Как подключить лазерный датчик дальности VL53-400 к Arduino
Для проекта нам понадобятся:
- лазерный дальномер VL53-400;
- преобразователь USB-UART;
- Arduino;
- соединительные провода;
- макетная плата.
1 Описание и характеристики датчика VL53-400
Датчик VL53-400 представляет собой лазерный дальномер и может измерять дальность от 0 до 4-х метров (для модификации с чипом VL53L1) или от 0 до 2-х метров (для модификации с чипом VL53L0). Причём есть несколько режимов работы с различной максимальной дальностью. Режимы с меньшей дальностью обеспечивают более высокую частоту опроса датчика. По умолчанию задан режим с максимальной дальностью. Точность измерений ±20 мм для VL53L1 и ±60 мм для VL53L0.
В качестве излучателя в датчике VL53-400 используется лазерный диод. Такие диоды не обеспечивают, конечно, когерентность и мощность излучения на уровне лазеров других типов, но вполне достаточную для применения в дальномерах, оптических мышах, проигрывателях компакт-дисков, сканерах штрих-кодов и т.д.
- Датчик VL53-400 может измерять с частотой от 0,1 до 100 Гц.
- Питание датчика от напряжения 3,3…5 В, потребляемый ток <36 мА.
- Рабочая температура от −20 до +70° C.
- Размеры датчика составляют всего 20×13×6.2 мм, вес 2 гр.
Излучатель и приёмник датчика покрыты специальной оптической защитой, чтобы уменьшить влияние излучений от других источников (например, солнца).
На рисунке ниже показаны углы передатчика и приёмника сенсора VL53-400.
Назначение выводов датчика VL53-400 такое:
Вывод | Назначение | Примечание |
---|---|---|
VCC | Питание | 3.3…5.0 В. |
RXD | Приёмник UART | Уровень TTL. Нельзя подключать напрямую к RS232. |
TXD | Передатчик UART | Уровень TTL. Нельзя подключать напрямую к RS232. |
SCL | Такт IIC | В режиме IIC. |
SDA | Данные IIC | В режиме IIC. |
GND | Земля |
Датчик поддерживает 3 режима работы: нормальный (UART), Modbus (UART) и IIC. При первом включении датчик входит в нормальный режим работы. Далее можно выбрать другой режим, который датчик запоминает и при перевключении входит в этот режим.
Производитель датчика поставляет специальное программное обеспечение WitMotion для работы с данными датчиками (использование ПО не обязательно, но для изучения протокола работы и проверки работоспособности очень удобно). С помощью данного ПО можно настраивать режимы работы датчика, менять параметры режимов, записывать измерения и строить по ним графики, проводить калибровку и т.д. Скачать ПО можно с репозитория производителя. А также много интересной информации можно найти тут (на китайском языке :).
При первом запуске интерфейс программы на китайском. Для смены языка на английский нажать в верхнем меню на предпоследнюю иконку и выбрать второй пункт. После этого программу перезапустить.
Для подключения к датчику VL53-400 выбрать порт вашего USB-UART адаптера, выставить скорость и нажать кнопку Add. Датчик появится снизу, и если все параметры указаны верно, вы увидите меняющиеся показания.
Поле ID пока не трогаем. Это адрес датчика, и по умолчанию он 0x50. Данное поле следует изменить, если вы планируете работать в режиме Modbus, и у вас будет несколько устройств в сети.
2 Нормальный режим работы датчика VL53-400
Это режим работы по умолчанию. В этом режиме сенсор VL53-400 подключён по UART и автоматически передаёт данные об измеренной дистанции и статус текущего измерения текстом в кодировке ASCII. Скорость по умолчанию 115200 бод и конфигурируется в диапазоне от 2400 до 921600 бод.
Для подключения датчика к компьютеру можно использовать любой USB-UART адаптер. Вывод TXD датчика подключаем к RX адаптера, RXD датчика – к TX адаптера. Питание и землю, естественно.
Подключимся к порту и увидим следующее:
Вывод датчика в нормальном режиме в таком формате:
State;0, Range Valid d: 242 mm
Здесь State – статус текущего измерения, d – дистанция в миллиметрах. Возможные статусы:
Состояние | Значение | Описание |
---|---|---|
0 | Range valid | Данные корректны |
1 | Sigma fail | Ошибка |
2 | Signal fail | Ошибка сигнала |
3 | Min range fail | Меньше минимальной дистанции |
4 | Phase fail | Больше максимальной дистанции |
5 | Hardware fail | Аппаратная ошибка |
7 или 255 | No update | Нет обновлений данных |
Чтобы подключить датчик VL53-400 к Arduino, вывод TXD датчика подключаем к RX Arduino (обычно это D0), а RXD к TX (обычно D1), VCC к 3V3, GND – к GND. Скетч может быть, например, такой:
Скетч для чтения показаний дальномера VL53-400 (разворачивается)
const int STATE_VALID = 0; String inputString = ""; // принятая строка int currentState; // статус текущего измерения void setup() { Serial.begin(115200); inputString.reserve(50); // зарезервируем 50 символов для строки } void loop() { /* ничего не делаем */ } // Обрабатывает поступающие данные void serialEvent() { while (Serial.available()) { char inChar = (char)Serial.read(); // читаем поступающий символ inputString += inChar; // дополняем строку новым символом if (inChar == '\n') { // при переходе на новую строку String start = inputString.substring(0, 2); // смотрим первые 2 символа строки if (start == "St") { //пример: 'State;0, Range Valid' currentState = GetIntFromString(inputString, 6); } else if (start == "d:") { //пример: 'd: 242 mm' if (currentState == STATE_VALID) { int distance = GetIntFromString(inputString, 2); Serial.println((String)distance + " mm"); } } inputString = ""; } } } // Ищет целое число в строке и возвращает его. int GetIntFromString(String s, int index) { String stateStr = ""; stateStr.reserve(10); String cur = ""; while ((cur!=",") && (index < 9)) { cur = s.substring(index, index+1); index += 1; if (cur!=","){ stateStr += cur; } } int val = stateStr.toInt(); return val; }
В результате выполнения этого скетча в мониторе порта Arduino видим:
Нормальный режим – самый простой из трёх режимов, т.к. требует только обработки строк, приходящих от датчика.
3 Режим Modbus датчика VL53-400
В режиме Modbus датчик VL53-400 также подключается по UART. Но данный режим уже требует активного управления. Имеются команды чтения (запроса данных от датчика) и записи (установка параметров, выполнение калибровки датчика, изменение адреса и т.д.). Команд довольно много; ознакомиться со всеми можно в описании датчика VL53-400 (раздел 8.3 Modbus Register на странице 24), которое можно скачать в приложениях внизу статьи. Мы же рассмотрим только несколько основных команд, которые нам понадобятся для измерения дальности.
ID датчика | Тип команды | Адрес регистра, старший байт | Адрес регистра, младший байт | Длина, старший байт | Длина, младший байт | CRC16, старший байт | CRC16, младший байт |
Здесь ID – это идентификатор датчика. По умолчанию он равен 0x50. Тип команды: 0x03 – чтение из указанного регистра, 0x06 – запись в указанный регистр. Каждый регистр датчика отвечает за свою функциональность. Адреса регистров полностью описаны в документации на модуль VL53-400. О контрольной сумме поговорим чуть ниже.
Шаблон команды чтения, которую понимает датчик, можно посмотреть в приложении WitMotion: меню Help Edit Register.
В данном случае шаблон ${ADDR} 03 00 34 00 02 ${CRC16}.
Реальная команда Modbus для чтения показаний дальномера VL53-400: 50 03 00 34 00 02 88 44
Здесь 0x50 – ID датчика, 0x03 – команда чтения, 0x0034 – адрес регистра измерения дальности, длина данных 2 байта (0x0002), 0x8844 – контрольная сумма CRC16/MODBUS, рассчитанная для данной команды.
Мы подробно рассматривали расчёт контрольной суммы по алгоритму CRC, в том числе CRC16. В приведённой статье также имеется программа калькулятора для расчёта контрольной суммы. На скриншоте видно, что она совпадает с примером (только байты меняются местами). При проверке с другими командами результат тот же, что говорит о том, что контрольная сумма действительно рассчитывается по алгоритму CRC-16/MODBUS (я не нашёл у производителя описания алгоритма расчёта CRC).
Благо, команда запроса не меняется, и нам не нужно каждый раз рассчитывать контрольную сумму. Но если вы будете использовать другие команды динамически, вам потребуется реализовать алгоритм CRC16 на микроконтроллере или компьютере.
Ответы модуля расшифровываются так:
ID датчика | Тип команды | Длина данных | Данные 1 | Данные 2 | … | Данные N | CRC16, старший | CRC16, младший |
Для перевода датчика VL53-400 из нормального режима в режим Modbus необходимо отправить последовательность команд:
Команда | Описание |
---|---|
50 06 00 38 00 01C4 46 | Режим работы: 0000 = нормальный, 0001 = Modbus, 0002 = IIC |
50 06 00 00 00 00 84 4B | Сброс: 0000 = сброс, 0001 = настройки по умолчанию. |
Здесь синим цветом выделен тип команды (06=запись или 03=чтение), зелёным адрес регистра (см. описание модуля), а красным – изменяемая часть.
Далее можно отправлять команды запроса. Например:
Команда | Примеры ответа | Примечание |
---|---|---|
50 03 00 04 00 01 C8 4A | 50 03 02 00 06 C5 8A | Прочитать битрейт: 00=2400, 01=4800, 02=9600, 03=19200, 04=38400, 05=57600, 06=115200, 07=230400, 08=460800, 09=921600 |
50 03 00 1A 00 01 68 4F | 50 03 02 00 50 45 B4 | Прочитать идентификатор датчика ID. Могут быть значения от 00 до FE. 0x50 – значение по умолчанию. |
50 03 00 35 00 01 99 85 | 50 03 02 00 00 45 88 50 03 02 00 02 C4 49 50 03 02 00 07 04 4A | Прочитать статус измерения: 00=ok, 02=fail, 07=no update |
50 03 00 34 00 01 C8 45 | 50 03 02 00 E2 C5 C1 50 03 02 04 EC 46 C5 | Запросить дистанцию: E2 =226 мм, 4EC =1260 мм. |
Последние две команды можно отправлять постоянно, чтобы обновлять показания дистанции и статус.
Из таблицы видно, что на запрос дистанции (в данном примере) датчик отвечает 50 03 02 00 E2 C5 C1 и 50 03 02 04 EC 46 C5. Дистанция это 4-ый и 5-ый байты пакета: 0x00E2 и 0x04EC. Переведём эти числа из шестнадцатеричной системы в десятичную и получим дистанцию в миллиметрах: 226 мм и 1260 мм, соответственно.
Теперь у нас есть вся минимально необходимая информация, чтобы написать скетч для Arduino:
Чтение показаний дальномера VL53-400 в режиме Modbus (разворачивается)
const int STATE_VALID = 0; const int CMD_LEN = 8; // длина команд и ответов датчика VL53 char buf[CMD_LEN]; // буфер для ответов датчика VL53 void setup() { pinMode(LED_BUILTIN, OUTPUT); // встроенный светодиод будет показывать статус Serial.begin(115200); Serial.setTimeout(100); // перевод в режим Modbus: byte mode[] = {0x50, 0x06, 0x00, 0x38, 0x00, 0x01, 0xC4, 0x46}; Serial.write(mode, CMD_LEN); int rlen = Serial.readBytes(buf, CMD_LEN); // системный сброс датчика: byte reset[] = {0x50, 0x06, 0x00, 0x00, 0x00, 0x00, 0x84, 0x4B}; Serial.write(reset, CMD_LEN); rlen = Serial.readBytes(buf, CMD_LEN); } void loop() { int stat = UpdateStatus(); if (stat == STATE_VALID) { digitalWrite(LED_BUILTIN, HIGH); // показываем, что измерение валидно int dist = UpdateDistance(); Serial.println((String)dist + "mm"); // только для демонстрации, не следует записывать в порт ничего лишнего } else { digitalWrite(LED_BUILTIN, LOW); // показываем, что валидных данных нет } } // Запрашивает VL53-400 и возвращает статус измерения. int UpdateStatus(){ byte cmd[] = {0x50, 0x03, 0x00, 0x35, 0x00, 0x01, 0x99, 0x85}; Serial.write(cmd, CMD_LEN); int rlen = Serial.readBytes(buf, CMD_LEN); return buf[4]; } // Запрашивает VL53-400 и возвращает дистанцию, в мм. int UpdateDistance(){ byte cmd[] = {0x50, 0x03, 0x00, 0x34, 0x00, 0x01, 0xC8, 0x45}; Serial.write(cmd, CMD_LEN); int rlen = Serial.readBytes(buf, CMD_LEN); return word(buf[3], buf[4]); }
4 Режим IIC датчика VL53-400
В режиме IIC линии SDA и SCL подключаются напрямую к чипу VL53Lx. И обмен осуществляется по шине I2C непосредственно с чипом и описан в документе VL53-400 API User Manual (приложен в конце статьи). При этом I2C адрес чипа по умолчанию 0x29 (не путать с адресом датчика).
Для перевода датчика VL53-400 в режим I2C сначала нужно передать по UART команду, которую мы уже рассматривали выше, только теперь поменяем режим на 0x0002:
Команда | Описание |
---|---|
50 06 00 38 00 02 84 47 | Режим работы: 0000 = нормальный, 0001 = Modbus, 0002 = IIC |
Датчик начнёт передавать по UART сообщение IICMODE.
После этого подключим модуль VL53-400 по следующей схеме:
Здесь MCU – управляющий микроконтроллер (в том числе Arduino). Линии SCL и SDA датчика имеют внутренние подтягивающие 10 кОм резисторы, поэтому внешние ставить не нужно.
Датчик VL53-400 может работать по IIC в трёх режимах: одиночное измерение (по запросу), непрерывное измерение без задержек между измерениями и непрерывное с заданным интервалом.
Скачать примеры работы для разных платформ (Arduino, STM, Raspberry Pi, Python и др.) можно здесь.
Download attachments:
- Скачать описание VL53-400 (403 Downloads)
- Скачать datasheet на датчик VL53 (566 Downloads)