《寻迹避障小车原理.docx》由会员分享,可在线阅读,更多相关《寻迹避障小车原理.docx(14页珍藏版)》请在三一办公上搜索。
1、循迹避障小车原理一)小车功能实现利用光电传感(红外对射管,红外发射与接收二极管组成)检测黑白线,实现小车能跟 着白线(或黑线)行走,同时也可避开障碍物,即小车寻迹过程中,若遇障碍物可自行绕开, 绕开后继续寻迹。二)电路分析1. 光电传感循迹光电传感器原理,利用黑白线对红外线不同的反射能力。然后通过光敏二极管或光 敏三极管,接收反射回的不同光强信号,把不同光强转换为电流信号,最后通过电阻,转换 为单片机可识别的高低电平。光电传感器实现循迹的基本电路如下图所示|GND循迹传感器基本电路电路解释:TC端是传感器工作控制端,为高电平时,发光二极管 不工作,传感器休眠,为低电平时,传感器启动。Signa
2、l端为检测信号输出, 当遇到黑线,黑线吸收大量的红外线,反射的红外线很弱,光敏三极管不导通, signal输出高电平,当遇到白线,与黑线相反,反射的红外线很强,使光敏三 极管导通,signal输出低电平。寻迹部分调整左右传感器之间的距离,两探头距离约等于白线宽度最合适,一般白线 宽度选择范围为3 - 5厘米比较合适。注意:该传感器的灵敏度是可调的,偶 尔传感器遇到白线却不能送出相应的信号,通过调节传感器上的可调电阻,适当 的增大或减小灵敏度。另外,循迹传感器的安放也算是比较有讲究的,有两种方 法,一种是两个都是放置在白线内侧但紧贴白线边缘,第二种是都放置在白线的 外侧,同样紧贴白线边缘。我们通
3、常采用第二种方法。编写程序使小车遇白线时,小车跟着白线走。当小车先前前进时,如果向左 偏离了白线。那么右边传感器会产生一个低电平,单片机判断这个信号,然后向 右拐。回到白线后。两传感器输出信号为高电平。小车前进。如果小车向右偏离 白线,左边传感器产生一个低电平,单片机判断这个信号,然后向左拐。如此如 此,小车必不偏离白线。若小车的两对光电传感器同时输出的信号为高电平(黑底)或低电平(白底),即单片机判断的都为高电平或低电平,小车向前直走, 在此过程中(直走)小车若遇白线,小车又重复上面动作跟着白线走。避障部分当小车在寻迹(沿着白线走或直走)过程中遇障碍物,小车亦可自行转弯,转弯动作完成后,又继
4、续寻迹。2. 电机驱动电路电机驱动芯片采用L298N,是一款承受高压大电流的全桥型直流/步进电压 驱动器,如下图55电施传感器B 输出引脚4 输出引脚3; 输入引脚4 便能端B 输X引脚3谡辑地 输*引脚2 便能端口输入引脚1 电机电源输出引脚N 输出引,脚1 电疏传感器卫电机控制芯片L298N的引脚排列L298N引脚编号与功能引脚编号名称功能1电流传感器A在该引脚和地之间接小阻值电阻可用来检测电流2输出引脚1内置驱动器A的输出端1,接至电机A3输出引脚2内置驱动器A的输出端2,接至电机A4电机电源端电机供电输入端,电压可达46V5输入引脚1内置驱动器A的逻辑控制输入端16使能端A内置驱动器A
5、的使能端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-14-刖进101后退111紧急停车100紧急停车0XX自由转动电机驱动A/B的工作原理电机控制逻辑
6、如下:以电机A为例,当使能端A为高电平是,如果输入端M1 Direction引脚为高电平,三极管导通,输入引脚1为低电平而输入引脚2为高电平,电机A反转; 如果输入端M1 Direction引脚为底电平,三极管截止,输入引脚1为高电平而输入引脚 2为低电平,电机A正转。PO 0 P0.1 P0.2 P03 P04 PO.S P0. iPO.7iP2.0 P2.1 P2.2 P2.3 Pi 4 P2.? P2.DR配合/W进行与数据或指令高DRI/O缓冲配合R进行读数据或指令低/低高无动作内部寄存器信号忙标志:BFBF标志提供内部工作情况,BF=1表示模块在进行内部操作,此时模块不接受外部 指令
7、和数据。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提供64X2个位元组的空间,最多可控制4行16字(64个字) 的中文字型显示,当写入显示数据RAM时,
8、可分别显示CGROM与CGRAM的字型;此模块可显 示三种字型,分别是半角英数字型(16*8)、CGRAM字型及CGROM的中文字型,三种字型的选 择,由在DDRAM中写入的编码选择,在此阶段0000H0006H的编码中(其代码分别是0000、 0002、0004、0006共4个)将选择CGRAM的自定义字型,02H7FH的编码中将选择半角英 数字的字型,至于A1以上的编码将自动的结合下一个位元组,组成两个位元组的编码形成 中文字型的编码 BIG5 (A140D75F), GB (A1A0-F7FFH)。字型产生RAM(CGRAM)字型产生RAM提供图象定义(造字)功能,可以提供四组16X16
9、点的自定义图象空间,使 用者可以将内部字型没有提供的图象字型自行定义到CGRAM中,便可和CGROM中的定义一样 地通过DDRAM显示在屏幕中。地址计数器AC地址计数器AC地址计数器是用来贮存DDRAM/CGRAM之一的地址,它可由设定指令暂存器 来改变,之后只要读取或是写入DDRAM/CGRAM的值时,地址计数器的值就会自动加一,当 D/I为“0”时而R/W为“1”时,地址计数器的值会被读取到DB6DB0中。光标/闪烁控制电路此模块提供硬体光标及闪烁控制电路,由地址计数器的值来指定DDRAM中的光标或 闪烁位置。指令操作模块控制芯片提供两套控制命令,基本指令和扩充指令如下:指令表1:(RE=
10、0:基本指令)指令指令码功能D/IR/WD7D6D5D4D3D2D1D0清除显示0000000001将DDRAM真满20H,并且设定DDRA帕勺地 址计数器加)到00旷地址归位000000001X设定DDRAM的地址计数器(AC)到00H并 且将游标移到开头原点位置;这个龄不 改SDDRA吊的内容显示状态开/关0000001DCBD=1:整体显示ONC=1:游标ONB=1:游标位置反白允许进入 点设 定00000001I/DS指定在数据的读取与与入时,设定 游标的移动方向及指定显示的移位游标 或显 示移 位控 制000001S/CR/LXX设定游标的移动与显示的移位控制 位;这个指令不改变DD
11、RAM的内容功能设定00001DLXREXXDL=0/1: 4/8 位数据RE=1:扩充指令操作RE=0:基本指令操作设定 CGRA M地 址0001AC5AC4AC3AC2AC1AC0设定CGRAM地址设定 DDRA M地 址0010AC5AC4AC3AC2AC1AC0设定DDRAM地址(显示位址)第一行:80H-87H第二行:90H-97H读取忙标志和地址01BFAC6AC5AC4AC3AC2AC1AC0读取忙标志(BF)可以确认内部动作 是否完成,同时可以读出地址计数 器(AC)的值写数 据到RAM10数据将数据D7D0写入到内部的RAM (DDRAM/CGRAM/IRAM/GRAM)读
12、出RAM11数据从内部RAM读取数据D7D0(DDRAM/CGRAM/IRAM/GRAM的值)指令表2:(RE=1:扩充指令)指令指令码功能D/IR/WD7D6D5D4D3D2D1D0待命模式0000000001进入待命模式,执行其他指令都终止卷动地址 开关开启000000001SRSR=1:允许输入垂直卷动地址SR=Q允许输入IRAMDCGRAM地址反白选择00000001R1R0选择2行中的任一行作反白显示,并 可决定反白与否。初始值R1R0 = 00, 第一次设定为反白显示,再次设定变 回正常睡眠 模式0000001SLXXSL=0 :进入睡眠模式SL=1 :脱离睡眠模式扩充功 能设定0
13、0001CLXREG0CL=0/1: 4/8 位数据RE=1:扩充指令操作RE=0:基本指令操作G=1/0:绘图开关设定 绘图RAM 地址0010AC60AC50AC4AC3AC3AC2AC2AC1AC1AC0AC0设定绘图RAM先设定垂直(列)AC6AC5AC0再设定水平(行)地址AC3AC2AC1AC0将以上16位地址连续写入即可注:当IC1在接受指令前,微处理器必须先确认其内部处于非忙碌状态,即读取BF标志时,BF需为零,方可 接受新的指令;如果在送出一个指令前并不检查BF标志,那么在前一个指令和这个指令中间必须延长一段 较长的时间,即是等待前一个指令确实执行完成。三、显示应用1、字符显
14、示带中文字库的128X64-0402B每屏可显示4行8列共32个16X16点阵的汉字,每个显示 RAM可显示1个中文字符或2个16X8点阵全高ASCI I码字符,即每屏最多可实现32个中文 字符或64个ASCII码字符的显示。带中文字库的128X64-0402B内部提供128X2字节的字符 显示RAM缓冲区(DDRAM)。字符显示是通过将字符显示编码写入该字符显示RAM实现的。根 据写入内容的不同,可分别在液晶屏上显示CGROM (中文字库)、HCGROM (ASCI I码字库)及 CGRAM (自定义字形)的内容。三种不同字符/字型的选择编码范围为:0000-0006H (其代码分别是000
15、0、0002、0004、0006共4个)显示自定义字型,02H7FH显示半宽ASCII码字符, A1A0HF7FFH显示8192种GB2312中文字库字形。字符显示RAM在液晶模块中的地址80H 9FH。字符显示的RAM的地址与32个字符显示区域有着一一对应的关系,其对应关系如下表 所示。80H81H82H83H84H85H86H87H90H91H92H93H94H95H96H97H88H89H8AH8BH8CH8DH8EH8FH98H99H9AH9BH9CH9DH9EH9FH其中,C语言编译器具有直接把中文转换成ASCI I码字符功能。对照下面原理图,编译 程序示例,并下载到实验板上,观测现
16、象。4.寻迹避障程序#include#define uchar unsigned char#define uint unsigned intsbit RM1=P00;sbit RM2=P0、;/右电机sbit LM1=P02;sbit LM2二P03/左电机sbit bzh=P26;sbit RAD=P06;/红外接收右电机转sbit LBD=P0;;/红外接收左电机转sbit rs=P35;/LCD 的 RSsbit rw=P36;/LCD 的 R/Wsbit en=P37;/LCD 的 Evoid lcd_string(uchar *strpoint);void delay(uint a)
17、 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 为写.doP1=0x00;en=1; /E信号下降沿锁存DB7DBOdat=P1; /读入P1的值en=0; /锁存dat=0x80 & dat; /BUSY: 1内部在工作,0正常状态 while(!(dat=0x00);rw=0;void sentcom(uchar com) checkbusy(); /检查 Busyrs=0;en=0;P1
18、=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;/初始化LCMvoid lcd_init()一次送8位数据,基本指令集 整体显示,游标off,清 DDRAMDDRAM地址归位设定DDRAM 7位地址sentcom(0x38);/功能设置, sentcom(0x0C);/0000,1100 游标位置offsentcom(0x01);/0000,0001 sentcom(0x02);/0000,0010 s
19、entcom(0x80);/1000,0000 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(-指导:文方老师);sent
20、com(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(-设计:刘志聪);sen
21、tcom(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();