智能迷宫寻迹小车报告

上传人:bei****lei 文档编号:178868379 上传时间:2022-12-30 格式:DOC 页数:27 大小:773KB
收藏 版权申诉 举报 下载
智能迷宫寻迹小车报告_第1页
第1页 / 共27页
智能迷宫寻迹小车报告_第2页
第2页 / 共27页
智能迷宫寻迹小车报告_第3页
第3页 / 共27页
资源描述:

《智能迷宫寻迹小车报告》由会员分享,可在线阅读,更多相关《智能迷宫寻迹小车报告(27页珍藏版)》请在装配图网上搜索。

1、题目名称:迷宫寻迹机器人(E题)参赛队员:*摘要:本寻迹小车选用8位89C52单片机为控制器,通过6个红外光电传感器TCRT5000对信号进行采集,采集到的信号经比较器LM393处理后传给89C52单片机,经单片机处理后,发出控制命令给L298N,驱动2台直流电动机进行相应的动作。该小车能够识别出黑色轨迹并能沿着黑色轨迹前进直到终点,并能显示出运行时间。1方案论证与比较1.1 传感器的选择与比较方案一 采用摄像头,然后用CCD处理技术,对采集的信号进行分析。方案二 使用光敏传感器,能够采集回来黑与白两种信号,然后进行处理与分析。由于采用摄像头进行CCD处理所用的硬件搭接较为繁琐,并且处理起来还

2、比较麻烦,而光敏传感器TCRT5000可以虽然智能识别黑与白两种颜色由于现场条件,并不能对其造成干扰,而且其反应速度快,响应时间短,故此,我们选用光敏传感器TCRT5000。1.2 车体的选择与比较 方案一 采用4轮小车,前轮由舵机控制转弯,后轮由动力电机控制前进与后退。方案二 采用三轮小车,前面两轮由两个电机分别控制,用其速度差来实现转弯与调整,后前轮为万向轮,用来维持小车的平衡由于采用4轮车,小车在转弯时会产生转弯半径,会偏离轨迹,不能按照黑色轨迹前进,而转弯半径无法缩小到满意的程度,由于三轮小车用两个电机来控制两个轮子,故很容易来实现转弯与调整,是理想的车体模型。1.3前进路径与返回路径

3、的最优选择由于小车需要按照黑色轨迹寻到终点,并且按最优路径返回,故小车应能识别迷宫的路况,普通寻迹小车智能按照黑色轨迹走,但不能识别路况,这样小车寻到终点的效率很低,又不能按照最优路径返回。考虑到以上情况,我们给小车加上了识别路口程序,并且让小车按照右手原则前进,在每个路口处让小车记录出所走过的路况,并且记忆,以便于在返航时调用记录信息,使小车顺利返回。1.4传感器个数的比较与选择 方案一 总共5个传感器,两个传感器用来检测小车是否偏离轨迹,另外三个传感器用来检测小车是否遇到路口(前方.左方及右方各一个),由前方传感器来检测终点。(如图1.1)方案二 总共6个传感器,其中两个传感器用来检测小车

4、是否偏离轨迹,另外三个传感器用来检测小车是否遇到路口(前方.左方及右方各一个),还有一个传感器配合前方的传感器来检测终点。(如图1.2)图1.3八个传感器示意图图1.2六个传感器示意图图1.1五个传感器示意图方案三 总共8个传感器,两个传感器用来检测小车是否偏离轨迹,另外五个传感器用来检测小车是否遇到路口(前方一个,左方及右方各两个),还有一个传感器配合前方的传感器来检测终点。检测路口左右方向时用2个传感器,是以使能减少误判,让小车更好的寻迹。(如图1.3)方案一比方案二多一个传感器,是为了更好的检测终点,方案一检测终点的方法是前当方传感器检测到死胡同时在让其延时继续前进如图1.4,当再检测到

5、黑色信号时即使终点,但是实际运作时发现由于2cm对于运动的小车来说过小,而且即便检测到终点在返回时,会再次遇到黑色信号,和死胡同标志容易产生混淆,不易于小车更好的判别路口,而当有第6个传感器辅助前方传感器检测到终点时,则能避免以上问题,当检测到死胡同标志时,只要再继续往前走,辅助检测传感器便会检测到白色信号小车就会认为到达终点如图1.5,避免了小车混淆死胡同与终点标志,同时让终点标志更好的被识别。而方案三,将检测左右路口的传感器增加至每侧2个,以防出现如图1.6所示的误判,而图1.7的方案三只要两个传感器不全进入黑线就不会认为有路口,能大大的避免误判的几率。但是后来在软件编写和实际测试的时候,

