urnipBit改造智能小車套件所需器材:
- TurnipBit開發(fā)板 一塊
- 下載數(shù)據(jù)線 一條
- 智能小車套件 一套(底盤、車輪、電機等)
- 超聲波模塊(HC-SR04)一個(用作小車的“眼睛”)
- L298N電機驅(qū)動模塊 一個
- 接入互聯(lián)網(wǎng)的電腦 一臺(推薦使用Google Chome或者Firefox瀏覽器)
電機驅(qū)動和超聲波的安裝 超聲波模塊共4個引腳,分別是VCC、GND、Trig和Echo。VCC接TurnipBit擴展板的+5V引腳,GND接TurnipBit擴展板的GND引腳,Trig觸發(fā)引腳接P5,Echo回傳引腳接P8。L298N電機驅(qū)動模塊左側(cè)OUT3、OUT4接線端子對應(yīng)接入左輪電機的下側(cè)、上側(cè)側(cè)銅片,右側(cè)也是。L298N的輸入端IN1、IN2、IN3、IN4分別接入擴展板的P19、P13、P12、P11。詳細見下表:
TurnipBit擴展板 | 超聲波模塊 | L298N |
+5V | VCC | +12V、+5V |
GND | GND | GND |
P5 | Trig | |
P8 | Echo | |
P11 | IN4 | |
P12 | IN3 | |
P13 | IN2 | |
P14 | IN1 |
程序設(shè)計偽代碼分析
讓我們先用偽代碼來分析一下避障車的程序邏輯。首先,我們通過小車的超聲波模塊來檢測前方是否存在障礙物,計算出與障礙物之間的距離。當(dāng)與障礙物的距離小于或等于我們預(yù)設(shè)的安全距離時,控制小車進行轉(zhuǎn)向避開障礙物;當(dāng)與障礙物的距離大于我們預(yù)設(shè)的安全距離時,控制小車進行繼續(xù)前進;邏輯順序如下:第一步,觸犯超聲波模塊開始檢測;第二步:計算出與前方障礙物的距離;第三步:判斷與障礙物的距離是否小于設(shè)定的安全距離;第四步:若小于或等于則進行轉(zhuǎn)向,避開障礙物;第五步:若大于則繼續(xù)保持前進。
根據(jù)偽代碼,畫成流程圖如下:
代碼分析會思考的避障車整體代碼,可參考右側(cè)代碼顯示區(qū),如下。
from microbit import *
display.show(Image.ARROW_N)
pin11.write_digital(0)
pin12.write_digital(1)
pin13.write_digital(0)
pin19.write_digital(1)
while True:
num = 0
pin5.write_digital(0)
pin5.write_digital(1)
sleep(0.01)
if pin8.read_digital() != True:
pin5.write_digital(0)
pin5.write_digital(1)
sleep(0.01)
while pin8.read_digital():
num = num + 1
if num <= 8:
display.show(Image.ARROW_W)
pin11.write_digital(1)
pin12.write_digital(0)
pin13.write_digital(0)
pin19.write_digital(1)
sleep(1000)
display.show(Image.ARROW_N)
pin11.write_digital(0)
pin12.write_digital(1)
pin13.write_digital(0)
pin19.write_digital(1)
接下來,我們一起來分析一下代碼。通過上面的代碼,不難發(fā)現(xiàn),控制避障車前進的代碼部分我們重復(fù)編寫了兩遍,在實際項目中這種寫法是不合理的。為了讓代碼更加簡潔,優(yōu)雅,我們將控制前進的代碼部分提取出來建立名稱為Go()的函數(shù),在需要執(zhí)行前進的地方直接調(diào)用Go()函數(shù)即可。
from microbit import *
def Go():
display.show(Image.ARROW_N)
pin11.write_digital(0)
pin12.write_digital(1)
pin13.write_digital(0)
pin19.write_digital(1)
Go()
while True:
num = 0
pin5.write_digital(0)
pin5.write_digital(1)
sleep(0.01)
if pin8.read_digital() != True:
pin5.write_digital(0)
pin5.write_digital(1)
sleep(0.01)
while pin8.read_digital():
num = num + 1
if num <= 8:
display.show(Image.ARROW_W)
pin11.write_digital(1)
pin12.write_digital(0)
pin13.write_digital(0)
pin19.write_digital(1)
sleep(1000)
Go()
按照同樣的方式,我們將控制轉(zhuǎn)向和檢測障礙物的代碼分別建立Turn()和Detection()函數(shù)。
from microbit import *
def Go():
display.show(Image.ARROW_N)
pin11.write_digital(0)
pin12.write_digital(1)
pin13.write_digital(0)
pin19.write_digital(1)
def Turn():
display.show(Image.ARROW_W)
pin11.write_digital(1)
pin12.write_digital(0)
pin13.write_digital(0)
pin19.write_digital(1)
def Detection():
num=0
pin5.write_digital(0)
pin5.write_digital(1)
sleep(0.01)
if pin8.read_digital() != True:
pin5.write_digital(0)
pin5.write_digital(1)
sleep(0.01)
while pin8.read_digital():
num = num + 1
return num
Go()
while True:
num = Detection()
if num <= 8:
Turn()
sleep(1000)
Go()
代碼如上 ,拼插編程代碼見附件。
轉(zhuǎn)自Geek-bodasister。