HC-SR04 是一種常見的超音波距離測量模組,透過超音波在空氣中傳播來測量距離。其工作原理如下:
發射超音波:當 Trig 引腳(Trigger)接收到高電平訊號(持續 10 微秒以上),模組會發射 40kHz 的超音波。
接收超音波:超音波遇到物體後反射回來,被模組上的接收器接收到。
計算時間:模組會在 Echo 引腳(Echo)輸出高電平,持續時間為超音波從發射到接收所經過的時間。
距離計算:利用聲速公式 距離 = (時間 x 聲速) / 2 來計算物體距離。通常聲速在空氣中約為 343 m/s。
Trig(觸發引腳): 發送超音波脈衝信號的引腳,當收到一個 10 微秒的高電平信號時,模組會發送 8 組 40kHz 的超音波脈衝。
Echo(回波引腳): 當超音波被反射回模組後,Echo 引腳會輸出一個高電平信號,該信號持續時間為超音波來回所用的時間。
根據你提供的可用 GPIO 接腳(16, 20, 21),我們可以將:
Trig 接到 GPIO 20
Echo 接到 GPIO 21
以下是 Python 測試程式範例:
import RPi.GPIO as GPIO
import time
# 設置 GPIO 模式
GPIO.setmode(GPIO.BCM)
# 定義 GPIO 接腳
GPIO_TRIGGER = 20
GPIO_ECHO = 21
# 設定 GPIO 的方向 (IN / OUT)
GPIO.setup(GPIO_TRIGGER, GPIO.OUT)
GPIO.setup(GPIO_ECHO, GPIO.IN)
def distance():
# 設置 Trigger 為低電平,延遲 2 微秒,確保沒有噪聲干擾
GPIO.output(GPIO_TRIGGER, False)
time.sleep(0.000002)
# 發送超音波脈衝 (10 微秒的高電平)
GPIO.output(GPIO_TRIGGER, True)
time.sleep(0.00001)
GPIO.output(GPIO_TRIGGER, False)
# 記錄 Echo 高電平的開始和結束時間
start_time = time.time()
stop_time = time.time()
# 等待 Echo 變為高電平
while GPIO.input(GPIO_ECHO) == 0:
start_time = time.time()
# 等待 Echo 變為低電平
while GPIO.input(GPIO_ECHO) == 1:
stop_time = time.time()
# 計算時間差
time_elapsed = stop_time - start_time
# 計算距離,聲速在空氣中約為 34300 cm/s
distance = (time_elapsed * 34300) / 2
return distance
try:
while True:
dist = distance()
print(f"Measured Distance = {dist:.1f} cm")
time.sleep(1)
except KeyboardInterrupt:
print("Measurement stopped by User")
GPIO.cleanup()
初始化 GPIO:將 GPIO_TRIGGER 設為輸出模式,GPIO_ECHO 設為輸入模式。
發送觸發信號:在 Trig 引腳發送 10 微秒的高電平信號以觸發超音波。
接收回波信號:計算 Echo 引腳高電平的時間長度。
計算距離:利用時間長度來計算物體與感測器之間的距離。
無限迴圈測量:每秒測量一次,並打印出測量距離。
Ctrl + C 結束:按下 Ctrl + C 結束測量,並清理 GPIO 設置。
這個範例程式應該可以幫助你在樹莓派上使用 HC-SR04 進行距離測量。