Micropython Turniobit 會思考的避障車

什麼是會思考的避障車?
在日常生活中,大家會經常見到各種各樣的遙控車,它需要我們人爲的操作,控制它的前進、後退和轉彎。今天就帶大家認識一個不一樣的新朋友——會思考的避障車。
會思考的避障車和我們平時的遙控車最主要的區別就是智能化,它可以不需要我們去操控,自己就能行走。同時它還會實時檢測前方是否有障礙物,思考自己是否要前進或者轉彎。
聽到這裏,是不是已經躍躍欲試了呢。話不多說,動起手來吧!

所需器材:
Ø TurnipBit開發板 1塊
Ø 下載數據線 1條
Ø 智能小車套件 1套(底盤、車輪、電機等)
Ø 超聲波模塊(HC-SR04)1個(用作小車的“眼睛”)
Ø L298N電機驅動模塊 1個
Ø 接入互聯網的電腦 1臺(推薦使用Google Chome或者Firefox瀏覽器)

電機驅動和超聲波的安裝
超聲波模塊共4個引腳,分別是VCC、GND、Trig和Echo。VCC接TurnipBit擴展板的+5V引腳,GND接TurnipBit擴展板的GND引腳,Trig觸發引腳接P5,Echo回傳引腳接P8。
L298N電機驅動模塊左側OUT3、OUT4接線端子對應接入左輪電機的下側、上側側銅片,右側也是。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
P19 IN1

圖片描述
圖片描述
程序設計
僞代碼分析
讓我們先用僞代碼來分析一下避障車的程序邏輯。首先,我們通過小車的超聲波模塊來檢測前方是否存在障礙物,計算出與障礙物之間的距離。當與障礙物的距離小於或等於我們預設的安全距離時,控制小車進行轉向避開障礙物;當與障礙物的距離大於我們預設的安全距離時,控制小車進行繼續前進;邏輯順序如下:
第一步,觸犯超聲波模塊開始檢測;
第二步:計算出與前方障礙物的距離;
第三步:判斷與障礙物的距離是否小於設定的安全距離;
第四步:若小於或等於則進行轉向,避開障礙物;
第五步:若大於則繼續保持前進。
根據僞代碼,畫成流程圖如下:
圖片描述
拼插編程

整體的拼插代碼如下圖:具體怎麼一步一步拼插就不寫了。

圖片描述
圖片描述
將程序名修改成turnipbit-car,點擊【下載hex】按鈕將程序保存到電腦裏。

把保存的turnipbit- car.hex文件拖入TurnipBit磁盤中,我們會看到TurnipBit板子上的燈在閃爍,說明正在下載到控制板中。
下載成功後,將TurnipBit正確插入TurnipBit擴展板的金手指卡槽內,開始啓動避障車吧。

代碼分析
會思考的避障車整體代碼,可參考右側代碼顯示區,如下。

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)
   接下來,我們一起來分析一下代碼。
   通過上面的代碼,不難發現,控制避障車前進的代碼部分我們重複編寫了兩遍,在實際項目中這種寫法是不合理的。爲了讓代碼更加簡潔,優雅,我們將控制前進的代碼部分提取出來建立名稱爲Go()的函數,在需要執行前進的地方直接調用Go()函數即可。
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()

按照同樣的方式,我們將控制轉向和檢測障礙物的代碼分別建立Turn()和“Detection()函數。
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()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章