智能循迹小车设计
专 业: 自动化 班 级: 0804班 姓 名: 指导老师:
2010年8月——2010年10月
摘要:
本课题是基于AT89C52单片机的智能小车的设计与实现,小车完
成的主要功能是能够自主识别黑色引导线并根据黑线走向实现快速稳定的寻线行驶。小车系统以 AT89S52 单片机为系统控制处理器; 采用红外传感获取赛道的信息,来对小车的方向和速度进行控制。此外,对整个控制软件进行设计和程序的编制以及程序的调试,并最终完成软件和硬件的融合,实现小车的预期功能。
引 言
当今世界,传感器技术和自动控制技术正在飞速发展,机械、电气和电子信息已经不再明显分家,自动控制在工业领域中的地位已经越来越重要,“智能”这个词也已经成为了热门词汇。现在国外的自动控制和传感器技术已经达到了很高的水平,特别是日本,比如日本本田制作的机器人,其仿人双足行走已经做得十分逼真,而且具有一定的学习能力,还据说其智商已达到6岁儿童的水平。
作为机械行业的代表产品—汽车,其与电子信息产业的融合速度也显著提高,呈现出两个明显的特点:一是电子装置占汽车整车(特别是轿车)的价值量比例逐步提高,汽车将由以机械产品为主向高级的机电一体化方向发展,汽车电子产业也很有可能成为依托整车制造业和用车提升配置而快速成为新的增长点;二是汽车开始向电子化、多媒体化和智能化方向发展,使其不仅作为一种代步工具、同时能具有交通、娱乐、办公和通讯等多种功能。
毋庸置疑,机电一体化人才的培养不论是在国外还是国内,都开始重视起来,主要表现在大学生的各种大型的创新比赛,比如:亚洲广播电视联盟亚太地区机器人大赛(ABU ROBCON)、全国大学生“飞思卡尔”杯智能汽车竞赛等众多重要竞赛都能很好的培养大学生对于机电一体化的兴趣与强化机电一体化的相关知识。但很现实的状况是,国内不论是在机械还是电气领域,与国外的差距还是很明显的,所以作为机电一体化学生,必须加倍努力,为逐步赶上国外先进水平
并超过之而努力。
为了适应机电一体化的发展在汽车智能化方向的发展要求,提出简易智能小车的构想,目的在于:通过独立设计并制作一辆具有简单智能化的简易小车,获得项目整体设计的能力,并掌握多通道多样化传感器综合控制的方法。所以立“智能循迹小车”一题作为尝试。
此项设计是在以杨老师提供的小车为基础上,采用AT89C52单片机作为控制核心,实现能够自主识别黑色引导线并根据黑线走向实现快速稳定的寻线行驶。
一、实验目的:
通过设计进一步掌握51单片机的应用,特别是在嵌入式系统中的应用。进一步学习51单片机在系统中的控制功能,能够合理设计单片机的外围电路,并使之与单片机构成整个系统。
二、设计方案:
该智能车采用红外传感器对赛道进行道路检测,单片机根据采集
到的信号的不同状态判断小车当前状态,通过电机驱动芯片L298N发出控制命令,控制电机的工作状态以实现对小车姿态的控制。
三、报告内容安排:
本技术报告主要分为三个部分。第一部分是对整个系统实现方法的一个概要说明,主要内容是对整个技术原理的概述;第二部分是对硬件电路设计的说明,主要介绍系统传感器的设计及其他硬件电路的设计原理等;第三部分是对系统软件设计部分的说明,主要内容是智能模型车设计中主要用到的控制理论、算法说明及代码设计介绍等。
技术方案概要说明
本模型车的电路系统包括电源管理模块、单片机模块、传感
器模块、电机驱动模块。
工作原理:
利用红外采集模块中的红外发射接收对管检测路面上的轨迹 将轨迹信息送到单片机
单片机采用模糊推理求出转向的角度和行走速度,然后去控制 行走部分
最终完成智能小车可以按照路面上的轨迹运行。
硬件电路的设计
1、最小系统:
小车采用atmel公司的AT89C52单片机作为控制芯片,图1是其最小系统电路。主要包括:时钟电路、电源电路、复位电路。其中各个部分的功能如下:
1、时钟电路:给单片机提供一个外接的16MHz的石英晶振。 2、电源电路:给单片机提供5V电源。
3、复位电路:在电压达到正常值时给单片机一个复位信号。
图1 单片机最小系统原理图
2、电源电路设计:
模型车通过自身系统,采集赛道信息,获取自身速度信息,加以处理,由芯片给出指令控制其前进转向等动作,各部分都需要由电路支持,电源管理尤为重要。在本设计中,51单片机使用5V电源,电机及舵机使用6V电源。考虑到电源为充电电池组,额定电压为7.2V,实际充满电后电压则为6.5-6.8V,所以单片机及传感器模块采用7805稳压后的5V电源供电,舵机及电机直接由电池供电。
3、传感器电路:
光电寻线方案一般由多对红外收发管组成,通过检测接收到的反射光强,判断黑白线。原理图由红外对管和电压比较器两部分组成,红外对管输出的模拟电压通过电压比较器转换成数字电平输出到单片机。
图2 赛道检测原理图:
4、电机驱动电路:
电机驱动芯片L298N是SGS公司的产品,内部包含4通道逻辑驱动
电路。是一种二相和四相电机的专用驱动器,即内含二个H桥的高电压大电流双全桥式驱动器,接收标准TTL逻辑电平信号,可驱动46V、2A以下的电机。其引脚排列如图1中U4所示,1脚和15脚可单独引出连接电流采样电阻器,形成电流传感信号。L298可驱动2个电机,OUT1、OUT2和OUT3、OUT4之间分别接2个电动机。5、7、10、12脚接输入控制电平,控制电机的正反转,ENA,ENB接控制使能端,控制电机的停转。也利用单片机产生PWM信号接到ENA,ENB端子,对电机的转速进行调节。 L298N的逻辑功能:
表1 SHARP GP2D12实物图
外形及封装:
234 图3 L298N实物图 L298N电路原理图: 由于一片L298N可以直接驱动两个电机,但是为了加大驱动力,我们采用两路并联的方式来驱动电机。 U15710126111158IN1IN2IN3IN4ENAENBGNDGNDGNDL298NU25710126111158IN1IN2IN3IN4ENAENBGNDGNDGNDL298NVSSOUT1OUT2OUT3OUT4VCC42313149+12V+12VD54007D64007+5VD74007+VSSOUT1OUT2OUT3OUT4VCC42313149+12V+12VD14007D24007+5VD34007+MG1MOTOR RIGHTD4A4007-J1123456P3.1P3.3P3.5P3.7P4.2P4.4单片机引脚MG2MOTOR LEFTD8A4007-小 车 电 机 驱 动U3J2123CON3+5VGNDP5.75710126111158IN1IN2IN3IN4ENAENBGNDGNDGNDVSSOUT1OUT2OUT3OUT4VCC423 灭火风扇+A-图3.3 L298N电路图 13149 灭 火 风 扇 驱 动L298N
软件系统的实现
小车循迹规则:
若小车偏左的时候,车轮将向右偏转;若小车偏右,车轮将向左偏转;若没有偏移,小车将继续向前;若小车完全偏离黑色轨迹,小车后退以寻找黑色轨迹。
小车程序:
#include \"reg52.h\"
#define det_Dist 2.55 //单个脉冲对应的小车行走距离,其值为车轮周长/4 #define RD 9 //小车对角轴长度 #define PI 3.1415926 #define ANG_90 90 #define ANG_90_T 102 #define ANG_180 189
/*============================全局变量定义区============================*/ sbit P10=P1^0; //控制继电器的开闭 sbit P11=P1^1; //控制金属接近开关 sbit P12=P1^2; //控制颜色传感器的开闭 sbit P07=P0^7; //控制声光信号的开启
sbit P26=P2^6; //接收颜色传感器的信号,白为0,黑为1 sbit P24=P2^4; //左
sbit P25=P2^5; //右 接收左右光传感器的信号,有光为0
unsigned char mType=0; //设置运动的方式,0 向前 1 向左 2 向后 3 向右 unsigned char Direction=0; //小车的即时朝向 0 朝上 1 朝左 2 朝下 3 朝右 unsigned sX=50; unsigned char sY=0; //小车的相对右下角的坐标 CM(sX,sY)
unsigned char StartTask=0; //获得铁片后开始执行返回卸货任务,StartTask置一 unsigned char Inter_EX0=0; // 完成一个完整的任务期间只能有一次外部中断 // Inter_EX0记录外部中断0的中断状态 // 0 动作最近的前一次未中断过, // 1 动作最近的前一次中断过
unsigned char cntIorn=0; //铁片数
unsigned char bkAim=2; //回程目的地,0为A仓库,1为B仓库,2为停车场, //(在MAIN中接受铁片颜色判断传感器的信号来赋值) unsigned char Light_Flag=0;//进入光引导区的标志(1)
unsigned int cntTime_5Min=0;//时间周期数,用于 T0 精确定时 unsigned int cntTime_Plues=0; //霍尔开关产生的脉冲数 /*============================全局变量定义区============================*/
/*------------------------------------------------*/
/*-----------------通用延迟程序-------------------*/ /*------------------------------------------------*/
void delay(unsigned int time) // time*0.5ms延时 {
unsigned int i,j;
for(j=0;j