Raspberry Pi 距离检测实战:在 IoT-For-Beginners 中驱动 VL53L0X 飞行时间传感器
【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners
本文基于 IoT-For-Beginners 开源课程
4-manufacturing/lessons/4-trigger-fruit-detector一课的 Raspberry Pi 章节整理而成,讲解如何为树莓派接入 Grove Time of Flight(飞行时间)距离传感器并读取距离数据。该能力是"水果品质检测器"原型中"用接近传感器触发拍照分类"环节的第一步,读完本文你将掌握 VL53L0X 传感器在树莓派上的接线方法、rpi-vl53l0xPython 库的安装与调用,以及完整的可运行示例代码。
为什么需要接近传感器
在完整的 IoT 应用中,系统往往由多个设备协同工作:传感器采集物理世界数据、云服务分析决策、执行器或可视化做出响应。4-manufacturing项目的最后一课 触发水果品质检测 就围绕"水果在传送带上到达指定位置后自动拍照、调用图像分类模型判断成熟度"这一场景展开。
其中,接近传感器(proximity sensor)承担触发器的角色:它通过发射激光或红外光束并计算光束被物体反射回来的时间,来测量传感器到物体之间的距离。当水果到达传送带上的正确位置时,距离值发生明显变化,设备据此判断"水果已就位",进而触发后续的拍照与分类流程。这也是智能手机"贴近耳朵时关闭屏幕"所用的同类技术。
硬件:Grove Time of Flight 距离传感器
树莓派需要外接一个接近传感器。本课选用的是 Seeed 的Grove Time of Flight distance sensor(基于 ST 的 VL53L0X 芯片),要点如下:
| 特性 | 说明 |
|---|---|
| 测距原理 | 激光测距模块(laser ranging module),通过激光往返时间计算距离 |
| 测量范围 | 10mm ~ 2000mm(即 1cm ~ 2m),范围内读数较为准确 |
| 超范围行为 | 距离超过 1000mm 时,读数会报告为8109mm(用于标识"超出有效范围") |
| 通信接口 | I²C 总线传感器,地址硬编码为0x29 |
| 朝向注意 | 激光测距模块位于传感器背面,即与 Grove 插座相反的一侧 |
接线:将传感器连接到 Grove Base Hat
连接步骤非常简单,全程只需要一根 Grove 线缆:
- 将 Grove 线缆的一端插入距离传感器的插座——该插座只有一个方向能插入;
- 在树莓派断电的状态下,将线缆另一端插入 Grove Base Hat 上标记为I²C的插座。这些插座位于底座的最下一排,与 GPIO 引脚相对的一端,紧邻摄像头排线插槽。
接线完成后即可给树莓派上电并等待系统启动。需要说明的是,Grove Base Hat 通过 I²C 与树莓派的 GPIO 通信,VL53L0X 芯片在硬件上固定使用
0x29地址,因此无需额外配置地址。
编程:安装 rpi-vl53l0x 并读取距离
树莓派端使用 Python 编程。完整的可用代码已收录在本仓库的 code-proximity/pi/fruit-quality-detector/distance_sensor.py 中,下面按原课程的实操步骤逐步还原。
第一步:安装依赖包
在树莓派上(直接在设备上,或通过 VS Code 的 Remote SSH 扩展连接)打开fruit-quality-detector项目,然后安装rpi-vl53l0xPip 包——这是一个专门与 VL53L0X 飞行时间距离传感器交互的 Python 包:
pip install rpi-vl53l0x第二步:创建脚本文件
在项目中新建distance-sensor.py。课程特别提示:模拟多台 IoT 设备的一个简单方法,就是把每台"设备"各自放在一个独立的 Python 文件中,然后同时运行它们——本课后续正是用这种方式让树莓派同时扮演"接近传感器设备"与"摄像头设备"。
第三步:导入依赖
import time from grove.i2c import Bus from rpi_vl53l0x.vl53l0x import VL53L0Xgrove.i2c.Bus来自 Grove I²C 总线库,用于访问树莓派上的 I²C 总线;rpi_vl53l0x.vl53l0x.VL53L0X是 Grove Time of Flight 传感器内部核心芯片(VL53L0X)的驱动库。
第四步:初始化传感器
distance_sensor = VL53L0X(bus = Bus().bus) distance_sensor.begin()第一行通过 Grove I²C 总线声明一个距离传感器实例,第二行调用begin()启动传感器。
第五步:编写无限读取循环
while True: distance_sensor.wait_ready() print(f'Distance = {distance_sensor.get_distance()} mm') time.sleep(1)循环的逻辑是:先调用wait_ready()等待传感器产生一个可读的测量值,再通过get_distance()取出距离(单位毫米)打印到控制台,最后sleep(1)让每秒采样一次。仓库中的 distance_sensor.py 与上述代码逐行一致,可直接对照阅读。
第六步:运行并验证
运行该文件(注意文件名是distance-sensor.py,不要误用app.py):
python3 distance_sensor.py在传感器前方摆放物体即可看到距离读数变化:
pi@raspberrypi:~/fruit-quality-detector $ python3 distance_sensor.py Distance = 29 mm Distance = 28 mm Distance = 30 mm Distance = 151 mm⚠️ 激光测距模块在传感器背面,测量距离时请务必使用正确的一侧朝向被测物体。
从单设备到多设备:如何模拟多台 IoT 设备
本课原型需要多台"设备"协同工作:接近传感器检测水果到达、摄像头设备拍照分类、LED 设备告警。由于树莓派属于单板计算机(Single Board Computer),可以同时运行多个应用程序,因此模拟多台 IoT 设备的方式就是为每台设备写一个独立的 Python 文件,再在不同终端会话中同时运行它们——这正是本课把代码拆成独立文件的原因。
与之相对,微控制器(如 Wio Terminal)无法同时运行多个应用,需要在单个程序中用类(如DistanceSensor、ClassifierCamera、LEDController)组织各设备的逻辑,并在主loop中用计数器协调不同设备的不同处理周期。课程在 README 的 "Using developer devices to simulate multiple IoT devices" 一节 有详细说明。
其他硬件路径对照
同一课还提供了另外两条硬件路径,思路一致、API 高度相似,可按手头设备选用:
- Wio Terminal(微控制器):使用 PlatformIO 工程,通过
seeed-studio/Grove Ranging sensor - VL53L0X @ ^1.1.1库依赖和Seeed_vl53l0x类完成测距,完整工程见 code-proximity/wio-terminal/distance-sensor,其 main.cpp 使用PerformSingleRangingMeasurement单次测距并打印RangeMilliMeter字段,每 1000ms 采样一次; - 虚拟 IoT 设备(无硬件):通过 CounterFit 应用添加一个 I²C 地址为
0x29的Distance传感器,安装counterfit-shims-rpi-vl53l0xshim 包,以VL53L0X()无参方式初始化(因为 shim 会接管总线模拟),对应代码见 code-proximity/virtual-iot-device/fruit-quality-detector/distance_sensor.py。
距离数据如何融入完整流程
传感器读出的距离值并不是终点。在水果品质检测的参考架构(见 README 中 "Design a fruit quality control system" 一节)中,距离数据会被进一步用于触发拍照与分类:设备端需要判断"距离是否足够近"并发送触发消息,还是把原始距离全部上报云端由 IoT Hub 决策——这需要在"消息成本"与"设备可配置性"之间权衡,是架构设计阶段就要定义好的消息结构与决策点。本课原型后续会在此基础上接入 IoT Hub 与图像分类,构建出完整的多设备链路。
【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考