В этом посте пойдет рассказ о ToF-датчиках, которые мы с моей командой пытались обуздать чуть более недели. На рынке большое количество различных датчиков расстояния, их вариаций и модификаций. От ультразвуковых датчиков HC-SR04 мы решили сразу отказаться, так как нам нужна была максимальная точность и стабильность измерений.

Мы решили остановиться на датчиках с принципом работы ToF (Time-of-Flight) используются для точного измерения расстояния до объектов на основе времени прохождения светового сигнала. Их ключевые преимущества — высокая точность, быстродействие и стабильная работа в разных условиях освещенности.

Все, решили берем TOF. Пошли в ближайший магазин электроники в городе, купили датчики в модификации TOF200F. Радостные погнали обратно к себе в офис, думаем, отлично датчики с MODBUS, I2C и еще Serial(UART). Все пришли, подключили к преобразователю TTL-USB, все работает. Ура, победа. Расстояние четкое, не скачет, погрешность 1,5мм, в общем как говорят: "ТОП за свои деньги". И эта радость длилась недолго. Задача проекта стояла в том, чтобы запустить в параллельной работе 3 таких датчика. Ну что, открыли интернет, нашли библиотеку для этих датчиков, подключили к I2C, не работают... Стали читать и лазать по интернету в поисках того, как включить I2C режим. Включили, снова меленькая победа. Ура-ура-ура. Отлично, по той же схеме включили режим I2C и на двух других датчиках. Отлично, все датчики готовы к работе. Подключили к самодельному разветвителю I2C. Начали смотреть шину I2C-сканером и нашли только один адрес 0х53. Пу пу пу, начали гуглить как задавать адрес этим датчикам. Везде писали про какие-то контакты XSHUT и GPIO1. А у нас такихне было... Начали внимательно изучать документацию на модуль, нигде нет упоминания про эти контакты. Ладно, мы тоже ребята не промах, скинули заднюю крышку модуля там тоже есть какие‑то реперные точки, но непонятно зачем они нужны. Скинули переднее черное стеклышко, чтобы скинуть саму микросхему VL53L0X и по распиновке найти «пятак» (реперную точку) XSHUT. И винешка на торте, мы этот контакт нашли, но его реперная точка находится под этим черным стёклышком. Было жестокое ощущение поражения.

Начали думать в направлении того, чтобы просто попробовать посмотреть даташит на микросхему под железным кожухом TOF200F. И о чудо, китайцы на ней сбили маркировку и смешно, и грустно. Было принято отказаться от этой модификации. Пошли снова в магазин и взяли уже другие датчики TOF250.

Взяли новые датчики, на них нет тех выводов, что нам нужны. В итоге просто была надежна на программнуюнастройку адреса этих датчиков. Ну все пришли в офис, подключили также через адаптер USB‑TTL. Расстояние выводит, ввели ту же самую CRC фразу в консоль. Не переключился режим. В ответ прилетело «error», ладно, начали искать даташиты. И спустя полтора часа нашли даташит именно на этот модуль. И, о да, настройка программная, настроили адресацию и другие параметры. Запустили, работает. Победа.
История на этом не закончилась, конечно, начали думать, а вот что бы мы делали, если бы не запустились эти датчики? «Да да, мы всегда так делаем, даже если задача успешно завершена. Ищем другие варианты решения этой задачи». Сначала подумали над решением этой задачи через 3 SoftwareSerial порта, но потом пришло осознание, что Atmega328P не умеет эмулировать 3 UART порта. Сели, призадумались, начали лазить по интернету и наткнулись на интересный модуль: I2C мультиплексор TCA9548A. И тут то мы и поняли, как легко можно было решить нашу проблему, но все же наше решение нравится нам больше, чем это, так как настройка датчиков становится более гибкой по средствам UART.

Как мы видим, датчики тут имеют одинаковую адресацию, а TCA9548A просто по запросу микроконтроллера выбирает к каком датчику обращаться и с какого датчика брать данные.
На этом у меня все, вот такие приключения у нас получились с этими датчиками. Ожидайте вторую часть, к ней должен успеть написать приложение для конфигурации этих датчиков, а также библиотеку для работы с этими датчиками. И бонусом даташит на русском языке.
Комментарии (10)

svitoglad
08.11.2025 08:03Я лет 20 назад 3 UART порта реализовывал на Mege8535 и апаратный RS-485 еще до кучи, а тут на Megа328 не смогли.

IgnatF
08.11.2025 08:03Самый идиотский способ в свое время придумал я. Нужно было подключить пять или шесть датчиков к ардуино. Адрес у всех один и тот же конечно. Подключил через простую планку реле. Нужный датчик ардуинка сама подключала.

Kitsok
08.11.2025 08:03Хорошее решение, но можно ещё лучше: двигатель поставить, редуктор там, ну и галетный переключатель. Отдельную ардуину на управление двигателем.
В зависимости от целевой необычности решения, двигатель можно использовать паровой.

Kitsok
08.11.2025 08:03Я все понимаю, со знанием I2C не рождаются, поэтому и про мультиплексор можно не знать. То, что команда обрела это знание - безо всякой иронии, очень хорошо, правда же молодцы.
Но почему автор называет себя "инженером встраиваемых систем", и что означает слово "старший" в профиле?
slog2
Радиоинженер доардуиновских времен читает эту статью и офигевает. Это же ардуино головного мозга. И потом это идёт в продакшн. Фэйспалм. А ещё я ожидал тут почитать про VL53L0X, но не нашёл.
martein
Это всё делается, чтобы потом валяться в большой коробке в гараже. Сделал, потешил себя, и плюнул на всё это, как это делают другие.
slog2
Что читать в этой статье? Что в i2c устройства оказывается имеют адреса? Внезапное открытие. Можно даже позавидовать, сколько ещё чудных открытий у автора впереди :)
user-book
ардуино это быстро
от идеи до железячного прототипа от часа до двух дней максимум
вылизывать уже можно потом и в процессе неторопливо
запустил не один проект и все начиналось с ардуино которое постепенно переписывалась на найтив
Kitsok
Все так. Я разраб электроники не настоящий, потому предпочитаю сначала решение на макете проработать, а потом уже схемоту рисовать. Коллеги-электронные инженеры действуют не так - они делают платы кастомизируемыми, нулевые резисторы, do-not-populate компоненты, всякое такое.
Но матчасть всё-таки надо изучать.
qwe101
На ардуинке хорошо макетить. И даже можно использовать, только если её принять как голый контроллер и обвесить всем, чем нужно для реальной работы.