作为大一的小菜花,参加的校内智能车比赛结束了,今天为这段时间做做总结。
一.硬件部分
必需:STM32F103C6T6(或者STM32F103C8T6),舵机(MG 996R),电机(TT马达 130电机),L298n驱动,电磁杆(可以自己制作),干簧管,两节18650电池,基础四轮车模。
辅助:OLED,HC-05蓝牙模块。
二.软件部分
必需:ADC多路采集的DMA配置,定时器PWM波输出,普通GPIO口,滤波,归一化,差比和,PID算法。
辅助:OLED驱动,串口打印。
1.舵机
三根线:VCC,GND,信 线。 我们给VCC接的6V。信 线接相应PWM波输出口。
舵机调中值:可以使用编码器调节占空比,看舵机一共能够转动多少占空比的范围(注意!舵机不是可以360度旋转的)。然后取最中间的占空比输出给舵机。小菜花当时是设置的20ms为周期,Counter Period 设置的20000-1。
2.电机
开环控制两个电机:两个PWM波输出,四个普通GPIO口控制高低电平。
3.L298n驱动
可以自己去了解如何接线,这里推荐一篇小菜花看到的文章http://t.csdn.cn/Anzwy
4.干簧管
用于在终点处停车。话不多说,上链接https://share.weiyun.com/2m5eUtRv
5.电磁杆的电感值采集
我们组开始准备使用两个水平电感,两个竖直电感;但是最后由于种种原因,我们使用了两个水平电感,两个内八字电感。(最后我们环岛没有进,所以就只使用了两个水平电感完成了最基础的寻迹)。
ADC给四个电感 开了四路DMA采集 ,分别是A1,A2,A3,A4。
如果有条件可以在电磁杆中间使用第五路电感,就是小菜花开的A5(虽然我最后没有用到)。
还有两路ADC 是采集 两个干簧管的IO口 高低电平。
6.一些算法
软件滤波
滤波(Wave filtering)是将信 中特定波段频率滤除的操作,很大程度上保证了采集到的数据的稳定与真实,是抑制和防止干扰的一项重要措施。
这是参考的别的博主的一种滤波算法: 中位算数平均滤波 。 即结合了中位值滤波和算数平均值滤波的一种算法。
这一篇文章非常详细的讲了滤波http://t.csdn.cn/a8DbF
归一化
关于为什么要使用归一化:我看到的很多文章说使用归一化可以提高对不同赛道的适应性。我的理解是,在不同的赛道只用去测每一路电感的最大最小值就可以正常跑了,对于特殊元素的特征值不用再去测量。大大提高了对不同赛道的适应性。
归一化的定义:将数据映射到0-1范围之内处理,可以更快速便捷地观察数据。
归一化的公式:(X – Min) / (Max – Min).
其中 X为某一路电感 滤波后的ADC值;Min / Max为某一路电感 滤波后ADC采集到的最小 / 大值。
可以进行适度放大(一般是放大100倍),使车能够更容易的根据电磁值判断路况。
差比和
电磁智能车 是根据电磁杆上电感 采集到的值判断路况,可以说电磁杆上的电感就是一辆电磁智能车的眼睛。差比和值能够让车更直观的判断路况。
差比和公式:(L-R)/(L+R)。差比和值范围0-1。
原理:当电感离中心磁感线越近,采集到的值就越大,反之越小。
所以当差比和值为负的时候,可以判断到车向左偏移了,为正则向右偏移了(公式里面的左右交换了则反之)。
小菜花给差比和值乘了100,这里的100可以自行修改,根据需要调整。
PID算法
小菜花采用的位置式PD控制舵机。
小菜花将差比和值乘100后(就是上段代码中的position)直接传给PD算法中作为误差error。
那么为什么可以这样呢,因为我把 差比和值为0作为目标,采集回来的差比和值作为实际值,那么误差error就是 实际值-目标值。 注意,我的目标值为0,所以error可以直接为采集回的差比和实际值。
然后就开始调P和D,如果P D调得好,车就跑得很丝滑。小菜花建议可以使用分段PD来调车,亲测有效!车跑起来确实丝滑。
PD算法返回的值传给
745是小菜花当时找到的舵机中值,PWMValue1可正可负,调节舵机可以左右转动。
7.特殊元素
十字路口
小菜花当时是用两路水平电感寻迹,到了十字路口也不会出现误判,能够正常行进。
三岔路口
当两路水平电感采集的归一化后的值 出现同时突然下降时,强制打角。
环岛检测
小菜花是设置了三个标志位,到赛道上去采集阈值。当三个标志位都满足时,进行了强制打角(可以在此时切换为内八字电感寻迹,由内八电感的PD算法输出占空比拐弯进环岛。不推荐强制打角,会降低对不同赛道的适应性)。
然后用水平电感跑环岛。出环的时候检测两条磁感线重合的位置,到赛道测阈值,设置标志位,满足条件则强制直行,延时控制出环岛(依旧不推荐强制控制,但小菜花的能力有限,只能想到这个办法)。
出库
小菜花当时的思路是:开机就强制打角,延时控制直到出库,随后正常水平巡线。(所以出库函数只运行一遍!)
用了一个for循环(也可以不用,直接输出占空比)。for循环 使舵机打角时不会突然一下就转到相应角度,而是更加丝滑地转过去。
入库
干簧管经过终点磁铁,会由高电平变为低电平。因此,检测到干簧管的IO口有一个电平变化,标志位加一。在while循环里面标志位变为一的时候进行强制打角,延时控制入库,舵机转回中值,电机停止转动。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!