写在前面
2020年电赛结束了,因为疫情的原因,今年的电赛也推迟了,所以我先参加了智能车竞赛再参加的电子设计竞赛。准备时间不是很充分,就准备了一个国庆的时间,因此我们准备的小车就是智能车的舵机和电机,为了符合比赛要求,底板是我们重新打的,然后在国庆期间,我找到了Ti芯片的MSP430F5529的硬件设备库并且分别将S3010舵机,RS380电机,按键,拨码,OLED显示屏等外设调通,小车上使用了智能车的稳压电源和电机驱动,至此完成小车运行的任务,调通了一辆可以运行的小车。
题目
演示
解决方案
第一天的早上我们讨论了一下小车前轮的安装情况(其实并没有啥用),然后开始搭车,因为我国庆摸鱼了,没有搭出一辆可以跑的车子,只是把外设调通了而已,所以第一天的白天我和队友A就是在搭一辆可以下地跑的小车。 看了题目之后我们觉得小车控制速度非常关键,但是我们用的MSP430F5529芯片只有4个定时器,一个产生电机PWM,一个产生舵机PWM,还有一个做定时中断使用,而后面2路的正交解码信号也需要2个定时中断进行解码,因此我使用了2块Ti芯片,芯片A进行正交解码,并且以波特率115200通过串口将数据传输给芯片B,由芯片B进行小车外设的控制 512线正交解码时序图:当后车轮往前转的时候,编码器方向输出为高电平(1),反之为低电平(0),同时输出脉冲数(当编码器转完一圈的时候输出512个脉冲,因此是512线编码器)表示轮子转过的角度。基于这种数据传输方式我写了对应的正交解码程序。 以后左轮为例,右轮相同。初始化一个定时器作为脉冲计数,具体配置方式如下,我用的是大佬的开源库(如有侵权请在评论区指出,立刻删除),大家最好还是用官方的库吧。同时设置GPIO口判断后轮转动的方向,这些都是小问题。 接下来是在脉冲中断函数中做的事情了,每次脉冲读取中断触发一次,便进入一次中断函数,因此在中断函数中进行脉冲计数变量的自加操作。 然后在定时中断(我设置了50ms)里面通过前面的g_left_over_flow
变量数值结合脉冲计数函数获得脉冲数,然后通过串口发送出去,数据发送完毕之后将变量清零,同时将脉冲计数器里面的脉冲计数清零。至此完成了脉冲计数采集以及发送。 第一天晚上芯片B串口接收脉冲数据还有些问题,具体的bug是这样的: 串口实际发送的数据如下图: 比如芯片A发送了数据0112;的数据给芯片b,芯片对该数据进行解码,得到脉冲数为112,算法思路是:当接收到0之后跳过该位,当接收到;之后表示这个数字的接收已经完成了。但是这个算法有个问题就是数据0110;会被识别成11, 第二天早上去实验室的时候我才发现了这个bug,并将其修正过来。
早上我们还在讨论黑白间隔点的巡迹方案。因为我们之前打算用摄像头的,但是我们之前做的车子实在是太长了,所以摄像头放不下了,而且拟合的巡迹线也不是很好,因此我们不得不寻找新的巡迹模块。我的想法又冒了出来,想用光电巡迹模块。但是我们车子实在是太长了,因此这个光电传感器的摆放位置被大大的限制了,所以第二天我们几乎就是在讨论光电巡迹的方案。 终于在晚上我们决定了光电摆放方案以及巡迹方案。
方案如下: 我们通过推车发现当小车在入弯的某个点打最大打角之后刚好可以以完美的姿态通过弯道。因此我们在小车前面放了2个光电传感器用于基本的黑白点巡迹,当左边光电探测到黑线的时候就往左给一个打角,当右边光电探测到黑线的时候往右给一个打角,从而保证小车可以基本沿着直线行驶。接下来就是过弯道的思路了,我们在小车底板的舵机附近开了一个窗口,并且在窗口里面放置了一个光电传感器,这个光电传感器放在了小车中线偏右的地方,一般情况下这个光电是不会检测到黑块的,但是在入弯的时候却会检测到黑块,因此在这个光电传感器检测到黑块的时候就把小车往右边打角死,并且通过编码器积分保证小车通过弯道之后再切换到正常直线巡迹,最后当小车前面2个光电传感器同时检测到黑块之后进行停车。
第二天白天我主要做了代码整体框架的建立,包括电机PI调试以及整体逻辑的建立,晚上队友A,B用打孔机在底板上开了一个很大的窗口,通过这个窗口里的光电传感器来巡迹 第三天当天早上我们完成了第二天定下来的传感器摆放位置,以及巡迹和控制方案,一气呵成,在早上10点钟的时候完成了题目的1,2题要求!下午修缮细节,完成了20度的测试!后来车子出了问题,最后比赛没有拿到一个理想的奖项,是有些可惜的。
(づ ̄3 ̄)づ╭❤~一键三连,这次一定(๑•̀ㅂ•́)و✧