壁障循迹智能小车
- 格式:doc
- 大小:2.68 MB
- 文档页数:15
实用精品文档 湖北理工学院电赛预选赛论文
题目;智能壁障循迹小车
参赛人员:许金利 陈雄
班级:10电气本一
实用精品文档
智能壁障循迹小车
摘要:本系统是以msp430单片机为控制核心,利用TRCT5000红外对管检测黑线,控制小车实现自动循迹功能,利用E18—D80NK—N红外壁障传感器实现壁障功能。小车驱动采用L293D驱动电路,速度由单片机控制,通过L293D芯片驱动直流电机,结合光电开关,可有效控制小车在特定位置转弯角度;另利用红外解码原理,通过遥控器实现小车的功能转换。由以上各种功能的结合,使小车更加智能化,自动化,该系统在结构和技术上都显得更加科学化。
关键字:msp430单片机;TRCT5000红外对管;E18—D80NK—N红外壁障传感器;L293D芯片。
实用精品文档 二.方案设计
2.1 主控系统
采用msp430F149单片机加8MHZ的晶振为整个系统的核心,TI公司的msp430系列16位单片机具有超低功耗性能,用其控制智能小车,实现既定的功能。
2.2 电机驱动模块(L293D)
采用功率三极管作为功率放大器的输出控制直流电机,线性型驱动的电路结构和原理简单,这种调速方式有调速特性优良、调整平滑、调速范围广、过载能力大,能承受频繁的负载冲击,还可以实现频繁的无级快速启动、制动和反转等优点。因此决定采用使用功率三极管作为功率放大器的输出控制直流电机。
2.3 循迹模块
采用4只红外对管并排至于小车后,中央黑线的两侧分别有两只,红外对管的红外发射管不断发射红外线,光敏三极管会不断接受反射的红外线,通过对黑线的检测,光电对管会向单片机发送脉冲信号,单片机则会控制电机的转速来实现转弯,继而实现循迹功能。 红外对管的电路实物图如下:
实用精品文档
图2 TRCT5000传感器模块布局图
2.4 壁障模块
E18-D80NK-N 这是一种集发射与接收于一体的光电传感器,发射光经过调制后发出,接收头对反射光进行解调输出。有效的避免了可见光的干扰。透镜的使用,也使得这款传感器最远可以检测80厘米距离的问题。如遇障碍物,光电开
关向单片机发去信号继而控制小车转弯以实现壁障功能。
E18-D80NK-N光电传感器的实物图与原理图
2.5 机械系统
本题目要求小车的机械系统稳定、灵活、简单,而运动系统具备以上特点。
驱动部分:由于玩具汽车的直流电机功率较小,而小车上装有电池、电机、电子器件等,使得电机负担较重。
电池的安装:将电池放置在车体的电机前后位置,降低车体重心,提高稳定性,同时可增加驱动轮的抓地力,减小轮子空转所引起的误差。
2.6 电源模块
电源采用12V电源转5V,通过7805的稳压片及滤波电容。
实用精品文档
电源电路
三.硬件设计
3.1 总体设计
智能小车采用前轮驱动,前轮左右两边各用一个电机驱动,调制前面两个轮子的转速起停从而达到控制转向的目的,将循迹光电对管并排安装在车体后。当车身下左边的传感器检测到黑线时,主控芯片控制左轮电机停止,车向左修正,当车身下右边传感器检测到黑线时,主控芯片控制右轮电机停止,车向右修正。红外光电开关装在车上中间部分,当检测到障碍物时,主控芯片控制小车转弯。
主板设计框图
3.2 驱动电路
电机驱动一般采用H桥式驱动电路,L293D内部集成了H桥式驱动电路,从而可以采用L293D电路来驱动电机。通过单片机给予L293D电路PWM信号来控制小车的速度,起停。
Msp430
单片机 红外对管模块
光电开关模块
红外遥控模块 电机驱动模块
液晶显示模块
实用精品文档
电机驱动电路
3.3 信号检测模块
小车循迹原理是小车在画有黑线的白纸 “路面”上行驶,由于黑线和白纸对光线的反射系数不同,可根据接收到的反射光的强弱来判断“道路”—黑线。笔者在该模块中利用了简单、应用也比较普遍的检测方法——红外探测法。
红外探测法,即利用红外线在不同颜色的物理表面具有不同的反射性质的特点。在小车行驶过程中不断地向地面发射红外光,当红外光遇到白色地面时发生漫发射,反射光被装在小车上的接收管接收;如果遇到黑线则红外光被吸收,则小车上的接收管接收不到信号,再通过LM324作比较器来采集高低电平,从而实现信号的检测。
市面上有很多红外传感器,在这里我选用TCRT5000型光电对管。
实用精品文档
光电对管传感器原理图
3.4 主控电路
本模块主要是对采集信号进行分析,同时给出PWM波控制电机速度,起停,以及驱动液晶显示等作用。
主控电路
四.软件设计
4.1 主程序框图
启动
实用精品文档
主程序图框
4.2 C程序
#include
#include //延时函数头文件
#define uint unsigned int
#define uchar unsigned char
#define mcu_xtal 8 //对8M的晶振
#define delay_us(x) __delay_cycles (x * mcu_xtal) //延时1us
#define delay_ms(x) __delay_cycles ((unsigned long)x * mcu_xtal*1000)//延ms
#define delay_s(x) __delay_cycles ((unsigned long)x * mcu_xtal*1000000)//延s
typedef unsigned char UCHAR;
typedef unsigned int UINT;
#define CPU_F ((double)8000000) //8000000为当前的晶振频率
#define DelayUs(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define DelayMs(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
UCHAR table[] = {" Xu Jin Li "};
UCHAR FLAG[] = " Chen Xiong";
#define ComDir P3DIR //控制端输入输出定义
#define RS_L P3OUT &=~BIT0 //液晶的RS端低电平
#define RS_H P3OUT |= BIT0 //液晶的RS端高电平
#define RW_L P3OUT &=~BIT1 //液晶的RW端低电平
#define RW_H P3OUT |= BIT1 //液晶的RW端高电平
#define EN_L P3OUT &=~BIT2 //液晶的EN端低电平
#define EN_H P3OUT |= BIT2 //液晶的RW端高电平
#define DatDir P4DIR //数据端输入输出定义 循迹
是否检测停止 是否检测到障碍 Y 壁障
N N
Y
停止
实用精品文档 #define DatBus P4OUT //数据端输出
#define WriDat P4IN //数据端输入
void CheBusy(); //读忙函数
/********************************************************************/
void WriteCom(UCHAR com)
{
CheBusy(); //读忙
DatDir = 0XFF; //数据口为输入
RW_L; //RW端拉低
RS_L; //RS端拉低
DatBus = com; //将指令写入
EN_H; //EN端拉高
DelayMs(1); //延时发送数据
EN_L; //EN端拉低
}
/********************************************************************/
void WriteData(UCHAR dat)
{
CheBusy(); //读忙
DatDir = 0XFF; //数据端输入
RW_L; //RW端拉低
RS_H; //RS端拉高
DatBus = dat; //将数据写入
EN_H; //EN端拉高
DelayMs(1); //延时发送数据
EN_L; //EN端拉低
}
/********************************************************************/
void Init1602()
{
EN_L;