6、发现了用软件可以进行防误判,而由于这种防误判方法的引入,是传感器的个数从8个减少到了6个,其具体如何防误判将在后面说明。图1.4 一个传感器检测终点示意图 图1.5 两个传感器检测终点示意图图1.6 路口误判示意图 图1.7 路口防误判示意图1.5传感器位置摆放的比较与选择1.为了让小车在检测到路口时就进行转弯,在转完后其中线仍与轨迹中线重合,避免了其每次转弯后都进行调整,我们经测量发现小车轮距为10cm,而轨迹宽度为2cm,故检测路口的传感器与轮子轴承间的距离D=(10-2)/2=4cm,如图1.8所示。2.为了让小车刚刚检测偏离轨迹就做出调整,同时又给小车在走直线时留有余量,经过不断实践测

7、试,认为检测偏离轨迹的两个传感器间距以2.1cm为最佳。如图1.9所示。图1.8 检测转弯路口传感器位置的计算图1.9检测偏离轨迹的传感器示意图3.为了两检测终点的传感器能够准确快速的检测并识别出终点,设定两传感器间距离为2.1cm。图1.10 两检测终点传感器间距4.总体摆放如下图1.11,A=1.1cm,B=3.2cm图1.11总体摆放图2 硬件系统设计2.1 总体设计有光敏传感器进行信号采集,经电压比较器LM393处理后直接传给AT89C52,单片机对信号按照预定的程序进行处理,将处理的结果通过IO口传给74LS08,通过与PWM波合成后给L298N(直流电机驱动芯片)信号,通过L298

8、N进行控制小车两轮子,以实现左右微调,左右转弯,前进与原地旋转等动作。小车每到路口都进行相关的记忆处理,以便最优返回。图2.1 总体设计框架图2.2单元电路设计2.2.1传感器单元电路的设计图2.2 传感器单元电路当传感器进入黑色轨迹中时,由发射管发射的不可见光被吸收,不能被接收器接收到,故接收一侧电路不导通,LM393的同向输入为高,输入比较器输出为高,其输出高电压为5V,低电压为0V,故可以直接传给单片机。而电压比较器的输出端所接的LED能够实时的显示传感器的工作状况。本题目要求小车能够不偏离中心轨迹,由于轨迹交窄小车相对运动速度快,故要求传感器单元必须较为灵敏,相应时间短,反应速度快。我

9、们采用的LM393电压比较器,其工作电源电压范围宽,单电源、双电源均可工作,消耗电流小,输入失调电压小,共模输入电压范围宽,反应时间快,其内部结构图如图2.3所示。图2.3 LM393内部结构图2.2.2 电机驱动单元电路的设计图2.4 电机驱动电路图由于要对电机实行加速减速刹车的控制,故采用由L298N和74LS08构成的驱动电路,由1.0和1.1口负责控制1号电机的前进与后退,而与他们一起走与门74LS08的1.4口负责输出PWM波,由PWM波负责控制小车的减速与加速以及制动的控制。同时与门也起到了扩大单片机输出电流的作用,由于L298N需要的输入电流AT89C52无法驱动,与门在此起到一

10、定的上拉作用。因为要用单片机对电动机进行四象限的控制,由于控制象限的复杂以及驱动电机功率的问题,这里我们需要采用电动机驱动芯片来实现,我们采用的是L298N这款电机驱动芯片,该芯片具备控制简单,反应快,输出功率大,支持外接电机工作电源等一系列优点。其结构图如图2.5所示。图2.5 L298N内部结构图2.2.3电源模块单元电路的设计图2.6 电源模块单元电路图由于整个控制板都需要5V电压,考虑到电池随着使用时间的增强,电压会有所下降,故我们选用直流稳压电源9V进行供电,由于多方同时分流,有可能造成电量不足,为了保持电压能够稳定在5V,故选用L7805进行稳压。在其输出输入端口各并联一个电容,以

