摘要
本系统以设计题目的要求为目的,采用STM32F103ZET6单片机为控制核心,另外其他辅助模块包括:电源模块,图像显示模块,蓝牙模块,以及其他功能模块进行辅助,从而来完成智能车的硬件设计。我们采用了模糊PID控制算法来实现对智能车的控制,并进行了一定的实验。通过利用ov7725摄像头探测前方的黑线,将采集到的信息传回STM32单片机,对读出的数据进行二值化处理,加上阈值后可以进行循迹使用,通过判断黑线的形状和曲率调整电机转速,进而改变方向,使小车沿黑线行驶,达到循迹功能并可以自动记录时间,使用LCD显示屏显示黑线轨迹。使用超声波测距离避障,并在LCD上显示,整个系统的电路结构简单,可靠性能高。实验测试结果满足要求,本文着重介绍了该系统的硬件设计方法及测试结果分析。
采用的技术主要有:
(1)小车摄像头处理及自动循迹;
(2)稳压电路的有效应用;
(3)单片机的使用;
(4)障碍物距离算法,串口通信协议;
关键字:STM32F103ZET6单片机;直流驱动小车;摄像头;LCD显示;避障;蓝牙控制;比例积分微分。
目 录
第1章 系统方案 1
1.1 实现方法 1
1.2 方案论证 1
1.2.1主控芯片的选择........................................................................................1
1.2.2电机及驱动................................................................................................1
1.2.3寻迹传感器模块........................................................................................2
1.3 系统设计 2
1.4 结构框图 3
第2章 理论分析与计算 8
2.1 测量与控制方法 8
2.2 理论计算 10
第3章 电路与程序设计 11
3.1 检测与驱动电路设计 14
3.1.1驱动设计..................................................................................................15
3.1.2检测设计...................................................................................................16
3.2 总体电路图 18
3.3 软件设计与工作流程图 19
第4章 结果分析 20
4.1 创新发挥 20
4.2 结果分析 20
第1章 系统方案
1.1 实现方法
本系统采用STM32F103ZET6单片机作为主控单元,对整个系统进行控制,并驱动液晶显示器,显示运动系统的信息,利用蓝牙接收数据,实现对小车的控制,实现反馈位置信息,进行循迹调整。
1.2 方案论证
1.2.1主控芯片芯片的选择
方案一:采用传统8位89C51单片机作为控制单元,价格低廉,但处理速度慢,功能单一,RAM、ROM小。本系统需要计算速度,角度等大量的浮点数。需扩展RAM和ROM,而且硬件工作量必然加大。
方案二:采用STM32F103ZET6单片机为控制核心,库函数多,实用简单方便,片内资源丰富,运算速度快,功率低。
鉴于STM32F103ZET6单片机的优越性,故选方案二。
1.2.2电机及其驱动
(1)电机
方案一:采用步进电机,可准确控制转速和旋转的角度,但是体积大,质量大,并且需要另配驱动器,成本较高。在电动车上安装比较复杂。
方案二:采用减速直流电机,体积适中,安装简单,转速慢,车速容易控制,并且转矩和扭矩较大。
综上所述,采用方案二。
(2)驱动
方案一:采用继电器对电机的开关进行控制,可以完成电机的正转,反转,调速,但继电器响应时间慢,使小车运动灵敏度降低,而
且机械结构易磨损,可靠性不高。它适用于大功率电机的驱动,对于中小功率的电机极不经济。
方案二:采用SM6135W电机遥控驱动模块。SM6135W是专为遥控车设计的大规模集成电路。能实现前进、后退、向右、向左、加速五个功能,但是其采用的是编码输入控制,而不是电平控制,这样在程序中实现比较麻烦,而且该电机模块价格比较高。
方案三:采用集成的驱动电路芯片L298N。L298N驱动芯片具有体积小,可靠性安全性高,抗干扰能力强等优点,适合控制智能小车的运动。且有较大的电流驱动能力,连接方便简单。
综合以上考虑,我们选择方案三,使用L298N驱动直流电机。
1.2.3寻迹传感器模块
方案一:采用OpenCV和高像素摄像头来完成,功能强大,图传稳定。
方案二:采用openmv摄像头,其中自带内核,处理速度快,功能强大。
方案三:采用ov7725摄像头,价格便宜,每秒60帧的像素处理,容易受到外界光的干扰,但其体积小,安装简单,当其安装位置较低时,可以大大减轻外界光对传感器的干扰,在平缓的路径中,可以完成寻迹功能。其原理图如下:
由于价格和实用性方面的考虑,所以采用方案三。
1.2.4电源模块
在本系统中,需要用到的电源有单片机的5V,L298N芯片的电源6V和电机的电源7-12V。所以需要对电源的提供必须正确和稳定可靠。
方案一:用9V的锌电源给电机供电,然后使用7805稳压管来把高电压稳成5V分别给单片机和电机驱动芯片供电。这种接法比较简单,但小车的电路功耗过大会导致电机动力不足。
方案二:采用双电源。为了确保单片机控制部分电机驱动的本分电压不会互相影响,要把单片机的供电和驱动电路分开来,即:用电流电12V供给点单片机和驱动,这样有助于消除电机干扰,提高系统的稳定性。
基于以上分析,我们选择了方案二。
1.3 系统设计
本系统采用STM32F103ZET6单片机为核心,采用两个直流减速电机进行左右轮分别驱动,利用PWM对电机进行调速,控制电动车的速度,实现电动车在跷跷板上的前进、停止和后退,利用红外反射传感器进行寻迹,使电动车沿着引导线行驶。
1.4 结构框图
通过上面的分析,我们设计的系统的总体框图如图一所示
1.5 OV7725特点
高灵敏度、低电压适合嵌入式应用,标准的 SCCB 接口,兼容 IIC 接口,
支持 RawRGB、 RGB(GBR4:2:2, RGB565/RGB555/RGB444), YUV(4:2:2)和 YCbCr(4:2:2)输出格式,支持 VGA、 QVGA,和从 CIF 到 40*30 的各种尺寸输出支持自动曝光控制、自动增益控制、自动白平衡、自动消除灯光条纹、自动黑电平校准等自动控制功能。同时支持色饱和度、色相、伽马、锐度等设置。支持图像缩放
第二章 理论分析与计算
2.1测量与控制方法
根据题目分析,要使摄像头循迹。ov7725摄像头来实现路径识别功能,将摄像头采集过来的视频信号二值化后送入微处理器进行处理,实时采集路况信息方法和实时控制智能小车的速度,最终达到实现整个系统的闭环控制,使小车可以自主的按照路面信息快速行驶。通过STM32F103ZET6单片机输出的PWM波控制。调节电机转速,进行循迹,避障。
2.2理论计算
2.2.1摄像头检测到黑线的中心位置算法
u8 center[4]={120,120,120,120};
u8 i,j,left=0,right=0,left_flag=0,right_flag=0,left2=0,
right2=0,left_flag2=0,right_flag2=0,left3=0,right3=0,left_flag3=0,right_flag3=0;
static u8 number;
for(j=0;j<240;j++)
{f((color1[0][j]==0)&&(color1[0][j+1]==0)&&(color1[0][j+2]==0)&&(color1[0][j+3]==0)&&(color1[0][j+4]==0)&&(color1[0][j+5]==1)&&(color1[0][j+6]==1)&&(color1[0][j+7]==1)&&(color1[0][j+8]==1)&&(color1[0][j+9]==1))//若存在00000111111这样的连续数据,判断为左边线{left_flag=1;left=j+4;break; }
else if((color1[0][j]==1)&&(color1[0][j+1]==1)&&(color1[0][j+2]==1)&&(color1[0][j+3]==1)&&(color1[0][j+4]==1)&&(color1[0][j+5]==0)&&(color1[0][j+6]==0)&&(color1[0][j+7]==0)&&(color1[0][j+8]==0)&&(color1[0][j+9]==0))
{right_flag=1;right=j+5;break; }
if((color2[0][j]==0)&&(color2[0][j+1]==0)&&(color2[0][j+2]==0)&&(color2[0][j+3]==0)&&(color2[0][j+4]==0)&&(color2[0][j+5]==1)&&(color2[0][j+6]==1)&&(color2[0][j+7]==1)&&(color2[0][j+8]==1)&&(color2[0][j+9]==1))//若存在0000011111这样的连续数据,判断为左边线{left_flag2=1;left2=j+4;break; }else if((color2[0][j]==1)&&(color2[0][j+1]==1)&&(color2[0][j+2]==1)&&(color2[0][j+3]==1)&&(color2[0][j+4]==1)&&(color2[0][j+5]==0)&&(color2[0][j+6]==0)&&(color2[0][j+7]==0)&&(color2[0][j+8]==0)&&(color2[0][j+9]==0)){right_flag2=1;right2=j+5;break;}if((color3[0][j]==0)&&(color3[0][j+1]==0)&&(color3[0][j+2]==0)&&(color3[0][j+3]==0)&&(color3[0][j+4]==0)&&(color3[0][j+5]==1)&&(color3[0][j+6]==1)&&(color3[0][j+7]==1)&&(color3[0][j+8]==1)&&(color3[0][j+9]==1)){left_flag3=1;left3=j+4;break;}else if((color3[0][j]==1)&&(color3[0][j+1]==1)&&(color3[0][j+2]==1)&&(color3[0][j+3]==1)&&(color3[0][j+4]==1)&&(color3[0][j+5]==0)&&(color3[0][j+6]==0)&&(color3[0][j+7]==0)&&(color3[0][j+8]==0)&&(color3[0][j+9]==0)){right_flag3=1;right3=j+5;break}
}
zhong1=(left+right)/2;zhong2=(left2+right2)/2;zhong3=(left3+right3)/2;
kuan=((right-left)+(right2-left2))/2;
}
其他的后续更新