构建 Arduino 激光雷达系统:VL6180X ToF 传感器 + 舵机扫描
元器件与物料
| 元器件 | 数量 | 备注 |
|---|---|---|
| Arduino UNO | 1 | 主控制器 |
| SparkFun ToF 测距传感器 - VL6180X | 1 | 短距测距;长距可选 VL53L0X |
| 舵机 (通用) | 1 | 驱动传感器旋转扫描 |
软件与在线服务
- Arduino IDE
- Processing (可视化界面)
项目简介
关于 LiDAR 的基础知识
LiDAR (光探测与测距) 通过发射激光脉冲并测量回波时间来确定目标距离。广泛应用于机器人环境感知、物体分类、地形测绘及自主着陆导航。核心组件:发射器 (激光)、接收器 (光电二极管)、机械扫描机构 (旋转镜/点头镜)。
测距原理主要有两种:
1. 直接飞行时间 (ToF):发射脉冲激光,测量往返时间。需皮秒级电子器件,成本高。
2. 相位差法:发射调制连续波,测量发射/反射光相位差。公式:D = τ × θ / 4π (τ 为调制波长,θ 为相位差)。
VL6180X / VL53L0X 是 ST 意法半导体的 ToF 传感器,手机自动对焦即用此技术。VL53L0X 精度更高、无线性问题、无「双重成像」模糊。本项目用 VL6180X 实现 180° 扫描,生成 2D 环境地图,用于毕业设计自主导航车辆。优于超声波:感知锥角极窄、速度快、精度高。
电路图
安装 Adafruit VL6180X 库
在 Arduino IDE 库管理器搜索「Adafruit VL6180X」安装。
Arduino 代码
#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() {
// 0° 到 180° 扫描,步进 0.5°
for (pos = 0; pos <= 180; pos += 0.5) {
myservo.write(pos);
uint8_t range = vl.readRange(); // 读取距离 (mm)
// 格式: 距离 p 角度(弧度) p 角度(度)
Serial.println(String(range) + "p" + String(pos * Pi / 180) + "p" + String(pos));
delay(10);
}
// 可选:回扫代码已注释
myservo.write(0);
delay(2000); // 复位等待
}
Processing 可视化代码
运行前修改 portName 为实际 Arduino 串口 (如 "COM3"):
import processing.serial.*;
Serial myPort;
String val;
int range, i = 0;
float pos;
void setup() {
size(550, 500);
frameRate(36);
String portName = "COMx"; // 修改此处
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 Hz,舵机高速响应差。如需高速 LiDAR,建议改用步进电机/带编码器直流电机 + 导电滑环 (Adafruit #736) 实现连续 360° 旋转。
欢迎提问与建议!
代码
- Arduino 代码 (见上文)
- Processing 代码 (见上文)
原理图
见上文「电路图」章节。
制造工艺