11、起到保护芯片的作用。其内部结构图如2.7所示。图2.7 L7805内部结构图2.2.4液晶显示单元电路设计图2.8液晶显示单元电路图采用1602液晶进行时间和方向的显示,我们采用单独的AT89S52来控制液晶,减少其对小车控制的干扰,然后由2根数据线让其与主控AT89S52进行通信,以此来显示小车运行的时间和方向。图2.8中R38用来控制液晶字幕的清晰度,R37用来控制液晶屏幕的对比度。3软件系统设计3.1 总体设计小车自上电时程序开始运行,我们依着右手原则为小车寻迹方法,右为先。自上电后小车进入初始化阶段之后转入主函数,我们将小车能遇到的各种情况进行一一排列出来,这样无论传感器反馈回来什么样

12、的信号都有与之对应的命令,分为以下10种情况:左微调,右微调,前进,左转,右转,T型,左T,右T,十字路口,死胡同。其流程图如图3.1所示。3.2 各子模块的设计3.2.1 转弯模块的设计为了让小车能够顺利并且及时的停止转弯,我们将其转弯的停止标志设为当检测前方是否有路的传感器遇到黑色轨迹,即表示其已完成转弯,这样避免了小车转弯过大或者过小的问题。3.2.2 终点识别模块的设计为了让小车能够准确的识别终点标志,采用2个传感器来检测终点标志,当且仅当前后检测终点的传感器同时检测到终点信号时,才认定到达终点,即当前后前后检测终点的传感器3.2.3 防误判模块的设计列出了小车在行走时可能碰到的各种误

13、判情况,对其一一分析后判别出应是那种路况,将其对应情况列出,并给出小车应该正确运行的指令。4附加功能增加了小车转弯的转向灯模拟功能,转向灯能随小车的转向实时的闪烁起来,以此一次来表示小车的运转状态,还在车尾处额外增加了两组led小灯,以此表示小车现在处于的状态即状态前进最优路径返回终点起点绿色1010绿色1010蓝色0110蓝色0110附录1 主控程序清单#include #include #include /char pro_left,pro_right,i,j; /左右占空比标志extern int a24=3,4,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0;

14、extern int n=2,logo=0;/sbit left1=P10; /左电机正反转sbit left2=P11;sbit right1=P12; /右电机正反转sbit right2=P13;sbit en1=P14; /输出PWM1波控制左电机sbit en2=P15; /输出PWM2波控制左电机sbit p16=P16; /sbit p17=P17; /sbit p23=P23;sbit p24=P24;sbit p25=P25;sbit p26=P26;/sbit left_turn=P00; /左侧传感器(识别路口)sbit left=P01; /微调左位置sbit midb

15、=P02; /后中间传感器(识别路口)sbit midf=P03; /前中间(识别路口)sbit right=P04; /微调右位置sbit right_turn=P05; /右侧传感器(识别路口) / /sbit p20=P22; /左拐sbit p21=P21; /直走 sbit p22=P20; /右拐 void first_straight(); /启动直走void straight(); /直走void sd_straight(); /左岔直走void stop(); /终点稍停void end(); /回到起点停车void wleft(); /左微调void wright(); /

16、右微调void ft_left(); /左转90 由黑到白void sd_left(); /左转90 由白到黑void ft_right(); /右转90 由黑到白void sd_right(); /右转90 由白到黑void ft_180rt(); /左转180 由黑到白void sd_180rt();/左转180 由白到黑/void infrared(); /初次循迹void comeback(); /返航void memory(int x); /记忆void delay(int z); /延时1ms/void delay(int z) /延时z*1mschar k;while(z-)fo

17、r(k=0;k121;k+); /延时1ms/void first_straight() /启动走直线p20=1;p21=0;p22=1;pro_left=85;pro_right=85;left1=1;left2=0;right1=1;right2=0;delay(5);/void straight() /走直线函数p20=1;p21=0;p22=1;pro_left=80;pro_right=80;left1=1;left2=0;right1=1;right2=0;/void sd_straight() /左岔走直线函数p20=1;p21=0;p22=1;straight();if(lef

18、t_turn=1)/&(right_turn=0)&(midf=1)sd_straight();elsestraight();/void wleft() /微调左转函数pro_left=0;pro_right=85;left1=0;left2=0;right1=1;right2=0;/void wright() /微调右转函数pro_left=85;pro_right=0;left1=1;left2=0;right1=0;right2=0;/void ft_left() /左转90 由黑到白p20=0;p21=1;p22=1; pro_left=0; pro_right=80; left1=0

