壁障循迹智能小车

  • 格式: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;