Компонент · Датчик

Датчик расстояния VL53L0X ToF

VL53L0X измеряет расстояние лазером, а не звуком, и передаёт по I²C узкий, быстрый луч с миллиметровой точностью для роботов, которым нужны точные измерения.

Что это такое

VL53L0X измеряет расстояние так же, как лазерный дальномер, — светом вместо звука. Он излучает невидимый импульс инфракрасного лазера, измеряет время пути туда и обратно и передаёт по I²C узкое, быстрое измерение с точностью до миллиметра. Если HC-SR04 воспринимает широкий конус с разбросом в несколько сантиметров, то VL53L0X измеряет узкое пятно с высокой точностью — это датчик для случаев, когда ответа «примерно как далеко» недостаточно.

Подписанная схема платы расширения датчика времени пролёта VL53L0X: небольшая фиолетовая плата с корпусом датчика в центре, в котором видны два отверстия — круглый лазерный излучатель и квадратный приёмник SPAD, стрелка лазерного луча наружу и 6-выводный разъём (VIN, GND, SCL, SDA, GP1, XSH) снизу.
Инфракрасный лазер излучает импульс, а приёмник SPAD измеряет время отражения: измерение по времени пролёта с узким лучом и миллиметровой точностью. Скачать SVG

Как это работает

В корпусе находятся два отверстия: лазерный излучатель и приёмник SPAD (детектор одиночных фотонов). Датчик посылает импульс инфракрасного света 940 nm, приёмник измеряет время возвращения отражения, а поскольку скорость света известна, это время преобразуется в расстояние. Всё хронометражное управление выполняется на кристалле; микроконтроллер лишь считывает значение в миллиметрах по I²C. Компромиссы по сравнению со звуком те же, что рассматриваются в руководстве ультразвук против датчиков времени пролёта.

Когда его следует использовать

Выбирайте VL53L0X, когда роботу нужно точное измерение расстояния узким лучом:

  • Близкие точные расстояния — оценка конкретного промежутка, следование вдоль стены с заданным отступом или точная остановка.
  • Небольшие или тонкие препятствия — ножка стола или провод, которые широкий ультразвуковой конус размоет или пропустит.
  • Быстрые контуры — обновления до 50 Hz для отзывчивого регулирования.

Для дешёвого и прощающего ошибки обнаружения «есть ли что-нибудь впереди?» на большей площади лучше HC-SR04. Идеи фильтрации из руководства чтение HC-SR04 применимы к любому потоку измерений расстояния, включая лазерный.

Подключение и важные нюансы

  • I²C, и возможен конфликт адресов. Все VL53L0X используют один адрес по умолчанию; для работы нескольких экземпляров применяйте вывод XSHUT, чтобы включать их по одному и переназначать адреса.
  • Учитывайте внешний свет. Яркое солнце с большим количеством инфракрасного излучения, а также тёмные и зеркальные поверхности сокращают рабочую дальность.
  • Содержите окно чистым. Отпечаток пальца или пыль на отверстии рассеивают луч и искажают показания.
  • Соблюдайте ближний предел (~5 cm); как и любой дальномер, он имеет слепую зону на слишком малых расстояниях.

Расположение выводов

Вывод Название Назначение
1 VIN 3–5 V. Плата понижает напряжение до 2.8 V датчика
2 GND Земля
3 SCL Тактовый сигнал I²C
4 SDA Данные I²C
5 GPIO1 Выход прерывания — срабатывает, когда измерение готово
6 XSHUT Выключение, активный низкий уровень. Низкий уровень полностью отключает датчик

XSHUT — вывод, который делает возможным использование нескольких датчиков; его следует понять до покупки второго экземпляра.

Использование нескольких датчиков VL53L0X

Каждый VL53L0X включается с одинаковым адресом 0x29, а выводов для выбора адреса нет. Подключите два к одной шине, и оба ответят одновременно, нарушив все обмены. Адрес можно изменить программно, но изменение не сохраняется и теряется при каждом цикле питания.

Стандартное решение использует XSHUT для поочерёдного включения:

#include <Wire.h>
#include <VL53L0X.h>

const int XSHUT[] = {4, 5, 6};          // one GPIO per sensor
const uint8_t ADDR[] = {0x30, 0x31, 0x32};
VL53L0X sensor[3];

