智能迷宫寻迹小车报告分解.docx
- 文档编号:6657463
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:32
- 大小:372.38KB
智能迷宫寻迹小车报告分解.docx
《智能迷宫寻迹小车报告分解.docx》由会员分享,可在线阅读,更多相关《智能迷宫寻迹小车报告分解.docx(32页珍藏版)》请在冰豆网上搜索。
智能迷宫寻迹小车报告分解
题目名称:
迷宫寻迹机器人(E题)
参赛队员:
************************
摘要:
本寻迹小车选用8位89C52单片机为控制器,通过6个红外光电传感器TCRT5000对信号进行采集,采集到的信号经比较器LM393处理后传给89C52单片机,经单片机处理后,发出控制命令给L298N,驱动2台直流电动机进行相应的动作。
该小车能够识别出黑色轨迹并能沿着黑色轨迹前进直到终点,并能显示出运行时间。
1方案论证与比较
1.1传感器的选择与比较
方案一采用摄像头,然后用CCD处理技术,对采集的信号进行分析。
方案二使用光敏传感器,能够采集回来黑与白两种信号,然后进行处理与分析。
由于采用摄像头进行CCD处理所用的硬件搭接较为繁琐,并且处理起来还比较麻烦,而光敏传感器TCRT5000可以虽然智能识别黑与白两种颜色由于现场条件,并不能对其造成干扰,而且其反应速度快,响应时间短,故此,我们选用光敏传感器TCRT5000。
1.2车体的选择与比较
方案一采用4轮小车,前轮由舵机控制转弯,后轮由动力电机控制前进与后退。
方案二采用三轮小车,前面两轮由两个电机分别控制,用其速度差来实现转弯与调整,后前轮为万向轮,用来维持小车的平衡
由于采用4轮车,小车在转弯时会产生转弯半径,会偏离轨迹,不能按照黑色轨迹前进,而转弯半径无法缩小到满意的程度,由于三轮小车用两个电机来控制两个轮子,故很容易来实现转弯与调整,是理想的车体模型。
1.3前进路径与返回路径的最优选择
由于小车需要按照黑色轨迹寻到终点,并且按最优路径返回,故小车应能识别迷宫的路况,普通寻迹小车智能按照黑色轨迹走,但不能识别路况,这样小车寻到终点的效率很低,又不能按照最优路径返回。
考虑到以上情况,我们给小车加上了识别路口程序,并且让小车按照右手原则前进,在每个路口处让小车记录出所走过的路况,并且记忆,以便于在返航时调用记录信息,使小车顺利返回。
1.4传感器个数的比较与选择
方案一总共5个传感器,两个传感器用来检测小车是否偏离轨迹,另外三个传感器用来检测小车是否遇到路口(前方.左方及右方各一个),由前方传感器来检测终点。
(如图1.1)
方案二总共6个传感器,其中两个传感器用来检测小车是否偏离轨迹,另外三个传感器用来检测小车是否遇到路口(前方.左方及右方各一个),还有一个传感器配合前方的传感器来检测终点。
(如图1.2)
图1.3八个传感器示意图
图1.2六个传感器示意图
图1.1五个传感器示意图
方案三总共8个传感器,两个传感器用来检测小车是否偏离轨迹,另外五个传感器用来检测小车是否遇到路口(前方一个,左方及右方各两个),还有一个传感器配合前方的传感器来检测终点。
检测路口左右方向时用2个传感器,是以使能减少误判,让小车更好的寻迹。
(如图1.3)
方案一比方案二多一个传感器,是为了更好的检测终点,方案一检测终点的方法是前当方传感器检测到死胡同时在让其延时继续前进如图1.4,当再检测到黑色信号时即使终点,但是实际运作时发现由于2cm对于运动的小车来说过小,而且即便检测到终点在返回时,会再次遇到黑色信号,和死胡同标志容易产生混淆,不易于小车更好的判别路口,而当有第6个传感器辅助前方传感器检测到终点时,则能避免以上问题,当检测到死胡同标志时,只要再继续往前走,辅助检测传感器便会检测到白色信号小车就会认为到达终点如图1.5,避免了小车混淆死胡同与终点标志,同时让终点标志更好的被识别。
而方案三,将检测左右路口的传感器增加至每侧2个,以防出现如图1.6所示的误判,而图1.7的方案三只要两个传感器不全进入黑线就不会认为有路口,能大大的避免误判的几率。
但是后来在软件编写和实际测试的时候,发现了用软件可以进行防误判,而由于这种防误判方法的引入,是传感器的个数从8个减少到了6个,其具体如何防误判将在后面说明。
图1.4一个传感器检测终点示意图图1.5两个传感器检测终点示意图
图1.6路口误判示意图图1.7路口防误判示意图
1.5传感器位置摆放的比较与选择
1.为了让小车在检测到路口时就进行转弯,在转完后其中线仍与轨迹中线重合,避免了其每次转弯后都进行调整,我们经测量发现小车轮距为10cm,而轨迹宽度为2cm,故检测路口的传感器与轮子轴承间的距离D=(10-2)/2=4cm,如图1.8所示。
2.为了让小车刚刚检测偏离轨迹就做出调整,同时又给小车在走直线时留有余量,经过不断实践测试,认为检测偏离轨迹的两个传感器间距以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(直流电机驱动芯片)信号,通过L298N进行控制小车两轮子,以实现左右微调,左右转弯,前进与原地旋转等动作。
小车每到路口都进行相关的记忆处理,以便最优返回。
图2.1总体设计框架图
2.2单元电路设计
2.2.1传感器单元电路的设计
图2.2传感器单元电路
当传感器进入黑色轨迹中时,由发射管发射的不可见光被吸收,不能被接收器接收到,故接收一侧电路不导通,LM393的同向输入为高,输入比较器输出为高,其输出高电压为5V,低电压为0V,故可以直接传给单片机。
而电压比较器的输出端所接的LED能够实时的显示传感器的工作状况。
本题目要求小车能够不偏离中心轨迹,由于轨迹交窄小车相对运动速度快,故要求传感器单元必须较为灵敏,相应时间短,反应速度快。
我们采用的LM393电压比较器,其工作电源电压范围宽,单电源、双电源均可工作,消耗电流小,输入失调电压小,共模输入电压范围宽,反应时间快,其内部结构图如图2.3所示。
图2.3LM393内部结构图
2.2.2
电机驱动单元电路的设计
图2.4电机驱动电路图
由于要对电机实行加速减速刹车的控制,故采用由L298N和74LS08构成的驱动电路,由1.0和1.1口负责控制1号电机的前进与后退,而与他们一起走与门74LS08的1.4口负责输出PWM波,由PWM波负责控制小车的减速与加速以及制动的控制。
同时与门也起到了扩大单片机输出电流的作用,由于L298N需要的输入电流AT89C52无法驱动,与门在此起到一定的上拉作用。
因为要用单片机对电动机进行四象限的控制,由于控制象限的复杂以及驱动电机功率的问题,这里我们需要采用电动机驱动芯片来实现,我们采用的是L298N这款电机驱动芯片,该芯片具备控制简单,反应快,输出功率大,支持外接电机工作电源等一系列优点。
其结构图如图2.5所示。
图2.5L298N内部结构图
2.2.3电源模块单元电路的设计
图2.6电源模块单元电路图
由于整个控制板都需要5V电压,考虑到电池随着使用时间的增强,电压会有所下降,故我们选用直流稳压电源9V进行供电,由于多方同时分流,有可能造成电量不足,为了保持电压能够稳定在5V,故选用L7805进行稳压。
在其输出输入端口各并联一个电容,以起到保护芯片的作用。
其内部结构图如2.7所示。
图2.7L7805内部结构图
2.2.4液晶显示单元电路设计
图2.8液晶显示单元电路图
采用1602液晶进行时间和方向的显示,我们采用单独的AT89S52来控制液晶,减少其对小车控制的干扰,然后由2根数据线让其与主控AT89S52进行通信,以此来显示小车运行的时间和方向。
图2.8中R38用来控制液晶字幕的清晰度,R37用来控制液晶屏幕的对比度。
3软件系统设计
3.1总体设计
小车自上电时程序开始运行,我们依着右手原则为小车寻迹方法,右为先。
自上电后小车进入初始化阶段之后转入主函数,我们将小车能遇到的各种情况进行一一排列出来,这样无论传感器反馈回来什么样的信号都有与之对应的命令,分为以下10种情况:
左微调,右微调,前进,左转,右转,T型,左T,右T,十字路口,死胡同。
其流程图如图3.1所示。
3.2各子模块的设计
3.2.1转弯模块的设计
为了让小车能够顺利并且及时的停止转弯,我们将其转弯的停止标志设为当检测前方是否有路的传感器遇到黑色轨迹,即表示其已完成转弯,这样避免了小车转弯过大或者过小的问题。
3.2.2终点识别模块的设计
为了让小车能够准确的识别终点标志,采用2个传感器来检测终点标志,当且仅当前后检测终点的传感器同时检测到终点信号时,才认定到达终点,即当前后前后检测终点的传感器
3.2.3防误判模块的设计
列出了小车在行走时可能碰到的各种误判情况,对其一一分析后判别出应是那种路况,将其对应情况列出,并给出小车应该正确运行的指令。
4附加功能
增加了小车转弯的转向灯模拟功能,转向灯能随小车的转向实时的闪烁起来,以此一次来表示小车的运转状态,还在车尾处额外增加了两组led小灯,以此表示小车现在处于的状态即
状态
前进
最优路径返回
终点
起点
绿色
1
0
1
0
绿色
1
0
1
0
蓝色
0
1
1
0
蓝色
0
1
1
0
附录1主控程序清单
#include
#include
#include
/////////////////////////////////////////////////////////////////
charpro_left,pro_right,i,j;//左右占空比标志
externinta[24]={3,4,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0};
externintn=2,logo=0;
//////////////////////////////////////////////////////////////////
sbitleft1=P1^0;//左电机正反转
sbitleft2=P1^1;
sbitright1=P1^2;//右电机正反转
sbitright2=P1^3;
sbiten1=P1^4;//输出PWM1波控制左电机
sbiten2=P1^5;//输出PWM2波控制左电机
sbitp16=P1^6;//
sbitp17=P1^7;
//////////////////////////////////////////////////////////////////
sbitp23=P2^3;
sbitp24=P2^4;
sbitp25=P2^5;
sbitp26=P2^6;
/////////////////////////////////////////////////////////////////
sbitleft_turn=P0^0;//左侧传感器(识别路口)
sbitleft=P0^1;//微调左位置
sbitmidb=P0^2;//后中间传感器(识别路口)
sbitmidf=P0^3;//前中间(识别路口)
sbitright=P0^4;//微调右位置
sbitright_turn=P0^5;//右侧传感器(识别路口)
//
//////////////////////////////////////////////////////////////////
sbitp20=P2^2;//左拐
sbitp21=P2^1;//直走
sbitp22=P2^0;//右拐
voidfirst_straight();//启动直走
voidstraight();//直走
voidsd_straight();//左岔直走
voidstop();//终点稍停
voidend();//回到起点停车
voidwleft();//左微调
voidwright();//右微调
voidft_left();//左转90由黑到白
voidsd_left();//左转90由白到黑
voidft_right();//右转90由黑到白
voidsd_right();//右转90由白到黑
voidft_180rt();//左转180由黑到白
voidsd_180rt();//左转180由白到黑
//////////////////////////////////////////////////////////////////
voidinfrared();//初次循迹
voidcomeback();//返航
voidmemory(intx);//记忆
voiddelay(intz);//延时1ms
//////////////////////////////////////////////////////////////////
voiddelay(intz)//延时z*1ms
{
chark;
while(z--)
{for(k=0;k<121;k++);}//延时1ms
}
//////////////////////////////////////////////////////////////////
voidfirst_straight()//启动走直线
{
p20=1;
p21=0;
p22=1;
pro_left=85;
pro_right=85;
left1=1;
left2=0;
right1=1;
right2=0;
delay(5);
}
//////////////////////////////////////////////////////////////////
voidstraight()//走直线函数
{
p20=1;
p21=0;
p22=1;
pro_left=80;
pro_right=80;
left1=1;
left2=0;
right1=1;
right2=0;
}
//////////////////////////////////////////////////////////////////
voidsd_straight()//左岔走直线函数
{
p20=1;
p21=0;
p22=1;
straight();
if((left_turn==1))//&&(right_turn==0)&&(midf==1)
{sd_straight();}
else
{
straight();
}
}
//////////////////////////////////////////////////////////////////
voidwleft()//微调左转函数
{
pro_left=0;
pro_right=85;
left1=0;
left2=0;
right1=1;
right2=0;
}
//////////////////////////////////////////////////////////////////
voidwright()//微调右转函数
{
pro_left=85;
pro_right=0;
left1=1;
left2=0;
right1=0;
right2=0;
}
//////////////////////////////////////////////////////////////////
voidft_left()//左转90由黑到白
{
p20=0;
p21=1;
p22=1;
pro_left=0;
pro_right=80;
left1=0;//左轮不动
left2=0;//右轮动
right1=1;
right2=0;
if(midf==1)
{
ft_left();
}
else
{sd_left();}
}
voidsd_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();
}
}
//////////////////////////////////////////////////////////////////
voidft_right()//右转90由黑到白
{
p20=1;
p21=1;
p22=0;
pro_left=85;
pro_right=0;
left1=1;//左轮动
left2=0;//右轮不动
right1=0;
right2=0;
if(midf==1)
{ft_right();}
else
{sd_right();}
}
voidsd_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();
}
}
//////////////////////////////////////////////////////////////////
voidft_180rt()//左转由黑到白
{
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();}
else
if(midf==0)
{sd_180rt();}
}
voidsd_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
{
first_straight();
straight();
}
}
//////////////////////////////////////////////////////////////////
voidstop()//回到起点
{
while
(1)
{
p17=1;p16=1;
p23=0;
p24=0;
p25=0;
p26=0;
pro_left=0;
pro_right=0;
left1=1;//或是全等于0
left2=1;
right1=1;
right2=1;
}
}
//////////////////////////////////////////////////////////////////
voidend()//单程刹车
{
pro_left=0;
pro_right=0;
left1=0;//或是全等于1
left2=0;
right1=0;
right2=0;
delay(150);
}
//////////////////////////////////////////////////////////////////
voidinfrared()//循迹
{
charflag=10;
p16=0;
p17=1;
p23=0;
p24=0;
p25=1;
p26=1;
if((left_turn==0)&&(right_turn==0)&&(midf==1)&&(midb==1)&&(left==0)&&(right==0))
{flag=7;}//直线
else
if((left_turn==0)&&(right_turn==0)&&(midf==0)&&(midb==0)&&(left==0)&&(right==0))
{flag=4;}//memory(4);死胡同
else
if((left_turn==1)&&(right_turn==0)&&(midf==0)&&(midb==1))
{flag=3;}//memory(3);左拐
else
if((left_turn==1)&&(right_turn==0)&&(midf==0)&&(midb==0))
{flag=13;}//误认为左拐左拐
else
if((left_turn==0)&&(right_turn==1)&&(midf==0)&&(midb==1))
{flag=1;}//memory
(1);右拐
else
if((left_turn==0)&&(right_turn==1)&&(midf==0)&&(midb==0))
{flag=11;}//误认为右拐右拐
else
if((left_turn==1)&&(right_turn==0)&&(midf==1)&&(midb==1))
{flag=2;}//memory
(2);左岔
else
if((left_turn==1)&&(right_turn==0)&&(midf==1)&&(midb==0))
{flag=12;}//误认为左岔直走
else
if((left_turn==1)&&(right_turn==1)&&(midf==0)&&(midb==1))
{flag=1;}//memory
(1);丁字
else
if((left_turn==1)&&(right_turn==1)&&(midf==0)&&(midb==0))
{flag=11;}//误认为丁字右拐
else
if((left_turn==0)&&(right_turn==1)&&(midf==1)&&(midb==1))
{flag=1;}//memory
(1);右岔
else
if((left_turn==0)&
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 智能 迷宫 小车 报告 分解