Рейтинг@Mail.ru

Как подключить лазерный датчик дальности VL53-400 к Arduino

автор:
Be the first to comment! Arduino
Print Friendly, PDF & Email
Разбираемся с нюансами подключения лазерного дальномера VL53-400.

Для проекта нам понадобятся:

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

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

На рисунке ниже показаны углы передатчика и приёмника сенсора VL53-400.

Диаграмма направленности сенсора VL53-400
Диаграмма направленности сенсора 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 для работы с данными датчиками (использование ПО не обязательно, но для изучения протокола работы и проверки работоспособности очень удобно). С помощью данного ПО можно настраивать режимы работы датчика, менять параметры режимов, записывать измерения и строить по ним графики, проводить калибровку и т.д. Скачать ПО можно с репозитория производителя. А также много интересной информации можно найти тут (на китайском языке :).

При первом запуске интерфейс программы на китайском. Для смены языка на английский нажать в верхнем меню на предпоследнюю иконку и выбрать второй пункт. После этого программу перезапустить.

Интерфейс программы WitMotion для управления сенсором VL53-400
Интерфейс программы WitMotion для управления сенсором VL53-400

Для подключения к датчику VL53-400 выбрать порт вашего USB-UART адаптера, выставить скорость и нажать кнопку Add. Датчик появится снизу, и если все параметры указаны верно, вы увидите меняющиеся показания.

Поле ID пока не трогаем. Это адрес датчика, и по умолчанию он 0x50. Данное поле следует изменить, если вы планируете работать в режиме Modbus, и у вас будет несколько устройств в сети.

2 Нормальный режим работы датчика VL53-400

Это режим работы по умолчанию. В этом режиме сенсор VL53-400 подключён по UART и автоматически передаёт данные об измеренной дистанции и статус текущего измерения текстом в кодировке ASCII. Скорость по умолчанию 115200 бод и конфигурируется в диапазоне от 2400 до 921600 бод.

Для подключения датчика к компьютеру можно использовать любой USB-UART адаптер. Вывод TXD датчика подключаем к RX адаптера, RXD датчика – к TX адаптера. Питание и землю, естественно.

Подключимся к порту и увидим следующее:

Поток данных модуля VL53-400 в нормальном режиме
Поток данных модуля VL53-400 в нормальном режиме

Вывод датчика в нормальном режиме в таком формате:

State;0, Range Valid
d: 242 mm    

Здесь State – статус текущего измерения, d – дистанция в миллиметрах. Возможные статусы:

СостояниеЗначениеОписание
0Range validДанные корректны
1Sigma failОшибка
2Signal failОшибка сигнала
3Min range failМеньше минимальной дистанции
4Phase failБольше максимальной дистанции
5Hardware failАппаратная ошибка
7 или 255No 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 видим:

Определение дистанции датчика VL53-400 в нормальном режиме с помощью Arduino
Определение дистанции датчика VL53-400 в нормальном режиме с помощью Arduino

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

3 Режим Modbus датчика VL53-400

В режиме Modbus датчик VL53-400 также подключается по UART. Но данный режим уже требует активного управления. Имеются команды чтения (запроса данных от датчика) и записи (установка параметров, выполнение калибровки датчика, изменение адреса и т.д.). Команд довольно много; ознакомиться со всеми можно в описании датчика VL53-400 (раздел 8.3 Modbus Register на странице 24), которое можно скачать в приложениях внизу статьи. Мы же рассмотрим только несколько основных команд, которые нам понадобятся для измерения дальности.

Общий формат команд Modbus дальномера VL53-400
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 на микроконтроллере или компьютере.

Ответы модуля расшифровываются так:

Общий формат ответов дальномера VL53-400 в режиме Modbus
ID датчикаТип командыДлина данныхДанные 1Данные 2Данные NCRC16, старший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 4A50 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 8550 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 4550 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 по следующей схеме:

Схема подключения датчика VL53-400 в режиме I2C
Схема подключения датчика VL53-400 в режиме I2C

Здесь MCU – управляющий микроконтроллер (в том числе Arduino). Линии SCL и SDA датчика имеют внутренние подтягивающие 10 кОм резисторы, поэтому внешние ставить не нужно.

Датчик VL53-400 может работать по IIC в трёх режимах: одиночное измерение (по запросу), непрерывное измерение без задержек между измерениями и непрерывное с заданным интервалом.

Скачать примеры работы для разных платформ (Arduino, STM, Raspberry Pi, Python и др.) можно здесь.

Last modified onПонедельник, 15 Июль 2024 18:38 Read 9625 times
Ключевые слова: :

Поблагодарить автора:

Поделиться

Print Friendly, PDF & Email
  1. Arduino это...
  2. Arduino это...
  3. Arduino это...
Отличный способ начать знакомство с электроникой, микроконтроллерами и программированием!
Замечательное средство для создания собственных электронных устройств, которые пригодятся в быту или для развлечения!
Уникальный конструктор, для которого разработаны десятки совместимых датчиков и модулей!
next
prev