自动光靶小车系统是2023年广西大学生电子设计竞赛第一阶段题目D题,选择这个题目主要是为了23年全国大学生电子设计竞赛积累经验,本项目综合度较高,涉及经典PID控制算法、多种传感器的使用、常用的无线通信、常用的电机驱动模块等,能有效锻炼自己的能力
先上实物图:
这是早期的照片,后来更新了小车主板,减少杜邦线,新的小车如下图:
赛题题目如下:(仅发挥部分)
考虑以现有的有效资源为基础;
小车系统以3D打印倒三轮智能小车为平台,采用STC公司开发的STC32G单片机做主控,直流电机采用TB6612模块驱动,电源采用 11.1V 充电锂电池和DC-DC大电流直流降压电源模块,传感器使用两路红外模拟量循迹模块,电机采用MG310直流电机。
中心激光控制系统安装有openMV摄像头模块,通过对openMV的编程,使其检测光靶坐标并通过串口发送给主控单片机(STC32)。主控单片机接收坐标信息,通过对坐标的比较,进行PID运算后使用A4988驱动模块驱动42步进电机使整个系统旋转,保证光靶一直处于摄像头中心位置,达到追踪光靶要求。
TB6612 相比于L298N,TB6612有很多改进的优点:发热小,无需散热片,支持高达100KHz的PWM输入(L298N是0-20KHz),体积小,外围电路简单,只需要外接电源滤波电容就可以直接驱动电机因此选择TB6612作为小车电机驱动。
通信方面用的模块是蓝牙模块。蓝牙模块拥有低价格,轻量化等特点为小车减轻负担更。此外,我之前对蓝牙模块有丰富的使用经验,其有着更多的理解,因此选择蓝牙模块,中心激光控制系统作为主设备发送信号,小车系统作为从设备接收信号,通过无线电波连接,主、从设备均可收发信号。
光靶跟踪我使用的是摄像头方案,我用openMV来对光靶坐标识别,很多人对openMV的评价就是“电赛神器”。它是一个国外的开源项目,有颜色识别、形状识别、数字识别、人脸识别等众多功能,结合官方IDE开发工具,可以快速对其进行开发,使用python语言开发,上手门槛低,经过一段时间的学习便可做出相当不错的效果。
关于小车的循迹方案,我使用两路模拟量红外模块进行循迹,该模块可将光强信号转换为电压信号,红外传感模块将检测到的信号发送给STC32G,由STC32G计算两路AD的差值,判断小车与引导线的相对位置。若差值为负数则引导线在小车左侧,小车应该向左转向。若差值为正数则引导线在小车右侧,小车应该向右转向。若差值为等于0则引导线在小车正中间,小车应该向前走。小车左右转向的量由PID进行计算以保证循迹的流畅性。PID我是通过https://blog.csdn.net/skythinker616/article/details/123019829?spm=1001.2014.3001.5506 这篇博客学习的,我认为这篇博文写得通俗易懂,并且配有线上模拟仿真平台能更直接的理解PID。最终小车的循迹效果也确实很丝滑,以下是循迹部分的代码:
//========================================================================
// 描述: 两路模拟量循迹
// 参数: None.
// 返回: None.
//========================================================================
void XUNJI()
{
float r,l;
float feedbackValue; //这里获取到被控对象的反馈值
float targetValue = 0; //这里获取到目标值
r = Get_ADCResult(6); //获取adc
l = Get_ADCResult(7);
feedbackValue = r - l; //这里获取到被控对象的反馈值
PID_Calc(&mypid,targetValue,feedbackValue); //进行PID计算,结果在output成员变量中
motor_L(1,speed - mypid.output);
motor_R(1,speed + mypid.output);
}
其余代码暂不做展示
关于ABCD标志点的识别,小车系统在车头与车右侧安装了三路红外数字量传感器。车头两路红外数字量传感器用于识别ABCD四个标志点,当小车行驶到标志点处时,两路红外传感器同时为高电平。车右侧一路红外数字量传感器用于在内圈识别A点位置,由于车宽,小车在内圈行驶时右侧传感器可检测到位于外圈的标志点,当小车在内圈行驶时对右侧传感器进行高电平计数,计一次数等于经过一个标志点。通过以上方式可控制小车在每个标志点的动作。
采用自制的STC32G功能拓展板,内含电机、电机驱动、循迹等模块的接口,减少单片机外接引线。PCB图如图:
本项目在两项课程评比以及校赛评比中,均获得高分成绩。