void setup() {
  Wire.begin();

  // 1. Hold every sensor in reset.
  for (int i = 0; i < 3; i++) { pinMode(XSHUT[i], OUTPUT); digitalWrite(XSHUT[i], LOW); }
  delay(10);

  // 2. Release one at a time and give each a new address before the next wakes.
  for (int i = 0; i < 3; i++) {
    digitalWrite(XSHUT[i], HIGH);
    delay(10);
    sensor[i].init();
    sensor[i].setAddress(ADDR[i]);      // now it is off 0x29 and the next can boot
    sensor[i].setTimeout(500);
  }
}

Две детали часто упускают: выводы должны удерживаться в состоянии LOW для сброса, а затем освобождаться; кроме того, всю последовательность необходимо повторять после каждого цикла питания, поскольку адреса не сохраняются. Некоторые платы расширения подтягивают XSHUT вверх встроенным резистором, поэтому простое оставление вывода неподключённым оставляет датчик включённым.

Бюджет времени: точность, скорость и дальность

У VL53L0X есть один параметр важнее остальных, и большинство примеров кода его не меняет. Бюджет времени определяет, сколько датчику разрешено накапливать фотоны для одного измерения, и задаёт компромисс между тремя величинами:

Бюджет времени Частота обновления Типичная дальность Лучшее применение
20 ms ~50 Hz ~0.8 m Быстрые контуры, ближний диапазон
33 ms (по умолчанию) ~30 Hz ~1.2 m Общее применение
66 ms ~15 Hz ~1.7 m Более высокая точность на расстоянии
200 ms ~5 Hz ~2 m Максимальная дальность, статичное измерение
sensor.setMeasurementTimingBudget(20000);   // microseconds

Существуют также режимы большой дальности и высокой точности, изменяющие порог частоты сигнала и периоды импульсов. Практическое правило: если дальности недостаточно, сначала увеличьте время, а не обвиняйте датчик. Бюджет 200 ms действительно удваивает рабочую дальность по сравнению с 20 ms.

Минимальный рабочий код

#include <Wire.h>
#include <VL53L0X.h>

VL53L0X sensor;

void setup() {
  Serial.begin(115200);
  Wire.begin();

  if (!sensor.init()) {
    Serial.println("VL53L0X not found");   // check wiring and XSHUT
    while (1) {}
  }
  sensor.setTimeout(500);
  sensor.setMeasurementTimingBudget(33000);
  sensor.startContinuous();
}

void loop() {
  uint16_t mm = sensor.readRangeContinuousMillimeters();

  if (sensor.timeoutOccurred()) {
    Serial.println("timeout");
  } else if (mm >= 8190) {
    Serial.println("out of range");        // 8190/8191 mean "no valid target"
  } else {
    Serial.println(mm);
  }
  delay(20);
}

8190 и 8191 не являются расстояниями. Это способ датчика сообщить, что пригодного отражения нет: либо перед ним ничего нет, либо цель слишком тёмная или слишком далёкая. Код, считающий 8191 равным 8.19 метра, будет странно вести себя в пустой комнате; код, считающий его нулём, включит аварийную остановку.

Чего он не может видеть

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

Условие Что происходит Почему
Чёрные матовые поверхности Дальность резко падает, часто до третьей Возвращается очень мало света 940 nm
Зеркала и полированный металл Показывает далеко или ничего Луч зеркально отражается в сторону, как свет от стекла
Прямой яркий солнечный свет Дальность падает Солнечный свет насыщен инфракрасным излучением 940 nm и подавляет отражение
Стекло Непредсказуемо считывает объект за ним или само стекло Частично пропускает и частично отражает
Ближе ~3–5 cm Ненадёжно Ниже минимальной рабочей дистанции датчика
Дальше ~1.2 m при настройках по умолчанию Срабатывает тайм-аут Сначала увеличьте бюджет времени, не делая вывод о неисправности

Особенно важно объяснить случай с солнцем, поскольку он самый неожиданный. VL53L0X, идеально работающий в помещении, может оказаться почти бесполезным в залитой солнцем зимней оранжерее, причём отказ развивается постепенно: дальность сокращается, а показания не становятся явно неверными.

Диагностика

