Электроника без границ.
В этой работе мы исследуем работу лазерного датчика расстояния VL53L1X от фирмы STMicroelectronics. Для этой цели на aliexpres была приобретена плата с данным датчиком и на которой уже имелась обвязка по согласованию уровней напряжения. Датчик передает данные во внешний мир и настраивается по шине I2C в мокроконтроллер STM32f103CBT6 который присутствует на плате BLUE PILL. Изначально полученные данные я выводил через програматор ST Link используя вывод SWO и функцию отладки printf(). Затем я решил что этого будет недостаточно, и подключил к микроконтроллеру ЖК дисплей от NOKIA 5110 для отображения данных. Это позволило использовать датчик как полноценное устройство для которого компьютер уже не нужен. Схема подключения для простоты повторения нарисована цветными линиями без каких либо стандартов. Питание осуществляется простым подключением шнура USB к плате BLUE PILL . В схеме линия подсветки дисплея объединена с землей, однако для регулировки уровня подсветки дисплея я бы порекомендовал подключить этот вывод на PWM выход какого либо таймера. Схема в сборе изображена ниже.
Для запуска датчика расстояния VL53L1X я использовал пример от производителя взятый из "STSW-IMG009 VL53L1X ULD API (Ultra Lite Driver Application Programming Interface) " скачаный с сайта " st.com ". Примеры находящиеся на сайте производителя предназначались для отладочной платы " X-NUCLEO " с более старшим процессором чем находящийся на моей плате STM32f103CBT6, поэтому пример пришлось пересобрать в Cube MX заново и добавить порт SPI для подключения дисплея. Настройки интерфейсов I2C и SPI вы можете посмотреть и изменить в Cube MX.
С чем пришлось столкнуться. В примере отсутствовали сами библиотечные файлы с API, пришлось вять их из "X-CUBE-53L1A1" скачанного с сайта производителя. Далее ждал еще один сюрприз в низкоуровнивих функциях запросов по I2C к сенсору отсутствовали HALовские функции передачи байтов ну просто полностью, пришлось вставить их самостоятельно, однако это еще не все. В HALовские не умеют передавать и читать данные в словах и двойных словах по I2C, мало того в запросе к датчику необходимо отправить индекс регистра и первый байт (согласно даташит) должен быть старшим пришлось организовывать реверс байтов перед отправкой для функций отправки и чтения слова и двойного слова. Все это вы найдете в файле "vl53l1_platform.с". Некоторые функции передачи такие как "VL53L1_WriteMulti()" предназмаченные для заполнения регистров сенсора одной строкой, я оставил пустыми т.к. в нашем примере (Ultra Lite Driver) они не используются. Настройку датчика я вынес в отдельную функцию чтобы не мешались. Датчик запустится без каких либо настроек после функций "VL53L1X_SensorInit(dev)" и VL53L1X_StartRanging(), после этого результат уже можно забирать функцией VL53L1X_GetDistance(). Я же предпочел запустить датчик согласно описания в мануале "UM2510" рисунок с алгоритмом работы ниже.
Программа работает следующим образом вначале происходит проверка окончания загрузки датчика. После чего производится инициализация датчика и настройка таких параметров как "VL53L1X_SetDistanceMod()e" определяет максимальное расстояние которое будет определять датчик. Функция "VL53L1X_SetTimingBudget()" определяет время за которое будет производиться определение рассояния датчиком, доступные величины определены в мануале "UM2510". Далее запускается "VL53L1X_SetInterMeasurementInMs()" эта функция устанавливает интервал между началами измерений. VL53L1X_SetROI()настраивает фокусировку в идеале можно програмно используя эту функцию пучком 4х4 мм ошупывать расстояние до объекта внутри матрицы избражения 16х16 мм подробнее об этом в "AN5191".Угол в 27 градусов был получен мною при перемещении препятствия перпендикулярно измеряемому расстоянию и отслеживании результатов на дисплее. "VL53L1X_SetOffset()" тут должно быть все понятно без объяснений. "VL53L1X_CalibrateOffset()" процедура калибровки датчика, описана в мануале. "VL53L1X_CalibrateXtalk()" процедура калибровки при установки защитного стекла. VL53L1X_StartRanging() эта функция запускает непрерывную операцию измерения расстояния.
Угол фокусировки при VL53L1X_SetROI(16,16) .
Поясняющий рисунок из AN5191.
После запуска модуля происходит последовательное выполнение нескольких функцый в бесконечном цикле . Первая "VL53L1X_CheckForDataReady()" ожидание готовности данных, затем "VL53L1X_GetDistance()"получение данных и очиска прерывания функцией "VL53L1X_ClearInterrupt()" без очистки прерывания флаг готовности данных будет висеть постоянно и полученные данные частично будут дублировать друг друга. От себя я добавил (в цикл бесконечного измерения расстояния) вывод результата количества измерений в секунду на дисплей.
Подведем небольшой итог. Что можно сказать о датчике. Лушие (наиболее точные) результаты измерений вы получите если будете производить измерения в темноте, с бюджетом времени "timing budget = 200ms" максимальная ошибка будет составлять 2,5мм. Мало того из за рассеивания дазерного луча минимальный диаметр измеряемого объекта должен соответствовать, как изображено на рисунке из AN5191 изображенном выше. Например при угле фокусировкив 27 градусов ("VL53L1X_SetROI(16,16)") и измеряемом расстоянии от 2м до 3м, минимальный диаметр измеряемого объекта должен составлять от 96см до 145см соответственно. Понятно что говорить о том что бы описать рельеф какой либо поверхностьи речь не идет. По моему мнению датчик подойдет для работы в качастве парктроника либо при иизпмерении расстояний до какихто ровных объектов напиример стен или для подсчета входящих людей (как описывает производитель).
Видео с работой устройства.
You can contact the developers of the project freelemelectronic.com by e-mail:
freelimelectronic@gmail.com.