繼按鍵控制 LED 亮滅後,我們繼續來實作超音波感測器測量距離,這項功能常被用來計算自身與前方物體之間的距離,例如機器人或行進車輛的避障功能,以確保機器人或車輛不會碰撞前方物品。
- 攝氏20度時的音速約為: 331.5 + 0.607*20 = 343.64 公尺/秒
- 音速公尺/秒 換算成 公分/微秒:343.64 * 100 / 1000000 = 0.034364 公分/微秒
- 超音波發射的距離為來回,因此單程距離 = 時間差的距離 / 2
瞭解上述的原理後,再看以下的程式應該會比較容易理解。
本程式用到的函式,主要是 utime ,說明如下:
[材料]
- Raspberry Pi Pico x1
- 超音波感測器 HCSR04 x1
- 排線 x4
[接線圖]
HC-SR04 觸發引腳(Trig)用於發送電流脈衝,因此 Pico 引腳設定為輸出。回波(Echo)引腳接收反射脈衝,因此 Pico 引腳設定為輸入。Pi Pico接腳 | HC-SR04 |
---|---|
Pin 36(+3.3V) | VCC |
Pin 38(GND) | GND |
Pin 19(GPIO14) | Trig |
Pin 20(GPIO15) | Echo |
[程式]
程式撰寫開始前,有個運用超音波時要瞭解的定理,就是音速在空氣中的傳播速度,運用超音波在空氣中行進的速度,花了多少時間來計算與物體間的距離,因為在攝氏零度之海平面音速約為331.5公尺/秒,每升高 1 攝氏度,音速就增加 0.607 公尺/秒,可以列出一個公式:- 攝氏20度時的音速約為: 331.5 + 0.607*20 = 343.64 公尺/秒
- 音速公尺/秒 換算成 公分/微秒:343.64 * 100 / 1000000 = 0.034364 公分/微秒
- 超音波發射的距離為來回,因此單程距離 = 時間差的距離 / 2
瞭解上述的原理後,再看以下的程式應該會比較容易理解。
本程式用到的函式,主要是 utime ,說明如下:
- utime.sleep_ms(n):延遲 n 毫秒,應為正數或 0。
- utime.sleep_us(n):延遲 n 微秒,應為正數或 0。
- utime.ticks_us():使其包含以微秒為單位的時間戳。
from machine import Pin import utime trigger = Pin(14, Pin.OUT) echo = Pin(15, Pin.IN) def ultra(): #建立一個函式 utime.sleep_us(2) #暫停兩毫秒,確保上一個設定低電位已經完成 trigger.high() utime.sleep_us(5) #拉高電位後,等待5毫秒後,立即設定為低電位 trigger.low() while echo.value() == 0: #建立一個while迴圈檢查回波引腳是否值為0,紀錄當時時間 signaloff = utime.ticks_us() while echo.value() == 1: #建立一個while迴圈檢查回波引腳是否值為1,紀錄當時時間 signalon = utime.ticks_us() timepassed = signalon - signaloff #計算發送與接收時間差 distance = (timepassed * 0.0343) / 2 #聲波行進時間 x 聲速(343.2 m/s,即每微秒0.0343公分),來回距離再除以2 print("The distance is : ",distance,"cm") while True: ultra() utime.sleep(1) #等待1秒
張貼留言