學習目標
- ✓理解 ToF 與反射光強弱量測的差異。
- ✓使用初始化與距離讀取積木取得毫米值。
- ✓比較不同物體距離與表面材質對量測的影響。
SENSOR / LASER
VL53L0X 透過 940 nm VCSEL 與飛行時間(ToF)原理測量距離,資料經 I2C 傳給 Arduino。它與反射式紅外線不同,教學重點是距離數值與量測限制。
先確認這一課要學會什麼,以及桌面上需要哪些材料。
感測器發出紅外線脈衝並量測回波到達時間,再轉換成距離;它不是可見光雷射測距儀,量測仍會受到目標大小、角度與環境影響。
啟動 Wire 與 VL53L0X 驅動程式。
感測器發出 940 nm 光並等待回波。
Blockly 距離積木回傳最新測量值。
實際數值由感測器內部校正與演算法處理;學生只需把回傳值視為毫米距離。
VL53L0X 使用 I2C,只需要供電、接地、SDA 與 SCL;若模組有 XSHUT 或 GPIO1,本篇先不使用。
| 模組腳位 | 接到控制板 | 訊號方向 | 檢查重點 |
|---|---|---|---|
| VIN/VCC | 5V 或依模組標示 | 電源 | 裸晶片模組不可直接接 5V,先看模組規格。 |
| GND | GND | 地線 | 建立共同地線。 |
| SDA | A4 / SDA | I2C 資料 | UNO 使用 A4 作為 SDA。 |
| SCL | A5 / SCL | I2C 時脈 | UNO 使用 A5 作為 SCL。 |
已將 4 條線路依同一筆資料逐列對齊;電壓仍須依手上模組版本確認。
積木名稱與型別以桃園版 Blockly 現行程式為準,不以通用積木替代。
taoyuan_vl53l0x_init啟動 I2C 與距離感測器
位置:感測器 → 距離感測器 → 雷射(VL53L0X)taoyuan_vl53l0x_distance取得目前距離值
位置:感測器 → 距離感測器 → 雷射(VL53L0X)serial_println觀察距離是否隨目標物移動而改變
位置:輸出controls_delay控制量測更新頻率
位置:控制將 VL53L0X 距離值每 200 毫秒列印一次。
taoyuan_vl53l0x_initarduino_delaytaoyuan_vl53l0x_distanceserial_printlncontrols_delaytaoyuan_vl53l0x_initarduino_delaytaoyuan_vl53l0x_distanceserial_printlncontrols_delay把初始化積木放在啟動區。
為什麼:I2C 與感測器設定不需要每圈重設。讓白紙、黑紙與手掌慢慢靠近或遠離。
為什麼:可觀察距離讀值對目標物的反應。記錄太近、太遠或斜放時的異常值。
為什麼:知道感測器的有效量測條件比只看一個數字重要。taoyuan_vl53l0x_init:啟動 I2C 與距離感測器
下載桃園版 Blockly 專案或對應的文字程式。
| 測試情境 | 可能讀值 | 判讀 |
|---|---|---|
| 目標物前後移動 | 距離毫米值大致跟著改變 | ToF 感測器將回波時間轉換成距離。 |
| 目標物太斜或太小 | 讀值可能不穩或超出範圍 | 回波能量與幾何角度會影響量測。 |
這段程式把「雷射距離感測器(VL53L0X)」的實體接線、桃園版 Blockly 積木與 Arduino 執行流程接在一起。先對照腳位,再看初始化、讀值、輸出與等待的順序;每一步都可以回到本頁的積木範例實測。
#include <Wire.h>
#include <Adafruit_VL53L0X.h>
Adafruit_VL53L0X lox;
void setup() {
Serial.begin(115200);
if (!lox.begin()) Serial.println("VL53L0X init failed");
}
void loop() {
VL53L0X_RangingMeasurementData_t measure;
lox.rangingTest(&measure, false);
if (measure.RangeStatus != 4) Serial.println(measure.RangeMilliMeter);
delay(200);
}#include <Wire.h>函式庫提供桃園版 Blockly 產生器所需的底層功能;若這裡的函式庫或物件名稱不對,後面的 taoyuan_vl53l0x_init 就算接線正確也無法使用。
// VIN/VCC → 5V 或依模組標示、GND → GND、SDA → A4 / SDA、SCL → A5 / SCL本頁接線是 VIN/VCC → 5V 或依模組標示、GND → GND、SDA → A4 / SDA、SCL → A5 / SCL。程式常數、積木欄位與實體線材必須使用同一組設定;若改了其中一邊,另外兩邊也要一起改。
void setup() {啟動序列埠、I²C/UART 或感測器初始化通常只需要做一次,所以要放在「初始化」區,不要每一圈重複建立裝置。這也對應範例中的啟動積木。
void loop() {重複執行區先讓感測器更新,再讀取 VL53L0X 初始化。若元件有 data ready、可用性或逾時條件,先判斷狀態再使用數值,避免把無效資料當成真實測量。
if (!lox.begin()) Serial.println("VL53L0X init failed");先把原始值、單位或狀態送到序列埠,才能和預期結果比較;等待時間則決定更新速度。若看到亂碼,先檢查鮑率;若數值跳動,先增加合理的取樣間隔或做校正。
先從「電源、接線、腳位、物體」四個方向檢查,再修改程式。
先檢查:確認 SDA/SCL、供電與函式庫是否正確。
處理方式:依模組規格供電,並掃描 I2C 或重新插接 A4/A5。
先檢查:確認目標物在感測器視野內且不是太斜。
處理方式:使用較大的平面目標,正對感測器測試。
先檢查:檢查目標物表面、環境光與固定方式。
處理方式:放慢更新速度並取多次讀值平均。
從顯示數值,逐步走向條件判斷、燈號回饋與雷達專題。
題目:距離小於 100 mm 時點亮 LED。
這題要延伸「VL53L0X 初始化」的基本讀值:先保留已驗證的接線與初始化,再把題目要求的資料處理加在重複執行區。把結果接到題目指定的輸出元件。
題目:比較不同延遲時間對資料更新速度的影響。
這題要延伸「VL53L0X 初始化」的基本讀值:先保留已驗證的接線與初始化,再把題目要求的資料處理加在重複執行區。先把資料整理成可觀察的序列埠或表格結果。
題目:使用不同 I2C 位址與 XSHUT 控制兩個 VL53L0X。
這題要延伸「VL53L0X 初始化」的基本讀值:先保留已驗證的接線與初始化,再把題目要求的資料處理加在重複執行區。先把資料整理成可觀察的序列埠或表格結果。
確認 940 nm VCSEL、ToF、I2C 與最遠約 2 m 的產品特性。
補充感測器原理、量測與安全資訊。
對照初始化與距離(mm)積木及 Adafruit library 產生器。