Симптом Вероятная причина Исправление
init() завершается ошибкой Подключение или XSHUT удерживается на низком уровне Просканировать шину на 0x29; проверить высокий уровень или плавающее состояние, удерживаемое на высоком уровне XSHUT
Из двух датчиков работает только один Оба используют 0x29 При каждом запуске выполнять приведённую выше последовательность XSHUT
После цикла питания адреса пропали Они по замыслу не сохраняются Повторить назначение в setup()
Постоянно считываются 8190/8191 Нет пригодного отражения Проверить цвет, расстояние до цели и внешний свет
Дальность намного меньше 2 m Бюджет времени по умолчанию Увеличить до 100–200 ms
Работает в помещении, но не снаружи Внешний ИК (IR) от солнца Затенить датчик или использовать ультразвук на улице
Показания дрейфуют в течение минут Загрязнённое окно или температура Очистить отверстие; выполнить калибровку датчика
Иногда возникают аномальные значения Край цели или частичное отражение Применить медианную фильтрацию, как для любого дальномера

VL53L0X или что-то другое?

Деталь Дальность Особенность Когда выбирать
VL53L0X 5 cm – 2 m Дешёвый повсеместный вариант Точное измерение ближнего расстояния в помещении
VL53L1X 4 cm – 4 m Вдвое большая дальность, программируемая область интереса Нужна большая дальность или сужение поля зрения программно
VL6180X 5 mm – 20 cm Очень короткая дальность, также измеряет внешний свет Обнаружение промежутков и близости в масштабе сантиметров
HC-SR04 2 cm – 4 m Звук, широкий конус, библиотека не нужна Дешёвое, прощающее ошибки обнаружение препятствий; видит тёмные поверхности
Sharp GP2Y0A21 10–80 cm Аналоговая ИК-триангуляция, один вывод ADC I²C недоступен, а немонотонный выход приемлем

Особого внимания заслуживает VL53L1X: это почти по всем параметрам более совершенная взаимозаменяемая деталь, а программируемая область интереса позволяет сузить поле зрения программно — фактически направить луч без перемещения датчика. Если вы выбираете сегодня, а не используете имеющийся экземпляр, обычно выгоднее купить такой датчик.

Исследуйте граф

Используется в этих сборках

Проекты, учебные пути и симуляторы, в которых используется Датчик расстояния VL53L0X ToF.

Сравнение

Альтернативы

Вопросы

Датчик расстояния VL53L0X ToF: частые вопросы

Какова максимальная дальность VL53L0X?

Около 2 метра в стандартном режиме; некоторые платы снижают частоту обновления ради увеличения дальности. Максимальная точность достигается в ближнем диапазоне; дальше нескольких m или при ярком внешнем инфракрасном свете, например солнечном, показания становятся ненадёжными. Кроме того, есть ближняя слепая зона ниже примерно 5 cm.

Какие ограничения у VL53L0X?

По сравнению с ультразвуковым датчиком дальность невелика (~2 m); яркий солнечный свет, а также тёмные и зеркальные поверхности уменьшают её ещё сильнее. Кроме того, у всех датчиков одинаковый адрес I²C, поэтому для работы нескольких экземпляров потребуется приём XSHUT для переназначения адресов. Содержите маленькое окно чистым: пыль рассеивает луч.

Работает ли VL53L0X с чёрными поверхностями?

Плохо. Тёмные матовые поверхности поглощают инфракрасный лазер, поэтому отражение слабое, а рабочая дальность резко падает: чёрная стена считывается гораздо ближе к пределу датчика, чем белая. Глянцевые и зеркальные поверхности также вводят его в заблуждение, отражая луч в сторону от приёмника.

Что такое лазерный датчик расстояния VL53L0X?

Крошечный датчик времени пролёта, который измеряет расстояние светом вместо звука. Он излучает невидимый инфракрасный (IR) лазерный импульс 940 nm и измеряет время возвращения отражения, передавая по I²C узкий, быстрый результат с точностью до миллиметра.

Датчик времени пролёта или ультразвуковой — что лучше?

Датчик времени пролёта, например VL53L0X, имеет узкий луч и миллиметровую точность, поэтому воспринимает определённую точку и небольшие объекты, которые ультразвуковой датчик может пропустить. HC-SR04 дешевле, измеряет дальше, и его широкий конус помогает не пропускать препятствия. Используйте ToF для точности, а ультразвук — для дешёвого и прощающего ошибки обнаружения.

Дополнительные материалы

Источники