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