元器件 · 传感器
VL53L0X ToF 激光测距传感器
VL53L0X 用激光而不是声音来测距:光束窄、响应快、精度可达毫米级,通过 I²C 读取,很适合需要精确测距的机器人。
它是什么
VL53L0X 像激光测距仪一样测距——用光而不用声音。打出不可见红外激光脉冲,计时往返,经 I²C 给出又窄又快、毫米级准的读数。HC-SR04 感知的是散布在几厘米范围内的宽声锥,VL53L0X 感知的则是精确的窄点——“大概有多远”不够用的时候,就该请它出场。
工作原理
封装里有两个孔:激光发射器和 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 |
| 室内好室外跪 | 阳光环境红外 | 遮光,或室外用超声 |
| 几分钟内读数漂 | 窗口脏或温度 | 擦孔;跑传感器校准 |
| 偶发离谱值 | 目标边缘或部分反射 | 中值滤波,和任何测距传感器一样 |
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 米——有些板子会牺牲更新率来换取更远的量程。它在近距离段最准确;超过两米左右,或者在阳光这类强烈的环境红外下,读数就会变得不可靠。它在约 5 cm 以内还有一段近距离盲区。
VL53L0X 有哪些局限?
与超声波传感器相比,它的量程较短(约 2 m),强烈的阳光以及深色或镜面般的表面还会让量程进一步缩短;而且每颗传感器出厂时的 I²C 地址都相同——所以要同时使用好几颗,就得用 XSHUT 技巧重新分配地址。还要保持那扇小窗口干净,灰尘会散射光束。
VL53L0X 在黑色表面上能用吗?
效果很差。深色哑光表面会吸收红外激光,反射很弱,可用量程急剧下降——同样距离的一面黑墙,比白墙更接近传感器的量程极限。光亮或镜面般的表面也会让它出错,因为光束会被反射到偏离接收器的方向。
VL53L0X 激光测距传感器是什么?
一种用光而不是声音来测量距离的微型飞行时间传感器。它发射一个不可见的 940 nm 红外激光脉冲,计时反射光返回所需的时间,通过 I²C 给出窄束、快速、精确到毫米的读数。
飞行时间和超声波,哪个更好?
VL53L0X 这样的飞行时间传感器光束窄、精度达毫米级,因此能测量一个特定的点,还能发现超声波传感器会漏掉的小物体。HC-SR04 更便宜,量程更远,而它宽阔的声锥反而有助于不漏掉障碍物。追求精度就用飞行时间传感器,要便宜、容错的检测就用超声波。
延伸阅读