
IoT-For-Beginners 制造篇使用 Wio Terminal 与 Grove VL53L0X 飞行时间传感器实现接近检测【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners本指南讲解如何在 IoT-For-Beginners 开源课程从传感器触发水果质量检测第 4 制造项目第 4 课中为 Wio Terminal 添加 Grove Time of Flight飞行时间接近传感器并通过 PlatformIO 编程读取物体距离。完成本文后你将掌握 VL53L0X 传感器的硬件连接、I²C 通信初始化、单次测距 API 调用与串口验证方法为后续用距离触发水果图像分类打下基础。硬件准备Grove Time of Flight 距离传感器本任务使用的接近传感器是 Grove Time of Flight 距离传感器型号 VL53L0X。其核心是一个激光测距模块通过发射激光束并测量光束从物体反射回来所用的时间来计算传感器与物体之间的距离。根据 wio-terminal-proximity.md 中的说明该传感器具有以下关键特性特性参数测量原理激光测距Time of Flight飞行时间测量范围10mm ~ 2000mm即 1cm ~ 2m超量程表现距离超过 1000mm 时报告为 8109mm通信协议I²CI2C激光测距模块位置传感器背面与 Grove 插座的相反一侧值得注意的是传感器报告的值在量程内相当准确但超出量程后会返回固定的 8109mm 值在编写业务逻辑时应将其视为超出有效测量范围的哨兵值。传感器实物图可参考 images/grove-time-of-flight-sensor.png激光测距模块位于传感器背面测量时应让该面朝向被测物体。在课程整体设计中这个接近传感器正是水果质量检测系统的触发器水果在传送带上到达指定位置时传感器测得距离变化从而触发后续的拍照与图像分类流程。关于该端到端原型系统的架构说明可阅读第 4 课总览 README.md。连接 Time of Flight 传感器到 Wio TerminalGrove Time of Flight 传感器通过 Grove 线缆与 Wio Terminal 连接步骤非常简单但需要注意正确的插槽与方向。将 Grove 线缆的一端插入 Time of Flight 传感器上的插座。该插座只有一个方向能插入无需担心插反。在 Wio Terminal断开电源拔掉与电脑或其他电源的连接的状态下将 Grove 线缆的另一端连接到 Wio Terminal 正对屏幕时左侧的 Grove 插座。这是离电源按键最近的插座是一个数字信号与 I²C 复合插座——由于 VL53L0X 是 I²C 传感器必须接到这个支持 I²C 的复合插座上。连接完成后即可将 Wio Terminal 重新连接到电脑。连接示意图可参考 images/wio-time-of-flight-sensor.png。使用 PlatformIO 创建工程并添加传感器库Wio Terminal 使用 PlatformIO 进行开发。需要新建一个名为distance-sensor的 Wio Terminal 工程并在工程的platformio.ini文件中声明 Seeed 官方提供的 VL53L0X 库依赖。仓库中提供了完整可运行代码位于 code-proximity/wio-terminal/distance-sensor 目录。其 platformio.ini 内容如下[env:seeed_wio_terminal] platform atmelsam board seeed_wio_terminal framework arduino lib_deps seeed-studio/Grove Ranging sensor - VL53L0X ^1.1.1配置项说明platform atmelsamWio Terminal 基于 Atmel SAMD51 系列微控制器使用 atmelsam 平台board seeed_wio_terminal指定目标开发板型号framework arduino使用 Arduino 框架进行编程lib_deps声明 Seeed Studio 的 Grove 测距传感器库seeed-studio/Grove Ranging sensor - VL53L0X ^1.1.1版本号采用^1.1.1语义化版本范围允许安装 1.1.1 及以上、低于 2.0.0 的兼容版本。编写代码初始化传感器并读取距离引入头文件并声明传感器实例在工程src/main.cpp中首先在已有的 include 指令下方引入 VL53L0X 库头文件并声明一个Seeed_vl53l0x类的全局实例后续所有传感器操作都通过该实例完成#include Arduino.h #include Seeed_vl53l0x.h Seeed_vl53l0x VL53L0X;在 setup 中配置串口并初始化传感器setup函数负责串口初始化和传感器初始化。仓库源码 main.cpp 中的完整实现为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(); }关键点说明Serial.begin(9600)将串口波特率配置为 9600用于后续向串口监视器输出测距结果while (!Serial);等待串口就绪避免初始化后立即输出时数据丢失delay(1000)等待 1 秒给传感器上电稳定时间VL53L0X_common_init()执行传感器的通用初始化完成 I²C 总线上的基础配置VL53L0X_high_accuracy_ranging_init()切换到高精度测距模式。与普通模式相比高精度模式会调整激光测距的测量参数以获得更精确的距离读数代价通常是更长的单次测量时间。在水果检测场景中精度优先于吞吐量因此选择该模式。在 loop 中执行单次测距并输出结果loop函数循环执行单次测距、输出结果并延时 1 秒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); }代码逻辑逐行解读首先定义一个VL53L0X_RangingMeasurementData_t类型的结构体变量用于承接测距数据memset(RangingMeasurementData, 0, sizeof(...))将结构体内存清零确保未填充字段不会携带脏数据调用PerformSingleRangingMeasurement(RangingMeasurementData)该方法执行一次完整的单次测距并把结果写入传入的结构体通过RangingMeasurementData.RangeMilliMeter读取以毫米为单位的距离值并用Serial.print/Serial.println输出Distance xxx mm格式的文本delay(1000)让测距循环以约 1 秒的间隔运行。需要留意的是测距结构体中的RangeMilliMeter字段单位为毫米输出时直接拼接mm后缀。若需在后续代码中判断是否有物体接近可结合量程上限2000mm与超量程哨兵值8109mm编写阈值逻辑。编译、烧录与串口验证在 PlatformIO 中构建并上传代码到 Wio Terminal然后打开串口监视器即可实时查看距离读数。将物体例如课程示例中的香蕉靠近传感器会看到读数随之变化Distance 29 mm Distance 28 mm Distance 30 mm Distance 151 mm验证时需要注意两点激光测距模块位于传感器背面与 Grove 插座相反的一侧测量距离时务必让背面朝向被测物体距离传感器正对水果测量时的实物效果可参考 images/time-of-flight-banana.png。从上面的输出可以看到当物体稳定在传感器前方时读数保持稳定29mm / 28mm / 30mm当物体移开或距离变化时读数立即更新151mm这正是后续用距离阈值触发水果图像分类所依赖的信号。在水果质量检测系统中的角色本任务属于第 4 课从传感器触发水果质量检测中的硬件实操部分课程同时提供了 Raspberry Pi 与虚拟设备两种替代实现分别见 pi-proximity.md 与 virtual-device-proximity.md。在课程设计的水果质检参考架构中装有接近传感器的 IoT 设备检测到水果到达传送带向云端发送已检测到水果的消息云端 Serverless 应用向另一台设备发送拍照与图像分类命令分类结果回传云端存储若判定为未成熟水果则向带 LED 的设备发送告警命令。因此本文实现的测距程序正是整个原型系统触发链的第一环。在工程实践中还需考虑距离阈值判定放在设备端还是云端、消息字段与单位的统一定义、以及量产时通过云端如设备孪生动态配置触发距离而非硬编码等问题详见课程总览 README.md 中的触发水果质量检测与数据定义章节。常见问题排查串口无输出确认Serial.begin(9600)的波特率与串口监视器设置一致确认 USB 连接正常且while (!Serial);已通过。读数始终为 8109mm表示距离超出量程或未检测到反射物请将物体移到 2m 有效量程内并确认激光测距模块传感器背面正对物体。读数始终为 0检查 Grove 线缆是否插紧以及传感器是否连接到了 Wio Terminal 左侧的复合数字/I²C 插座。构建失败确认platformio.ini中lib_deps的库名称与版本号写法与仓库示例一致seeed-studio/Grove Ranging sensor - VL53L0X ^1.1.1并确认网络可正常拉取 PlatformIO 依赖库。参考代码位置完整可运行的工程代码位于 code-proximity/wio-terminal/distance-sensor 目录其中主要逻辑src/main.cpp工程配置platformio.ini课程总览、Raspberry Pi 实现与虚拟设备实现分别位于 README.md、pi-proximity.md 和 virtual-device-proximity.md可作为扩展学习入口。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考