19、; /左轮不动 left2=0; /右轮动 right1=1; right2=0; if(midf=1) ft_left(); elsesd_left();void sd_left() /左转90 由白到黑p20=0;p21=1;p22=1; pro_left=0; pro_right=80; left1=0; /左轮不动 left2=0; /右轮动 right1=1; right2=0; if(midf=0) sd_left(); else first_straight(); straight();/void ft_right() /右转90 由黑到白 p20=1;p21=1;p22=0;p

20、ro_left=85; pro_right=0; left1=1; /左轮动 left2=0; /右轮不动 right1=0; right2=0;if(midf=1)ft_right();elsesd_right();void sd_right() /右转90 由白到黑p20=1;p21=1;p22=0; pro_left=80; pro_right=0; left1=1; /左轮动 left2=0; /右轮不动 right1=0; right2=0;if(midf=0)sd_right();else first_straight(); straight();/void ft_180rt()

21、/左转 由黑到白 p20=0;p21=0;p22=0;pro_left=80; pro_right=80; left1=0; /左轮反转 left2=1; /右轮正转 right1=1; right2=0;if(midf=1)ft_180rt();elseif(midf=0)sd_180rt();void sd_180rt() /左转 由白到黑 p20=0; p21=0; p22=0;pro_left=80; pro_right=80; left1=0; /左轮反转 left2=1; /右轮正转 right1=1; right2=0;if(midf=0)sd_180rt();else firs

22、t_straight(); straight();/void stop() /回到起点while(1)p17=1;p16=1;p23=0;p24=0;p25=0;p26=0;pro_left=0;pro_right=0;left1=1; /或是全等于0left2=1;right1=1;right2=1;/void end() /单程刹车pro_left=0;pro_right=0;left1=0; /或是全等于1left2=0;right1=0;right2=0;delay(150);/void infrared() /循迹char flag=10;p16=0;p17=1;p23=0;p24=

23、0;p25=1;p26=1;if(left_turn=0)&(right_turn=0)&(midf=1)&(midb=1)&(left=0)&(right=0)flag=7; /直线elseif(left_turn=0)&(right_turn=0)&(midf=0)&(midb=0)&(left=0)&(right=0) flag=4; / memory(4); 死胡同elseif(left_turn=1)&(right_turn=0)&(midf=0)&(midb=1)flag=3; /memory(3);左拐elseif(left_turn=1)&(right_turn=0)&(mid

24、f=0)&(midb=0)flag=13; /误认为左拐 左拐elseif(left_turn=0)&(right_turn=1)&(midf=0)&(midb=1)flag=1; /memory(1); 右拐elseif(left_turn=0)&(right_turn=1)&(midf=0)&(midb=0)flag=11; /误认为右拐 右拐elseif(left_turn=1)&(right_turn=0)&(midf=1)&(midb=1)flag=2; /memory(2);左岔elseif(left_turn=1)&(right_turn=0)&(midf=1)&(midb=0)

25、flag=12; /误认为左岔 直走elseif(left_turn=1)&(right_turn=1)&(midf=0)&(midb=1)flag=1; /memory(1); 丁字elseif(left_turn=1)&(right_turn=1)&(midf=0)&(midb=0)flag=11; /误认为丁字 右拐elseif(left_turn=0)&(right_turn=1)&(midf=1)&(midb=1) flag=1; /memory(1); 右岔elseif(left_turn=0)&(right_turn=1)&(midf=1)&(midb=0) flag=11; /

26、 误认为右岔 右拐elseif(left_turn=1)&(right_turn=1)&(midf=1)&(midb=1)flag=1; /memory(1); 十字elseif(left_turn=1)&(right_turn=1)&(midf=1)&(midb=0)flag=11; /误判十字 右拐elseif(left_turn=0)&(right_turn=0)&(midf=1)&(midb=0)&(left=0)&(right=0) flag=0; /memory(0); 终点elseif(left_turn=0)&(right_turn=0)&(left=0)&(right=1)

27、flag=5; /左偏(right)elseif(left_turn=0)&(right_turn=0)&(left=1)&(right=0) flag=6; /右偏(left)else flag=7; /直走switch (flag) case 0: p17=0;p16=0;p23=0;p24=0;p25=0;p26=0;end();ft_180rt();memory(0); logo=1; break; /p17=0;p16=0;终点 两个灯全亮case 1: ft_right();memory(1);logo=0; break; /右拐case 2: sd_straight();memo

