學習目標
- ✓理解 ToF 飛行時間與多區域量測概念。
- ✓使用 0x29 初始化並更新 8×8 距離資料。
- ✓比較中央、最短與指定區域的距離。
SENSOR / VL53L5CX
VL53L5CX 是 ST 的多區域 ToF 距離感測器,能以 8×8 區域回傳距離。本課使用桃園版 Blockly 的更新、中央距離、最短距離與指定區域積木,練習把距離資料轉成障礙物提示。
先確認這一課要學會什麼,以及桌面上需要哪些材料。
感測器發出近紅外光並計算反射光回來的時間,再把視野切成最多 64 個區域。資料是距離,不是影像色彩;每一格都要留意無效值與量測範圍。
接妥 3.3V、GND、SDA、SCL,確認位址為 0x29。
設定解析度並開始 ranging,等待資料可用。
從 64 格取出中央或最短距離,用來判斷前方障礙。
指定區域編號由左上角第 1 格到第 64 格;程式內部索引是 0 到 63。
VL53L5CX 是 I2C 模組,UNO 以 A4/A5 連接;請依轉接板標示使用 3.3V 或可接受的 VIN。
| 模組腳位 | 接到控制板 | 訊號方向 | 檢查重點 |
|---|---|---|---|
| VIN/VCC | 依轉接板規格 | 電源 | 裸晶片與有穩壓的 breakout 供電要求不同。 |
| GND | GND | 地線 | 所有裝置要共地。 |
| SDA | A4 / SDA | I2C 資料 | UNO 的 SDA。 |
| SCL | A5 / SCL | I2C 時脈 | UNO 的 SCL,範例使用 400 kHz。 |
已將 4 條線路依同一筆資料逐列對齊;電壓仍須依手上模組版本確認。
積木名稱與型別以桃園版 Blockly 現行程式為準,不以通用積木替代。
playrobot_vl53l5cx_setup設定 I2C 位址 0x29 並啟動感測器。
位置:感測器 → 距離感測器 → VL53L5CX 8×8 ToF 影像playrobot_vl53l5cx_update讀取一筆新的感測資料。
位置:感測器 → 距離感測器 → VL53L5CX 8×8 ToF 影像playrobot_vl53l5cx_center_distance讀取中央四格的平均距離。
位置:感測器 → 距離感測器 → VL53L5CX 8×8 ToF 影像playrobot_vl53l5cx_min_distance找出有效區域中的最近物體。
位置:感測器 → 距離感測器 → VL53L5CX 8×8 ToF 影像playrobot_vl53l5cx_point_distance用 ZONE 選取 1~64 的區域。
位置:感測器 → 距離感測器 → VL53L5CX 8×8 ToF 影像playrobot_vl53l5cx_data_ready確認新資料是否已準備好。
位置:感測器 → 距離感測器 → VL53L5CX 8×8 ToF 影像當中央距離小於門檻時,讓序列埠顯示「靠近」,練習把距離資料接到條件判斷。
playrobot_vl53l5cx_setuparduino_delayplayrobot_vl53l5cx_updateplayrobot_vl53l5cx_center_distancearduino_serial_printplayrobot_vl53l5cx_setuparduino_delayplayrobot_vl53l5cx_updateplayrobot_vl53l5cx_center_distancearduino_serial_print把紙盒放在模組正前方,觀察中央平均距離。
為什麼:中央區域較適合做前方障礙判斷。以 10 公分為間隔移動紙盒。
為什麼:比較距離變化與實際位置。用最短距離偵測側邊突然出現的物體。
為什麼:理解中央值與全視野值的差異。playrobot_vl53l5cx_setup:設定 I2C 位址 0x29 並啟動感測器。
下載桃園版 Blockly 專案或對應的文字程式。
| 測試情境 | 可能讀值 | 判讀 |
|---|---|---|
| 紙盒靠近中央 | 中央距離變小 | ToF 量測到反射物距離縮短。 |
| 區域沒有有效反射 | 可能出現 0 或無效值 | 程式要先檢查資料是否 ready。 |
這段程式把「VL53L5CX 8×8 ToF 距離感測器」的實體接線、桃園版 Blockly 積木與 Arduino 執行流程接在一起。先對照腳位,再看初始化、讀值、輸出與等待的順序;每一步都可以回到本頁的積木範例實測。
#include <Wire.h>
#include <SparkFun_VL53L5CX_Library.h>
SparkFun_VL53L5CX sensor;
VL53L5CX_ResultsData data;
void setup() {
Serial.begin(115200);
Wire.begin();
Wire.setClock(400000);
if (sensor.begin(0x29)) {
sensor.setResolution(8 * 8);
sensor.startRanging();
}
}
void loop() {
if (sensor.isDataReady() && sensor.getRangingData(&data)) {
Serial.println(data.distance_mm[27]);
}
delay(100);
}#include <Wire.h>函式庫提供桃園版 Blockly 產生器所需的底層功能;若這裡的函式庫或物件名稱不對,後面的 playrobot_vl53l5cx_setup 就算接線正確也無法使用。
// VIN/VCC → 依轉接板規格、GND → GND、SDA → A4 / SDA、SCL → A5 / SCL本頁接線是 VIN/VCC → 依轉接板規格、GND → GND、SDA → A4 / SDA、SCL → A5 / SCL。程式常數、積木欄位與實體線材必須使用同一組設定;若改了其中一邊,另外兩邊也要一起改。
void setup() {啟動序列埠、I²C/UART 或感測器初始化通常只需要做一次,所以要放在「初始化」區,不要每一圈重複建立裝置。這也對應範例中的啟動積木。
VL53L5CX_ResultsData data;重複執行區先讓感測器更新,再讀取 VL53L5CX 初始化。若元件有 data ready、可用性或逾時條件,先判斷狀態再使用數值,避免把無效資料當成真實測量。
if (sensor.begin(0x29)) {先把原始值、單位或狀態送到序列埠,才能和預期結果比較;等待時間則決定更新速度。若看到亂碼,先檢查鮑率;若數值跳動,先增加合理的取樣間隔或做校正。
先從「電源、接線、腳位、物體」四個方向檢查,再修改程式。
先檢查:確認電源、SDA/SCL 與 0x29。
處理方式:先用 I2C 掃描器確認裝置,再檢查 breakout 的供電規格。
先檢查:確認是否等待 isDataReady。
處理方式:先更新資料再讀取區域值,並讓障礙物有明顯反射面。
先檢查:檢查環境光、距離與固定方式。
處理方式:固定模組並改用中央平均或多次取樣。
從顯示數值,逐步走向條件判斷、燈號回饋與雷達專題。
題目:列印中央距離並與尺量結果比較。
這題要延伸「VL53L5CX 初始化」的基本讀值:先保留已驗證的接線與初始化,再把題目要求的資料處理加在重複執行區。先把資料整理成可觀察的序列埠或表格結果。
題目:中央距離小於 300 mm 時亮 LED。
這題要延伸「VL53L5CX 初始化」的基本讀值:先保留已驗證的接線與初始化,再把題目要求的資料處理加在重複執行區。把結果接到題目指定的輸出元件。
題目:輪流列印 64 格距離,找出最近區域。
這題要延伸「VL53L5CX 初始化」的基本讀值:先保留已驗證的接線與初始化,再把題目要求的資料處理加在重複執行區。先把資料整理成可觀察的序列埠或表格結果。
確認 8×8 多區域 ToF、65° 視角與 I2C 感測器特性。
確認 setup、update、zone、center、min 與 data ready 積木。