2021电赛-F题-智能送药小车-国二作品-超神战队
简介
2021电赛F题国二作品。基于arduino单片机、步进电机运动系统、openmv神经网络视觉识别、蓝牙双车通信实现功能。完成所有基础功能和发挥功能1,稳定性强。
简介:2021电赛F题国二作品。基于arduino单片机、步进电机运动系统、openmv神经网络视觉识别、蓝牙双车通信实现功能。完成所有基础功能和发挥功能1,稳定性强。开源协议
:Public Domain
描述
一、前言
本人有非常多做车经验,因此电赛主打的方向就是做车。而本次比赛车类题目和我的团队阵容匹配,加上两个给力队员助力,取得了国二的好成绩!
二、团队介绍
由队长赵嘉辉(电控编程)、队员陈为骞(视觉识别)和吴金颖(机械设计)组成,其中两个大四,一个大三。
三、项目分析
四、系统方案
1、单片机选择
采用arduinoMEGA2560单片机作主控。由于其代码开源性,代码简易,适合新手使用。强大的库函数能极大减少开发时间。且对于该题目,运算速度足够,因此采用。
2、运动系统
采用42步进电机。该款电机转动精确度高,扭力大,额定电流2A以下,且控制简单,不会因为不同驱动的电压而导致转动步数的偏差,无需使用闭环控制即能走出非常好的直线,不易走歪,短距离内可精准控制运动位移。驱动采用TB6600 H桥双极恒相流驱动。驱动及电机采用淘宝成品套件,设置驱动细分数为4细分,即800步电机转一圈。由于驱动体积较大,且42步进电机运行时电流较小,因此可以拆除该驱动模块的金属外壳(散热器),从而达到极大缩小体积和重量。拆除电机驱动的外壳后,可以用铜柱将两个驱动垫起来,然后本工程的另一个PCB电机信号整合板,可以直接安装在驱动的铜柱上面,然后接好线即可。
2024/05新增说明:步进电机驱动市场上也有很多种类,推荐直接买双路的,比较省体积。推荐一款下图的:LV8731的驱动,体积极小,直接带5V 3A的稳压输出,单片机扩展板PCB上都不再需要焊稳压模块了。淘宝识图即可找到。(建议有一定基础想优化小车的同学使用,需要自行更改代码)
前轮采用牛眼轮进行支撑。牛眼轮的选择最好选摩擦力小的。本作品用的牛眼轮摩擦力较大,使得电机的速度不能提得太高,否则摩擦力会将车的运动姿态扰乱,走起来一抖一抖的。因此推荐使用万向轮,能大幅减少摩擦力!!!
3、循迹系统
采用八路灰度传感器(实际只用了4路)。调节好阈值,能精准分辨红白色。推荐使用下图的灰度传感器。用非常简单的数字逻辑检测循迹代码即能完成循迹功能。
2024/05新增说明:市场上出现了性价比更高的灰度传感器,感为科技的8路灰度传感器,推荐此款,功能完全兼容上面用到的灰度传感器。买绿色光的款式。
4、视觉系统
手持病房号采用模板匹配识别,原因是手持病房号可动态调整远近、角度,模板匹配也能很快识别成功。
地面上的病房号数字采用OpenMV4 H7 Plus神经网络方法识别。对比模板匹配,识别成功率极高,高达90%以上。由于性能受限,运行时图像仅有2~3帧,需要在病房号前停下零点几秒让其图像稳定下来识别数字。
openmv一通电执行模板匹配算法识别手持病房号,识别到后发送对应数字给单片机,随后openmv自己保存这个“目的病房号”。之后就等待单片机发送‘1’。随后单片机控制小车来到十字路口前停下,发送‘1’后openmv使用深度学习算法识别地面的病房号,并和之前储存的“目的病房号”对比,如果是地面上贴着的左病房号和‘目的病房号’一致,就发送‘1’,右病房号一致就发送‘2’,如果都不匹配就发送‘0’。单片机根据收到的0、1、2控制小车:直行到下一个十字路口重新发送‘1’、左转到目的病房号、右转到目的病房号。
5、通信系统
采用HM-10蓝牙模块进行双机通信(可用HC-0X系列代替,但注意要买支持主从一体的蓝牙型号)。主蓝牙仅能接收从蓝牙的信息,不能传信息给从蓝牙。因此从蓝牙接1号车,主蓝牙接2号车。2号车只需要接收1号车指令即可完成所有任务。注意:需提前AT指令设置主从模式和自动连接蓝牙的操作。
6、其他
采用了0.96寸oled屏幕显示本次读取病房号是否成功,及实时显示一些小车运行状态,方便调试。设置红绿黄指示灯、蜂鸣器提示等功能。
采用双边自复位按钮作复位键。由于主控单片机和OpenMV工作电平不一致,复位引脚不能接入同一按键上,因此使用此按键可一键复位两个单片机。(原本规则是写每次演示任务后只能按一个复位键,但是验收的时候评委说可以断电重启来代替复位,所以这个按钮复位的功能可以不做)
药物检测采用简单的红外避障模块检测高低电平即可。
五、原理图电路分析
1、主控单片机扩展板
由于本作品的pcb是提前准备的,预设了很多功能接口都没有用上,因此只讲解使用过部分的原理图。
2024/05新增说明:旧版本的PCB已经弃用,现在换成了新版本的PCB,删除了旧版本没有用到的多余接口,缩小了PCB面积,而且添加了众多的接口说明。代码完全兼容旧版本PCB。
(1)单片机及其引脚外接
其中arduino的D2-D5作为IO口接入电机驱动模块,驱动两个步进电机(每个步进电机由DIR和PUL控制),D23-D37的其中一些引脚接灰度传感器的8个数字信号口。
(2)电源输入、输出
12V从圆孔DC5.5系列接口输入,一路直出给步进电机驱动和步进电机供电,另一路经过5V稳压模块给单片机等其他模块供电。
稳压模块是淘宝上的这款:焊的时候需要注意要用排针焊接
(3)蜂鸣器驱动电路
这个电路可有可无,锦上添花。
(4)红绿灯驱动电路
在旧版本的PCB中无该设计,是现场焊电路做成的,更新后的PCB加上了3个LED灯,3个灯分别接入单片机D8、D9、D10接口。
(5)单片机扩展板PCB介绍
印丝都标的非常明显。
首先,单片机ArduinoMEGA2560的排针焊接方式是向下焊,然后单片机从下往上插,实现单片机吊在PCB的下面。
串口0是用来烧录的,最好不要接东西。串口1接蓝牙模块,串口2接OPENMV。接OPENMV时有可能供电不足,导致openmv死机或重启,这时候建议用多一个独立的稳压模块给OPENMV单独供电。
左上角电机信号控制接口是XH2.54-5P的封装接口,用XH2.54的红白排线可以将其接到电机驱动信号整合板上,用于驱动电机运行。
上方是灰度传感器接口,焊排针,需要注意的是代码中主车和从车的灰度传感器接口定义的顺序是反的,接线的时候需要额外注意。
左边是OLED接口,OLED接口请焊排母!!! 这样OLED能直接插在上面。
左下角是DC5.5-2.1的电池接口,上方是稳压模块。
下方是按键,接入了单片机的A0到A3接口,备用扩展调试功能。
右下角是红外感应模块接口,该接口用于药仓检测,检测有无药物放下。最右下角则是12V直出供电,用于给电机驱动板供电使用。这里请用2根粗的电线连接,杜邦线扛不住电机的大电流,发热会很严重的。
右方是3个LED,黄灯不要焊错了。可以根据亮度更换电阻,尝试过200R左右的阻值LED是比较亮的。
中间是蜂鸣器,可有可无,可不焊。
2、步进电机驱动信号整合板
两个步进电机需要两个驱动板,需要较多信号线和电源线,会导致接线较乱、易松。为了稳定性更好,制作了这块信号整合板,并使用了XH2.54红白排插线,连接不易松,且易拔插。
(1)原理图
分为12V电源输入输出,布线配合单片机扩展板的IO分布。
(2)PCB及仿真图
印丝层加入了对应的IO口数字号,标注了步进电机驱动细分数对应的拨码器状态。且该pcb孔位、大小完全适配拆了散热外壳后的步进电机驱动模块,能直接安装在驱动上,省空间。
六、PCB设计分析
由于主要难度在电控编程上,因此对于PCB的布线难度较小,有一定基础即可,没有需要特别注意的地方。
七、实物展示
小车1和小车2用的都是同一个方案和模型。由于成本原因,我们组手头上只有1个openmv4plus,而深度学习仅能用4plus跑。因此小车2上搭载的是openmv4,使用模板匹配进行识别。
八、作品装配
1、整车模型
如图为小车机械结构3D图。前轮采用两个牛眼轮进行辅助支撑,后轮为步进电机驱动的动力轮。长21cm、宽19.5cm、高24.5cm。
图中1为牛眼轮,2为八路灰度传感器模块,3为小车底板,4为六角铜柱,5为单片机和PCB扩展板,6为摄像头支架固定底座,7为OpenMV摄像头,8为药品,9为药仓,10为红外对射模块,11为步进电机驱动板,12为普通轮子,13为步进电机,14为12V锂电池,15为支撑座。
2、车底盘图
如图为车底盘CAD图,使用激光切割亚克力制成。厚度4mm左右。
九、程序设计
1、运动函数
以前进为例:通过脉冲数控制步进电机的步进数。想让电机走一圈就是给800个脉冲,位移对应轮子周长。给脉冲的快慢(频率)决定了电机旋转快慢。
后退、顺逆时针同理,仅A、B电机的方向不一样而已。
2、循迹函数
Q3-Q6为灰度传感器中间4个,检测其电平,根据电平控制小车左转、右转。函数中:(Anit)ClockwisePX(10,3000)为(逆)顺时针微动函数,10为步进数,3000为速度(越小越快)。Advance(50,1800)为前进函数,50为步进数,1800位速度。
3、读取病房号函数
其中inData为字符类型全局变量,存储收到的信息,作缓存。Aim为目的地全局变量,其数字值代表着识别到的目的地病房号。
4、读取分岔路口病房号函数
自定义和openmv的通信协议,发送0x31时开始识别分岔路口病房号。接收到返回的字符,对应左转、右转、前进,显示屏也会显示对应Z、Y、N。u8g2类函数是oled的显示函数,使用方法自行学习,较简单。
5、小车1发送位置信息给小车2
定义病房号的绝对坐标,小车1到达某个收货点后发送该收货点的绝对坐标(3或4,目前没做到5-8的任务)。小车2收到这个绝对坐标后,到达暂停点。小车1返回结束后,会发送可运行指令给小车2,此时小车2根据接收到的绝对坐标,直接去对应的中端病房。
代码没有截全,因为后面的是发送5-8远端病房号的绝对坐标,没有做到那一步,此部分没什么用。函数里的Mid变量是记录小车1到中端病房时的动作,Mid=0对应左转、Mid=1对应右转、Mid=2时前进。以此判断小车1终点在中端病房还是远端病房。同样的变量还有Long。
6、视觉代码流程图
7、神经网络训练结果
基于部分图片数据训练的结果已经达到100%识别率。实际检测结果置信度达到90%以上,足以满足识别要求。
十、总结
1.选择自己最擅长的方案。例如本人在多个车类比赛中均使用步进电机方案,经验丰富,旧代码多,省了非常多的代码编写时间。不要去尝试其他不熟悉的方案,因为4天3页时间真的很紧急。
2.作为队长要根据每个队员的优势长处设定任务,队长要担任起进度规划的重任,经常是“单核多线程”工作。每个队员都要有强烈的责任感,在选队员上是关键。例如我们队伍有一个机械,负责车组装和3d建模打印等操作,效率极高,半天时间就设计完,一天不到就组装出第一台车,为我们队伍节省了非常多宝贵的调试时间。
3.运气也是实力的一部分。本次比赛的题目非常符合我们队伍阵容,车控电控、神经网络、机械,完美适配我们三人的优势,也许这些都是命中注定。
十一、附件
B站演示视频:https://www.bilibili.com/video/BV1Qb4y1i7Sn/
代码见附件。不懂可联系qq986274874可提供简单答疑等。
评论