基本說明:
HC-SR04 超音波感測器透過超音波反彈來測定感測器與障礙物之間的距離。
根據說明書(ref.1),能測到的障礙物會在感測器方向15°角之內,有效測定距離為2公分~400公分之間。
驅動HC-SR04的方式,透過給Trig針腳高電壓持續10µs,即開始測定距離。
HC-SR04回傳時,會將Echo針腳維持在高電壓,透過維持高電壓的時間來回饋測定的距離。
這裡需要注意,當維持高電壓時間會介於150µs~25ms之間,若時間大於38ms表示未偵測到障礙物。
距離(cm) = 高電壓時間(µs) / 58
接線:
VCC | 5V |
Trig> | GPIO#20 |
Echo | GPIO#21 |
GND | GND |
Python程式:
import RPi.GPIO as GPIO
import time
TRIG = 20
ECHO = 21
# init GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.cleanup()
GPIO.setup(TRIG, GPIO.OUT)
GPIO.setup(ECHO, GPIO.IN)
GPIO.setup(TRIG, GPIO.LOW)
time.sleep(0.1)
GPIO.output(TRIG, GPIO.HIGH)
time.sleep(0.00001)
GPIO.output(TRIG, GPIO.LOW)
echo_count = 0
while GPIO.input(ECHO) == GPIO.LOW:
if echo_count < 1000:
echo_count += 1
sonarStartTime = time.time()
else:
exit(1)
while GPIO.input(ECHO) == GPIO.HIGH:
sonarEndTime = time.time()
distance = (sonarEndTime - sonarStartTime) / 58 * 1000000
print("{}".format(distance))
討論:
1. HC-SR04技術文件(Ref.1)有提到距離的計算上,可以不使用推導出來的1/58作為係數,可以透過音波公式來做更精確的計算,音波會受到溫度影響而有變化,可以參考Ref.3的相關內容。2. 距離公式中的距離係數1/58=0.01724 cm/µs = 172.4 m/s,但波傳遞的距離是從感測器至障礙物反彈再回到感測器上,實際距離是兩倍,因此公式中實際使用的音速是344.8 m/s,或空氣溫度在22.76°C下計算而得。
參考:
1. https://www.linuxnorth.org/raspi-sump/HC-SR04Users_Manual.pdf2. https://www.linuxnorth.org/hcsr04sensor/
3. https://en.wikipedia.org/wiki/Speed_of_sound
沒有留言:
張貼留言