超聲波測距模塊 HC-SR04 非常易于使用,這篇文章就介紹 HC-SR04 的測距原理放坏、樹莓派如何與 HC-SR04 接線军洼,以及使用 python 程序控制測距的方法。
HC-SR04 測距過程
下圖說明了超聲波的測距原理:
HC-SR04 引腳圖:
HC-SR04 模塊包含了超聲波發(fā)射器璧针、超聲波接收器和控制電路,可以提供 3cm - 4m 的距離測量渊啰。引腳圖如上圖所示有4個(gè)引腳:電源引腳(5v Vcc),觸發(fā)脈沖引腳(Trig),返回脈沖引腳(Echo),地引腳(Gnd)探橱。
如何使用呢?下面是 HC-SR04 的工作過程:
- 樹莓派向 Trig 腳發(fā)送一個(gè)持續(xù)時(shí)間至少為 10us 的高電平信號绘证。
- HC-SR04 接收到樹莓派的觸發(fā)信號隧膏,自動發(fā)送 40 Khz 的超聲波,并把 Echo 腳置為高電平嚷那。然后開始檢測返回的聲波胞枕。
- 當(dāng)檢測到返回的聲波時(shí),Echo 腳被置為低電平魏宽。
從上述過程可以看出腐泻,Echo 腳的高電平持續(xù)時(shí)間就是超聲波從發(fā)射到返回所經(jīng)過的時(shí)間間隔 T。那么傳感器和物體間的距離就能用下面的公式計(jì)算:
距離(Distance) = 超聲波速度(340m/s) * 時(shí)間 T / 2
HC-SR04 與樹莓派的接線
樹莓派 GPIO 引腳圖
接線圖
- 電源引腳 Vcc 與樹莓派的 5v 腳(物理引腳2)相連队询,地引腳 Gnd 與樹莓派的 Gnd 腳(物理引腳6)相連派桩。
- 觸發(fā)脈沖引腳 Trig 用來接收來自樹莓派的控制信號,接任意 GPIO 口蚌斩。圖中連接了 GPIO_23(物理引腳16)铆惑。
- 返回脈沖引腳 Echo 用來返回測距結(jié)果,需要注意的是 Echo 輸出的是 5v 信號,而樹莓派的 GPIO 最高只能承受3.3v 信號员魏,所以 Echo 引腳需要經(jīng)分壓電路連接到樹莓派的 GPIO丑蛤。圖中連接了 GPIO_24(物理引腳18).
為什么 GPIO_23 又是物理引腳16呢,這跟 GPIO 的兩種編號方式有關(guān)逆趋,這兩種編號方式分別是 BCM 編號和物理編號盏阶。
分壓電路使用了 330 歐姆和 470 歐姆的電阻晒奕,這樣 GPIO_24 分到的電壓為: (470) / (330+470) * 5v = 2.9v < 3.3 v 闻书。當(dāng)然你可以選用任意阻值的兩只電阻來組成分壓電路,只要經(jīng)過計(jì)算后 GPIO_24 分到的電壓合適即可脑慧。
python 程序控制測距
如果你理解了 HC-SR04 的工作過程魄眉,那么下面包含注釋的程序?qū)δ銘?yīng)該很簡單,就不一一解釋了闷袒。
#導(dǎo)入 GPIO庫
import RPi.GPIO as GPIO
import time
#設(shè)置 GPIO 模式為 BCM
GPIO.setmode(GPIO.BCM)
#定義 GPIO 引腳
GPIO_TRIGGER = 23
GPIO_ECHO = 24
#設(shè)置 GPIO 的工作方式 (IN / OUT)
GPIO.setup(GPIO_TRIGGER, GPIO.OUT)
GPIO.setup(GPIO_ECHO, GPIO.IN)
def distance():
# 發(fā)送高電平信號到 Trig 引腳
GPIO.output(GPIO_TRIGGER, True)
# 持續(xù) 10 us
time.sleep(0.00001)
GPIO.output(GPIO_TRIGGER, False)
start_time = time.time()
stop_time = time.time()
# 記錄發(fā)送超聲波的時(shí)刻1
while GPIO.input(GPIO_ECHO) == 0:
start_time = time.time()
# 記錄接收到返回超聲波的時(shí)刻2
while GPIO.input(GPIO_ECHO) == 1:
stop_time = time.time()
# 計(jì)算超聲波的往返時(shí)間 = 時(shí)刻2 - 時(shí)刻1
time_elapsed = stop_time - start_time
# 聲波的速度為 343m/s坑律, 轉(zhuǎn)化為 34300cm/s。
distance = (time_elapsed * 34300) / 2
return distance
if __name__ == '__main__':
try:
while True:
dist = distance()
print("Measured Distance = {:.2f} cm".format(dist))
time.sleep(1)
# Reset by pressing CTRL + C
except KeyboardInterrupt:
print("Measurement stopped by User")
GPIO.cleanup()
運(yùn)行結(jié)果:
這個(gè)程序放在了 github囊骤。
此文章也發(fā)布在 mengsheng.me晃择。
參考文章
Using a Raspberry Pi distance sensor (ultrasonic sensor HC-SR04)