一起玩轉樹莓派(14)——超聲測距
當今,汽車行業的發展可謂是日新月異。智能汽車的概念也越來越火熱。自動駕駛也將得到越來越廣泛的應用。不知你有沒有想過,平時我們在人工駕駛汽車時,主要使用的是視覺來感知距離,對於人工智能來說,它是如何通過感知距離來獲取周圍環境信息的呢?這就需要使用到相關的測距傳感器。
一、超聲測距傳感器
我們知道,超聲波頻率高,相對於普通聲波,其能量消耗慢,傳播距離遠且指向性很強。十分適合用來進行距離的測量。本次實驗,我們使用HC-SR04超聲測距模塊來進行距離測量。元件如下圖所示:
如上圖所示,HC-SR04模塊有一個超聲發生器(T端)和一個超聲收集器(R端)以及4個引腳。在網上很容易購買到此模塊,其價格低廉,精準度高,使用簡單,性價比非常高。HC-SR04硬件原理圖如下:
模塊內部電路結構雖然看上去非常複雜,但是我們使用它來測距並不需要了解其內部完整的工作原理,要進行距離的測定,離不開公式_s = v * t_。如果要計算出距離s,需要得知速度v和時間t,聲波的速度v是一定的,我們可以取340m/s,時間t就是HC-SR04模塊能夠幫助我們得到的。
超聲測距的核心原理是通過發生源發出超聲波,當超聲波遇到障礙時會被反射,反射的超聲波可以被感知源感知到,從聲波發出到被感知到這之間的時間就是超聲波從模塊到障礙物間傳遞一次來回所使用的時間。如下圖所示:
對於HC-SR04模塊,其Trig引腳是觸發引腳,向其發10us以上的高電平即可觸發發送超聲波指令,HC-SR04模塊會自動發送8個40kHz的方波,當發送完成後,Echo引腳會輸出高電平,當收到反射回來的聲波後,Echo會重新變回低電平。因此,在使用HC-SR04模塊時,我們只需要通過向Trig引腳加高電平觸發測量指令,之後監聽Echo引腳高電平的持續時間,即可完成測距工作。
二、連線與編碼
我們選擇BCM編碼下的GPIO17來控制超聲發生Trig引腳,使用GPIO18來獲取Echo引腳的電平。連線如下:
HC-SR04模塊 | 樹莓派 |
---|---|
VCC | +5V電源 |
GND | GND |
Trig | GPIO17(BCM編碼) |
Echo | CGIO18(BCM編碼) |
編寫如下代碼:
#coding:utf-8
import RPi.GPIO as GPIO
import time
# 觸發聲波引腳
trig = 11
# 監聽信號
echo = 12
def getDistance():
# 輸出高電平
GPIO.output(trig, GPIO.HIGH)
# 持續15us高電平 觸發超聲波
time.sleep(0.000015)
# 停止加高電平
GPIO.output(trig, GPIO.LOW)
# 開始檢測信號引腳的電平爲高電平時開始計時
while GPIO.input(echo) == 0:
pass
t1 = time.time()
# 信號引腳的電平爲低電平時計算時間間隔
while GPIO.input(echo) == 1:
pass
t2 = time.time()
# 計算距離
s = (t2 - t1)*340/2
return s
GPIO.setmode(GPIO.BOARD)
GPIO.setup(trig, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(echo, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
while True:
s = getDistance()
print("當前距離前方障礙物:%fm"%(s))
time.sleep(1)
在樹莓派中運行上面代碼,即可實現超聲波測距,效果如下圖:
專注技術,懂的熱愛,願意分享,做個朋友
QQ:316045346