В этом посте пойдет рассказ о 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 просто по запросу микроконтроллера выбирает к каком датчику обращаться и с какого датчика брать данные.
На этом у меня все, вот такие приключения у нас получились с этими датчиками. Ожидайте вторую часть, к ней должен успеть написать приложение для конфигурации этих датчиков, а также библиотеку для работы с этими датчиками. И бонусом даташит на русском языке.
Комментарии (44)

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 не рождаются, поэтому и про мультиплексор можно не знать. То, что команда обрела это знание - безо всякой иронии, очень хорошо, правда же молодцы.
Но почему автор называет себя "инженером встраиваемых систем", и что означает слово "старший" в профиле?

Alpatov_K_i Автор
08.11.2025 08:03Тут как мне кажется вопрос даже не в знании I2C, а чисто в устройствах, микросхемах и подходах, которые можно использовать для работы с этой шиной.
Почему называю себя "инженером встраевымых систем", просто если я не ошибаюсь то встраевыемые системы, это все что связано с платами и микроконтроллерами. Слово старший обозначает лишь то, что я "старший" в нашей команде курирую ребяти отвечаю за сам процесс разработки, согласен статья получилась сухая, вторую и третью часть постараюсь сделать объемнее по информации. Если вы могли бы дать какую-то критику, то я бы с радостью бы это с вами обсудил, телеграм есть у меня в профиле. Так как регистрировался на Хабре для получения дополнительного опыта и здравой критики или других решений от форумчан.
Надеюсь, что на все ответил

tklim
08.11.2025 08:03Ну т.е. электрик из ЖЕКа, устанавливающий зигби-выключатель в подрозетник, в какой-то мере тоже "инженер встраиваемых систем", там ведь есть микроконтроллер.

d_nine
08.11.2025 08:03Как сократить время такой "разработки" до пары часов с учётом похода в магазин? Прочитать документацию. Поддерживаю коллегу выше - ардуино головного мозга.

Alpatov_K_i Автор
08.11.2025 08:03Так откройте и почитайте документацию. В чем проблема? Могу вам отправить один модуль для тестов. А также все, что нарыл в интернете. Если вы мне покажете как изменить адресацию, чтобы она была сохранена после отключения питания, то буду рад посмотреть на ваще решение.

d_nine
08.11.2025 08:03Зарезервируйте кусочек флеша, для хранения конфига устройств на шинах. При запуске МК конфигурируете адресатов на шинах. По крайней мере прочитав документацию, вы бы сразу поняли, как конфигурируются адреса датчиков: модуль вам подходит из коробки / не подходит, а какой подойдёт при правильном прикладывание паяльника. Вы правда в этом проблему видите?

