孫智勇 戴文翔 程文龍
摘要:如今越來越多人走出課本不拘泥于文字之上,他們更多的邊做邊學,樹莓派就是其中一個很好的例子,不少人會去拿樹莓派去控制小燈,或通過樹莓派來實現(xiàn)網(wǎng)頁對小車的控制,更有甚者用樹莓派來做智能家居。該文則介紹一個相對簡單些的利用超聲波來做避障小車,以樹莓派為核心通過它L298n的控制來控制小車,利用超聲波傳感器來實時監(jiān)測小車與障礙物之間的距離,利用算法來實現(xiàn)避障
關鍵詞:超聲波傳感器;Raspberry;樹莓派
中圖分類號:TP3 文獻標識碼:A 文章編號:1009-3044(2018)30-0206-02
1 硬件組成
(1)避障小車硬件組成包括:小車底盤、4個車輪、四個直流電機、超聲波測距傳感器模塊、電源盒、移動電源(也可直接通過5v電源接口直接使用)、無線網(wǎng)卡、樹莓派。注:如果使用的板子是3個輪子的,則3個車輪中,兩個前輪由直流電機直接驅(qū)動,后輪選擇萬向輪。
(2)電源部分:包括四節(jié)1.5V(5號)電池,5000毫安移動電源。四節(jié)1.5V(5號)電池為L298n提供6V電壓,5000毫安移動電源為樹莓派提供穩(wěn)定的5V電壓。
(3)驅(qū)動部分:包括小車底盤、L298n電機驅(qū)動、直流電機(2/4個)。3輪小車需要L298n驅(qū)動前輪,配合萬向輪實現(xiàn)前進、后退以及左右轉(zhuǎn)向。
(4)主控制部分:樹莓派。樹莓派通過L298n控制直流電機轉(zhuǎn)動,全方向達到移動的目的。樹莓連接超聲波測距模塊,以達到實時測量與障礙物的距離。從而可以做到小車再碰到障礙物之前能按預設避讓方式進行避讓,最終實現(xiàn)智能避讓。
(5)傳感器部分:超聲波測距傳感器模塊連與樹莓派,正常工作時,超聲波測距傳感器模塊的工作電壓為5V左右,電壓會下降0.1V左右。傳感器通過向空中發(fā)送超聲波脈沖并測量反彈所需的時間來工作。該值可以用于計算脈沖行進的距離進而產(chǎn)生信號,是樹莓派執(zhí)行避讓語句。
注意點:找到距離的計算依賴于聲音的速度,這隨溫度而變化。腳本根據(jù)預定義的溫度計算要使用的正確值。如果需要可以更改此值,或者使用溫度傳感器動態(tài)測量該值。
2 軟件編譯
(1)定義接口控制輪子:
import RPi.GPIO as gpio
import time
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
zuoqian = 7
zuohou = 11
youqian = 15
youhou = 13
注:首先沒有HDMI線的人可以直接通過putty通過樹莓派ip來遠程登錄樹莓派,賬戶名為:pi,密碼為raspberry(密碼不可見)在樹莓派上首次使用引腳時,首先要通過sudo apt-get install python-dev指令安裝Python——dev(dev: 開發(fā)包,包含相關庫和頭文件,用于開發(fā)用),然后使用sudo pip install rpi.gpio指令安裝適用于Python的GPIO模塊。
接著你可以使用vim編譯器或者也是用nano編譯器,指令為:sudo vim +文件名.py或者sudo nano +文件名。py(注:樹莓派默認的是沒有安裝vim編譯器的,所以要通過sudo apt-get install -y vim指令安裝。而nano為大部分Linux系統(tǒng)的默認編譯器,還有兩種簡易方式,一種使用樹莓派的可視化界面,第二種是使用WinSCP直接進入樹莓派內(nèi)部文件。
(2)初始化GPIO口:
def init():
gpio.setmode(gpio.BOARD)
gpio.setup(7,gpio.OUT)
gpio.setup(11,gpio.OUT)
gpio.setup(13,gpio.OUT)
gpio.setup(15,gpio.OUT)
注:gpio.setmode(gpio.BOARD)意思為gpio調(diào)用BOARD編號方式。
因為樹莓派需要通過L298n來控制直流電機,所以連接7,11,13,15這幾個GPIO端口且要為輸出端。而與紅外避障模塊相連GPIO端口,因為需要其收集的路況信息,所以設置為輸入端
(3)定義基礎方向:
def qianjin(timerun):
init()
gpio.output(7,True)
gpio.output(11,F(xiàn)alse)
gpio.output(15,True)
gpio.output(13,F(xiàn)alse)
time.sleep(timerun)
gpio.cleanup()
注:定義基礎方向時要注意L298n的安裝朝向,gpio7和gpio11應相對應接右邊,而gpio15及gpio13口應相對應左側(cè),注意同側(cè)間可能會有與直流電機出現(xiàn)正負極順序錯誤的可能,極有可能形成左右輪轉(zhuǎn)向相反,小車方向控制不了的情況。
第一個(qianjin)代碼使得左右輪都問前進;同理后退(houtui)代碼的false與ture指令與第一個相反則形成后退。
def zuozhuan(timerun):
init()
gpio.output(7,F(xiàn)alse)
gpio.output(11,F(xiàn)alse)
gpio.output(15,True)
gpio.output(13,F(xiàn)alse)
time.sleep(timerun)
gpio.cleanup()
此條指令(左轉(zhuǎn))則通過gpio.output(7,F(xiàn)als),gpio.output(11,F(xiàn)alse) 兩個代碼使得左邊輪子停止而右邊的兩個gpio接口依舊正常使得右邊向前則形成的左轉(zhuǎn),右轉(zhuǎn)也是同樣的道理在這里就不一一贅述了。
def tingzhi(timerun):
init()
gpio.output(7,F(xiàn)alse)
gpio.output(11,F(xiàn)alse)
gpio.output(15,F(xiàn)alse)
gpio.output(13,F(xiàn)alse)
time.sleep(timerun)
gpio.cleanup()
最后一個是(停止)指令四個gpio口的指令都為False,使得四輪子全部停止。即形成了指令。
最后我們要注意的是Python對空格極為敏感,有可能我們沒有觀察出來的地方?jīng)]對齊,或某處忘縮進就會造成程序錯誤。所以最好統(tǒng)一使用Tap鍵縮進,或者統(tǒng)一使用空格鍵。
(4)超聲波測距傳感器的連接與編輯:
import RPi.GPIO as gpio
import time
def distance():
gpio.setmode(gpio.BOARD) gpio.setup(12,gpio.OUT) gpio.setup(16,gpio.IN) gpio.output(12,True)
time.sleep(0.000015) gpio.output(12,F(xiàn)alse)
while not gpio.input(16):
pass
t1 = time.time()
while gpio.input(16):
pass
t2 = time.time()
return (t2-t1)*34000/2
gpio.cleanup()
return distance
print(distance())
注:通過gpio.output(12,True)指令發(fā)出觸發(fā)信號保持10us以上,從發(fā)現(xiàn)高電平時開始計時記為t1,當高電平結(jié)束時停止計時記為t2,由此可計算t1,t2的時間差從而通過公式:(t1-t2)*3400/2來計算出距離。
通過先定義小車前后左右的動作和測算距離后,我們就可以令小車進行距離判斷進行相應的動作了。
dis = int(checkdistance())
print(dis)
If dis<=30
print”distance less than 0.30m and back
Int()
houtui(1)
這只是定義了一個選擇更多的可以通過對距離的判斷來做。
3 結(jié)語
本文中的超聲波小車不過是樹莓派眾多實驗中的九牛一毛,但實驗中的步驟多相似之處,像編程語言的注意事項和工具等這些都是基礎也是需要加強的地方,所以我們要加強對Python和C++的學習,從中發(fā)現(xiàn)樂趣。
參考文獻:
[1] 胖若兩人.[樹莓派]樹莓派小車(三)Python控制小車(簡書網(wǎng))
[2] 趙貴生.一起來玩樹莓派.www.sentdex.com(一工程師教程)
【通聯(lián)編輯:代影】