苏嵌119项目报告
项目题目: 循迹小车
项目成员: 郑旭宏 简雷
2016年9月11日~2016年10月15日
智能寻迹小车的设计
Intelligent Tracing Car Design
摘要
在智能寻迹小车控制系统的设计中,以AT89RD+为核心,用L298N驱动两个减速电机,当产生信号驱动小车前进时,是通过寻迹模块里的红外对管是否寻到黑线产生的电平信号通过LM393再返回到单片机,单片机根据程序设计的要求做出相应的判断送给电机驱动模块,让小车来实现前进、左转、右转、停车等基本功能。 寻白线时,外部环境光线的强弱对小车的运动会产生很大的影响,基于此原因,本实验中的寻迹是指在白色地板上寻黑线。 寻迹是指通过红外发射管和接收管识别路径。
本实验的重点有三个方面:1.硬件的设计实现;2.软件的设计实现;3.方案的比较与论证。 报告共分为五章:
第一章是智能小车总体概况。介绍了小车的功能及展示了小车模型。
第二章是系统要求。介绍了小车设计的要求及寻迹的原理。详细阐述了各模块的方案比较与论证,最后得出最终方案。
第三章是硬件实现及单元电路实现。详细阐述了各部分电路的设计,并给出了原理图。
第四章是软件设计。介绍了设计思想、程序流程图及具体程序设计。
目 录
第一章 智能小车总体概况
1.1 概况
1.2总体结构图
第二章 系统设计
2.1 设计要求
2.2 小车寻迹的原理
2.3模块方案比较与论证
第三章 硬件实现及单元电路设计
3.1 AT89RD+主控芯片介绍 11 3.2 硬件设计
3.2.1 红外对管电路的设计
3.2.2寻迹红外对管的安装
3.2.3电机驱动电路的设计
第四章 软件设计
4.1软件设计思想
4.3寻迹模块软件程序设计
第一章 智能小车总体概况
1.1概况
智能小车以AT89RD+为核心,经焊接相关芯片用电路板自制而成,通过I/O口检测信号,输出信号到L298N,从而驱动两个减速电机控制其前进 停止 左转 右转。检测信号则为四组红外发射和接收管,遇到黑线就是高电平,遇到白色就是低电平。
第二章 系统设计
2.1 小车寻迹的原理
这里的循迹是指小车在白色地板上寻黑线行走,通常采取的方法是红外探测法。 红外探测法,即利用红外线在不同颜色的物体表面具有不同的反射性质的特点,在小车行驶过程中不断地向地面发射红外光,当红外光遇到白色纸质地板时发生漫反射,反射光被装在小车上的接收管接收;如果遇到黑线则红外光被吸收,小车上的接收管接收不到红外光。单片机就是否收到反射回来的红外光为依据来确定黑线的位置和小车的行走路线。红外探测器探测距离有限,一般最大不应超过3cm。
2.2模块方案比较与论证
根据设计要求,本系统主要由控制器模块、寻迹传感器模块、直流电机及其驱动模块、电压比较模块等模块构成。
为较好的实现各模块的功能,我分别设计了几种方案并分别进行了论证。 2.3.1车体设计
方案1:购买玩具电动车。购买的玩具电动车具有组装完整的车架车轮、电机及其驱动电路。但是一般的说来,玩具电动车具有如下缺点:首先,这种玩具电动车由于装配紧凑,使得各种所需传感器的安装十分不方便。其次,这种电动车一般都是前轮转向后轮驱动,不能适应该题目的方格地图,不能方便迅速的实现原地保持坐标转90度甚至180度的弯角。再次,玩具电动车的电机多为玩具直流电机,力矩小,空载转速快,负载性能差,不易调速。而且这种电动车一般都价格不菲。因此我们放弃了此方案。
方案2:自己制作电动车。经过反复考虑论证,我们制定了左右两轮分别驱动,后方向轮转向的方案。即左右轮分别用两个转速和力矩基本完全相同的直流电机进行驱动,车体尾部装一个方向轮。这样,当两个直流电机转向相反同时转速相同时就可以实现电动车的原地旋转,由此可以轻松的实现小车坐标不变的90度和180度的转弯。
在安装时保证两个驱动电机同轴。当小车前进时,左右两驱动轮与方向轮形成了三点结构。这种结构使得小车在前进时比较平稳,可以避免出现后轮过低而使左右两驱动轮驱动力不够的情况。为了防止小车重心的偏移,后方向轮起支撑作用。
对于车架材料的选择,鉴于方便性,我选择了购买器件。综上考虑,我选择了方案1。
2.3控制器模块
方案1:采用可编程逻辑期间CPLD 作为控制器。CPLD可以实现各种复杂的逻辑功能、规模大、密度高、体积小、稳定性高、IO资源丰富、易于进行功能扩展。采用并行的输入输出方式,提高了系统的处理速度,适合作为大规模控制系统的控制核心。但本系统不需要复杂的逻辑功能,对数据的处理速度的要求也不是非常高。且从使用及经济的角度考虑我放弃了此方案。
方案2:采用凌阳公司的16位单片机,它是16位控制器,具有体积小、驱动能力高、集成度高、易扩展、可靠性高、功耗低、结构简单、中断处理能力强等特点。处理速度高,尤其适用于语音处理和识别等领域。但是当凌阳单片机应用语音处理和辨识时,由于其占用的CPU资源较多而使得凌阳单片机同时处理其它任务的速度和能力降低。
本系统主要是进行寻迹运行的检测以及电机的控制。如果单纯的使用凌阳单片机,在语音播报的同时小车的控制容易出现不稳定的情况。从系统的稳定性和编程的简洁性考虑,我放弃了单纯使用凌阳单片机而考虑其它的方案。
方案3:采用Atmel公司的AT89RD+单片机作为主控制器。AT89RD+是一个低功耗,高性能的8位单片机,32个IO口, 2个16位可编程定时计数器。
从方便使用的角度考虑,我选择了方案3。 2.3.3 寻迹方案 D的设计
这里的寻迹是指小车在白色地板上,寻着黑线行走,通常采取的方法是以下三种方案。
方案1:用光敏电阻组成光敏探测器。光敏电阻的阻值可以跟随周围环境光线的变化而变化。当光线照射到白线上面时,光线发射强烈,光线照射到黑线上面时,光线发射较弱。因此光敏电阻在白线和黑线上方时,阻值会发生明显的变化。将阻值的变化值经过比较器就可以输出高低电平。
但是这种方案受光照影响很大,不能够稳定的工作。因此我考虑其他更加稳定的方案。
方案2:用红外发射管和接收管自己制作光电对管寻迹传感器。红外发射管发出红外线,当发出的红外线照射到白色的平面后反射,若红外接收管能接收到反射回的光线则检测出白线继而输出低电平,若接收不到发射管发出的光线则检测出黑线继而输出高电平。外部环境对其有一定影响。
方案3:用RPR220型光电对管。RPR220是一种一体化反射型光电探测器,其发射器是一个砷化镓红外发光二极管,而接收器是一个高灵敏度,硅平面光电三极管。
RPR220采用DIP4封装,其具有如下特点: a. 塑料透镜可以提高灵敏度。
b. 内置可见光过滤器能减小离散光的影响。
c. 体积小,结构紧凑。
d. 当发光二极管发出的光反射回来时,三极管导通输出低电平。此光电对
管调理电路简单,工作性能稳定。
虽然第三种方案最好,但由于不容易买到,所以我选择了第二种方案。 2.3.4 电机方案设计
本系统为智能电动车,对于电动车来说,其驱动轮的驱动电机的选择就显得十分重要。由于本实验要实现对路径的准确定位和精确测量,我们综合考虑了一下两种方案。
方案1:采用步进电机作为该系统的驱动电机。由于其转过的角度可以精确的定位,可以实现小车前进路程和位置的精确定位。虽然采用步进电机有诸多优点,步进电机的输出力矩较低,随转速的升高而下降,且在较高转速时会急剧下降,其转速较低,不适用于小车等有一定速度要求的系统。经综合比较考虑,我们放弃了此方案。
方案2:采用直流减速电机。直流减速电机转动力矩大,体积小,重量轻,装配简单,使用方便。由于其内部由高速电动机提供原始动力,带动变速(减速)齿轮组,可以产生较大扭力。
我选择了此方案2。
2.5 电机驱动模块
方案1:采用专用芯片L298N作为电机驱动芯片。L298N是一个具有高电压大电流的全桥驱动芯片,它相应频率高,一片L298N可以分别控制两个直流电机,而且还带有控制使能端。用该芯片作为电机驱动,操作方便,稳定性好,性能优良。
方案2:对于直流电机用分立元件构成驱动电路。由分立元件构成电机驱动电路,结构简单,价格低廉,在实际应用中应用广泛。但是这种电路工作性能不够稳定。
因此我们选用了方案1。
2.6 最终方案
经过反复论证,我最终确定了如下方案:
(1)车体用零器件组装。
(2)采用最小系统板作为主控制器。
(3)用红外对管进行寻迹。
(4)L298N作为直流电机的驱动芯片。
(5)9v电池,稳压模块,稳出5v给单片机工作。
红外对管检测电路:
LN298N驱动模块:
四、程序
//++++++++++++++++++++++//
#include
#include"./delay/delay.h"
sbit IN1 = P1^0;
sbit IN2 = P1^1;
sbit ENA = P1^2;
sbit IN3 = P1^3;
sbit IN4 = P1^4;
sbit ENB = P1^5;
sbit left1 = P0^0;
sbit left2 = P0^1;
sbit right1 = P0^2;
sbit right2 = P0^3;
unsigned char zkb1 = 0;
unsigned char zkb2 = 0;
unsigned char t = 0;
void init()
{
EA = 1;
TMOD |= 0x01;
TH0 =(65536 - 100) / 256;
TL0 = (65536 - 100)% 256;
ET0 = 1;
TR0 = 1;
}
void timer0() interrupt 1
{
TH0 = (65536 - 100) / 256;
TL0 = (65536 - 100) % 256;
if(t < zkb1)
{
ENA = 1;
}
else
{
ENA = 0;
}
if(t < zkb2)
{
ENB =1;
}
else
{
ENB = 0;
}
++t;
if(t >= 50)
{
t = 0;
}
}
void turn_left1()
{
zkb1 = 13;
zkb2 = 0;
}
void turn_left2()
{
zkb1 = 13;
zkb2 = 0;
}
void turn_right1()
{
zkb1 = 0;
zkb2 = 13;
}
void turn_right2()
{
zkb1 = 0;
zkb2 = 13;
}
void qianjin()
{
zkb1 = 8;
zkb2 = 8;
}
void xunji()
{
unsigned char flag;
if((right2 == 0)&&(right1 == 0)&&(left1 == 0)&&(left2 == 0))
{
flag = 0;
}
if((right2 == 0)&&(right1 ==1)&&(left1 == 0)&&(left2 == 0))
{
flag = 1;
}
if((right2 == 0)&&(right1 == 0)&&(left1 == 1)&&(left2 == 0))
{
flag = 2;
}
if((right2 == 0)&&(right1 == 0)&&(left1 == 0)&&(left2 == 1))
{
flag = 3;
}
if((right2 == 1)&&(right1 == 0)&&(left1 == 0)&&(left2 == 0))
{
flag = 4;
}
switch(flag)
{
case 0:qianjin();break;
case 1:turn_right1();break;
case 2:turn_left1();break;
case 3:turn_left2();break;
case 4:turn_right2();break;
default:qianjin();break;
}
}
void main()
{
init();
// zkb1 = 40;
// zkb2 = 30;
IN1 = 0;
IN2 = 1;
IN3 = 0;
IN4 = 1;
while(1)
{
xunji();
}
}