智能车竞赛技术报告 | 专科基础组 - 哈尔滨铁道职业技术学院 - 智能车勇创协会
Posted 卓晴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了智能车竞赛技术报告 | 专科基础组 - 哈尔滨铁道职业技术学院 - 智能车勇创协会相关的知识,希望对你有一定的参考价值。
队伍名称:智能车勇创协会
参赛队员:刘宝、张琮策、薛闯
带队教师:崔妍、张筱萌
第一章 绪论
第十六届全国大学生智能汽车竞赛为了实现竞赛的"立足培养、重在参与、鼓励探索、追求卓越"的指导思想,竞赛内容设置需要能够面向高校学生和教学内容,同时又能够兼顾当今时代科技发展的新趋势。比赛形式包括有竞速比赛与创意比赛两大类。竞速比赛中包含不同的组别,难度适合高校不同年级学生参赛。
在这次比赛中,哈尔滨铁道职业技术学院组别为专科基础组,制作一辆四轮智能小车,通过感应赛道中央交变电流产生的磁场进行循迹行驶。车模采用大赛组委会统一提供的C
型车模,并根据官方要求,使用STC
系列单片机,具体型号为STC
8G2K64S4。车模以安装在车头的工字电感与电容共同构成LC
谐振电路,在电源信号为20KHz
达到谐振要求,得到最大感应电压,用于程序调制来实现智能车的自动循迹功能。通过编写与优化算法来实现智能车通过不同的赛道元素,其中包括三岔路口、坡道、环岛、十字路口等。旨在有限时间内(三分钟)获得更高的比赛分数。
第二章 设计任务与要求
本次参赛组别为专科基础组,具体设计任务为设计一款智能循迹小车来感应赛道中交变电流所产生的磁场的变化,通过程序控制来实现小车的从规定区域出发,沿规定赛道行驶,在满足准确性要求的基础上,组委会要求比赛时间3分钟内尽可能多得赛道中的任务点:发车-1分、三岔路口-5分、坡道-5分、环岛-5分、十字路口-2分。
具体要求包括:
1、须使用竞赛秘书处统一指定的竞赛车模套件;
2、使用指定的单片机种类(STC系列);
3、除单片机最小系统外,所有电路模块均为自主设计制作,包括用于接收赛道磁场变化并进行放大的运放模块;采
用单片机处理赛道信号并作出相应指令,如控制舵机打角、改变小车速度的主板模块;对主板控制作出回应,驱动智能小车电机的双MOS的驱动模块。
第三章 系统总体方案设计与方案选择
3.1 硬件部分
可分为三个模块:运放模块、主板模块、驱动模块。
3.1.1运放模块
本次比赛赛道信号源位20kHz交变电流,小车可以通过对导线产生的电磁场进行采集分析处理,判断当前所在位置,从而控制小车沿预定赛道方向行驶完成比赛。根据麦克斯韦电磁场理论可知,交变电流的周围会产生交变的电磁场。导线周围的电磁场按一定的规律分布,而赛道宽度远远小于电磁波的波长λ,电磁场辐射能量很小,所以能够感应到的电磁波的能量也就非常小,因此,我们可以将导线周围变化的磁场近似地认为是缓变的磁场。根据这一特点我们可以按照检测静态磁场的方法去采集导线周围的磁场分布、强度以及方向来判断检测点与导线的距离,从而可以得出小车在赛道的位置。
我们采用的是LC谐振电路来感应其周围赛道磁场的变化,通过不断调节电感电容值来使得电路在20kHz下达到谐振,获得最大的感应电压。为了更好的在不同方位下测量赛道的感应磁场大小,我们采用一左一右对称式的LC谐振电路,并通过横杆支撑在智能车的上方,如图:
▲ 图3.1 对称式LC谐振电路
根据对基本设计原理的分析,我们知道在通电的导线周围有规律的磁场,使用电感作为检测导线的传感器。如果在通电的直导线的两侧对称地水平放置一对感应线圈,则可以得到感应磁场的一对感应电动势,进而可以获得磁场的强度。此时感应到的磁场信号仍然比较小,故采用OPA2350
运放进行信号放大,并在输出端外接滑动变阻器分压,用以调节放大后的信号值;因为是对称放置的一对感应线圈,所以在直线的情况下,一对感应线圈获取到的感应电动势理论上是一样的。
当对称的一对感应线圈检测到的感应电动势不同时,将感应线圈检测到的电动势进行比较,根据基本设计原理可知:检测到较大值的感应线圈离导线更近,小车的位置出现偏移,应该控制两个电机的转速,造成差速进而达到转弯的效果,使小车的位置回到赛道中间。上述直走转弯,以及更复杂的指令与赛道元素判断交由主板模块处理。
3.1.2主板模块
主板上配备有STC8G2K64S4
单片机最小系统,并带有与运放模块、双MOS
驱动模块连接的插头;为了更好的对后续程序进行调试,主板上还配备有LCD1602
液晶显示屏,用来显示由运放反馈到单片机的左右电感值,设计人员通过观察电感值的大小,比较左右电感值之间的差异,并采用PID
(比例-微分-积分)算法来控制小车的左/
右转以及加/
减速,具体执行时将通过单片机I/
O口来控制舵机的打角以及输出PWM
波控制电机转速。
3.1.3驱动模块
其主要功能对主板控制作出回应,驱动智能小车电机的双MOS的驱动模块。采用HIP4082 H桥驱动模块为双侧电机提供稳定的动力,为小车稳定直行提供保障。设计上采用左右侧对称模式的设计方式,目的在于尽可能在直路行驶时保证左右轮转速一致。
3.2 软件部分
此系统采用STC8G2K64S4单片机,再根据硬件连接,通过相应的程序来完成对信号的数据和分析,再控制小车的运行状态,具体分为:
- 循迹模块程序
通过LC谐振电路构成的传感器获得赛道信息,并传递给单片机,再通过特定算法来实现相应的功能;
- 电机驱动模块程序
通过撰写好的程序控制两个电机的转速以及舵机的打角,来实现前进、后退、左转、右转、停车等功能,在完成这些基础功能后,再根据实际赛道情况所编写的复杂程序,来驱动小车通过岔口、环岛以及加速通过坡道等赛道元素。
第四章 电路制板与智能车组装
4.1 PCB绘制
在分析整个智能车所需模块后,我们将整个电路划分为三块板,包括运放电路、主板电路以及双MOS
驱动电路,PCB
绘制所使用的软件为Altium Designer21
,队员在PCB
过程中购买相关书籍以及观看网课进行自学。绘制PCB
主要分为以下四个文件:原理图库(.SchLib
)、原理图(.SchDoc
)、PCB
库(.PcbLib
)、PCB
图(.PcbDoc
),并用工程文件(PrjPcb
)将各文件关联起来;其中,原理图库是采用几何方法绘制元器件模型,其目的是直观的显示元器件的重要信息,如:引脚、位号、名称等;
▲ 图4.1 电路原理图库
原理图是调用原理图库中的模型,实现各元器件之间的电器连接;
▲ 图4.2 电路原理图库电路原理图
PCB库是将元器件与其实际所需的封装一一对应;
▲ 图4.3 电路原理图库电路原理图电路PCB库
PCB图是绘制实际打板所需的电路工艺图,其中包括所有元器件对应的封装与布局,以及绘制电路走线,实现与原理图相对应的电器连接功能。
▲ 图4.4 电路原理图库电路原理图电路PCB库电路PCB图
PCB布线出于对电路性能的考虑,对线宽,各器件间距等有特殊要求,出于篇幅考虑,此处不予赘述
4.2 PCB打板
绘制好PCB后,下一步是将其发给板厂打板。在这个步骤之前,我们还需生成打板所需的gerber文件,也就是制造输出以及装配输出;在这个过程中,除了可以生成CAM文件包用于打板之外,还可以生成ASM文件用于装配以及生成BOM报表用于采购。
▲ 4.5 PCB打板所需文件
目前国内常见的PCB板厂有:嘉立创、凡亿PCB等等,其提供的服务除打板之外还包括SMT贴片,本次智能车比赛我们选取的方式是自行购买零件,手动焊接的方式。
4.3 PCB贴片与焊接
本次采用手工焊接方式,使用焊锡与恒温电烙铁进行贴片操作,其缺点是焊点大小不一,焊接时间长短不一,电路性能可能不稳定;优点是节约成本,以及锻炼我们的动手实践能力,学习一项新技能。
▲ 图4.6 PCB贴片与焊接
4.4 智能车组装
本次比赛我们采用c型车模,通过打孔与使用铜柱将电路板固定。
▲ 图4.7 车模打孔与固定
电路板之间通过排线相连,电池通过绷带固定在车模底座。
▲ 图4.7 车模打孔与固定图4.8 各模块之间的连接
组装后的智能车模长300mm
宽180mm
高135mm
,电机型号为DC7.2V
最大功率19.25w
,舵机型号FutabaS3010
,车模整体都不含有无线通讯模块,符合比赛要求。采集信号部分为两套对称安装的LC
谐振电路,即在20kHz
交流信号下谐振,从而感应到最大电压值。
第五章 铺设赛道与程序调试
5.1 铺设赛道
如图,分别是本次比赛我们自主设计的赛道CAD图以及铺设的实物图,赛道中间为漆包线,采用20kHz赛道信号发生源驱动。赛道规格与标准符合赛事要求。
▲ 图5.1 赛道CAD图与实物图
5.2 程序编写与调试
程序编写方面我们使用软件为MDK Keil Version5
,这是一个专门使用单片机语言进行编程的软件,烧录软件使用的是STC-isp
系列软件,可以与单片机很好的进行串口通信,单片机为STC8G2K64S4
,频率选为33.1776MHz
。下面将展示涉及控制小车循迹的PID
算法以及环岛、岔口等关键算法。
▲ 图5.2 PID算法图
其中,适当增大P
的值可以使得小车转弯更加灵敏,减小P
的值或增大D
的值可以减小小车直道上的抖动。下图是小车启动以及优化小车在直路弯路上的行驶,主要思想如下:在小车发车从车库出发时,需要控制小车在一定时间内(startnum<652
)不受循迹控制,即先直行,再右转,进入赛道,最后发车结束才控制小车进行循迹(LeftRightSub=LeftRightSub5
)。考虑到小车在直路上需要较快速度以便通过坡道和节约时间,并且在弯道时需控制低俗以防止小车冲出赛道,因此,单纯的给小车提速或降速效果都不会很理想,对此我们自主研发了一种差速算法,即在小车正常循迹的前提下,通过比较左右磁场感应值,其差值在一定范围,即认为是直路,此时给两侧电机一个较大的P
WM波获得较快速度;而当差值大于一定范围时即认定小车即将进入弯道,此时小车减速。此时整体效果就是小车在直路加速,弯路减速,以保证小车的最佳运行状态。
▲ 图5.3 小车出库与小车速度优化程序
- 岔口实现与坡道实现
岔口元素的要求为,当小车行驶至岔口之前电感感应到特定值时,需强制小车打角进行左转右转,即两圈中需分别走岔口左右路;环岛元素的要求为当感应值到特定值时,小车先直走一段,进而右转进入环岛,同时不能再次判断进入环岛条件(否则小车会在环岛一直转圈)。由于在之前的比赛要求中具有停车环节,因此赛道上具有磁铁元素,即我们可以通过干簧管来监测磁铁信号,来判断小车运行的圈数,进而判断该圈小车在岔口需左转或右转,同时对环岛计时参数以及判断进入环岛的参数进行复位,来保证程序的正常运行。但随着赛制的改变,磁铁与干簧管不再被允许,对圈数的判断需要另寻他路,比如采用摄像头、红外感应之类的模块。
以上方法无一不使得电路变得纷繁复杂,虽然在设计程序的逻辑上进行了简化,但是硬件上增大了很大的困难。为了解决这个问题,我们经过了长时间的思考,最终提出一种互补式的闭环判断方法:即每经过岔口的判定条件时,使得环岛参数与使能复位;在每经过环岛时,计圈数加一,并采用除2取余法if(圈数%2)进行判断当圈数为0、2、4、6。。。时为0(非)执行左转,当圈数为1、3、5、7。。。时为1(真)直行右转,从而实现了环岛元素,交替通过岔口元素。其源程序如下图:
▲ 图5.4 岔口程序图
▲ 图5.4 岔口程序图图5.5 环岛程序图
在整个程序都写好之后,后续工作便是根据实际赛道,小车行驶过程中的表现,对各个赛道元素的判断阈值、小车舵机打角大小、打角时间、小车车速等进行不断的更改和优化。在实际操作过程中,我们发现小车在直路运行时两个轮子速度不一样,与采用对称双MOS即两侧车轮同PWM值同速的预期不一样,我们对此问题进行了解决,解决方法为使用电流表测试小车正常直路行驶时驱动处的电压大小,如图:
▲ 图5.4 岔口程序图图5.5 环岛程序图图5.6 小车不同车轮速度校正
通过不断的更改调试赋予两侧电机不同的PWM波,控制得到两侧电机相近的电压值,此时小车两轮车速校正完毕,可以在直路上平稳行驶。
后续我们还针对小车转弯时不够稳定容易冲出赛道的问题提出一种解决方法,即:小车左转时(左电感值>右电感值)右轮速度>左轮速度,小车右转时左轮速度>右轮速度,结果使得小车在弯道同样有较好的表现,至此小车成功的实现了全部赛道元素,并且直道/弯道全部优化完毕。
第六章 总结与致谢
哈尔滨铁道职业技术学院此次完成的智能循迹小车的设计需要涉及到许多方面,在小车设计过程中,传感器的设计和单片机的处理关系至关重要。本技术报告主要阐述了一种以STC8G2K64S4
单片机为控制核心、电磁传感器为基础的智能小车循迹系统。在小车中,单片机根据传感器输出信号来控制小车的行驶路径,减小了车的抖动,实现了小车能够平稳地循着轨迹正常行驶并完成多项任务点(三岔路口、坡道、环岛、十字路口等)的功能。经过多次试验并在参赛中结果显示,本次智能循迹小车具有较强的运行能力,并能够很好的控制小车的运行过程。
通过此次制作并完成智能循迹小车收获颇丰,首先感谢崔妍、张筱萌两位指导老师提供给我们本次学习及成长的机会,在我们遇到困难时提供给我们很多建议,让我们少走了很多弯路,她们对科研上负责认真的态度值得我们学习。宝贵的是我们学会了如何在团队中和组员进行高效的沟通,同时极大丰富了实践经验及动手能力,为以后的学习打下坚实的基础。本次的智能循迹小车从无到有,虽然在整个过程中出现了很多各种各样的意外,但在小组成员通力合作最终解决一个又一个的问题,并一直把它作为一件神圣的事情去做,最后取得了成绩,让我们受益终生。
参考文献与资料
[1] 蒋宗祥, 林乐彬, 彭晓旭,等. 采用模糊控制的电磁循迹三轮小车[J]. 科技创新与生产力, 2018, 000(007)😛.93-96.
[2] 肖玉萌, 程登良, 杨文俊. 电磁循迹智能小车设计[J]. 湖北汽车工业学院学报, 35(1):6.
[3] 秦磊, 王佳宇, 黄名扬,等. 基于单片机的电磁循迹智能车系统的设计[J]. 物联网技术, 2018.
[4] 罗茜, 唐鼎明. 基于电感的智能小车电磁循迹方案[J]. 中小企业管理与科技(17):2.
[5] 程智. 自动电磁循迹小车设计与实现[J]. 电子测试, 2019, 000(009):11-13.
[6] 周新,《从零开始学Altium Designer电路设计与PCB制板》,2020.
■ 附录A 程序源代码
主程序#include "include.h"
//11.0592M PWM0C = 0x02FE;0x02AB右极限,0x029E为左极限 13
//33.1776M PWM0C = 0x08DF;0x07E2右极限,0x07BC为左极限,0x07CF为中值 38
u16 xdata ad0=0,ad5=0,startnum=0,startflag=1;//定义电感数据变量
void main(void)
{
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
Uart1_Init_Timer1_P30P31(115200); //串口初始化
/*舵机初始化*/
PWMSET = 0x01;
P_SW2 |= 0x80;
PWM0CKS |= 0x10;
PWM0C = 0x047F;
AUXR |= 0x04;
T2L = 0xE0;
T2H = 0xFE;
AUXR |= 0x10;
PWM07T1= 0x0000;
PWM07T2= 0x0370;
PWM07CR= 0x80;
P_SW2 = 0x00;
PWMCFG01 = 0x01;
/*舵机初始化结束*/
/*电机初始化*/
PWM2_Init(0, 10000, 1150);//初始化PWM2的0脚,即P20为PWM,频率10000hz,占空比为1500/FTM0_PRECISON
PWM2_Init(1, 10000, 0);//初始化PWM2的1脚,即P21为PWM,频率10000hz,占空比为0/FTM0_PRECISON
PWM2_Init(2, 10000, 1900);//初始化PWM2的2脚,即P22为PWM,频率10000hz,占空比为1500/FTM0_PRECISON
PWM2_Init(3, 10000, 0);//初始化PWM2的3脚,即P23为PWM,频率10000hz,占空比为0/FTM0_PRECISON
/*电机初始化结束*/
OLED_Init(); //OLED初始化
/*ADC初始化*/
ADC_Channel_Init(1);//选择 ADC1 , 即 P11
ADC_Channel_Init(2);//选择 ADC2 , 即 P12
ADC_Init();//初始化10位 ADC
/*ADC初始化结束*/
EA = 1; //开总中断
while(1)
{
ad0 = ADC_convert(2);//采集AD,电感0的数据
ad5 = ADC_convert(1);//采集AD,电感5的数据
//Delay_ms(100);///延时100ms
LED_PrintValueUI(5, 1, ad0); //显示屏显示电感0的数据
LED_PrintValueUI(5, 3, ad5);//显示屏显示电感5的数据
LED_PrintValueF(5, 5,LeftRightSub,3); //显示屏显示控制偏差
Data_processing(); //电感数据处理
if(startflag==1)
{
startnum++;
}
if(startnum<430)
{
P_SW2 |= 0x80;
PWM07T2=0x0370;
P_SW2 &= 0x7F; //改变舵机占空比
}
if((startnum>430)&&(startnum<650))
{
P_SW2 |= 0x80;
PWM07T2=0x0382;
P_SW2 &= 0x7F; //改变舵机占空比
}
if((startnum>650)&&(startnum<652))
{
startflag=0;
startnum=0;
}
if(startflag==0)
{
Steer_Pd(); //舵机控制
if(ad0<300&&ad0>200&&ad5<300&&ad5>200)//岔口前减速
{
PWM2_SetDuty(2,0);
PWM2_SetDuty(0,0);
}
else
{
if(((ad0-ad5<118)||(ad5-ad0<118)))//左右电感差在一定范围内,认为是直道,加速
{
PWM2_SetDuty(0,1650);//1.21
PWM2_SetDuty(2,2400);//1.23
}
else
{
if(ad0>ad5)//left
{
PWM2_SetDuty(2,1650);
PWM2_SetDuty(0,800);
}
if(ad0<ad5)//right
{
PWM2_SetDuty(2,1550);
PWM2_SetDuty(0,1300);
}
//PWM2_SetDuty(2,1550);左右轮一样快0.65
//PWM2_SetDuty(0,900);
}
}
}
}
}
赛道元素实现与舵机电机控制程序
#include "Conduct.h"
uint16 xdata ad0_0=0,ad0_1=0,ad0_2=0,ad0_3=0,ad0_4=0,ad0_5=0,ad5_0=0,ad5_1=0,ad5_2=0,ad5_3=0,ad5_4=0,ad5_5=0;
uint8 xdata LYH0=0,LYH1=0,LYH2=0,RYH0=0,RYH1=0,RYH2=0,chakou=0,chakoudelay=0;
float xdata LeftRightSub=0,LeftRightSub5=0;
int xdata cha;
int xdata huandaotime=0,huandaoEN=1,chakouflag=0;
void Data_processing(void)
{
//存储6次数据量
ad0_5=ad0_4;ad5_5=ad5_4;
ad0_4=ad0_3;ad5_4=ad5_3;
ad0_3=ad0_2;ad5_3=ad5_2;
ad0_2=ad0_1;ad5_2=ad5_1;
ad0_1=ad0_0;ad5_1=ad5_0;
ad0_0=ad0;ad5_0=ad5;
if(ad0-ad5>5000) //判断是不是负数
cha=-(~(ad0-ad5)+1);//负数取补码
else cha=ad0-ad5;
LeftRightSub5=(float)cha/(ad0+ad5); //求偏差值
LeftRightSub=LeftRightSub5;
//岔口
if(ad0<300&&ad0>200&&ad5<300&&ad5>200&&(ad0_0<ad0_2)&&(ad0_1<ad0_3)&&(ad5_0<ad5_2)&&(ad5_1<ad5_3))
{
chakou=1;
huandaoEN=1;
}
if(chakou==1)
{
chakoudelay++;
}
if((!(chakouflag%2))&&(chakou==1))
{
LeftRightSub= 50; //ad0_0*0.0096;
}
if((chakouflag%2)&&(chakou==1))
{
LeftRightSub= -50; //ad0_0*(-0.0096);
}
if(ad0>300&&ad5>300)
chakou=0;
if((ad0<100||ad5<100)&&(chakoudelay>130))
{
chakou=0;
chakoudelay=0;
LeftRightSub=LeftRightSub5;
}
//右圆环&&ad5_0>ad0_0&&(ad0_0>ad0_2)&&(ad0_1>ad0_3)&&(ad5_0>ad5_2)&&(ad5_1>ad5_3)
if(ad5_0>600&&ad0_0>600&&huandaoEN)//ad5_0>820&&ad0_0>750
{
RYH0=1;
}
if(RYH0==1)
{
huandaotime++;
}
if((RYH0==1)&&(huandaotime<225))
{
LeftRightSub=0.14;
}
if((RYH0==1)&&(huandaotime>225)&&(huandaotime<410))
{
LeftRightSub=-50;
}
if((RYH0==1)&&(huandaotime>410))
{
LeftRightSub=LeftRightSub5;
huandaoEN=0;
RYH0=0;
huandaotime=0;
chakouflag++;
}
if((huandaoEN==0))
{
if(ad5>900&&ad0>400)
LeftRightSub=0;
智能车竞赛技术报告 | 基础四轮组 - 哈尔滨工程大学 - 济海追风5队
智能车竞赛技术报告 | 双车接力组 -哈尔滨工业大学 - 紫丁香六队
智能车竞赛技术报告 | 智能视觉组 -哈尔滨工业大学 - 紫丁香七队
智能车竞赛技术报告 | 节能信标组-哈尔滨工业大学紫丁香五队