鹹魚ZTMR實例—巡線進階
簡單的巡線滿足不了朋友們的願望,因爲大部分‘賽道’都有各種‘坑’,比如直角彎,鈍角彎,交叉等路線。爲了方便學習,整理了代碼用於測試,之後可以根據賽道情況來挑選代碼。先看賽道↓就問你害不害怕。
主控板:ZTMR1.1python開發板
N20減速馬達(四驅車上的電機)
ZT紅外尋跡
引腳說明
引腳 | 說明 |
---|---|
VCC | 5v |
GND | GND |
x1~x4 | 都爲輸入 |
代碼如下
main.py
# main.py -- put your code here!
from car import Car,Tracing #調用car.py裏的Car類。
from pyb import Pin, Timer,LED
from time import sleep_us,ticks_us,sleep
#定義引腳,低電平時,指示燈亮。
xun1 = Pin(("B1"),Pin.IN)
xun4 = Pin(("B0"),Pin.IN)
xun3 = Pin(("C7"),Pin.IN)
xun2 = Pin(("C6"),Pin.IN)
def xunji():
while True:
pyb.udelay(50)
print('xun1:%d,xun2:%d,xun3:%d,xun4:%d' %(xun1.value(),xun2.value(),xun3.value(),xun4.value()))
#檢測到黑線時循跡模塊相應的指示燈亮,端口電平爲LOW
#未檢測到黑線時循跡模塊相應的指示燈滅,端口電平爲HIGH
#四路循跡引腳電平狀態
# 0 0 X 0
# 1 0 X 0
# 0 1 X 0
#以上6種電平狀態時小車原地右轉
#處理右銳角和右直角的轉動
if((xun1.value() == 0 or xun2.value() == 0) and xun4.value() == 0):
pyb.LED(4).on()
right(60)
pyb.delay(800)
pyb.LED(4).off()
#print(1)
#四路循跡引腳電平狀態
# 0 X 0 0
# 0 X 0 1
# 0 X 1 0
#處理左銳角和左直角的轉動
elif(xun1.value() == 0 and (xun3.value() == 0 or xun4.value() == 0)):
pyb.LED(3).on()
left(60)
pyb.delay(800)
pyb.LED(3).off()
# 0 X X X
#最左邊檢測到
elif(xun1.value() == 0):
spin_left(40)
# X X X 0
#最右邊檢測到
elif(xun4.value() == 0):
spin_right(40)
#四路循跡引腳電平狀態
# X 0 1 X
#處理左小彎
elif(xun2.value() == 0 and xun3.value() == 1):
left(40)
#四路循跡引腳電平狀態
# X 1 0 X
#處理右小彎
elif(xun2.value() == 1 and xun3.value() == 0):
right(40)
#四路循跡引腳電平狀態
# X 0 0 X
#處理直線
elif(xun2.value() == 0 and xun3.value() == 0):
go(50)
#go(20)
#當爲1 1 1 1時小車保持上一個小車運行狀態
if __name__ == '__main__':
xunji()
car.py
# main.py -- put your code here!
from pyb import Pin, Timer,delay
from time import sleep_us,ticks_us,sleep
cs = Pin('B10',Pin.OUT_PP) #B10設置爲輸出引腳輸出高電平
cs(1)
ch1 =None
ch2 =None #初始化
AI1 = Pin('B12',Pin.OUT_PP) #右側馬達
AI2 = Pin('B13',Pin.OUT_PP)
BI1 = Pin('B14',Pin.OUT_PP) #左側馬達
BI2 = Pin('B15',Pin.OUT_PP)
#A電機(右)
p1 = Pin('B8')
tim1 = Timer(10, freq=120)
ch1 = tim1.channel(1, Timer.PWM, pin=p1)
#B電機(左)
p2 = Pin('B9')
tim2 = Timer(4, freq=120)
ch2 = tim2.channel(4, Timer.PWM, pin=p2)
#小車狀態
class Car(): #把小車行駛狀態存入Car類中
def go(speed): #直行狀態
ch1.pulse_width_percent(speed)
ch2.pulse_width_percent(speed)
AI1(0)
AI2(1)
BI1(1)
BI2(0)
def back(speed): #逆行
ch1.pulse_width_percent(speed)
ch2.pulse_width_percent(speed)
AI1(1)
AI2(0)
BI1(0)
BI2(1)
def stopdj(): #停止
ch1.pulse_width_percent(0)
ch2.pulse_width_percent(0)
def spin_left(speed): #左旋
ch1.pulse_width_percent(0)#右
ch2.pulse_width_percent(speed)
AI1(0)
AI2(0)
BI1(1)
BI2(0)
def spin_right(speed):#右旋
ch1.pulse_width_percent(speed)
ch2.pulse_width_percent(0)
AI1(1)
AI2(0)
BI1(0)
BI2(0)
def left(speed): #左轉
ch1.pulse_width_percent(0)#右
ch2.pulse_width_percent(speed)
AI1(0)
AI2(0)
BI1(1)
BI2(0)
def right(speed): #右轉
ch1.pulse_width_percent(speed)
ch2.pulse_width_percent(0)
AI1(1)
AI2(0)
BI1(0)
BI2(0)