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

Вот эти самые HC-SR04
Вот эти самые 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. И винешка на торте, мы этот контакт нашли, но его реперная точка находится под этим черным стёклышком. Было жестокое ощущение поражения.

Вот датчики с вынесеными контактами GPIO1 и XSHUT. Но нам они не подходят по причине того, что на них не защищен сам лазерный модуль. Да и в целом будет выглядеть как колхоз каких-то гаражных мастеров или поделка для школьного конкурса. Мы же в свое время делаем качественные электронные продукты.
Вот датчики с вынесеными контактами GPIO1 и XSHUT. Но нам они не подходят по причине того, что на них не защищен сам лазерный модуль. Да и в целом будет выглядеть как колхоз каких-то гаражных мастеров или поделка для школьного конкурса. Мы же в свое время делаем качественные электронные продукты.

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

Вот новые датчики. И опять 6 пятаков без нужных нам контактов.
Вот новые датчики. И опять 6 пятаков без нужных нам контактов.

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

История на этом не закончилась, конечно, начали думать, а вот что бы мы делали, если бы не запустились эти датчики? «Да да, мы всегда так делаем, даже если задача успешно завершена. Ищем другие варианты решения этой задачи». Сначала подумали над решением этой задачи через 3 SoftwareSerial порта, но потом пришло осознание, что Atmega328P не умеет эмулировать 3 UART порта. Сели, призадумались, начали лазить по интернету и наткнулись на интересный модуль: I2C мультиплексор TCA9548A. И тут то мы и поняли, как легко можно было решить нашу проблему, но все же наше решение нравится нам больше, чем это, так как настройка датчиков становится более гибкой по средствам UART.

Нарисовал маленькую схему по подключению
Нарисовал маленькую схему по подключению

Как мы видим, датчики тут имеют одинаковую адресацию, а TCA9548A просто по запросу микроконтроллера выбирает к каком датчику обращаться и с какого датчика брать данные.

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

