2019年6月21日 星期五

Raspberry Pi筆記:HC-SR04 超音波感測器

基本說明:

HC-SR04 超音波感測器透過超音波反彈來測定感測器與障礙物之間的距離。
根據說明書(ref.1),能測到的障礙物會在感測器方向15°角之內,有效測定距離為2公分~400公分之間。
驅動HC-SR04的方式,透過給Trig針腳高電壓持續10µs,即開始測定距離。
HC-SR04回傳時,會將Echo針腳維持在高電壓,透過維持高電壓的時間來回饋測定的距離。
這裡需要注意,當維持高電壓時間會介於150µs~25ms之間,若時間大於38ms表示未偵測到障礙物。
距離(cm) = 高電壓時間(µs) / 58 

接線:

VCC5V
Trig>GPIO#20
EchoGPIO#21
GNDGND
Ref.2內有建議接線圖,在Echo針腳與GND用一1K電阻連接,

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.pdf
2. https://www.linuxnorth.org/hcsr04sensor/
3. https://en.wikipedia.org/wiki/Speed_of_sound

沒有留言:

張貼留言