
电子科技大学英才实验学院2023年工创二-循迹避障小车
简介
本作品为UESTC英才实验学院2023年工创二课程设计——红外循迹超声波避障小车,各小组作品中的代表性作品之一,采用STM32F411主控,动力部分采用AT8236驱动n20电机。
简介:本作品为UESTC英才实验学院2023年工创二课程设计——红外循迹超声波避障小车,各小组作品中的代表性作品之一,采用STM32F411主控,动力部分采用AT8236驱动n20电机。开源协议
:GPL 3.0
(未经作者授权,禁止转载)描述
一、设计目标
基本要求
- 运动功能:能实现灵活转向,前进与后退平滑,速度合适,两分钟内应走完循迹路线全程;
- 自动控制功能:能沿白底黑色循迹线自动前进;能识别避障路线上障碍物并沿合理路线规避,规避完成后自动回到循迹路线;在指定标识出停止并鸣笛,模拟路口警示功能;
附加功能
- 外加控制功能:可切换到外部远程控制器,如使用蓝牙,Wifi或2.4G遥控等进行连接,控制小车的运动;
- 有可观赏性,具有一定的美学价值;
- 车身具有一定强度,具有负载能力。
二、硬件设计
完成人:YiRen
- 机械结构:
- 整体构架:
底板+电机*4+循迹避障模块+电池盒+主控板+连接线
- 底板:
不单独制作底板外壳,使用强度已经足够的1.6mm厚PCB电路板(FR-4玻璃纤维)底板上标注“n20电机位”的白色丝印方框用于在底板上方预留安装电机的位置;中段较大白色矩形框为电池盒的位置,较小白色矩形框安装dcdc降压模块;左侧较窄区域两侧安装小车后轮,右侧安装前轮,前轮位置较为灵活,可安装在中间的空余区域,此时后轮用较短的联轴器,可以极大减小车宽,增加美观性同时减小体积,但不利于实现差速转向,需要较大功率的电机,考虑到本组规划使用的电机功率较小,将前轮安装在底板外侧,后轮使用加长款联轴器,增加小车的转向灵活性,中间空余区域用于安装载重盒,也可扩展备用电池、摄像头或音响等其他功能性负载;底板上的打孔用于使用尼龙柱固定各部件。
- 电机:
经研究讨论,本组使用N20减速电机,原因是其结构简单,体积小,相比自身重量而言驱动能力强,扭矩大。转向功能使用两侧轮差速转向。
最初设计构想是计划设计类似摩托车外观,车身应该尽可能窄,因此选择了带有蜗杆传动装置的改良版n20电机,其转动杆在电机侧边,电机本身减小了车的宽度,同时利于轮子紧贴底板安装,进一步减小车身宽度,但由于本组最终方案改版,其减小宽度的优势并未得到体现,并且由于蜗杆有动力损耗,换成普通n20电机能提高作品性能,但需要对安装孔做一定的改动。
本组测试了12v电压下“381转-减速比42”和“60转-减速比236”两种型号的蜗杆n20电机,前者最高能跑出接近每秒一米的高速,但差速转向模式由于扭矩不足会直接停止,而后者虽然速度较慢,但转向能力稳定,最终为保证差速转向的稳定性,选用后者。
电机固定上,由于没有针对蜗杆n20电机设计的电机架,且绘制pcb时本人还未掌握3D打印技术。于是突发奇想使用两个尼龙柱进行限位,用捆扎胶带将电机绑在PCB底板上(如下图),实测固定效果良好。
- 载重盒:
改进轮胎位置后,为充分利用底板剩余空间,在留给原方案前轮的位置设计拓展功能,利用底板上的铜柱安装孔,增添扩展区块。该位置可以通过设计支架安装摄像头,音响和各类环境探测模块等。此处为模拟该扩展能力,设计一个方形载重盒。载重盒材质为PLA,采用3D打印制造,安装部件为盒子两侧带安装孔的侧耳,通过螺柱固定在底板上,3D模型与实物如下:
- 电池盒:
供电方面最初采用两节3.7V最低压,型号14500锂电池供电,后为增强前行动力与转向速度,改为三节3.7V电池供电,购买柱状三节电池串联盒后,使用3D打印设计一尺寸合适,强度足够且轻便的电池盒容纳并接通柱状三节电池盒,材质为PLA,底部为方便灌入热熔胶留有大量镂空:
- 车轮:
后轮采用直径65mm橡胶宽轮增强抓地力,用加长六角联轴器连接车轮与马达,增加后轮间距;前轮采用高强度轮毂硅胶窄车轮,减小前轮造成摩擦力,同时增加前轮承重能力,实测中,载重盒负载500g物品可无减速前进,前轮采用配套法兰联轴器与马达相连。
- 循迹避障模块:
循迹避障模块主体为宽U形,宽度与主板一致,固定孔依主板设计,可通过2.54mm-8P接口接入小车底板5V供电网络,并通过此接口将探测信号通过底板插座和排线传递到单片机,循迹部分设计五路红外循迹,避障部分设计双通道,五接插位,从左至右1、2、3插座为通道一,4和5为通道二,可实现单通道或双通道超声波测距避障,循迹模块前方用高亮度LED作为头灯:
- 连接部件:
各模块之间,跨板多路信号连接使用2.54mm-8P插针、2.54mm-6P-XH排线以及配套插座,并用尼龙柱、铜柱和螺母进行机械固定。
- 主控模块:
为方便更换主控芯片,利于后续改进,同时便于让蓝牙通信模块位于车顶接受信号,将主控芯片与底板分离,设计一主控模块扩展PCB,用尼龙柱通过三个限位孔固定在底板上,使用6P排线与底板实现信号交换,主控芯片选择STM32F411CBU6,扩展PCB上为其核心系统模块放置接插排母,两侧各有一排排母将其引脚扩展,排母针脚与排线插座相连处使用0欧姆贴片电阻,方便调试时断开连接并用杜邦线改变插座的连接引脚,板上预留蓝牙模块插座:
- 电路设计:
- 底板:
- 供电:
供电部分采用三节3.7V锂电池串联(满电12.6V)为总输入,通过sy8205开关降压电路产生5V(5A)供电网络,通过rt9013-33线性稳压电路获得3.3V(0.5A)网络,放置开关控制总输入与5V网络输入主控。
- 拨动开关集:
通过3个拨动开关,控制单片机引脚接通3.3V高电平或滞空,分别开关软件层面的蓝牙、循迹和避障功能。
- 电机驱动:
电机驱动芯片选用AT8236,按数据手册参考设计进行电路拓扑,最大可承受6A电流,设置3A电流阈值防止堵转烧毁电机和驱动芯片,电机驱动电路放置在空气流动频繁的底板下方,保证其良好散热。
- 采样运放:
一路差分放大器将电池电压缩小5.1倍输出给单片机的dac获得电池电量状态,另一路差分放大器将5V转化为3.3V产生参考电平。
- 无源蜂鸣器:
通过单片机pwm波控制mosfet导通和关断使蜂鸣器振动从而产生声音。
- 循迹避障模块:
- 供电:
接入底板的5V供电网络,5V为超声波模块和红外开关对管的发光管供电,通过RT9013-33线性稳压芯片产生模块上3.3V供电。
- 红外循迹模块:
红外光电开关选择ITR9909,发射管用5V供电,接受管使用3.3V供电,适应后续比较器信号输入范围,比较器选择TLV3201推挽式高速比较器,3.3V供电适应单片机引脚的输入范围,负输入端用两个0603贴片电阻代替电位器调节比较电压,节省空间,当光电开关扫描到黑线时,输出高电平,扫描到白色区域反馈低电平。
- 超声波避障模块:
选用HC-SR04超声波测距模块,给予短时高电平激活后,反馈一个时间长度与距离正比的高电平信号,通过4P排母与模块连接,5V供电。
- 主控模块:
主控模块主要起扩展MCU核心板的功能,主要元器件为接插核心板的20P排母,XH-2.54-6P插座和0欧姆电阻,同时预留排母用于接插蓝牙模块,并配套LED和MOSFET开关用于显示蓝牙连接状态。核心板选择微行工作室的F411CEU6核心板,蓝牙模块选择汇承HC08蓝牙模块。
三、软件设计
完成人:Antimo.
本次工程创新项目的软件部分采用CubeMX生成框架,采用keil集成开发环境编程。在"Code Generator"部分,可以设置文件生成的方式:勾选"Generate peripheral initialization as a pair of '.c/.h' files per peripheral",使CubeMX为每个外设生成一对 `.c` 和 `.h` 文件,便于后续对外设进行个性化配置。
下面详细介绍红外循迹与超声避障的程序实现,并简要说明其他外设的实现。
红外循迹
本项目使用五路循迹,循迹传感器分为直行传感器(3)、微调传感器(2、4)与转向传感器(1、5)三类,分别安装在小车前方的正中、直行传感器的两侧与小车前方的左右两角上。
另外,此处对小车的驱动系统作简要说明,后续不再赘述。小车采用蜗轮蜗杆1218-N20减速马达,共有两个电极,输入不同的电平或PWM波形,效果如下[3]:
IN1 |
IN2 |
马达效果 |
低电平 |
低电平 |
滑行 |
高电平 |
低电平 |
正转 |
低电平 |
高电平 |
反转 |
高电平 |
高电平 |
锁死 |
PWM |
0 |
正转,快衰减 |
1 |
PWM |
正转,慢衰减 |
0 |
PWM |
反转,快衰减 |
PWM |
1 |
反转,慢衰减 |
实际使用中我们采用PWM控制电机速度,以便于更灵活地控制小车速度。
改变电机的PWM输入可以使用__HAL_TIM_SET_COMPARE函数,实际上可以使用inline语句在USER CODE区写一个函数体以增强代码的可读性,但由于这个操作实在是可有可无,我们就没有做。
OnTest标记
五路循迹的优势在于:若直行传感器检测到循迹线,不管其他传感器检测如何,小车都全速直行。这样可以极大地节省PWM改变占空比的次数,节约内存空间。循迹算法首先需要判断小车是否在循迹赛道上,然后才能依据规则运动。我们使用OnTest来标记。
- 判断小车是否在赛道上
如果五个引脚都读到白色,会有两种情况:小车不在赛道上、小车在赛道上但循迹线卡在了两个传感器之间且小车行进方向与循迹线平行。如果不对两种情况加以分别的话,小车会不知道自己处于什么状态(因为红外循迹的所有状态都必须是有传感器读到黑色)从而出现错误,所以我们必须厘清这两个状态。
从上面的需求出发我们就可以如此设计OnTest的判断(这也是本次工创算法部分我们最引以为傲的设计):如果五个引脚都读到白色,且OnTest==1的话,我们让小车随机转动一个小角度(main.c 213-236行),这样小车就不会与循迹线平行了。在这之后如果五个引脚还是读到白色,那就证明小车真的处于循迹线之外,让OnTest=0。 - 小车不在赛道上时,我们直接让小车直行直到它找到循迹线。也就是直到小车的传感器之一读到了黑色,OnTest变成1。在调试的时候由于我们不可能每次都注意到自己把小车完美地放在循迹线上了,这种使小车自己向前走寻找循迹线的做法是很有用的。
- 小车位于赛道上时,小车就进行正常循迹。如果五个引脚都读到白色,正如前面所说,我们可以让小车转一个小角度让小车路线不再与循迹线平行,这样小车就能自动走到循迹线上。值得注意的是,令小车转动小角度时需要让马达保持转向状态一段时间(224以及234行),否则小车会在转向的瞬间恢复直行状态,造成转向失败。
循迹算法实现
当小车位于循迹线上时,我们便使用一般循迹算法,通过不停修正小车的方向以维护小车在循迹线上运动。
- 直行传感器读到黑色。(main.c 302-311行)这说明小车处在循迹线上且沿着循迹线的方向行驶,由于五路循迹的特点我们不需要改变小车的方向,全速直线行驶即可。
- 直行传感器没有读到黑色。(main.c 312-334行)如果直行传感器没有读到黑线,而旁边的微调传感器读到了黑线的话,说明小车方向偏移了循迹线方向,需要进行微调。为了微调的精准性,我们使一侧马达正常运转,而停下另一侧马达,这样来实现差速转向。比如,当2脚即左侧微调传感器读到黑色时,小车应该微微左转,此时让左侧马达停转、右侧马达原速行驶,当3脚重新读到黑色循迹线时恢复直线行驶状态。
实际上,差速转向最好不要使一侧马达停下来,因为PWM占空比改变过大可能导致马达寿命减少。然而实际情况下如果让差速一侧的PWM降低到70%会导致微调速度过快,小车冲出循迹线,最终循迹失败。
而遇到弯道行驶甚至直角转弯时,普通的差速转向就实现不了了。这时候转向传感器就派上用场了。正因如此,转向传感器的优先级要先于直行与微调传感器。
- 转向传感器读到黑色。(main.c 274-300行)由于地面上摩擦力的不均匀,差速转向时小车的轴心不是一定的,有时小车会后退,但大趋势是向前的。在转大弯时如果小车还要继续向前的话,小车一定会冲出循迹轨道,造成迅即失败。因此我们在设计转向时就需要让小车后退。当转向传感器读到黑色时,我们让向心一侧马达以90%的PWM反转,对侧以50%PWM正转,这样我们就能实现小车后退着转向了。不设置PWM为100%的原因是防止轮胎抓地的摩擦力过大从而导致扭矩过大造成小车结构解体,并且保护马达,延长其使用寿命。
此外,按照赛道要求,当遇到停车指示(横向循迹线)时小车需要停下鸣笛,因此有:
- 当所有传感器读到黑色时,停车并鸣笛5秒。(main.c 250-272行)鸣笛采用PWM控制笛声响度,通过预设周期确定了笛声频率为3000Hz。
红外循迹流程图
红外循迹的进步空间
在实现当前版本的红外循迹的过程中,我们也没有放弃思考如何改进红外循迹算法。
我们发现,直接修改PWM的操作既会对马达产生损坏,又会使小车在行进过程中产生很多颠簸(如果小车有乘客的话,一定会因为多次短间距地更改加速度而感到头晕目眩吧),有很大的改进空间。我们设想的后续改进方法是,让小车的加速度连续改变。具体实现方法比如,使PWM每10微秒改变1%。
再往深发掘这个想法,我们认为,如果在资金充足的情况下增添一个陀螺仪或速度检测装置,在改变速度时使用负反馈系统,或许可以使小车速度的改变更加平滑。
超声避障
在超声避障中,我们参考并基于CSDN[1] 给出的实例编写实现了自己的超声测距函数。
超声测距
我们使用HC-SR04元件进行超声测距。其原理如下:
- 发射超声波脉冲:HC-SR04模块通过发射器产生一个短脉冲的超声波。
- 接收超声波回波:发射的超声波脉冲会传播到目标物体表面,然后被反射回来。HC-SR04上的接收器会接收到这个回波。
- 时间测量:当超声波发射后,HC-SR04开始计时,直到接收到回波为止。它测量了超声波脉冲从发射到接收的时间间隔。
- 距离计算:通过已知的声速(在空气中约为340米/秒),模块将接收到的时间间隔转换成目标物体与传感器之间的距离。通常,这个时间间隔乘以声速的一半就是目标物体的距离。
HC-SR04模块通过测量声波的传播时间来计算距离,然后将距离信息传递给连接的微控制器,使得它可以执行相应的操作或者控制其他设备。这种模块简单易用,被广泛应用于避障、测距和定位等领域。
使用PWM中断以及微秒级计时器实现超声测距。详见hc-sr04.h,在此不过多赘述。
避障操作
由于实际考试时避障环境复杂,存在桌角、墙壁等非目标障碍物,在缺乏预算、缺乏技术手段的情况下,我们只能让小车在干扰障碍物最少的地方进行避障。通过设置参数Turned为1(main.c 51行),并控制main.c 155行的限制,确保每次开机小车仅避障一次。
由于HC-SR04模块的特点,开机时会随机返回一个较小的距离,导致开机时小车可能认为前方已经存在障碍物了。为了解决这个问题,我们写了一个滤波函数(hc-sr04.c 48-68行),并在每次读距离的时候输出滤波后的值(hc-sr04.c 139行)。
测试时采用的避障方法预设了避障路线。即:当距离障碍物10cm时,通过左转、直行绕行、右转回到赛道的方式避开障碍物。通过反复测试,我们得到的具体数据是:左转1.9s,直行离开赛道2.7s,右转2.15s,直行回到赛道2.4s。(main.c 155-200行)
超声避障流程图
超声避障的改进
预设避障路线的缺点在于避障的场所、障碍物的种类受限,基本上只能在我们预设的场地避开我们预设的小盒子障碍物。考虑到这一点我们想到了如下的改进办法:
增设一个超声模块,并改变超声测距模块位置,使其能够测量到小车左侧与右侧距障碍物的距离。利用定时中断的方法维护小车侧边到障碍物的距离恒大于10cm。通过这种方法小车会贴着障碍物边上走,直到回到循迹线上。
由于我们在最初设计底板的时候就预留了两个超声传感器的输入输出引脚,并且在可移植模块上设置了5个可以安装超声传感器的位置,这种方法理论上是可以在我们的小车上实现的。不过虽然这种方法非常优秀,但由于时间有限,并且我们对中断编程的经验不足,在测试前未能完成。不过我们仍然将对这种方法进行探索。
其他外设
下面简要介绍其他一些外设的硬件与软件实现。
状态控制与检测
在最初设计底板时,我们就预留了各模块的状态检测接口,便于实际投入使用时及时判断各模块是否正常运行。
其中,3V3REF可以检测红外模块和超声避障是否就绪,如果没有就绪就不能开始循迹、避障等功能,此时我们令小车直行,以测试小车能否运行,因为在最初测试小车是否能运动的时候我们需要排除其他模块对小车运动系统的干扰;3V3返回电机是否使能,如果这可以排除没开电机造成的小车不动(而实际上我们也确实遇到过这种情况,在没有将驱动模块与主板链接的时候我们很快就发现问题了)。
OPINF与OPULT分别为红外循迹与超声避障是否就绪。就绪后才能进行相应的功能。OPBLUE为蓝牙是否连接,如果连接蓝牙并输入AT指令的话,可以开启蓝牙控制模式。ALLLED会反馈电路中的LED灯是否正常工作,如果电路中某个LED灯在该亮的时候不亮的话,可能不是因为其关联的外设失效了,而仅仅是LED自身失效了。
电量检测
VMES系列引脚可以通过ADC输入的预设读入电池电量,以及时反馈电池电量,方便我们在小车跑不动的时候发现是否为电池电量不足的影响。电池电量会实时通过蓝牙模块输送到手机的蓝牙控制中心
蜂鸣器
CONBUZ引脚会输出PWM信号,以控制小车蜂鸣器的响度。而蜂鸣器的频率是在CubeMX中预设的3000Hz。
蓝牙模块
小车选用USART6引脚对进行蓝牙通讯。蓝牙通讯使得我们可以通过printf函数进行调试,极大地加快了我们调试的速度。
四、软硬件结合部分
完成人:Antimo.&YiRen
单片机引脚分配和对应命名:见附件1:
五、实际作品
六、作品测试
实测阶段,完成规定赛道,含一次避障,直角转弯和红绿灯停止5S,自测所用时间为1分21秒,考核阶段电量有所下降,完成时间为1分31秒。
七、成本和实际花销
注:本成本估计只考虑单个产品,未考虑设计阶段产生的其他成本和备损。
- 橡胶后轮 2*6=12;
- 硅胶高强度轮毂前轮 2*28=56;
- 蜗杆电机和联轴器 4*20=80;
- 德力普14500锂电池3.7V 10*3=30;
- 三节圆柱电池架 1*5=5;
- TL082运放,排母,四色LED灯,TLV3201比较器 合计34;
- STM32F411CEU6核心板 1*23=23;
- 5V开关电源降压模块 1*11=11;
- HC-08蓝牙模块含调试架 1*28=28;
- 尼龙柱,铜柱,排线,螺母,超声波测距模块 合计25;
- 电机驱动芯片,开关,插座,线性稳压器,红外开关,蜂鸣器 合计60;
- 小车底板PCB打板费用(最小订单5张) 66;
以上单品成本12项合计 430元。
其他:
设计初期,摩托车结构探索阶段,购买了许多种轮子,连接器,机械转向架,舵机和配件等,额外支出160元左右,同时尝试了高速低扭矩电机(含其固定架)再次额外支出60元,故本次工创活动小组设计成本650元上下。
附件1:小车各接口命名、功能及其单片机引脚对应
小车与控制板交互端口信息:
格式:端口名-输出/返回(对单片机而言)-意义-类型
3V3REF 返回 真值1为红外模块和超声避障已就绪 高低电平(IO)
红外循迹部分:
INF1 返回 左起1号红外,黑色对应高电平;白色对应低电平 高低电平(IO)
INF2 返回 左起2号红外,黑色对应高电平;白色对应低电平 高低电平(IO)
INF3 返回 左起3号红外,黑色对应高电平;白色对应低电平 高低电平(IO)
INF4 返回 左起4号红外,黑色对应高电平;白色对应低电平 高低电平(IO)
INF5 返回 左起5号红外,黑色对应高电平;白色对应低电平 高低电平(IO)
超声避障部分:
TR1 输出 左起1号超声,10us以上高电平触发 周期信号(Timer-占空比)
ECH1 返回 左起1号超声,高电平时间代表距离 高低电平(IO中断)
TR2 输出 左起2号超声,10us以上高电平触发 周期信号(Timer-占空比)
ECH2 返回 左起2号超声,高电平时间代表距离 高低电平(IO中断)
电机控制部分:
M1N1 输出 左前轮电机IN1 高低电平(IO)or PWM(timer-pwmout)
M1N2 输出 左前轮电机IN2 高低电平(IO)or PWM(timer-pwmout)
M2N1 输出 左后轮电机IN1 高低电平(IO)or PWM(timer-pwmout)
M2N2 输出 左后轮电机IN2 高低电平(IO)or PWM(timer-pwmout)
M3N1 输出 右前轮电机IN1 高低电平(IO)or PWM(timer-pwmout)
M3N2 输出 右前轮电机IN2 高低电平(IO)or PWM(timer-pwmout)
M4N1 输出 右后轮电机IN1 高低电平(IO)or PWM(timer-pwmout)
M4N2 输出 右后轮电机IN2 高低电平(IO)or PWM(timer-pwmout)
状态控制和反馈部分:
3V3 返回 电机使能 真值1为就绪 高低电平(IO)
VMES 返回 电池电量检测 电压/3.3 低于7.7为电量不足 ADC信号
OPINF 返回 高电平为开启红外循迹 高低电平(IO)
OPULT 返回 高电平为开启超声波避障 高低电平(IO)
OPBLUE 返回 高电平为开启蓝牙 高低电平(IO)
ALLLED 输出 高低电平分别有一个LED灯亮 高低电平(IO)
CONBUZ 输出 驱动蜂鸣器 PWM信号(timer-pwmout)
STM32F411CEU6 引脚分配和署名(引脚-选项-功能)
PB12-GPIO_INPUT-INF1;PB13-GPIO_INPUT-INF2;PB14-GPIO_INPUT-INF3;
PB15-GPIO_INPUT-INF4;PA8-GPIO_INPUT-INF5;;
PA9-TIM1_CH2-M1N1;PA10-TIM1_CH3-M1N2;
PA15-TIM2_CH1-M2N1;PB3-TIM2_CH2-M2N2;
PB4-TIM3_CH1-M3N1;PB5-TIM3_CH2-M3N2;
PB6-TIM4_CH1-M4N1;PB7-TIM4_CH2-M4N2;
PB8-TIM10_CH1-CONBUZ;PB9-GPIO_OUTPUT-ALLLED
PC15-GPIO_INPUT-OPINF;PC14-GPIO_INPUT-OPULT;
PB0-GPIO_INPUT-OPBLUE;
PA0-TIM5_CH1-TR1;PA1-TIM5_CH2-TR2;
PA2-GPIO_EXTI2-ECH1;PA3-GPIO_EXTI3-ECH2;
PA4-GPIO_INPUT-3V3REF;
PA5-GPIO_INPUT-3V3;PA6-ADC1_IN6-VMES;
引脚分配图(不含蓝牙通信部分)
蓝牙引脚:
PB2-GPIO_IN-蓝牙state-高电平为已连接,低电平为未连接
PA12-USART6_RX(Asyn)-接蓝牙模块TX-串口通信
PA11-USART6_TX(Asyn)-接蓝牙模块RX-串口通信
设计图

BOM


评论