2020电赛总结—依靠“黑白间隔点”巡迹的四轮电动“爬坡”小车(附开源代码)

依靠黑白间隔点巡迹的四轮电动爬坡小车


2020年电赛终于结束了,因为疫情的原因,今年的电赛也推迟了,所以我先参加了智能车竞赛再参加的电子设计竞赛。准备时间不是很充分,就准备了一个国庆的时间,因此我们准备的小车就是智能车的舵机和电机,为了符合比赛要求,底板是我们重新打的,然后在国庆期间,我找到了Ti芯片的MSP430F5529的硬件设备库并且分别将S3010舵机,RS380电机,按键,拨码,OLED显示屏等外设调通,小车上使用了智能车的稳压电源和电机驱动,至此完成小车运行的任务,调通了一辆可以运行的小车。

先放上我的GitHub代码,欢迎大家互相学习哦
链接: https://github.com/LittleGenius12138/ramp_car/tree/master/.

题目

在这里插入图片描述

我们选择了C题的小车控制题目。拿到了题目,我们当时“膨胀”了,以为很简单哈哈哈,结果现实打了我们一个大耳光啊哈哈。

第一天

第一天的早上我们讨论了一下小车前轮的安装情况(其实并没有啥用),然后开始搭车,因为我国庆摸鱼了,没有搭出一辆可以跑的车子,只是把外设调通了而已,所以第一天的白天我和队友A就是在搭一辆可以下地跑的小车。
看了题目之后我们觉得小车控制速度非常关键,但是我们用的MSP430F5529芯片只有4个定时器,一个产生电机PWM,一个产生舵机PWM,还有一个做定时中断使用,而后面2路的正交解码信号也需要2个定时中断进行解码,因此我使用了2块Ti芯片,芯片A进行正交解码,并且以波特率115200通过串口将数据传输给芯片B,由芯片B进行小车外设的控制
512线正交解码时序图:在这里插入图片描述
当后车轮往前转的时候,编码器方向输出为高电平(1),反之为低电平(0),同时输出脉冲数(当编码器转完一圈的时候输出512个脉冲,因此是512线编码器)表示轮子转过的角度。基于这种数据传输方式我写了对应的正交解码程序。
以后左轮为例,右轮相同。初始化一个定时器作为脉冲计数,具体配置方式如下,我用的是大佬的开源库,大家最好还是用官方的库吧。同时设置GPIO口判断后轮转动的方向,这些都是小问题。
在这里插入图片描述
接下来是在脉冲中断函数中做的事情了,每次脉冲读取中断触发一次,便进入一次中断函数,因此在中断函数中进行脉冲计数变量的自加操作。
在这里插入图片描述
然后在定时中断(我设置了50ms)里面通过前面的g_left_over_flow变量数值结合脉冲计数函数获得脉冲数,然后通过串口发送出去,数据发送完毕之后将变量清零,同时将脉冲计数器里面的脉冲计数清零。至此完成了脉冲计数采集以及发送。
在这里插入图片描述

至于巡迹模块,我们当时看了准备材料,买了一个openmv摄像头,打算用这个来进行黑白巡线,所以队友B在调openmv的寻迹代码,下午队友B也做了题目里面要求的赛道。
晚上在调芯片B的串口接收程序,摸鱼中进行度过,看了队友B调出来的openmv效果不是很满意,仔细询问,居然全是调库,遂喷其一顿,结束了第一天的摸鱼工作。回寝室睡了个美滋滋的觉。

第二天

第一天晚上芯片B串口接收脉冲数据还有些问题,具体的bug是这样的:
串口实际发送的数据如下图:
在这里插入图片描述
比如芯片A发送了数据0112;的数据给芯片b,芯片对该数据进行解码,得到脉冲数为112,算法思路是:当接收到0之后跳过该位,当接收到;之后表示这个数字的接收已经完成了。但是这个算法有个问题就是数据0110;会被识别成11, 第二天早上去实验室的时候我才发现了这个bug,并将其修正过来。
早上我们还在讨论黑白间隔点的巡迹方案。因为我们之前打算用摄像头的,但是我们之前做的车子实在是太长了,所以摄像头放不下了,而且拟合的巡迹线也不是很好,因此我们不得不寻找新的巡迹模块。我的骚想法又冒了出来,想用光电巡迹模块。但是我们车子实在是太长了,因此这个光电传感器的摆放位置被大大的限制了,所以第二天我们几乎就是在讨论光电巡迹的方案。
终于在晚上我们决定了光电摆放方案以及巡迹方案。
方案如下:
我们通过推车发现当小车在入弯的某个点打最大打角之后刚好可以以完美的姿态通过弯道。因此我们在小车前面放了2个光电传感器用于基本的黑白点巡迹,当左边光电探测到黑线的时候就往左给一个打角,当右边光电探测到黑线的时候往右给一个打角,从而保证小车可以基本沿着直线行驶。接下来就是过弯道的思路了,我们在小车底板的舵机附近开了一个窗口,并且在窗口里面放置了一个光电传感器,这个光电传感器放在了小车中线偏右的地方,一般情况下这个光电是不会检测到黑块的,但是在入弯的时候却会检测到黑块,因此在这个光电传感器检测到黑块的时候就把小车往右边打角死,并且通过编码器积分保证小车通过弯道之后再切换到正常直线巡迹,最后当小车前面2个光电传感器同时检测到黑块之后进行停车。
第二天白天我主要做了代码整体框架的建立,包括电机PI调试以及整体逻辑的建立,晚上队友A,B用打孔机在地板上开了一个很大的窗口。

第三天

这天是我们进展最大的一天,也是我最遗憾的一天!
当天早上我们完成了第二天定下来的传感器摆放位置,以及巡迹和控制方案,一气呵成,在早上10点钟的时候完成了题目的1,2题要求!下午修缮细节,完成了20度的测试!
因为队友B铺设信号线的时候位置摆放有错误,未满足比赛要求,然后我做了最错误的一个决定:重做引导线。本来明明可以撕下来贴到上面一点就可以解决的事,我居然让B重新贴一条,我真想穿越回去给自己两巴掌啊。引导线重贴了之后小车就跑不了了,导致的结果就是晚上队友B花了40min重贴引导线,我和队友A花了8个小时重新恢复小车的运行姿态。
我在事后进行了深刻的反思,这可能是我大学做的唯一一件会后悔的事情吧。我还原了当时我自己深处的内心活动抽丝剥茧之后,我发现我当时最主要的思考就是:把同一根引导线撕下来之后再贴过就会粘不牢。其实当时这个问题明明可以用双面胶来解决的。我发现我有时候总会做一些完全没有必要的事情呢,仅仅是因为我的感性思维在起作用,没有仔细理性的思考权衡这件事情的利弊,我觉得这个是我在此次电赛中学到最最最重要的知识。

第四天

在第四天,我们将传感器的位置进行了微调,勉强完成了小车运行,但是最高的角度也只有10度,而且成功率也不是100%,但是最后还是装了箱,在装箱之后我还是感觉到了如释重负。
果不其然,测评结果不如意,拿了个不太好看的奖项,总之,算是一次比较遗憾的经历吧,但是我一定会汲取经验,不断成长!
加油,奥利给!
在这里插入图片描述

©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页