Построение LIDAR-системы на Arduino с VL6180X и сервоприводом
Компоненты и материалы
- Arduino UNO — 1 шт.
- ToF-датчик расстояния VL6180X (SparkFun) — 1 шт. (для ближнего диапазона; VL53L0X — для дальнего)
- Сервопривод (стандартный, например SG90/MG995) — 1 шт.
Программное обеспечение
- Arduino IDE
- Processing — для визуализации радара на ПК
О проекте
Кратко о LiDAR
LIDAR (Light Detection and Ranging) — оптическая система дистанционного зондирования, измеряющая расстояние до объекта за счет времени полета светового импульса (Time-of-Flight, ToF). Применяется в робототехнике для картирования окружения и классификации объектов.
Принцип: передатчик излучает лазерный луч, приемник фиксирует отраженный сигнал. Расчет расстояния по фазовому сдвигу или прямому замеру времени полета. Механизм (зеркало или вращающийся датчик) сканирует пространство в плоскости или 3D.
Датчики VL6180X / VL53L0X (STMicroelectronics) используют ToF с фазовой модуляцией. Они компактны, дешевы и применяются в смартфонах для автофокуса камеры. VL53L0X точнее и дальномернее, VL6180X — для ближнего диапазона (до ~10-20 см).
Автору нужен 2D-сканер для автономного робота — LiDAR выбран за скорость и узкий луч (в отличие от сонаров).
Схема подключения
Установка библиотеки Adafruit
Код Arduino (скетч)
Сервопривод поворачивается от 0° до 180° с шагом 0.5°. На каждой позиции считывается расстояние (0-255) и отправляется в Serial в формате: range p angle_rad p angle_deg (разделитель «p»).
#include <Wire.h>
#include "Adafruit_VL6180X.h"
#include <Servo.h>
Adafruit_VL6180X vl = Adafruit_VL6180X();
Servo myservo;
float pos = 0;
const float Pi = 3.14159;
void setup() {
myservo.attach(9);
Serial.begin(115200);
while (!Serial) delay(1);
if (!vl.begin()) while (1); // Остановка если датчик не найден
}
void loop() {
for (pos = 0; pos <= 180; pos += 0.5) {
myservo.write(pos);
uint8_t range = vl.readRange();
Serial.println(String(range) + "p" + String(pos * Pi / 180) + "p" + String(pos));
delay(10);
}
myservo.write(0);
delay(2000); // Пауза перед следующим сканом
}
Код Processing (визуализация)
Запускается на компьютере, подключенном к Arduino по USB. Не забудьте поменять COMx на свой порт.
import processing.serial.*;
Serial myPort;
String val;
int range, i = 0;
float pos;
void setup() {
size(550, 500);
frameRate(36);
String portName = "COM3"; // ВАШ ПОРТ!
myPort = new Serial(this, portName, 115200);
background(255);
}
void draw() {
if (myPort.available() > 0) {
val = myPort.readStringUntil('\n');
if (val != null) {
String[] nums = split(val, "p");
if (nums.length == 3) {
range = int(nums[0]);
pos = float(nums[1]);
i = int(nums[2]);
if (i == 180) background(255); // Очистка экрана в конце скана
}
}
}
translate(25, -50);
line(250, 500, 250 - 2 * (range * cos(pos)), 500 - 2 * (range * sin(pos)));
}
Ограничения и улучшения
- Скорость датчика ограничена ~10 Гц, сервопривод инерционен. Для высокоскоростного LiDAR используйте шаговый двигатель или DC-мотор с энкодером.
- Для непрерывного вращения 360° нужны контактные кольца (slip rings), например Adafruit 736.
- Можно улучшить интерфейс Processing (добавить сетку, масштаб, цветовую кодировку расстояния).
Вопросы и предложения приветствуются!
Производственный процесс
- Газовые фонари: эволюция, дизайн и современное производство
- Лазерный указатель: дизайн, производство и обзор безопасности
- Фонарик: от изобретения к современным инновациям
- Калейдоскоп: от науки Брюстера к современному дизайну
- Полупроводниковые лазеры: точное генерирование света для современных технологий
- Искусство и наука фотографических процессов: от dageерротипов к современной пленке
- Светофоры: инженерия, история и будущие инновации
- От огня к нити накаливания: эволюция и производство современной лампы накаливания
- Оптоволокно: технологии, производство и перспективы
- Kodiak 3D LiDAR: Точная космическая дальномерность для миссий на высоких орбитах