Raspberry Pi Pico筆記(3):超音波感測器HC-SR04測量距離

繼按鍵控制 LED 亮滅後,我們繼續來實作超音波感測器測量距離,這項功能常被用來計算自身與前方物體之間的距離,例如機器人或行進車輛的避障功能,以確保機器人或車輛不會碰撞前方物品。

[材料]

  • 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秒

[結果]



[參考資料]

Post a Comment

較新的 較舊