今天我們來(lái)玩超聲波測(cè)距傳感器。我購(gòu)買的是型號(hào)是US-015,長(zhǎng)得是下面這個(gè)樣子:
可以看到它有四個(gè)引腳,除了電源VCC和地線GND外,主要靠Trig(觸發(fā))引腳和Echo(回波)引腳來(lái)測(cè)距。其工作原理如下圖
其工作的時(shí)序圖如下:
由于超聲波電源為5V,在樹莓派的官方文檔中,5V的電壓如果接到GPIO引腳,會(huì)燒壞樹莓派(樹莓派使用3.3V電壓)。所以推薦在連接Echo引腳時(shí)通過(guò)電阻來(lái)做分壓處理,其電路如下圖所示:
如果我們手邊沒有330歐和470歐的電阻,也可以使用2個(gè)完全相同的電阻來(lái)做分壓,電阻的大小不限,這樣分壓后的GPIO引腳可以得到2.5V的電平,仍然會(huì)讀入為高電位(一般集成電路會(huì)把超過(guò)2伏作為高電位),可以得到同樣的效果。(多說(shuō)一句:我看到網(wǎng)上很多文章提供的電路都是讓5v的Echo直接連接GPIO,也可以成功,我自己也試了一下,從我的經(jīng)歷看,樹莓派沒有被5v的電壓燒毀,其原因應(yīng)該是Echo一直輸出低電位,只有在trig觸發(fā)后的檢測(cè)到回波時(shí)才短暫的輸出5v高電位,所以很幸運(yùn)的沒有對(duì)樹莓派造成影響,但 不建議大家嘗試,否則后果自負(fù)! )
最終的電路連接好后如下圖所示:
然后執(zhí)行下面的程序,這段程序的邏輯就是向Trig引腳發(fā)送10us的高電平,觸發(fā)超聲波模塊發(fā)送8個(gè)40khz的方波,然后讀取Echo的高電位時(shí)間,此時(shí)間就是超聲波從發(fā)送到返回的時(shí)間,也就是2個(gè)從傳感器到阻擋物體的距離。
import RPi.GPIO as GPIO
from time import sleep,time
TRIG = 6 #傳感器tirg引腳接GPIO6
ECHO = 17 #傳感器Echo引腳接GPIO17,大家需要根據(jù)自己電路連接情況修改
GPIO.setmode(GPIO.BCM) #設(shè)置為BCM模式。
GPIO.setup(TRIG,GPIO.OUT) #把 GPIO6設(shè)置為輸出
GPIO.setup(ECHO,GPIO.IN) #把GPIO17設(shè)置為輸入
GPIO.output(TRIG,0) # 給Trig輸出低電平
i = 1 # 測(cè)距計(jì)數(shù)器
while True:
print("-----start----",i)
sleep(0.00002) #讓低電平保持20us
GPIO.output(TRIG,1) #觸發(fā)trig,設(shè)置為高電位10us
sleep(0.00001) # 保持高電位10us
GPIO.output(TRIG,0) # 然后把trig設(shè)置為低電位
while GPIO.input(ECHO) == 0: # 當(dāng)Echo為低電位時(shí)在此循環(huán)等待
a = 1
time1 = time() # 當(dāng)Echo為高電位時(shí)跳出上面的while循環(huán),讀取此時(shí)時(shí)間
while GPIO.input(ECHO) == 1: # 當(dāng)Echo為高電位是循環(huán),直到變?yōu)榈碗娢?span>
a = 2
time2 = time() # 當(dāng)Echo變?yōu)榈碗娢粫r(shí)跳出上面while循環(huán),讀取當(dāng)前時(shí)間
#print("time2:",time2)
during = time2-time1 # 計(jì)算保持高電位的時(shí)間
#print("during:",during)
distance = during*340*100/2 # 高電位的時(shí)間 * 340米(聲音速度)/2(往返),乘100轉(zhuǎn)為厘米
print("time1:",time1)
print("time2:",time2)
print("during:",during)
print("distance:",distance) # 顯示測(cè)算的距離
sleep(2)
i = i+1
運(yùn)行程序時(shí),在超聲波前面移動(dòng)書本,可以看到輸出如下:
其實(shí),GPIOZero其實(shí)已經(jīng)實(shí)現(xiàn)了距離傳感器,并且封裝為可以直接使用的類DistanceSensor,用它的話代碼會(huì)非常簡(jiǎn)單,其底層實(shí)現(xiàn)的機(jī)理和我們上面的代碼其實(shí)是一樣的。
from gpiozero import DistanceSensor
from time import sleep
sensor = DistanceSensor(echo=17, trigger=6)
while True:
print('Distance: ', sensor.distance * 100)
sleep(1)
運(yùn)行結(jié)果如下:
-
傳感器
+關(guān)注
關(guān)注
2566文章
53008瀏覽量
767552 -
超聲波
+關(guān)注
關(guān)注
63文章
3140瀏覽量
141434 -
引腳
+關(guān)注
關(guān)注
16文章
1735瀏覽量
52916 -
GND
+關(guān)注
關(guān)注
2文章
544瀏覽量
39826 -
樹莓派
+關(guān)注
關(guān)注
121文章
2009瀏覽量
107483
發(fā)布評(píng)論請(qǐng)先 登錄
在全志H616核桃派開發(fā)板上實(shí)現(xiàn)超聲波傳感器測(cè)距
超聲波傳感器測(cè)距電路
基于超聲波傳感器的測(cè)距系統(tǒng)設(shè)計(jì)
超聲波測(cè)距原理
超聲波傳感器測(cè)距系統(tǒng)如何設(shè)計(jì)
超聲波傳感器的優(yōu)勢(shì)及原理
如何去實(shí)現(xiàn)一種基于樹莓派4B的超聲波測(cè)距和顯示設(shè)計(jì)
超聲波測(cè)距實(shí)驗(yàn)

Arduino應(yīng)用_Arduino連接超聲波傳感器測(cè)距

超聲波傳感器測(cè)距方法詳解

評(píng)論