28、ry(2); logo=0; break; /直走 case 3: ft_left();memory(3);logo=0; break; /左拐case 4: ft_180rt();memory(4);logo=0; break; /死胡同case 5: wright();logo=0; break; /左偏case 6: wleft();logo=0; break; /右偏case 7: straight();logo=0; break; /直走 case 11: ft_right();logo=0; break; /误认为右case 12: straight();logo=0; break

29、; /误认为直case 13: ft_left();logo=0; break; /误认为左default: straight(); logo=0;break; /void memory(int mflag) /记忆程序if(mflag=1)an+=1;if(an=4) an=0; n=n-2; n+; elseif(mflag=2) an+=2; n+;elseif(mflag=3) an+=3; n+;elseif(mflag=4) an=0; n-;elseif(mflag=0) n-;/void comeback() p23=1; p24=1; p25=0; p26=0; p17=0;

30、 p16=1;if(left_turn=0)&(right_turn=0)&(midf=1)&(midb=1)&(left=0)&(right=0) straight();logo=1; /直线elseif(left_turn=1)&(midb=1) /左边有路 switch(an) case 1: ft_left(); logo=1;n-; break; case 2: sd_straight();logo=1;n-; break; case 3: ft_right();logo=1;n-; break;elseif(right_turn=1)&(midb=1) /右边有路 switch(a

31、n) case 1: ft_left(); logo=1;n-; break; case 2: sd_straight();logo=1;n-; break; case 3: ft_right();logo=1;n-; break;elseif(left_turn=0)&(right_turn=0)&(midf=0)&(midb=0)&(left=0)&(right=0)/&(n=1) p17=1;p16=1;stop(); /回到起点 两个灯全灭elseif(left_turn=0)&(right_turn=0)&(left=0)&(right=1) wright();logo=1; /左偏

32、(motor_right)elseif(left_turn=0)&(right_turn=0)&(left=1)&(right=0) wleft();logo=1; /右偏(motor_left) /*else straight();logo=1;*/void init()TMOD=0x01;TH0=(65536-100)/256;TL0=(65536-100)%256;EA=1; /中断总开关ET0=1; /开启定时器0TR0=1; /定时器0启动en1=1; /使能1端en2=1; /使能2端void time0(void)interrupt 1i+;j+;if(i=pro_left) e

33、n1=1; else en1=0;if(i=100) en1=en1;i=0;if(j=pro_right) en2=1; else en2=0;if(j=100) en2=en2;j=0;TH0=(65536-100)/256;TL0=(65536-100)%256;/void main(void)init();delay(1);while(1) if(logo=0) infrared(); if(logo=1)comeback();void int0(void)interrupt 0附录2 液晶驱动源代码程序#include#define uchar unsigned char #defi

34、ne uint unsigned intsbit rs=P10;sbit lcden=P11;sbit p20=P20;sbit p21=P21;uchar count,num;char miao,shi,fen;uchar code table=2010-6-22 ROBOT;uchar code table1= 00:00:00;void time();void delay(uint z)uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);void write_com(uchar com)rs=0;lcden=0;P0=com;delay(5);lcden=1;

35、delay(5);lcden=0;void write_date(uchar date)rs=1;lcden=0;P0=date;delay(5);lcden=1;delay(5);lcden=0;void init()uchar num;lcden=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);for(num=0;num15;num+)write_date(tablenum);delay(5);write_com(0x80+0x40);for(num=0;num12;num+

36、)write_date(table1num);delay(5);TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;void write_sfm(uchar add,uchar date)uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+0x40+add);write_date(0x30+shi);write_date(0x30+ge);void main()init();while(1)if(p20=1)&(p21=1)/回到起点 TR0=0;else

37、if(p20=0)&(p21=1)/单程去TR0=1; time();elseif(p20=1)&(p21=0)/单程回 TR0=1;time();elseif(p20=0)&(p21=0)/终点 TR0=0;void timer0() interrupt 1TH0=(65536-50000)/256;TL0=(65536-50000)%256;count+;void time(void)if(count=18)count=0;miao+;if(miao=60)miao=0;fen+;if(fen=60)fen=0;shi+;if(shi=24)shi=0;write_sfm(4,shi);write_sfm(7,fen);write_sfm(10,miao);附录3总体电路图(见下页)27

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!