【STM32智能车】智能寻迹
- 基础算法
- 寻迹小车
我们之前说了到了寻迹这里会涉及到一些算法,不过各位小伙伴可以放心,我们这里用的是一些基础算法。不需要公式,只需要进行简单的判断就行。
基础算法
寻迹车的程序算法如下:
初始化:设置电机和传感器的引脚,定义速度和转向角度。
启动循环:重复执行以下步骤:
2.1 读取传感器:读取左右两侧红外传感器的数值。
2.2 判断:根据传感器数值判断当前情况,如下:
- 左右都有黑线:直行。 - 左边有黑线:左转。 - 右边有黑线:右转。 - 左右都没有黑线:停止。
2.3 调整方向:根据判断结果调整车辆的方向,如下:
- 直行:两个电机都向前运转。 - 左转:左侧电机停止或减速,右侧电机加速。 - 右转:右侧电机停止或减速,左侧电机加速。 - 停止:停止所有电机。
结束循环。
这就是一个简单的寻迹车程序算法,它可以让车辆根据传感器读数自动调整方向,沿着黑线行驶。
寻迹小车
有请我们跑道,可以看到这个小车跑道过度相对较稳,所以只用左右两边的寻迹信号就行。
代码如下,需要注意的是传感器接收数据有个时间,所以要控制车速,车速不能太快。
# main.py -- put your code here!
from car import car #调用car.py里的Car类。
from pyb import Pin, Timer,LED
from time import sleep_us,ticks_us,sleep
#定义引脚,低电平时,指示灯亮。
xun1 = Pin(("C3"),Pin.IN)
xun4 = Pin(("C2"),Pin.IN)
xun3 = Pin(("C1"),Pin.IN)
xun2 = Pin(("C0"),Pin.IN)
while True:
pyb.udelay(1000)
print('xun1:%d,xun2:%d,xun3:%d,xun4:%d' %(xun1.value(),xun2.value(),xun3.value(),xun4.value()))
#检测到黑线时循迹模块相应的指示灯亮,端口电平为(0)
#未检测到黑线时循迹模块相应的指示灯灭,端口电平为(1)
if(xun1.value()==0):
#四路循迹引脚电平状态
#信号1检测到黑线电平值为0,左转(或者原地左旋转)
# 0 1 1 1
#car.left(10)
car.left(20)
elif(xun4.value()==0):
#四路循迹引脚电平状态
# 信号4检测到黑线了,右转即可
# 1 0 0 0
# 1 1 0 0
# 1 0 1 0
car.right(20)
else:
car.go(40)
car.py
#main.py -- put your code here!
from pyb import Pin, Timer,delay
from time import sleep_us,ticks_us,sleep
cs = Pin('C8',Pin.OUT_PP) #C8设置为输出引脚输出高电平
cs(1)
ch1 =None
ch2 =None #初始化
A0= Pin('B12',Pin.OUT_PP) #右侧马达
A1 = Pin('B13',Pin.OUT_PP)
B0 = Pin('B14',Pin.OUT_PP) #左侧马达
B1 = 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)
#小车状态
#小车右侧电机接到A处,且电机红线在A0;
#小车左侧电机接到B处,且电机红线在B1
class car:
def go(speed): #直行状态
ch1.pulse_width_percent(speed)
ch2.pulse_width_percent(speed)
A0(1)
A1(0) #此状态测试A电机正转
B0(0)
B1(1) #此状态B电机正转
def back(speed): #倒车
ch1.pulse_width_percent(speed)
ch2.pulse_width_percent(speed)
A0(0)
A1(1) #此状态测试A电机正转
B0(1)
B1(0) #此状态B电机正转
def ztstop(): #停止
ch1.pulse_width_percent(0)
ch2.pulse_width_percent(0)
def right(speed): #右转
ch1.pulse_width_percent(0) #A电机不动
ch2.pulse_width_percent(speed)
B0(0)
B1(1)
def left(speed): #左转
ch1.pulse_width_percent(speed)
ch2.pulse_width_percent(0) #B电机不动
A0(1)
A1(0)
我们用的传感器是低电平亮,方便使用者观察。如果传感器碰到黑色线不亮,则需要根据情况调整传感器灵敏度。(上面旋钮就能调~)