(不眠者①队)国电-F题:智能送药小车,广东赛区一等奖,推国赛,开源(代码+设计方案)

国电 —— F题: 智能送药小车,所有源码暂时开源

前言

  千歌:即将走完大学的四分之三,从入学,参加社团,参赛,申项目,创业……大二由于某些原因,没有赶上国电的备赛,原本以为与这场四天三夜的盛宴无缘了,作为一名电子人,如果没有参加上国电,那将会是我一生的遗憾。好在机缘巧合,国电赛期延时了,我搭上了末班车,并拿到省赛一等奖。在此,我要感谢我的队友:康康、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题交流群,要是过期了,关注公众号,联系千歌进群,未来我们还会继续推出各种比赛项目,敬请期待~~~

交流群:

在这里插入图片描述

在这里插入图片描述

版权声明:本文为CSDN博主「千歌叹尽执夏」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_46423500/article/details/121384853

千歌叹尽执夏

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

基于stm32的自平衡小车

引言 1、系统概述 1.1、设计任务 利用stm32做一辆自平衡小车 1.2、设计要求 利用IIC和MPU6050、OLED12864进行通信,使用pid算法到自平衡,熟练掌握PID算法 2、方案设计与论