元器件 · 传感器

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
室内好室外跪 阳光环境红外 遮光,或室外用超声
几分钟内读数漂 窗口脏或温度 擦孔;跑传感器校准
偶发离谱值 目标边缘或部分反射 中值滤波,和任何测距传感器一样

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 更便宜,量程更远,而它宽阔的声锥反而有助于不漏掉障碍物。追求精度就用飞行时间传感器,要便宜、容错的检测就用超声波。

延伸阅读

参考资料