十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶(hù) + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專(zhuān)業(yè)推廣+無(wú)憂(yōu)售后,網(wǎng)站問(wèn)題一站解決
樹(shù)莓派怎樣進(jìn)行超聲波測(cè)距自動(dòng)避障,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
讓客戶(hù)滿(mǎn)意是我們工作的目標(biāo),不斷超越客戶(hù)的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶(hù),將通過(guò)不懈努力成為客戶(hù)在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名與空間、虛擬主機(jī)、營(yíng)銷(xiāo)軟件、網(wǎng)站建設(shè)、遼寧網(wǎng)站維護(hù)、網(wǎng)站推廣。
超聲波測(cè)距的原理很簡(jiǎn)單,發(fā)射一個(gè)聲波,反彈回來(lái),然后接受反彈回來(lái)的這個(gè)聲波。 利用這個(gè)時(shí)間差,就可以算出距離了。 首先,連接超聲波模塊,我的連接在GPIO20和GPIO21上,所以相應(yīng)的代碼如下
# 超聲波引腳 TRIG = 20 ECHO = 21
TRIG這個(gè)名稱(chēng)也可以換,但是模塊上用的這個(gè)名字,用這個(gè)更好記憶。 TRIG負(fù)責(zé)發(fā)射超聲波,ECHO負(fù)責(zé)接收超聲波。
GPIO.output(TRIG, 0)
很多在后面追加了如下代碼:
time.sleep(0.000002)
應(yīng)該是為了防止錯(cuò)誤,因?yàn)榫o接著,就需要把發(fā)射端置為高電平。
GPIO.output(TRIG, 1) time.sleep(0.00001) GPIO.output(TRIG, 0)
一定要 用GPIO.output(TRIG, 0)來(lái)把超聲波發(fā)射關(guān)閉,否則將會(huì)一直發(fā)射,也就沒(méi)有辦法測(cè)距了。 現(xiàn)在發(fā)射結(jié)束。
while GPIO.input(ECHO) == 0: pass emitTime = time.time() while GPIO.input(ECHO) == 1: pass acceptTime = time.time()
通過(guò)該代碼,獲取ECHO的狀態(tài),一開(kāi)始發(fā)射的時(shí)候,ECHO輸入為低電平,此時(shí)獲取一個(gè)時(shí)間emitTime,發(fā)射結(jié)束以后,接收啟動(dòng),接收到信號(hào),獲得一個(gè)時(shí)間 acceptTime。
totalTime = acceptTime - emitTime distanceForReturn = totalTime * 340 / 2 * 100
這里之所以乘以100,是因?yàn)楂@得的距離是微米,乘以100就是厘米了。
現(xiàn)在把上面的代碼整合起來(lái),放在一個(gè)distance函數(shù)里面,并且返回距離的值。 完整代碼如下:
# 超聲波測(cè)距函數(shù) def distance(): GPIO.output(TRIG, 0) time.sleep(0.000002) GPIO.output(TRIG, 1) time.sleep(0.00001) GPIO.output(TRIG, 0) while GPIO.input(ECHO) == 0: pass emitTime = time.time() while GPIO.input(ECHO) == 1: pass acceptTime = time.time() totalTime = acceptTime - emitTime distanceForReturn = totalTime * 340 / 2 * 100 return distanceForReturn
拿到了距離,需要讓超聲波按照要求不斷發(fā)射和接收,小車(chē)也需要做出相應(yīng)的反應(yīng),因此還需要一個(gè)循環(huán)的函數(shù)。 代碼很難用文字解釋?zhuān)呛芎美斫狻H缦拢?/p>
def loop(): while True: dis= distance() if dis<40: while dis<40: backword(50, 0.2) dis=distance() else: forward(50, 0)
if __name__ == '__main__': try: forward(50, 0) loop() except KeyboardInterrupt: GPIO.cleanup()
forward()和backword()等函數(shù)均是之前定義的小車(chē)運(yùn)動(dòng)的函數(shù)。 以下是整個(gè)文件的所有代碼:
import time # 綁定對(duì)應(yīng)的引腳,來(lái)自于圖紙 PWMA = 18 AIN1 = 22 AIN2 = 27 PWMB = 23 BIN1 = 25 BIN2 = 24 # 超聲波引腳 TRIG = 20 ECHO = 21 GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) # 設(shè)置引腳為輸出 GPIO.setup(PWMA, GPIO.OUT) GPIO.setup(AIN1, GPIO.OUT) GPIO.setup(AIN2, GPIO.OUT) GPIO.setup(PWMB, GPIO.OUT) GPIO.setup(BIN1, GPIO.OUT) GPIO.setup(BIN2, GPIO.OUT) GPIO.setup(TRIG, GPIO.OUT) GPIO.setup(ECHO, GPIO.IN) # 電機(jī) leftMotor = GPIO.PWM(PWMA, 100) rightMotor = GPIO.PWM(PWMB, 100) leftMotor.start(0) rightMotor.start(0) ##小車(chē)的前進(jìn)函數(shù) def forward(speed, runtime): leftMotor.ChangeDutyCycle(speed) GPIO.output(AIN1, True) # AIN1高電平則正轉(zhuǎn) GPIO.output(AIN2, False) # 如果為T(mén)rue則翻轉(zhuǎn) rightMotor.ChangeDutyCycle(speed) GPIO.output(BIN1, True) GPIO.output(BIN2, False) time.sleep(runtime) # 維持狀態(tài)的時(shí)間,如果不給命令執(zhí)行其他,將會(huì)繼續(xù)執(zhí)行 # 后退函數(shù) def backword(speed, backtime): leftMotor.ChangeDutyCycle(speed) GPIO.output(AIN2, True) GPIO.output(AIN1, False) rightMotor.ChangeDutyCycle(speed) GPIO.output(BIN2, True) GPIO.output(BIN1, False) time.sleep(backtime) # 左轉(zhuǎn)彎函數(shù) def turnLeft(speed, lefttime): leftMotor.ChangeDutyCycle(speed) GPIO.output(AIN1, False) GPIO.output(AIN2, True) rightMotor.ChangeDutyCycle(speed) GPIO.output(BIN1, True) GPIO.output(BIN2, False) time.sleep(lefttime) # 右轉(zhuǎn)彎函數(shù) def turnRight(speed, righttime): leftMotor.ChangeDutyCycle(speed) GPIO.output(AIN1, True) GPIO.output(AIN2, False) rightMotor.ChangeDutyCycle(speed) GPIO.output(BIN1, False) GPIO.output(BIN2, True) time.sleep(righttime) # 超聲波測(cè)距函數(shù) def distance(): GPIO.output(TRIG, 0) time.sleep(0.000002) GPIO.output(TRIG, 1) time.sleep(0.00001) GPIO.output(TRIG, 0) while GPIO.input(ECHO) == 0: pass emitTime = time.time() while GPIO.input(ECHO) == 1: pass acceptTime = time.time() totalTime = acceptTime - emitTime distanceForReturn = totalTime * 340 / 2 * 100 return distanceForReturn def loop(): while True: dis= distance() if dis<40: while dis<40: backword(50, 0.2) dis=distance() else: forward(50, 0) if __name__ == '__main__': try: forward(50, 0) loop() except KeyboardInterrupt: GPIO.cleanup()``` 這樣,遇到障礙物,就會(huì)后退。通過(guò)轉(zhuǎn)彎可以躲避障礙物,這里沒(méi)有寫(xiě)躲避的代碼。其實(shí)就是轉(zhuǎn)向就可以了。
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。