前言:
笔者大二,也算是第一次正式的打电赛省赛(大一电赛的时候还没接触32,校赛的时候就被刷下去了。。。)。经过一年的学习,三天两夜的校赛、两天一夜的七校联赛终于是挺到了省赛。比赛过程中真的是有太多感悟了。于是完赛第二天就赶出了这篇博客。
一、题目描述
设计一个采用 TI MSPM0 系列 MCU 控制的自动行驶小车,能在指定路径 上自动行驶,行驶场地示意如图所示。场地面积不小于 220cm×120cm。图中 两个对称半圆弧线的半径为 40cm,弧线为黑色,线宽 1.8cm 左右,弧线的四个 顶点分别定义为 A、B、C 和 D 点。建议场地采用白色哑光喷绘布制作。场地除 两个半圆弧外,不得添加任何标记。
要求 :
(1)将小车放在位置 A 点,小车能自动行驶到 B 点停车,停车时有声光提 示。用时不大于 15 秒。
(2)将小车放在位置 A 点,小车能自动行驶到 B 点后,沿半弧线行驶到 C 点,再由 C 点自动行驶到 D 点,最后沿半弧线行驶到 A 点停车,每经过一个点, 声光提示一次。完成一圈用时不大于 30 秒。
(3)将小车放在位置 A 点,小车能自动行驶到 C 点后,沿半弧线行驶到 B 点,再由 B 点自动行驶到 D 点,最后沿半弧线行驶到 A 点停车。每经过一个点, 声光提示一次。完成一圈用时不大于 40 秒。
(4)按要求 3 的路径自动行驶 4 圈停车,用时越少越好。
二、重点
我们的基本思路是,使用 MSPM0G3507 控制小车,红外寻迹(没有灰度),陀螺仪控制方向。难点一个是跑直线,一个是转弯。
(1)跑直线
我们开始准备采用编码电机测速,配合 pid 算法调速,使两个轮子的速度维持在一个定值,或者计算两个轮子的差速,用 pid 算法去调节。最终发现,两个轮子的性能不一样,达到恒定速度的时间也不一样。所以我们改用陀螺仪的 yaw 值检测小车的偏航角,然后配合 pid 算法控制小车直行。
(2)转弯
转弯肯定是采用陀螺仪,使小车能转固定的角度。
这两个难点的最终落脚点都停在了陀螺仪身上。
三、陀螺仪的选择
我们首先想到的肯定是 mpu6050,一款便宜好用的陀螺仪,主要是我们备赛的时候就有移植好的 mpu6050 的代码。但便宜肯定有它便宜的道理,yaw 值的零飘问题十分严重。一秒偏 2°,我还以为有太阳磁暴了。
幸亏我们实验室有往年学长留下来的财产。我们找到了实验室唯一一个 imu901。正好网上有一篇 imu901 的移植代码,正好它移植的芯片就是 MSPM0G3507 !!!因为它是十轴传感器,可以通过磁力计进行校准,就算是六轴的,它也自带了校准的算法,基本没有零飘问题,于是我们当天就把所有题跑了出来。可是,到了交作品那天早上一点,我们想着优化一下小车结构,最后不小心把 imu901 烧了。。。可以说是没了它我们所有的题都跑不出来了。这个比较冷门的陀螺仪基本别的实验室也没有,我买的要等完赛第二天才能回来。
然后我们又试了问同学借来的磁力计模块,效果也不是很理想,而且我们没时间去学这个东西。于是我就试着移植我们七校联赛用的 jy60 模块。最终在早上6点多移植成功了,(最后发现是中断服务函数写错了)。虽然效果没 imu901 效果好,但是起码能跑。
四、思路
1、如何判断到达A、B、C、D点:
开始巡线的点比较容易判断,我们可以以检测到黑线来判断结束直行,转为巡线;但出巡线的点就不能以检测不到黑线来判断了,因为我们用的是两个四路红外,间距比较大,在巡线中也会有很多次检测不到黑线。但我们备赛的时候发现我们跑定距离效果还不错,所以我们检测出巡线的点的方法就是跑过一定的距离并且检测不到黑线,就判断出巡线了。
2、如何跑斜线:
因为靠陀螺仪很难跑到确定的点上,而且斜着跑不一定能寻到线,所以我们跑一个比较大的角度,跑固定的距离,然后跑直线。
五、 总结
此次电赛可谓一波三折,先是烧了块 M0 的板子,又是烧了陀螺仪。好在最终是顺利完赛。要我觉得最大的感悟,就是所有东西都要有备份,最后阶段千万不要大改结构!!!
最最最后,我还要感谢两位队友让我们整个比赛都很轻松快乐,以及我们的指导老师都在背后默默鼓励着我们。