學習目標
- ✓能分辨 VCC、TRIG、ECHO、GND 四個腳位的用途。
- ✓能在桃園版 Blockly 設定 TRIG 與 ECHO 腳位。
- ✓能用序列埠觀察距離數值,並判斷異常讀值。
- ✓能解釋距離公式為什麼要除以 2。
SENSOR / ULTRASONIC
HC-SR04 先發出超音波,再量測聲波碰到物體後返回的時間。這一課使用桃園版 Blockly 的實際積木,把距離值顯示在序列埠監控視窗。
先確認這一課要學會什麼,以及桌面上需要哪些材料。
控制板送出短暫的觸發訊號後,模組會發射一串 40 kHz 超音波。ECHO 腳位維持高電位的時間,代表聲波往返物體所花的時間。
TRIG 維持高電位至少 10 微秒,要求模組開始量測。
模組送出人耳聽不到的 40 kHz 超音波。
聲波碰到物體後返回接收端,ECHO 脈波長度記錄往返時間。
程式以聲速換算距離,並除以 2 取得單程距離。
0.0343 cm/μs 是約略聲速;除以 2 是因為聲波走了去程與回程。
以下採用 Arduino UNO;積木參數必須與實際接線相同。
| 模組腳位 | 接到控制板 | 訊號方向 | 檢查重點 |
|---|---|---|---|
| VCC | 5V | 電源 | HC-SR04 使用 5V 供電 |
| TRIG | D7 | 控制板輸出 | 對應積木的 TRIG 7 |
| ECHO | D8 | 控制板輸入 | 對應積木的 ECHO 8 |
| GND | GND | 共同接地 | 未共地會造成讀值不穩 |
已將 4 條線路依同一筆資料逐列對齊;電壓仍須依手上模組版本確認。
積木名稱與型別以桃園版 Blockly 現行程式為準,不以通用積木替代。
arduino_serial_begin設定控制板與電腦的通訊速度,放在程式開始區。
位置:通訊 → 序列埠arduino_ultrasonic送出觸發脈波、讀取 ECHO 時間並回傳公分數值。這是有回傳值的積木,要嵌入需要數字的插槽。
位置:感測器 → 距離感測器 → 超音波(HC-SR04)arduino_serial_print把超音波積木回傳的數值送到電腦,方便觀察與除錯。
位置:通訊 → 序列埠arduino_delay控制量測頻率,避免序列埠訊息更新太快。
位置:時間分類資料同時保留舊版 ultrasonic_distance 與現行 arduino_ultrasonic。本篇主範例採現行積木;開啟舊專案時仍可辨識舊版型別。
移動手掌靠近或遠離感測器,監控視窗中的公分數值會跟著變化。
arduino_serial_beginarduino_serial_printarduino_ultrasonicarduino_delay把「啟動序列埠 9600」放進開始區。
為什麼:只需要初始化一次,不要放在重複區。把「序列埠 印出並換行」放進重複區。
為什麼:每輪會送出一筆新數值,換行後比較容易閱讀。將「超音波距離 TRIG 7 ECHO 8」塞進序列埠積木的數值插槽。
為什麼:超音波積木是數值積木,不能單獨接在上下堆疊中。在輸出積木下方接上「等待 100 毫秒」。
為什麼:保留穩定觀察時間,也避免訊息塞滿監控視窗。上傳後打開序列埠監控視窗,速度設為 9600。
為什麼:鮑率不一致時,文字可能變成亂碼。arduino_ultrasonic:送出觸發脈波、讀取 ECHO 時間並回傳公分數值。這是有回傳值的積木,要嵌入需要數字的插槽。
下載桃園版 Blockly 專案或對應的文字程式。
| 測試情境 | 可能讀值 | 判讀 |
|---|---|---|
| 手掌正對感測器約 10 cm | 約 9–12 cm | 可接受少量波動 |
| 手掌逐漸遠離 | 數值逐漸增加 | 感測方向與程式正常 |
| 前方沒有可反射物 | 可能出現 -1 或異常值 | 逾時,並非距離為負數 |
這段程式把「HC-SR04 超音波距離感測器」的實體接線、桃園版 Blockly 積木與 Arduino 執行流程接在一起。先對照腳位,再看初始化、讀值、輸出與等待的順序;每一步都可以回到本頁的積木範例實測。
float readUltrasonicCm(int trigPin, int echoPin) {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
unsigned long duration = pulseIn(echoPin, HIGH, 30000);
if (duration == 0) return -1;
return duration * 0.0343 / 2.0;
}// HC-SR04 超音波距離感測器 library函式庫提供桃園版 Blockly 產生器所需的底層功能;若這裡的函式庫或物件名稱不對,後面的 arduino_ultrasonic 就算接線正確也無法使用。
pinMode(trigPin, OUTPUT);本頁接線是 VCC → 5V、TRIG → D7、ECHO → D8、GND → GND。程式常數、積木欄位與實體線材必須使用同一組設定;若改了其中一邊,另外兩邊也要一起改。
void setup() {啟動序列埠、I²C/UART 或感測器初始化通常只需要做一次,所以要放在「初始化」區,不要每一圈重複建立裝置。這也對應範例中的啟動積木。
float readUltrasonicCm(int trigPin, int echoPin) {重複執行區先讓感測器更新,再讀取 超音波距離 TRIG 7 ECHO 8(公分)。若元件有 data ready、可用性或逾時條件,先判斷狀態再使用數值,避免把無效資料當成真實測量。
delayMicroseconds(2);先把原始值、單位或狀態送到序列埠,才能和預期結果比較;等待時間則決定更新速度。若看到亂碼,先檢查鮑率;若數值跳動,先增加合理的取樣間隔或做校正。
先從「電源、接線、腳位、物體」四個方向檢查,再修改程式。
先檢查:確認 ECHO 是否接到 D8,感測器前方是否有平整物體。
處理方式:重新插緊杜邦線,讓紙板或手掌正對兩個圓形探頭。
先檢查:確認 TRIG、ECHO 沒有接反,積木腳位是否為 7、8。
處理方式:逐線比對接線表,再重新上傳程式。
先檢查:檢查物體角度、材質與量測間隔。
處理方式:改用平整硬紙板,正對探頭並保留 100 ms 等待。
先檢查:檢查程式與監控視窗的鮑率。
處理方式:兩邊都設為 9600。
從顯示數值,逐步走向條件判斷、燈號回饋與雷達專題。
題目:加入判斷積木:距離小於 15 cm 時顯示「太近」。
這題要延伸「超音波距離 TRIG 7 ECHO 8(公分)」的基本讀值:先保留已驗證的接線與初始化,再把題目要求的資料處理加在重複執行區。把結果接到題目指定的輸出元件。
題目:把距離分成近、中、遠三段,控制紅、黃、綠 LED。
這題要延伸「超音波距離 TRIG 7 ECHO 8(公分)」的基本讀值:先保留已驗證的接線與初始化,再把題目要求的資料處理加在重複執行區。把結果接到題目指定的輸出元件。
題目:加入伺服馬達,記錄不同角度的距離資料。
這題要延伸「超音波距離 TRIG 7 ECHO 8(公分)」的基本讀值:先保留已驗證的接線與初始化,再把題目要求的資料處理加在重複執行區。把結果接到題目指定的輸出元件。
確認分類、積木型別、預設腳位、逾時與距離換算邏輯。
確認 5V 供電、10 μs 觸發、40 kHz、量測範圍與腳位定義。
參考 Arduino 官方的超音波回波時間教學脈絡。
參考入門實作、序列埠觀察與距離警報延伸方式。