Комментарии (44)


  1. slog2
    08.11.2025 08:03

    Радиоинженер доардуиновских времен читает эту статью и офигевает. Это же ардуино головного мозга. И потом это идёт в продакшн. Фэйспалм. А ещё я ожидал тут почитать про VL53L0X, но не нашёл.


    1. martein
      08.11.2025 08:03

      Это всё делается, чтобы потом валяться в большой коробке в гараже. Сделал, потешил себя, и плюнул на всё это, как это делают другие.


      1. slog2
        08.11.2025 08:03

        Что читать в этой статье? Что в i2c устройства оказывается имеют адреса? Внезапное открытие. Можно даже позавидовать, сколько ещё чудных открытий у автора впереди :)


        1. qwe101
          08.11.2025 08:03

          ..Что на некоторых блоках i2c адрес практически несменяемый, хотя в теории можно.


        1. Alpatov_K_i Автор
          08.11.2025 08:03

          Вы думаете, я не в курсе про адрессацию I2C? В статье четко описано, что чтобы поменять адресацию больших датчиков TOF400F нам надо найти два пина, которые скрыты под защитным стеклом датчика. Купили новые датчики, чисто потому что у них по даташиту была программная смена адреса, а не аппаратное отключение I2C. Мы использовали в итоге TOF250, так как у них есть аппаратная смена адреса I2C. TOF400 не подошли под нашу задачу потому, что у них адресацию не изменить, а считывать данные с датчиков можно только поочередным их включением через контакты GPIO1 и XSHUT. Открывать осталось принцип работы и формирования протоколов RS232, RS485. Их в основном используем. Поэтому хотелось бы иметь полное понимание, а не работать по методичке


      1. Alpatov_K_i Автор
        08.11.2025 08:03

        Вообще не так, наша организация занимается разработкой электроники, разработкой различных проектов. Используем и 3Д печать, и изготавливаем печатные платы, в общем специалисты широкого профиля.


        1. lapot2
          08.11.2025 08:03

          Соболезную...(


    1. user-book
      08.11.2025 08:03

      ардуино это быстро

      от идеи до железячного прототипа от часа до двух дней максимум

      вылизывать уже можно потом и в процессе неторопливо

      запустил не один проект и все начиналось с ардуино которое постепенно переписывалась на найтив


      1. Kitsok
        08.11.2025 08:03

        Все так. Я разраб электроники не настоящий, потому предпочитаю сначала решение на макете проработать, а потом уже схемоту рисовать. Коллеги-электронные инженеры действуют не так - они делают платы кастомизируемыми, нулевые резисторы, do-not-populate компоненты, всякое такое.

        Но матчасть всё-таки надо изучать.


        1. Alpatov_K_i Автор
          08.11.2025 08:03

          Я согласен, просто наш макет макет представлял собой гребенку на макетной плате, к которой было подключено 3 датчика и 4 провода которые шли к отладочной плате Arduino Nano. Понятное дело, что в печатных платах используем "нулевые" резисторы, различные компоненты. А так в момент проектировки еще пользуемся Proteus.


        1. user-book
          08.11.2025 08:03

          пробовал разное, в итоге пришел к тому что первый прототип собирается на соплях, а уже на его основе отрисовывается первая плата-прототип мелкой серией

          мекетка очень ненадежная штука, паять это надежно, плюс оно сохраняется "в стол" до востребования (и может пригодится через года для другого схожего проекта)
          а сразу разрабатывать плату прототип - что нужно по факту не знает сам боженька, а перепайка по месту будет и так и так (а если делать слишком универсальное то бюджет вызовет инфаркт у начальства)

          ну и do-not-populate и "воткнуть дорогой и редкий чип потому что с ним легче работать" это классика. очень часто железки дальше прототипа или пары екземпляров не уходят, а лишние заморочки не нужны никому.
          А вот если уже идет на тираж тогда уже идет вылизывание всего вплоть до транзисторной развязки на дешевых компонентах вместо использования сдвигового регистра. там цент, там пол цента и вот на 100К тираж экономия в пол ляма


    1. qwe101
      08.11.2025 08:03

      На ардуинке хорошо макетить. И даже можно использовать, только если её принять как голый контроллер и обвесить всем, чем нужно для реальной работы.


    1. Alpatov_K_i Автор
      08.11.2025 08:03

      Добрый день. Ардуино(Atmega328p) использовали для прототипа, в тиражном изделии будет использоваться микроконтроллер STM32F103C8T6


      1. alcotel
        08.11.2025 08:03

        в тиражном изделии будет использоваться микроконтроллер STM32F103C8T6

        Так и взяли бы отладочную плату именно с ним, в чём проблемы?

        У этого камня аж 2 контроллера I2C, один из которых можно перебрасывать на другие выводы. При этом доступно 2 UARTа. Итого без какой-либо обвязки к STM можно подключить 5 ваших датчиков, 4 из которых можно опрашивать одновременно.

        А на прототипе не грех и программный I2C запустить, хоть на 50 портов.


    1. Mmz87
      08.11.2025 08:03

      Можно узнать каким языком программирования вы пользуетесь? Если это не Ассемблер, то... Вы обычный пустозвон....


  1. svitoglad
    08.11.2025 08:03

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


    1. Alpatov_K_i Автор
      08.11.2025 08:03

      А зачем нам тут нужен UART? Если непосредственно нужен был I2C?


  1. IgnatF
    08.11.2025 08:03

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


    1. Kitsok
      08.11.2025 08:03

      Хорошее решение, но можно ещё лучше: двигатель поставить, редуктор там, ну и галетный переключатель. Отдельную ардуину на управление двигателем.

      В зависимости от целевой необычности решения, двигатель можно использовать паровой.


      1. IgnatF
        08.11.2025 08:03

        ну так в следующий раз по совету гения и сделаю.


      1. kkuznetzov
        08.11.2025 08:03

        Галетный переключатель? Лучше шаговый искатель от АТС.


  1. Kitsok
    08.11.2025 08:03

    Я все понимаю, со знанием I2C не рождаются, поэтому и про мультиплексор можно не знать. То, что команда обрела это знание - безо всякой иронии, очень хорошо, правда же молодцы.

    Но почему автор называет себя "инженером встраиваемых систем", и что означает слово "старший" в профиле?


    1. Alpatov_K_i Автор
      08.11.2025 08:03

      Тут как мне кажется вопрос даже не в знании I2C, а чисто в устройствах, микросхемах и подходах, которые можно использовать для работы с этой шиной.

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

      Надеюсь, что на все ответил


      1. tklim
        08.11.2025 08:03

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


    1. qwe101
      08.11.2025 08:03

      Назначили его так. И он работает, старается! Уже хорошо.


  1. d_nine
    08.11.2025 08:03

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


    1. Alpatov_K_i Автор
      08.11.2025 08:03

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


      1. d_nine
        08.11.2025 08:03

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


  1. juramehanik
    08.11.2025 08:03

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


    1. Alpatov_K_i Автор
      08.11.2025 08:03

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


  1. nikolz
    08.11.2025 08:03

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

    Вот защитное стекло для этого датчика:

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


    1. Alpatov_K_i Автор
      08.11.2025 08:03

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


      1. nikolz
        08.11.2025 08:03

        Тогда используйте еще два пина у микроконтроллера.


  1. nikolz
    08.11.2025 08:03

    Начали смотреть шину I2C-сканером и нашли только один адрес 0х53. Пу пу пу, начали гуглить как задавать адрес этим датчикам. Везде писали про какие-то контакты XSHUT и GPIO1. А у нас таких не было...

    простой способ включения трех датчиков с одинаковыми адресами это подключить SDA к отдельным пинам, а SCL - сделать общим. В итоге нет надобности изменять адрес и не нужен расширитель I2C.


    1. Alpatov_K_i Автор
      08.11.2025 08:03

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


      1. nikolz
        08.11.2025 08:03

        Если используете расширитель, то тоже решаете программно.

        ------------------------

        Дополнительные два пина потребуют добавления одной команды в вашей программе - это команда смены адреса шины SDA. Это самое простое решение и упрощает сборку.

        Надо взять два любых свободных пина GPIO.


        1. Alpatov_K_i Автор
          08.11.2025 08:03

          А что за команда, не подскажете?


          1. nikolz
            08.11.2025 08:03

            Ошибся с числом команд.

            На Ардуине аппаратно лишь один I2C.

            На ESP32 - два I2C.

            Для трех I2C надо использовать программную реализацию I2C для дополнительных к аппаратным каналам.

            https://github.com/tremaru/iarduino_I2C_Software


    1. kanvas
      08.11.2025 08:03

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


      1. Alpatov_K_i Автор
        08.11.2025 08:03

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


  1. Gudd-Head
    08.11.2025 08:03

    Atmega328P не умеет эмулировать 3 UART порта

    Жесть, конечно. Как и вся статья.


    1. Alpatov_K_i Автор
      08.11.2025 08:03

      Здраво, не знаю, что тут даже и ответить...


  1. mikrizh
    08.11.2025 08:03

    Зато теперь вы знаете что слово "ардуино" часто вызывает агрессию, не смотря на то, что статья опубликована в одноименном хабе да еще и из песочницы :D

    А вообще по моему опыту vl53l0 вполне себе позволяет переназначать адрес программно, правда он будет сбрасываться при каждом отключении питания. В свое время решал это таким образом: заводил управляющие линии на ресеты и пока конфигурировал первый датчик, остальные держал в сбросе и так их поочередно выводя из под сброса инициализировал все (в моем случае два, но решение это вполне масштабируемое).

    под STM, в общем-то на просторах можно найти библиотеку на сях. Когда то, еще в студенческие времена делал вывод с двух таких датчиков как раз на STM32F103C8T6. Тут немного топорно ибо делалось ОЧЕНЬ быстро, оставлю тут, мб пригодится

    https://github.com/Krizhik/VL53L0


  1. lapot2
    08.11.2025 08:03

    Ошибки в тексте кто исправлять будет?