资源描述
循迹避障小车原理一) 小车功能实现利用光电传感(红外对射管,红外发射与接收二极管组成)检测黑白线,实现小车能跟着白线(或黑线)行走,同时也可避开障碍物,即小车寻迹过程中,若遇障碍物可自行绕开,绕开后继续寻迹。二) 电路分析1. 光电传感循迹光电传感器原理,利用黑白线对红外线不同的反射能力。然后通过光敏二极管或光敏三极管,接收反射回的不同光强信号,把不同光强转换为电流信号,最后通过电阻,转换为单片机可识别的高低电平。光电传感器实现循迹的基本电路如下图所示、循迹传感器基本电路 电路解释:TC端是传感器工作控制端,为高电平时,发光二极管不工作,传感器休眠,为低电平时,传感器启动。Signal端为检测信号输出,当遇到黑线,黑线吸收大量的红外线,反射的红外线很弱,光敏三极管不导通,signal输出高电平,当遇到白线,与黑线相反,反射的红外线很强,使光敏三极管导通,signal输出低电平。 寻迹部分调整左右传感器之间的距离,两探头距离约等于白线宽度最合适,一般白线宽度选择范围为3 5 厘米比较合适。注意:该传感器的灵敏度是可调的,偶尔传感器遇到白线却不能送出相应的信号,通过调节传感器上的可调电阻,适当的增大或减小灵敏度。另外,循迹传感器的安放也算是比较有讲究的,有两种方法,一种是两个都是放置在白线内侧但紧贴白线边缘,第二种是都放置在白线的外侧,同样紧贴白线边缘。我们通常采用第二种方法。编写程序使小车遇白线时,小车跟着白线走。当小车先前前进时,如果向左偏离了白线。那么右边传感器会产生一个低电平,单片机判断这个信号,然后向右拐。回到白线后。两传感器输出信号为高电平。小车前进。如果小车向右偏离白线,左边传感器产生一个低电平,单片机判断这个信号,然后向左拐。如此如此,小车必不偏离白线。若小车的两对光电传感器同时输出的信号为高电平(黑底)或低电平(白底),即单片机判断的都为高电平或低电平,小车向前直走,在此过程中(直走)小车若遇白线,小车又重复上面动作跟着白线走。 避障部分 当小车在寻迹(沿着白线走或直走)过程中遇障碍物,小车亦可自行转弯,转弯动作完成后,又继续寻迹。 2. 电机驱动电路 电机驱动芯片采用L298N,是一款承受高压大电流的全桥型直流/步进电压驱动器,如下图电机控制芯片L298N的引脚排列L298N引脚编号与功能引脚编号名称功能1电流传感器A在该引脚和地之间接小阻值电阻可用来检测电流2输出引脚1内置驱动器A的输出端1,接至电机A3输出引脚2内置驱动器A的输出端2,接至电机A4电机电源端电机供电输入端,电压可达46V5输入引脚1内置驱动器A的逻辑控制输入端16使能端A内置驱动器A的使能端7输入引脚2内置驱动器A的逻辑控制输入端28逻辑地逻辑地9逻辑电源端逻辑控制电路的电源输入端为5V10输入引脚3内置驱动器B的逻辑控制输入端111使能端B内置驱动器B的使能端12输入引脚4内置驱动器B的逻辑控制输入端213输出引脚3内置驱动器B的输出端1,接至电机B14输出引脚4内置驱动器B的输出端2,接至电机B15电流传感器B在该引脚和地之间接小阻值电阻可用来检测电流L298N内部原理图电机驱动A/B的控制逻辑如下表所示输入信号电机运动方式使能端A/B输入引脚1/3输入引脚2/4110前进101后退111紧急停车100紧急停车0XX自由转动电机驱动A/B的工作原理电机控制逻辑如下:以电机A为例,当使能端A为高电平是,如果输入端M1 Direction引脚为高电平,三极管导通,输入引脚1为低电平而输入引脚2为高电平,电机A反转;如果输入端M1 Direction引脚为底电平,三极管截止,输入引脚1为高电平而输入引脚2为低电平,电机A正转。电机驱动原理图3. 中文液晶显示器128x64 带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块。其显示分辨率为12864, 内置8192个16*16点汉字,和128个16*8点ASCII字符集。利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示84行1616点阵的汉字,也可完成图形显示。具有低电压低功耗特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。基本特性: 低电源电压(VDD:+3.0-+5.5V) 显示分辨率:12864点 内置汉字字库,提供8192个1616点阵汉字(简繁体可选) 内置 128个168点阵字符 2MHZ时钟频率 显示方式:STN、半透、正显 驱动方式:1/32DUTY,1/5BIAS 视角方向:6点 背光方式:侧部高亮白色LED,功耗仅为普通LED的1/51/10 通讯方式:串行、并口可选 内置DC-DC转换电路,无需外加负压 无需片选信号,简化软件设计 工作温度: 0 - +55 ,存储温度: -20 - +60 模块接口说明:PIN15LED+ 背光正极,接4.8V-5VPIN116LED- 背光负极,接0V*注:1:如在实际应用中仅使用并口通讯模式,可将PSB接固定高电平,也可以将模块上的J8和“VCC”用焊锡短接;2:模块内部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空;3:如背光和模块共用一个电源,可以将模块上的JA、JK用焊锡短接。引脚控制信号应用 D/I,R/W的配合选择决定控制界面的4种模式:D/IR/W功能说明LLMPU写指令到指令暂存器(IR)LH读出忙标志(BF)及地址记数器(AC)的状态HLMPU写入数据到数据暂存器(DR)HHMPU从数据暂存器(DR)中读出数据E信号操作:E状态执行动作结果高低I/O缓冲DR配合/W进行写数据或指令高DRI/O缓冲配合R进行读数据或指令低/低高无动作内部寄存器信号 忙标志:BFBF标志提供内部工作情况,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提供642个位元组的空间,最多可控制4行16字(64个字)的中文字型显示,当写入显示数据RAM时,可分别显示CGROM与CGRAM的字型;此模块可显示三种字型,分别是半角英数字型(16*8)、CGRAM字型及CGROM的中文字型,三种字型的选择,由在DDRAM中写入的编码选择,在此阶段0000H0006H的编码中(其代码分别是0000、0002、0004、0006共4个)将选择CGRAM的自定义字型,02H7FH的编码中将选择半角英数字的字型,至于A1以上的编码将自动的结合下一个位元组,组成两个位元组的编码形成中文字型的编码BIG5(A140D75F),GB(A1A0-F7FFH)。 字型产生RAM(CGRAM) 字型产生RAM提供图象定义(造字)功能,可以提供四组1616点的自定义图象空间,使用者可以将内部字型没有提供的图象字型自行定义到CGRAM中,便可和CGROM中的定义一样地通过DDRAM显示在屏幕中。 地址计数器AC 地址计数器AC地址计数器是用来贮存DDRAM/CGRAM之一的地址,它可由设定指令暂存器来改变,之后只要读取或是写入DDRAM/CGRAM的值时,地址计数器的值就会自动加一,当D/I为“0”时而R/W为“1”时,地址计数器的值会被读取到DB6DB0中。 光标/闪烁控制电路此模块提供硬体光标及闪烁控制电路,由地址计数器的值来指定DDRAM中的光标或闪烁位置。指令操作模块控制芯片提供两套控制命令,基本指令和扩充指令如下:指令表1:(RE=0:基本指令)指令 指 令 码功 能D/IR/WD7D6D5D4D3D2D1D0清除显示0000000001将DDRAM填满20H,并且设定DDRAM的地址计数器(AC)到00H地址归位000000001X设定DDRAM的地址计数器(AC)到00H,并且将游标移到开头原点位置;这个指令不改变DDRAM 的内容显示状态开/关0000001DCBD=1: 整体显示 ONC=1: 游标ONB=1:游标位置反白允许进入点设定00000001I/DS指定在数据的读取与写入时,设定游标的移动方向及指定显示的移位游标或显示移位控制000001S/CR/LXX设定游标的移动与显示的移位控制位;这个指令不改变DDRAM 的内容功能设定00001DLXREXXDL=0/1:4/8位数据RE=1: 扩充指令操作RE=0: 基本指令操作设定CGRAM地址0001AC5AC4AC3AC2AC1AC0设定CGRAM 地址设定DDRAM地址0010AC5AC4AC3AC2AC1AC0设定DDRAM 地址(显示位址)第一行:80H87H第二行:90H97H读取忙标志和地址01BFAC6AC5AC4AC3AC2AC1AC0读取忙标志(BF)可以确认内部动作是否完成,同时可以读出地址计数器(AC)的值写数据到RAM10数据将数据D7D0写入到内部的RAM (DDRAM/CGRAM/IRAM/GRAM)读出RAM的值11数据从内部RAM读取数据D7D0(DDRAM/CGRAM/IRAM/GRAM)指令表2:(RE=1:扩充指令)指令指 令 码功 能D/IR/WD7D6D5D4D3D2D1D0待命模式0000000001进入待命模式,执行其他指令都终止卷动地址开关开启000000001SRSR=1:允许输入垂直卷动地址SR=0:允许输入IRAM和CGRAM地址反白选择00000001R1R0选择2行中的任一行作反白显示,并可决定反白与否。初始值R1R000,第一次设定为反白显示,再次设定变回正常睡眠模式0000001SLXXSL=0:进入睡眠模式SL=1:脱离睡眠模式扩充功能设定00001CLXREG0CL=0/1:4/8位数据RE=1: 扩充指令操作RE=0: 基本指令操作G=1/0:绘图开关设 定绘图RAM地 址0010AC60AC50AC4AC3AC3AC2AC2AC1AC1AC0AC0设定绘图RAM先设定垂直(列)AC6AC5AC0 再设定水平(行)地址AC3AC2AC1AC0将以上16位地址连续写入即可注:当IC1在接受指令前,微处理器必须先确认其内部处于非忙碌状态,即读取BF标志时,BF需为零,方可接受新的指令;如果在送出一个指令前并不检查BF标志,那么在前一个指令和这个指令中间必须延长一段较长的时间,即是等待前一个指令确实执行完成。三、显示应用1、字符显示带中文字库的128X64-0402B每屏可显示4行8列共32个1616点阵的汉字,每个显示RAM可显示1个中文字符或2个168点阵全高ASCII码字符,即每屏最多可实现32个中文字符或64个ASCII码字符的显示。带中文字库的128X64-0402B内部提供1282字节的字符显示RAM缓冲区(DDRAM)。字符显示是通过将字符显示编码写入该字符显示RAM实现的。根据写入内容的不同,可分别在液晶屏上显示CGROM(中文字库)、HCGROM(ASCII码字库)及CGRAM(自定义字形)的内容。三种不同字符/字型的选择编码范围为:00000006H(其代码分别是0000、0002、0004、0006共4个)显示自定义字型,02H7FH显示半宽ASCII码字符,A1A0HF7FFH显示8192种GB2312中文字库字形。字符显示RAM在液晶模块中的地址80H9FH。字符显示的RAM的地址与32个字符显示区域有着一一对应的关系,其对应关系如下表所示。 80H81H82H83H84H85H86H87H90H91H92H93H94H95H96H97H88H89H8AH8BH8CH8DH8EH8FH98H99H9AH9BH9CH9DH9EH9FH其中,C语言编译器具有直接把中文转换成ASCII码字符功能。对照下面原理图,编译程序示例,并下载到实验板上,观测现象。4. 寻迹避障程序#include#define uchar unsigned char#define uint unsigned intsbit RM1=P00;sbit RM2=P01;/右电机sbit LM1=P02;sbit LM2=P03;/左电机sbit bzh=P26;sbit RAD=P06;/红外接收右电机转sbit LBD=P07;/红外接收左电机转sbit rs=P35;/LCD的RS sbit rw=P36;/LCD的R/W sbit en=P37;/LCD的E void lcd_string(uchar *strpoint);void delay(uint a) uint b,c; for(b=a;b0;b-) for(c=120;c0;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信号下降沿锁存DB7DBO 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(strpointi!=0)sentdata(strpointi);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;RM2=0;LM2=0; if(RAD=0) RM1=0;LM1=1;RM2=0;LM2=0;if(LBD=0) RM1=1;LM1=1; RM2=0;LM2=0; delay(i); if(LBD=0) RM1=1;LM1=0;RM2=0;LM2=0;if(RAD=0)RM1=1;LM1=1;RM2=0;LM2=0;delay(i); void bizhan() bypass();if(bzh=0)RM1=1;LM1=0;RM2=0;LM2=1;delay(100);void main() stop();delay(2000); while(1) find();bizhan();
展开阅读全文