赞
踩
千歌:即将走完大学的四分之三,从入学,参加社团,参赛,申项目,创业……大二由于某些原因,没有赶上国电的备赛,原本以为与这场四天三夜的盛宴无缘了,作为一名电子人,如果没有参加上国电,那将会是我一生的遗憾。好在机缘巧合,国电赛期延时了,我搭上了末班车,并拿到省赛一等奖。在此,我要感谢我的队友:康康、Zwalkon。
本次我们会把作品(基础题三小问)的设计思路,硬件选择,以及源码全部开源!!!
注意:本文章严禁未授权转载;所属源码,除本团队外,禁止销售。如有发现,可向我们举报。
工程链接请看文末,自行下载。
效果视频:
2021电赛F题,送药小车,结束封箱,提桶跑路
基本要求:
(1)单个小车运送药品到指定的近端病房并返回到药房。要求运送和返回时间均小于 20s,超时扣分。
(2)单个小车运送药品到指定的中部病房并返回到药房。要求运送和返回时间均小于 20s,超时扣分。
(3)单个小车运送药品到指定的远端病房并返回到药房。要求运送和返回时间均小于 20s,超时扣分。
首先我们拿到题目立即分析其中需要的重要组成元素,分别为:数字识别、循迹、药物检测、红绿黄灯。
我们根据题目要求设计的小车具备以下硬件:两个openmv(寻迹、数字识别)、两个单路灰度传感器(识别十字)、两个TB6612电机驱动、行程开关(检测药物)、0.96寸OLED(显示代码效果)、红绿灯模块(红、黄、绿LED)、主控STM32F103RCT6,以下是硬件对应配置表,有一些多准备的硬件没用上也在其中(可忽略)。
openmv4摄像头2,7.2V锂电池1,普通小车底盘(带4个TT电机)1,STM32F103RCT6单片机1,TB6612FNG电驱2,OLED显示屏,单路灰度模块3,行程开关1,200g砝码1,洞洞板*2,杜邦线若干。(一辆小车大概750成本,摄像头买280的就可以)
破破烂烂-寒门子弟号(1):
破破烂烂-寒门子弟号(2):
1、openmv4:
2、单片机:
3、小车底盘(长26厘米,需要自己锯掉一点)
4、灰度模块:
5、电驱TB6612:
6、行程限位开关
7、0.96寸OLED
循迹大概分为两种方案,一种的灰度循迹,一种是摄像头寻红色,我们代码中使用的openmv寻红色线,通过取阈值可以排除误识别黑色的概率,如果使用的是灰色循迹,则需要避免误识别黑色,比如边界和十字路口边上的数字都是黑色;循迹中的路径规划与判断都由stm32处理。
由于题目提到的是大约200g药物,但是形状没限制,不作为考核重点,那我们就没必要搞一个压力传感器,直接用行程开关感应药物是否压着开关就能判断药物是否存在。
使用两个灰度传感器用于识别十字,判断寻迹途中转弯时机。
OLED用于反馈代码执行阶段,方便调试时候看现象。
我们是通过openmv的多模板匹配实现的,虽然是使用例程,但是不能完全使用,必须做修改,不然模板一多会出现帧数特别低的现象,基本卡着不动(这里,千万不要用for循环,不然就会出现卡)(直接在单模板的基础上叠加模板就行,具体看源码),模板匹配后,就把感兴趣的ROI的第一位传给需要传给单片机的数组。
数据格式为[X,X,X…]中间有14个数据
组成为1,2,3,3的X坐标,4,4的X坐标,5,5的X坐标,6,6的X坐标,7,7的X坐标,8,8的X坐标
举例
识别到画面中只有1,数据格式为[1,0,后面都是零]
识别到画面中只有2,数据格式为[0,2,后面都是零]
识别到画面中只有3,数据格式为[0,0,3,3的X坐标]
以此类推,1和2都是没有X坐标的,因为1、2房间号固定位置,不用判断。别的数字后面都会紧跟着数字所在位置的X坐标值
以上代码只进行了openmv传输数据到stm32,接下来进行进一步处理。对识别数字结果进行滤波,每一次识别结果中,将识别到的数字在对应数组中加1,后面比较数组的大小就可得知,那个数字识别的次数对多,那个数字就是正确的。LB_flag初始为0
上面只适用开头的识别单个数字的场景,接下来还有同时识别两个数字的代码,方法就是先识别一个最多的数字排除,再后续识别出现最多的另一个数字。
这部分的数据处理与数字识别部分类似,并且无需滤波,运用得来的数据进行PID运算做寻迹。Openmv发送数据格式为[X,X]
第一个数据是截距rho第二个是角度theta,两者都有正负之分,最大值为三位数。
以下是stm32处理此数据格式的代码
最重要的数字识别和寻迹部分的数据传输和处理已经展示完毕
剩下的就是判别十字路口和路径规划的代码处理
首先,因为我们的寻迹效果很理想,所以不存在误触的情况,所以通过硬件上的灰度传感器识别到红线则必定是到了十字路口,执行转弯流程,但是因为转弯90度会导致灰度传感器再次触发红线,因此我们设置了一个防触发延时,需要一点5秒过后才能进行转十字判断。
由于涉及到太多标志位,代码看起来比较复杂,此处只讲概念,剩下自己看源码,此处代码部分在定时器3的中断服务函数内。以下以题目1部分识别处理
SZ_flag为转弯标志位,当它置1则执行转弯操作
关于路径规划部分
设置了一个数组,根据每次十字路口的处理,分别对数组的每一位进行赋值,转左赋1,转右赋2,不转弯赋0,这样在的话只需要在写完往目标前进的代码,后续代码复制一遍前进代码中识别数字的部分删除,改为数组中数据判断,反转数组中对应数值进行转弯操作就行,比如,前进时,遇到路口,对应为1,左转,返回是判断对应是1,右转,如果为0.则不判断转弯即可。
在我的代码里,这个路径数组为luxian[] (中文拼写别介意)
精华部分:关于实现停车位置一致性的处理
由于我们openmv动态识别数字效果十分不理想,所以我们只能静态识别,为此,必须设定一个确定的停车位置,并且每次运行时的停车位置都得几乎一致,但是做过小车的同学都知道,小车在使用时间不同的情况下,电压不定,电机的运行速度也不一致,因此,为了保证停车位置一致,我们在每次发车开始打开计时,到第一个十字路口时中断,然后将这段距离与时间运算即可得到当前电压值下小车的平均速度,然后就可以用这个速度去计算我们接下来前进的每一个位置,也包括第二、三个路口的数字识别位置。
由于涉及到很多标志位,此处只写概念,代码请同学们查看源码。
关注公众号,回复电赛获取下载链接。
注意:本文章严禁未授权转载;所属源码,除本团队外,禁止销售。如有发现,可向我们举报。
预告团队下一个比赛:
广东省工科大学生实验综合技能竞赛
电赛F题交流群,要是过期了,关注公众号,联系千歌进群,未来我们还会继续推出各种比赛项目,敬请期待~~~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。