一、介紹
?? 超聲波傳感器使用超聲波來準(zhǔn)確檢測物體并測量距離。他發(fā)出超聲波并將它們轉(zhuǎn)換成電信號,主要應(yīng)用于汽車的倒車?yán)走_(dá)、機(jī)器人自動避障行走、建筑施工工地以及一些工業(yè)現(xiàn)場。
二、組件
★Raspberry Pi 3主板*1
★樹莓派電源*1
★40P軟排線*1
★超聲波傳感器模塊*1
★面包板*1
★跳線若干
三、實(shí)驗(yàn)原理

??該傳感器有4個引腳:
VCC,超聲波模塊電源腳,接5V電源即可
Trig,超聲波發(fā)送腳,高電平時發(fā)送出40KHZ出超聲波
Echo,超聲波接收檢測腳,當(dāng)接收到返回的超聲波時,輸出高電平5V
GND,超聲波模塊GND
??注意:Echo 返回的是 5v信號,而樹莓派的 GPIO 接收超過 3.3v 的信號可能會被燒毀,因此需要加一個分壓電路,這里由于返回的脈沖時間非常短,我沒有加,能正常運(yùn)行,但還是冒險(xiǎn)了!
??超聲波是指頻率大于20 kHz的在彈性介質(zhì)中產(chǎn)生的機(jī)械震蕩波,其具有指向性強(qiáng)、能量消耗緩慢、傳播距離相對較遠(yuǎn)等特點(diǎn),因此常被用于非接觸測距。聲音是由振動產(chǎn)生的,能夠產(chǎn)生超聲波的裝置就是超聲波傳感器,習(xí)慣上稱為超聲換能器,或者超聲探頭。超聲波探頭主要由壓電晶片組成,既可以發(fā)射超聲波,也可以接收超聲波。
??常用的是壓電式超聲波發(fā)生器,是利用壓電晶體的諧振來工作的。超聲波傳感器探頭內(nèi)部有兩個壓電晶片和一個共振板。當(dāng)它的兩極外加脈沖信號,其頻率等于壓電晶片的固有振蕩頻率時,壓電晶片將會發(fā)生共振,并帶動共振板振動,便產(chǎn)生超聲波。反之,如果兩電極間未外加電壓,當(dāng)共振板接收到超聲波時,將壓迫壓電晶片作振動,將機(jī)械能轉(zhuǎn)換為電信號,這時它就成為超聲波接收器了。 超聲波傳感器就是利用壓電效應(yīng)的原理將電能和超聲波相互轉(zhuǎn)化,即在發(fā)射超聲波的時候,將電能轉(zhuǎn)換成超聲波發(fā)射出去;而在接收時,則將超聲振動轉(zhuǎn)換成電信號。
??超聲波碰到雜質(zhì)或分界面會產(chǎn)生顯著反射形成反射成回波,碰到活動物體能產(chǎn)生多普勒效應(yīng)。由于超聲波對液體、固體的穿透本領(lǐng)很大,尤其是在陽光不透明的固體中,因此超聲波測距對環(huán)境有較好的適應(yīng)能力,此外超聲波測量在實(shí)時、精度、價(jià)格也能得到很好的折衷。

??本實(shí)驗(yàn)中,HC-SR04超聲波傳感器通過發(fā)送聲波,并計(jì)算聲波返回超聲傳感器所需的時間來工作。通過往返時間檢測法,它可以告訴我們物體相對于超聲波傳感器有多遠(yuǎn)。
??HC-SR04超聲波測距模塊可提供2cm-400cm的非接觸式距離感測功能, 測距精度可達(dá)高到3mm;模塊包括超聲波發(fā)射器、接收器與控制電路。基本工作原理:
(1)采用IO口TRIG觸發(fā)測距,給至少10us的高電平信號;
(2)模塊自動發(fā)送8個40khz的方波,自動檢測是否有信號返回;
(3)有信號返回,通過IO口ECHO輸出一個高電平,高電平持續(xù)的時間就是超聲波從發(fā)射到返回的時間。
(4)測試距離=(高電平時間*聲速(340M/S))/2;

??初始化時將trig和echo端口都置低,給Trig一個10US以上的高電平,模塊開始工作,模塊內(nèi)自動發(fā)送八個40khz方波,并自主檢測是否有電波返回。這時我們需要檢測Echo處的電平,當(dāng)為高電平的時候記一個時間;當(dāng)Echo出為低電平的時候在記一個時間,這兩個時間的差就是高電平持續(xù)的時間,然后用測距公式進(jìn)行計(jì)算。
四、實(shí)驗(yàn)步驟
??第1步:連接電路。
| 樹莓派 | T型轉(zhuǎn)接板 | 超聲波測距模塊 |
|---|---|---|
| GPIO0 | G17 | Trig |
| GPIO1 | G18 | Echo |
| 5V | 5V | VCC |
| GND | GND | GND |


??第2步:編寫控制程序。將手放在超聲波測距模塊上,觀察屏幕上打印的距離數(shù)值。

#!/usr/bin/env python
import RPi.GPIO as GPIO
import time
TRIG = 11 #send-pin
ECHO = 12 #receive-pin
def setup():
GPIO.setmode(GPIO.BOARD)
GPIO.setup(TRIG, GPIO.OUT, initial = GPIO.LOW)
GPIO.setup(ECHO, GPIO.IN)
def distance():
GPIO.output(TRIG, 1) #給Trig一個10US以上的高電平
time.sleep(0.00001)
GPIO.output(TRIG, 0)
#等待低電平結(jié)束,然后記錄時間
while GPIO.input(ECHO) == 0: #捕捉 echo 端輸出上升沿
pass
time1 = time.time()
#等待高電平結(jié)束,然后記錄時間
while GPIO.input(ECHO) == 1: #捕捉 echo 端輸出下降沿
pass
time2 = time.time()
during = time2 - time1
#ECHO高電平時刻時間減去低電平時刻時間,所得時間為超聲波傳播時間
return during * 340 / 2 * 100
#超聲波傳播速度為340m/s,最后單位米換算為厘米,所以乘以100
def loop():
while True:
dis = distance()
print dis, 'cm'
print ''
time.sleep(0.3)
def destroy():
GPIO.cleanup()
if __name__ == "__main__":
setup()
try:
loop()
except KeyboardInterrupt:
destroy()
??
