IoT-For-Beginners 实战:在 Wio Terminal 上用 VL53L0X 飞行时间传感器实现距离检测
【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners
导读
本文是 Microsoft IoT-For-Beginners 课程(12 周、24 课)第 18 课「由传感器触发水果质检」中面向 Wio Terminal 硬件平台的实操指南。你将学会如何把 Grove Time of Flight(ToF)激光测距传感器连接到 Wio Terminal,并通过 PlatformIO 工程读取毫米级距离数据,为后续「距离达到阈值 → 触发摄像头拍摄 → 边缘 AI 质检水果成熟度」的完整 IoT 应用打下触发层基础。读完本文,你将掌握 VL53L0X 传感器的 I²C 接线、Seeed_vl53l0x库的初始化与单次测距调用,以及串口打印与调试方法。
硬件:Grove Time of Flight 距离传感器
在水果质检原型中,设备需要一种「触发器」来判断水果是否到达传送带上的正确位置——最常见的方式就是测量水果与传感器之间的距离。课程所选的传感器是 Grove Time of Flight distance sensor(VL53L0X):
- 采用激光测距模块(laser ranging module)测量距离,属于飞行时间(Time of Flight)原理:发射激光束并检测反射信号,根据光束发出与反射返回的时间差计算出物体距离;
- 量程为 10 mm 至 2000 mm(1 cm - 2 m),在该范围内可提供相当精确的读数;
- 距离超过 1000 mm 时,传感器会统一上报为8109 mm,可据此判断「前方无有效物体」;
- 该传感器是I²C 接口设备(在虚拟硬件场景中其地址固定为
0x29,参见 虚拟设备文档); - 激光测距器位于传感器背面,与 Grove 插座相对的一侧,测量时务必使用正确的一面朝向被测物体。
连接 ToF 传感器到 Wio Terminal
接线步骤非常直接,Grove 线缆有防反插设计:
- 将 Grove 线缆的一端插入 ToF 传感器上的插座,线缆只有一个方向能插入;
- 在 Wio Terminal 与电脑或其他电源断开的情况下,将 Grove 线缆另一端插入 Wio Terminal 的左侧 Grove 插座(正对屏幕观看时的左手边)。该插座离电源按钮最近,是一个数字 / I²C 复合插座;
- 接线完成后即可将 Wio Terminal 连接到电脑。
接线时保持 Wio Terminal 断电,是避免热插拔造成 GPIO / I²C 总线损坏的常规安全操作。
用 PlatformIO 创建 distance-sensor 工程
Wio Terminal 的程序基于 Arduino 框架编写,官方推荐使用 VS Code + PlatformIO 进行构建、烧录和串口调试。课程仓库中提供了完整可运行的示例工程,位于 code-proximity/wio-terminal/distance-sensor,包含platformio.ini、src/main.cpp以及标准的include/、lib/、test/目录骨架。
工程配置:platformio.ini
新建一个名为distance-sensor的 Wio Terminal 项目后,在platformio.ini中添加 Seeed 官方的 VL53L0X 库依赖。仓库中的实际配置如下:
[env:seeed_wio_terminal] platform = atmelsam board = seeed_wio_terminal framework = arduino lib_deps = seeed-studio/Grove Ranging sensor - VL53L0X @ ^1.1.1关键参数说明:
| 配置项 | 值 | 说明 |
|---|---|---|
platform | atmelsam | Wio Terminal 基于 Microchip SAMD51 系列 MCU,使用 Atmel SAM 平台支持 |
board | seeed_wio_terminal | PlatformIO 对 Wio Terminal 的板级定义 |
framework | arduino | 采用 Arduino 框架编写固件 |
lib_deps | seeed-studio/Grove Ranging sensor - VL53L0X @ ^1.1.1 | Seeed 官方 VL53L0X 测距库,^1.1.1表示兼容 1.1.1 及以上且不跨大版本的版本范围 |
主程序:main.cpp 完整实现
src/main.cpp是本文讲解的核心。先看仓库中的完整代码,再逐段拆解:
#include <Arduino.h> #include "Seeed_vl53l0x.h" Seeed_vl53l0x VL53L0X; void setup() { Serial.begin(9600); while (!Serial) ; // Wait for Serial to be ready delay(1000); VL53L0X.VL53L0X_common_init(); VL53L0X.VL53L0X_high_accuracy_ranging_init(); } void loop() { VL53L0X_RangingMeasurementData_t RangingMeasurementData; memset(&RangingMeasurementData, 0, sizeof(VL53L0X_RangingMeasurementData_t)); VL53L0X.PerformSingleRangingMeasurement(&RangingMeasurementData); Serial.print("Distance = "); Serial.print(RangingMeasurementData.RangeMilliMeter); Serial.println(" mm"); delay(1000); }1. 声明全局传感器实例
在 include 指令下方,引入Seeed_vl53l0x.h头文件并声明一个全局实例,供setup与loop共用:
#include "Seeed_vl53l0x.h" Seeed_vl53l0x VL53L0X;2. setup:串口初始化 + 传感器初始化
在setup函数中,先用Serial.begin(9600)配置串口波特率(对照仓库代码可看到它同时还等待串口就绪并延时 1 秒),随后调用两个初始化方法:
VL53L0X.VL53L0X_common_init(); VL53L0X.VL53L0X_high_accuracy_ranging_init();VL53L0X_common_init():执行 I²C 总线探测与传感器基础配置;VL53L0X_high_accuracy_ranging_init():将传感器切换到高精度测距模式。高精度模式以更长测量时间为代价换取更稳定的毫米级读数,正适合水果质检这种对距离精度敏感的触发场景。
3. loop:单次测距并输出
loop中首先初始化一个VL53L0X_RangingMeasurementData_t类型的数据结构(memset清零),然后调用PerformSingleRangingMeasurement将测距结果填入该结构:
VL53L0X_RangingMeasurementData_t RangingMeasurementData; memset(&RangingMeasurementData, 0, sizeof(VL53L0X_RangingMeasurementData_t)); VL53L0X.PerformSingleRangingMeasurement(&RangingMeasurementData);测量结果存储在结构体的RangeMilliMeter字段中(单位为毫米),随后通过串口打印,并在循环末尾延时 1 秒,使采样频率约为每秒 1 次:
Serial.print("Distance = "); Serial.print(RangingMeasurementData.RangeMilliMeter); Serial.println(" mm"); delay(1000);编译、烧录与运行验证
在 VS Code 中打开 PlatformIO 工程,使用「Build」编译、「Upload」烧录到 Wio Terminal,然后打开 Serial Monitor(波特率 9600),将物体移近传感器即可看到距离读数变化。典型输出如下:
Distance = 29 mm Distance = 28 mm Distance = 30 mm Distance = 151 mm几点实践提示:
- 注意测距方向:激光测距器位于传感器背面(与 Grove 插座相反的一侧),测量时需让背面朝向被测物体,否则会得到错误的读数;
- 注意量程边界:量程为 10 mm - 2000 mm,超出 1000 mm 的物体统一上报 8109 mm,可将其作为「无物体」信号处理;
- 调试技巧:Serial Monitor 是验证传感器接线、I²C 通信与测距逻辑的最直接手段,后续集成触发逻辑时也建议保留串口打印。
从距离检测到水果质检触发:本课的上下文
本文档是整个「由传感器触发水果质检」课程(课程 README)的一个实操分支,课程仓库针对同一任务提供了三条实现路线,可对照学习:
- Wio Terminal(本文,Arduino 微控制器)
- Raspberry Pi(单板计算机)
- 虚拟 IoT 设备(CounterFit 模拟 VL53L0X)
在课程设计的原型架构中,距离传感器的角色是Things 层的关键触发源:当检测到水果到达传送带设定位置时,云端 serverless 应用(Insights)向摄像头设备发送指令拍照并用边缘/云端图像分类模型判断成熟度,若判定为未成熟再通过 LED 等执行器告警(Actions)。三种路线的对照也体现了重要的架构决策点——「在哪里做触发判断」:是设备端把距离阈值判断下放(可调参、省带宽、减少 IoT Hub 消息量与设备功耗),还是把距离数据全部上云由云端决策(便于统一管理但消息量更大)。本文档实现的毫米级测距输出,正是这些后续架构讨论的第一手数据来源。
小结
通过本文,你已经在 Wio Terminal 上完成了 Grove VL53L0X 飞行时间传感器的接线、PlatformIO 工程配置与Seeed_vl53l0x库的初始化、单次测距与串口输出,并理解了它在水果质检原型中作为触发器的角色定位。完整的可运行示例位于 code-proximity/wio-terminal/distance-sensor,你可以直接打开参考或在此基础上继续实现距离阈值触发逻辑,把测距结果接入云端的 IoT Hub 消息流。
【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考