juramehanik
08.11.2025 08:03Два spdt переключателя SN74LVC1G3157 старший электронщик осилить не смог, печаль(

Alpatov_K_i Автор
08.11.2025 08:03Спасибо за совет, прочитал про SPDT переключатели, с таким еще не сталкивался, но возьму на заметку. Спасибо. Как отвечал коллеге выше, я старший лишь в команде, стараюсь каждый раз делать все лучше и лучше. Если интересно, чем мы занимаемся, можете написать мне в телеграм, он у меня указан в профиле. Буду рад как и советам так и критике

nikolz
08.11.2025 08:03Вот датчики с вынесеными контактами GPIO1 и XSHUT. Но нам они не подходят по причине того, что на них не защищен сам лазерный модуль.
Вот защитное стекло для этого датчика:

А это датчик, но уже с защитным стеклом и есть все контакты, которые вы искали.


Alpatov_K_i Автор
08.11.2025 08:03Забыл указать, Такое не совсем подходит по причине того, что нам нужен был датчик именно с разъемом, чтобы упростить сам процесс сборки. В TOF250 используется JST SH 1.0mm, что нас устраивает от и до. Нам надо выпускать партию устройств, на которых стоят такие датчики, метод с пайкой точно мимо, надо много и быстро. Поэтому собираем именно на версии с разъемом. Как указвал выше в посте, я датчики с этими выведеннвми контактами находил, а вот про стекло написать забыл. Для нас это оносительно колхозный метод, нам нужно как можно меньше операций при сборке устройства.

nikolz
08.11.2025 08:03Начали смотреть шину I2C-сканером и нашли только один адрес 0х53. Пу пу пу, начали гуглить как задавать адрес этим датчикам. Везде писали про какие-то контакты XSHUT и GPIO1. А у нас таких не было...
простой способ включения трех датчиков с одинаковыми адресами это подключить SDA к отдельным пинам, а SCL - сделать общим. В итоге нет надобности изменять адрес и не нужен расширитель I2C.

Alpatov_K_i Автор
08.11.2025 08:03Спасибо за подсказку, но тогда это уже решается через программное решение. Аппаратно i2c у Ардуино на пинах А4 и А5

nikolz
08.11.2025 08:03Если используете расширитель, то тоже решаете программно.
------------------------
Дополнительные два пина потребуют добавления одной команды в вашей программе - это команда смены адреса шины SDA. Это самое простое решение и упрощает сборку.
Надо взять два любых свободных пина GPIO.

Alpatov_K_i Автор
08.11.2025 08:03А что за команда, не подскажете?

nikolz
08.11.2025 08:03Ошибся с числом команд.
На Ардуине аппаратно лишь один I2C.
На ESP32 - два I2C.
Для трех I2C надо использовать программную реализацию I2C для дополнительных к аппаратным каналам.
https://github.com/tremaru/iarduino_I2C_Software

kanvas
08.11.2025 08:03Здравствуйте, спасибо за "простой способ включения трех датчиков с одинаковыми адресами"

Alpatov_K_i Автор
08.11.2025 08:03К кому обращаетесь? Не особо понял. Если ко мне, то тут статья не про простое подключение датчиков, а в целом о проблемах. По предыдущим комментариям понял, что не хватило раскрытия информации и более подробных деталей. Исправлюсь в следующей статье

Gudd-Head
08.11.2025 08:03Atmega328P не умеет эмулировать 3 UART порта
Жесть, конечно. Как и вся статья.

mikrizh
08.11.2025 08:03Зато теперь вы знаете что слово "ардуино" часто вызывает агрессию, не смотря на то, что статья опубликована в одноименном хабе да еще и из песочницы :D
А вообще по моему опыту vl53l0 вполне себе позволяет переназначать адрес программно, правда он будет сбрасываться при каждом отключении питания. В свое время решал это таким образом: заводил управляющие линии на ресеты и пока конфигурировал первый датчик, остальные держал в сбросе и так их поочередно выводя из под сброса инициализировал все (в моем случае два, но решение это вполне масштабируемое).
под STM, в общем-то на просторах можно найти библиотеку на сях. Когда то, еще в студенческие времена делал вывод с двух таких датчиков как раз на STM32F103C8T6. Тут немного топорно ибо делалось ОЧЕНЬ быстро, оставлю тут, мб пригодится
slog2
Радиоинженер доардуиновских времен читает эту статью и офигевает. Это же ардуино головного мозга. И потом это идёт в продакшн. Фэйспалм. А ещё я ожидал тут почитать про VL53L0X, но не нашёл.
martein
Это всё делается, чтобы потом валяться в большой коробке в гараже. Сделал, потешил себя, и плюнул на всё это, как это делают другие.
slog2
Что читать в этой статье? Что в i2c устройства оказывается имеют адреса? Внезапное открытие. Можно даже позавидовать, сколько ещё чудных открытий у автора впереди :)
qwe101
..Что на некоторых блоках i2c адрес практически несменяемый, хотя в теории можно.
Alpatov_K_i Автор
Вы думаете, я не в курсе про адрессацию I2C? В статье четко описано, что чтобы поменять адресацию больших датчиков TOF400F нам надо найти два пина, которые скрыты под защитным стеклом датчика. Купили новые датчики, чисто потому что у них по даташиту была программная смена адреса, а не аппаратное отключение I2C. Мы использовали в итоге TOF250, так как у них есть аппаратная смена адреса I2C. TOF400 не подошли под нашу задачу потому, что у них адресацию не изменить, а считывать данные с датчиков можно только поочередным их включением через контакты GPIO1 и XSHUT. Открывать осталось принцип работы и формирования протоколов RS232, RS485. Их в основном используем. Поэтому хотелось бы иметь полное понимание, а не работать по методичке
Alpatov_K_i Автор
Вообще не так, наша организация занимается разработкой электроники, разработкой различных проектов. Используем и 3Д печать, и изготавливаем печатные платы, в общем специалисты широкого профиля.
lapot2
Соболезную...(
user-book
ардуино это быстро
от идеи до железячного прототипа от часа до двух дней максимум
вылизывать уже можно потом и в процессе неторопливо
запустил не один проект и все начиналось с ардуино которое постепенно переписывалась на найтив
Kitsok
Все так. Я разраб электроники не настоящий, потому предпочитаю сначала решение на макете проработать, а потом уже схемоту рисовать. Коллеги-электронные инженеры действуют не так - они делают платы кастомизируемыми, нулевые резисторы, do-not-populate компоненты, всякое такое.
Но матчасть всё-таки надо изучать.
Alpatov_K_i Автор
Я согласен, просто наш макет макет представлял собой гребенку на макетной плате, к которой было подключено 3 датчика и 4 провода которые шли к отладочной плате Arduino Nano. Понятное дело, что в печатных платах используем "нулевые" резисторы, различные компоненты. А так в момент проектировки еще пользуемся Proteus.
user-book
пробовал разное, в итоге пришел к тому что первый прототип собирается на соплях, а уже на его основе отрисовывается первая плата-прототип мелкой серией
мекетка очень ненадежная штука, паять это надежно, плюс оно сохраняется "в стол" до востребования (и может пригодится через года для другого схожего проекта)
а сразу разрабатывать плату прототип - что нужно по факту не знает сам боженька, а перепайка по месту будет и так и так (а если делать слишком универсальное то бюджет вызовет инфаркт у начальства)
ну и do-not-populate и "воткнуть дорогой и редкий чип потому что с ним легче работать" это классика. очень часто железки дальше прототипа или пары екземпляров не уходят, а лишние заморочки не нужны никому.
А вот если уже идет на тираж тогда уже идет вылизывание всего вплоть до транзисторной развязки на дешевых компонентах вместо использования сдвигового регистра. там цент, там пол цента и вот на 100К тираж экономия в пол ляма
qwe101
На ардуинке хорошо макетить. И даже можно использовать, только если её принять как голый контроллер и обвесить всем, чем нужно для реальной работы.
Alpatov_K_i Автор
Добрый день. Ардуино(Atmega328p) использовали для прототипа, в тиражном изделии будет использоваться микроконтроллер STM32F103C8T6
alcotel
Так и взяли бы отладочную плату именно с ним, в чём проблемы?
У этого камня аж 2 контроллера I2C, один из которых можно перебрасывать на другие выводы. При этом доступно 2 UARTа. Итого без какой-либо обвязки к STM можно подключить 5 ваших датчиков, 4 из которых можно опрашивать одновременно.
А на прототипе не грех и программный I2C запустить, хоть на 50 портов.
Mmz87
Можно узнать каким языком программирования вы пользуетесь? Если это не Ассемблер, то... Вы обычный пустозвон....