循迹避障小车原理
一)小车功能实现
利用光电传感(红外对射管,红外发射与接收二极管组成)检测黑白线,实现小车能跟着白线(或黑线)行走,同时也可避开障碍物,即小车寻迹过程中,若遇障碍物可自行绕开,绕开后继续寻迹。
二)电路分析
1.光电传感
循迹光电传感器原理,利用黑白线对红外线不同的反射能力。然后通过光敏二极管或光敏三极管,接收反射回的不同光强信号,把不同光强转换为电流信号,最后通过电阻,转换为单片机可识别的高低电平。光电传感器实现循迹的基本电路如下图所示
、
循迹传感器基本电路
电路解释:TC端是传感器工作控制端,为高电平时,发光二极管不工作,传感器休眠,为低电平时,传感器启动。Signal端为检测信号输出,当遇到黑线,黑线吸收大量的红外线,反射的红外线很弱,光敏三极管不导通,signal 输出高电平,当遇到白线,与黑线相反,反射的红外线很强,使光敏三极管导通,signal输出低电平。
寻迹部分
调整左右传感器之间的距离,两探头距离约等于白线宽度最合适,一般白线宽度选择范围为3 –5 厘米比较合适。注意:该传感器的灵敏度是可调的,偶尔传感器遇到白线却不能送出相应的信号,通过调节传感器上的可调电阻,适当的增大或减小灵敏度。另外,循迹传感器的安放也算是比较有讲究的,有两种方法,一种是两个都是放置在白线内侧但紧贴白线边缘,第二种是都放置在白线的外侧,同样紧贴白线边缘。我们通常采用第二种方法。
编写程序使小车遇白线时,小车跟着白线走。当小车先前前进时,如果向左偏离了白线。那么右边传感器会产生一个低电平,单片机判断这个信号,然后向右拐。回到白线后。两传感器输出信号为高电平。小车前进。如果小车向右偏离白线,左边传感器产生一个低电平,单片机判断这个信号,然后向左拐。如此如此,小车必不偏离白线。若小车的两对光电传感器同时输出的信号为高电平(黑底)或低电平(白底),即单片机判断的都为高电平或低电平,小车向前直走,在此过程中(直走)小车若遇白线,小车又重复上面动作跟着白线走。
避障部分
当小车在寻迹(沿着白线走或直走)过程中遇障碍物,小车亦可自行转弯,转弯动作完成后,又继续寻迹。
2.电机驱动电路
电机驱动芯片采用L298N,是一款承受高压大电流的全桥型直流/步进电压
驱动器,如下图
电机控制芯片L298N的引脚排列
L298N引脚编号与功能
引脚编号名称功能
1 电流传感器A 在该引脚和地之间接小阻值电阻可用来检测电流
2 输出引脚1 内置驱动器A的输出端1,接至电机A
3 输出引脚2 内置驱动器A的输出端2,接至电机A
4 电机电源端电机供电输入端,电压可达46V
5 输入引脚1 内置驱动器A的逻辑控制输入端1
6 使能端A 内置驱动器A的使能端
7 输入引脚2 内置驱动器A的逻辑控制输入端2
8 逻辑地逻辑地
9 逻辑电源端逻辑控制电路的电源输入端为5V
10 输入引脚3 内置驱动器B的逻辑控制输入端1
11 使能端B 内置驱动器B的使能端
12 输入引脚4 内置驱动器B的逻辑控制输入端2
13 输出引脚3 内置驱动器B的输出端1,接至电机B
14 输出引脚4 内置驱动器B的输出端2,接至电机B
15 电流传感器B 在该引脚和地之间接小阻值电阻可用来检测电流
L298N内部原理图
电机驱动A/B的控制逻辑如下表所示
输入信号电机运动方式
使能端A/B 输入引脚1/3 输入引脚2/4
1 1 0 前进
1 0 1 后退
1 1 1 紧急停车
1 0 0 紧急停车
0 X X 自由转动电机驱动A/B的工作原理
电机控制逻辑如下:以电机A为例,当使能端A为高电平是,如果输入端M1 Direction引脚为高电平,三极管导通,输入引脚1为低电平而输入引脚2为高电平,电机A反转;如果输入端M1 Direction引脚为底电平,三极管截止,输入引脚1为高电平而输入引脚2为低电平,电机A正转。
电机驱动原理图
3.中文液晶显示器128x64
带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块。其显示分辨率为128×64, 内置8192个16*16点汉字,和128个16*8点ASCII字符集。利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4行16×16点阵的汉字,也可完成图形显示。具有低电压低功耗特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。
基本特性: 低电源电压(VDD:+3.0--+5.5V)
显示分辨率:128×64点
内置汉字字库,提供8192个16×16点阵汉字(简繁体可选)
内置128个16×8点阵字符
2MHZ时钟频率
显示方式:STN、半透、正显
驱动方式:1/32DUTY,1/5BIAS
视角方向:6点
背光方式:侧部高亮白色LED,功耗仅为普通LED的1/5—1/10
通讯方式:串行、并口可选
内置DC-DC转换电路,无需外加负压
无需片选信号,简化软件设计
工作温度: 0℃- +55℃,存储温度: -20℃- +60℃
模块接口说明:
PIN15 LED+ 背光正极,接4.8V-5V
PIN116LED- 背光负极,接0V
*注:1:如在实际应用中仅使用并口通讯模式,可将PSB接固定高电平,也可以将模块上的J8和“VCC”用焊锡短接;2:模块内部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空;3:如背光和模块共用一个电源,可以将模块上的JA、JK用焊锡短接。
引脚控制信号应用
D/I,R/W的配合选择决定控制界面的4种模式:
D/I R/W 功能说明
E信号操作:
内部寄存器信号
●忙标志:BF
BF标志提供内部工作情况,BF=1表示模块在进行内部操作,此时模块不接受外部指令和数据。BF=0时,模块为准备状态,随时可接受外部指令和数据。利用STATUS RD 指令,可以将BF读到DB7总线,从而检验模块之工作状态。
●字型产生ROM(CGROM)
字型产生ROM(CGROM)提供8192个此触发器是用于模块屏幕显示开和关的控制。DFF=1为开显示(DISPLAY ON),DDRAM的内容就显示在屏幕上,DFF=0为关显示(DISPLAY OFF)。DFF 的状态是指令DISPLAY ON/OFF和D/IT信号控制的。
●显示数据RAM(DDRAM)
模块内部显示数据RAM提供64×2个位元组的空间,最多可控制4行16字(64个字)的中文字型显示,当写入显示数据RAM时,可分别显示CGROM与CGRAM的字型;此模块可显示三种字型,分别是半角英数字型(16*8)、CGRAM字型及CGROM的中文字型,三种字型的选择,由在DDRAM中写入的编码选择,在此阶段0000H—0006H的编码中(其代码分别是0000、0002、0004、0006共4个)将选择CGRAM的自定义字型,02H —7FH的编码中将选择半角英数字的字型,至于A1以上的编码将自动的结合下一个位元组,组成两个位元组的编码形成中文字型的编码BIG5(A140—D75F),GB(A1A0-F7FFH)。
●字型产生RAM(CGRAM)
字型产生RAM提供图象定义(造字)功能,可以提供四组16×16点的自定义图象空间,使用者可以将内部字型没有提供的图象字型自行定义到CGRAM中,便可和CGROM中的定义一样地通过DDRAM显示在屏幕中。
●地址计数器AC
地址计数器AC地址计数器是用来贮存DDRAM/CGRAM之一的地址,它可由设定指令暂存器来改变,之后只要读取或是写入DDRAM/CGRAM的值时,地址计数器的值就会自动加一,当D/I为“0”时而R/W为“1”时,地址计数器的值会被读取到DB6——DB0中。
●光标/闪烁控制电路
此模块提供硬体光标及闪烁控制电路,由地址计数器的值来指定DDRAM中的光标或闪烁位置。
指令操作
模块控制芯片提供两套控制命令,基本指令和扩充指令如下:指令表1:(RE=0:基本指令)
指令表2:(RE=1:扩充指令)
注:当IC1在接受指令前,微处理器必须先确认其内部处于非忙碌状态,即读取BF标志时,BF需为零,方可接受新的指令;如果在送出一个指令前并不检查BF标志,那么在前一个指令和这个指令中间必须延长一段较长的时间,即是等待前一个指令确实执行完成。
三、显示应用
1、字符显示
带中文字库的128X64-0402B每屏可显示4行8列共32个16×16点阵的汉字,每个显示RAM可显示1个中文字符或2个16×8点阵全高ASCII码字符,即每屏最多可实现32个中文字符或64个ASCII码字符的显示。带中文字库的128X64-0402B内部提供128×2字节的字符显示RAM缓冲区(DDRAM)。字符显示是通过将字符显示编码写入该字符显示RAM实现的。根据写入内容的不同,可分别在液晶屏上显示CGROM(中文字库)、HCGROM (ASCII码字库)及CGRAM(自定义字形)的内容。三种不同字符/字型的选择编码范围为:0000~0006H(其代码分别是0000、0002、0004、0006共4个)显示自定义字型,02H~7FH显示半宽ASCII码字符,A1A0H~F7FFH显示8192种GB2312中文字库字形。字符显示RAM在液晶模块中的地址80H~9FH。字符显示的RAM的地址与32个字符显示区域有着一一对应的关系,其对应关系如下表所示。
其中,C语言编译器具有直接把中文转换成ASCII码字符功能。对照下面原理图,编译程序示例,并下载到实验板上,观测现象。
4.寻迹避障程序
#include
#define uchar unsigned char
#define uint unsigned int
sbit RM1=P0^0;
sbit RM2=P0^1;//右电机
sbit LM1=P0^2;
sbit LM2=P0^3;//左电机
sbit bzh=P2^6;
sbit RAD=P0^6;//红外接收右电机转sbit LBD=P0^7;//红外接收左电机转
sbit rs=P3^5;// LCD的RS
sbit rw=P3^6;// LCD的R/W
sbit en=P3^7;// LCD的E
void lcd_string(uchar *strpoint);
void delay(uint a)
{ uint b,c;
for(b=a;b>0;b--)
for(c=120;c>0;c--);
}
uchar i=0;
void checkbusy()//检查LCD忙
{ uchar dat;
rs=0; //rs=1为数据,=0为命令.
rw=1; //rw=1为读,=0为写.
do
{
P1=0x00;
en=1; //E信号下降沿锁存DB7~DBO
dat=P1; //读入P1的值
en=0; //锁存
dat=0x80 & dat; //BUSY:1内部在工作,0正常状态
}while(!(dat==0x00));rw=0;
}
void sentcom(uchar com)
{ checkbusy(); //检查Busy
rs=0;
en=0;
P1=com;
delay(5);
en=1;
delay(5);
en=0;
}
void sentdata(uchar date) //写数据
{
checkbusy();
rs=1;
en=0;
P1=date;
delay(5);
en=1;
delay(5);
en=0;
}
//初始化LCM
void lcd_init()
{
sentcom(0x38);//功能设置,一次送8位数据,基本指令集
sentcom(0x0C);//0000,1100 整体显示,游标off,游标位置off
sentcom(0x01);//0000,0001 清DDRAM
sentcom(0x02);//0000,0010 DDRAM地址归位
sentcom(0x80);//1000,0000 设定DDRAM 7位地址000,0000到地址计数器AC
}
void lcd_string(char *strpoint)//在当前显示位置显示LCD字符串
{ register i=0;
while(strpoint[i]!=0){
sentdata(strpoint[i]);
i++;
}
}
void stop()
{
lcd_init();
sentcom(0x80);
lcd_string("现代创新实训室");//C编译系统本省也具有转换功能,所以也可以这样写
sentcom(0x90);
lcd_string("寻迹避障一体小车");
sentcom(0x88);
lcd_string("--指导:文方老师");
sentcom(0x98);
lcd_string("--设计:刘志聪"); }
void tracing()
{
sentcom(0x80);
lcd_string("现代创新实训室"); sentcom(0x90);
lcd_string("--指导:文方老师"); sentcom(0x88);
lcd_string("--设计:刘志聪"); sentcom(0x98);
lcd_string(" 小车寻迹中---"); }
void bypass()
{
sentcom(0x80);
lcd_string("现代创新实训室"); sentcom(0x90);
lcd_string("--指导:文方老师"); sentcom(0x88);
lcd_string("--设计:刘志聪"); sentcom(0x98);
lcd_string(" 小车避障中---"); }
void find()
{tracing();
while(bzh==1)
{ if(LBD&&RAD==1)
{
RM1=1;LM1=1;