自动避障小车用超声波嫌测距慢、看不清小目标,很多人会升级到VL53L0X这款激光测距。它内部藏了一颗905纳米级的VCSEL激光发射器和单光子雪崩接收器,靠测量光子飞行时间(ToF)来算距离,不靠回声、不靠反射强度,好处是精准、快,还不太受环境光影响。单片用I2C两根线就能读,很适合做精准避障和定距悬停。这篇把它的接线、两米量程怎么用讲清楚。
VL53L0X引脚:VIN、GND、SDA、SCL加XSHUT
这类ToF模块体积很小,引脚不多:VIN(或VCC)供电、GND接地、SDA和SCL是I2C数据时钟线。个别板子还有XSHUT,这个脚是关断控制,低电平可以把传感器睡眠,平时悬空或接高电平即可,做多传感器阵列时才用它来复位和区分地址。供电范围一般2.8到5.5V,兼容Arduino的3.3V或5V,不同厂家丝印略有差异,接前看下板子标注最稳。

接线图:I2C四根线就走通
I2C接线最省心,把SDA接Arduino的A4、SCL接A5,VIN接5V或3.3V,GND共地即可。靠I2C的默认地址0x29就能被扫到。因为内部自己上拉,一般不需要额外接上拉电阻,但总线拉长了还是建议补两颗4.7K。装Adafruit_VL53L0X库后,初始化一行began()再readRange()就能读到毫米值。测量是直线对射式的,物体会反射的光斑,所以最好对准被测面。

代码:readRange读取毫米数
Adafruit库的用法很简单:include头文件,声明adafruit_vl53l0x对象,setup里initialize()初始化并打印状态,loop里用readRangeSingleMillimeters()读一次距离,返回值就是毫米整数。测量有效量程通常标称约2米,实际从约30毫米到2000毫米,超出量程或反射面太光滑系统会给一个255甚至溢出标记,代码里要根据超量程判断加个容错。它比超声波安静得多,对窄条、细线这类小物体照样能测。
常见坑:环境光和超高量程
虽然VL53L0X抗环境光不错,但正午太阳直射或对着镜面、玻璃这类强反光物,读数会不稳定,量程也会被压缩到一两米内。另外别看它叫激光,等级是Class 1,对人眼安全,不必慌张。它读得快、适合避障和定距,也支持多片并联时的地址改写,但I2C总线上地址若要区分就要用XSHUT,单独一片就省心多了。(来源:ITP接线示意、Makerguides量程参数)


高亮和镜面会影响读数,我一直以为激光就不怕光,实测确实会有波动
从30毫米到两米的量程记下来,超出范围它给默认值这个判断也得处理
激光直射对不上面这条提醒得好,放斜了读出的距离就没意义