迷宫小车.docx
- 文档编号:8693449
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:20
- 大小:398.03KB
迷宫小车.docx
《迷宫小车.docx》由会员分享,可在线阅读,更多相关《迷宫小车.docx(20页珍藏版)》请在冰豆网上搜索。
迷宫小车
综合课程设计报告
题目:
迷宫电脑鼠的设计
二级学院计算机科学与工程学院
专业计算机科学与技术
班级112030701
学生姓名李洋学号112*****314
指导教师黄贤英刘小洋
时间2015年1月17日
摘要
本次做的迷宫电脑鼠的设计实验中,迷宫电脑鼠可以通过利用传感器识别周围是否有障碍物,来发送信号给单片机,单片机通过下载好的驱动程序调用相关算法控制小车的左右电机,实现小车走转弯、右转弯、直走等一系列动作。
迷宫电脑鼠在行走路线走偏了,可以通过检测是否准备碰墙,自动调整行走路线,回到预定路线。
该迷宫电脑鼠可以一定的算法,遍历整个迷宫,记录二维8*8的迷宫的坐标信息,通过坐标信息找到终点和找到多条到达终点的路径,并且找到一条最短到达终点的路径,沿路返回起点进行最后的冲刺到达终点。
关键词:
嵌入式或单片机微控制器,电脑鼠,智能算法,蓝牙,无线遥控
1、课程设计的目的及要求
1.1课程设计目的
本项目要实现的是用电脑鼠找出迷宫中通往终点的最短路径并以最快速度到达迷宫的终点。
电脑鼠从迷宫起点位置前进,由程序判断通过前视距离探测器探测到的迷宫状况,控制驱动机构前进或转向并记录路径和距离(控制车轮编码器可完成),由于起点位置和终点位置是已知的,虽然不知道具体路径,但通过编写算法程序即可找到最短路径,在重新开始时便可以最快速度从最短路径到达终点。
(1)了解并熟悉电子元器件焊接技术与方法。
(2)了解并熟悉电子元器件工作原理和功能特性。
(3)掌握单片机对编码电机的控制与红外发射与接收的控制。
(4)熟练运用keil软件进行单片机的C语言编程。
1.2课程设计要求
设计的电脑鼠应该具有三种最基本的能力:
•拥有稳定、准确、快速的行走能力
•能争取判断环境的能力(如有墙、有路)
•记忆路径的能力
总之,电脑鼠的设计目标是:
在最短的时间内找到一条通往总店的最短路径,并以最快速度从起点到达终点。
蓝牙遥控部分:
用手机使用蓝牙无线连接到小车,通过发送命令遥控小车实现前进、左转、右转、向后转。
2、题目分析
2.1功能分析
(1)迷宫电脑鼠能够在迷宫中随意穿行。
迷宫一格长为18cm,各个转角为90°,然后需要在迷宫中随意穿行,需要迷宫电脑鼠的基本直行,与转向,在其中加入遇到墙时小车的修正,再运用右手法则等算法便可达到初步的在迷宫中随意穿行的目的。
(2)迷宫电脑鼠能够在迷宫中记忆路径。
创建一格8*8的二维数组,初始化其中的数字,迷宫的一格对应二维数组的一个位置,标记的位置代表走过的位置。
这样数组中被标记的数字就为迷宫电老鼠走过的路径。
(3)迷宫电脑鼠能够在找到终点坐标并能返回原点。
在迷宫电脑鼠走的过程中,将要到达的单元格的最高四位记录小车到达该单元格方向的反方向,如此利用回溯算法,可知回来的路线的方向。
如图2.1。
图2.1
设小车在箭头处,坐标为(p,q)处,map[p][q]=0xf*,小车将要到达坐标为(p,q+1)处,在进入(p,q+1)前,将map[p][q+1]&=0xdf,即map[p][q+1]=0x1101*,高四位描述了改坐标下方为小车进入方向。
由于小车没走一个未走过的格子,就会也只会修改一个方向的信息,因此记录小车进入该格子的方向是唯一的。
2.2性能需求分析
1、迷宫电脑鼠外形合理,符合8×8迷宫场地需求。
迷宫小车如图2.2,迷宫如图2.3
图2.2图2.3
2、迷宫电脑鼠运行稳定,能够正常在迷宫中随意穿行。
在普通的行走中,由于外界原因回使车走离出原来应该有的路线,然后与墙体碰撞,为了使其不要碰撞,左右的1,3传感器感应左右是否有阻碍,在动作里面添加相应的感应函数,做出动作修改,使小车尽量不与墙碰撞。
3、迷宫电脑鼠走到终点所需的时间越短越好,最长应不得超过2分钟。
2.3算法分析
2.3.1探测策略
探测策略主要有两种:
(1)全迷宫探索策略,即将迷宫的所有单元均搜索一次,从中找出最佳的行走路径。
这种策略需要有足够的时间或探测次数,但在IEEE竞赛规则中每场竞赛只有15分钟的时间,因此是不可能的。
(2)部分迷宫探索策略,即在有限的时间或探测次数下,只探测迷宫的一部分,从中找出次最佳的路径,显然只能采用这种策略。
电脑鼠在一巷道内行走,如果最后无路可走,则该巷为死巷。
电脑鼠在任一单元内,可能的行走方向最多只有三个(前、左、右),如果有二个或二个以上的可能行走方向,称为交叉,遇有交叉时,由于有多个可以行走的方向,在行走方向的选择上,可有下面的几种选择法则:
右手法则:
遇有交叉时,以右边为优先的前进方向,然后是直线方向、左边方向。
左手法则:
遇有交叉时,以左边为优先的前进方向,然后是直线方向、右边方向。
中左法则:
遇有交叉时,以直线为优先的前进方向,然后是左边方向、右边方向。
与此类似的还有中右法则。
乱数法则:
遇有交叉时,取随机值作为前进方向。
向心法则:
由于终点在迷宫的中心,遇有交叉时,以向迷宫中心的方向为优先的前进方向。
2.3.2标记
为了记忆迷宫的详细信息,需要对迷宫单元的位置进行线路标记。
全迷宫共有8×8个单元组成,可采用二维坐标方式标记,即用每个单元的XY坐标表示,如起点可标记为(0,0),终点为(7,7)。
此外,还需要对迷宫单元的可行进方向进行标记,可采用绝对方位或相对方位二种方式。
绝对方位:
这是一种与电脑鼠行进方向无关的标记方式,以一个四位的二进制数,分别表示“东”﹑“西”﹑“南”和“北”四个方向。
以1表示允许行进(无墙壁),0表示不允许行进(有墙壁)。
相对方位:
这是一种与电脑鼠行进方向有关的标记方式,以一个三位的二进制数即可实现标记,分别表示“前”“左”“右”, 以1表示允许(无墙壁),0表示不允许(有墙壁)。
2.3.3阻断
在电脑鼠试跑过程中或在最后冲刺时,需要对部分路径进行“阻断”,即在发现某条路径是死路(只有入口而无出口)时,在该路径的入口处(一般是交叉点)设置标记,即将入口的线路标记由1改为0。
3、系统设计
3.1系统整体设计
电脑鼠的硬件电路结构图如下。
图3.1硬件电路结构框图
3.1.1单片机
本次课程设计使用的单片机型号为STC89C52的8位单片机。
STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
单片机电路图如3.1.1。
图3.1.1
3.1.2.时钟震荡电路
时钟震荡电路作用:
时钟电路时微计算机的心脏,它控制着计算机的工作节奏。
CPU就是通过复杂的时序电路完成不同的指令功能的。
时钟震荡电路图如图
图3.1.2
3.1.3供电及充电电路
作用:
为单片机系统供能。
此充电电路设计通过一个开关控制,当开关拨到SW位置时,系统通过锂电池供能;当开关拨到SWSPOT位置时,系统通过充电线供能,并为锂电池蓄电。
供电及充电电路如图3.1.3。
图3.1.3
3.2硬件设计
3.2.1硬件结构设计
1.传感器组电路设计
该部分包含五组红外传感模块和对应的传感器驱动模块,红外传感模块分为红外发射与红外接收传感器,传感器驱动模块主要包括了74HC138译码器、74HC00芯片和电位器。
(1)红外发射与接收传感器组
图3.2.1
红外发射与接收传感器组作用:
检测外界障碍物信息。
(2)74HC138译码器
图3.2.2
74HC138译码器作用:
扩展IO口,实现引脚的逐一控制。
(3)74HC00芯片
图3.2.3
74HC00芯片作用:
连接到红外发射器,使之产生38KHz的光波。
(4)电位器
图3.2.4
电位器调节器作用:
实现对红外发射器发射光波远近的控制。
2.电机驱动电路设计
该部分主要包含两块L9110电机驱动芯片。
图3.2.5
L9110电机驱动芯片作用:
控制电机的转动圈数和正反转。
3.2.2传感器组设计
(1)传感器的选择
本次中选择的传感器为HS0038,它的作用为红外接收探头,接受红外信号频率为38kHz,周期约26us,HS0038电子元件有3个引脚,分别是1,2和3号引脚分别连接在VCC和GND(即电源的两端),不难理解这两个引脚是用来给HS0038供能使之工作的,1号与irR1引脚相连,与单片机的IO口连接到一起,如此实现对HS0038信号的采集。
如图3。
图3.2.6
(2)74HC138译码器
3-8译码器(如图4)电路的输入变量有三个即D0,D1,D2,输出变量有八个Y0-Y7,对输入变量D0,D1,D2译码,就能确定输出端Y0-Y7的输出端变为有效(低电平),从而达到译码目的。
图3.2.7
在发射红外信号时为了达到分时的效果,通过三个口实现对5个口的输出控制,并且每次输出一个3-8译码器在其中有着一定的作用,不仅节约了引脚,还能到达分时(为防止多组传感器之间的互相干扰)输出一个信号的目的。
(3)载波发生器
载波发生器就是把载波信号转换器。
把其它信号转换成数字信号通过载波传输的。
74HC00芯片(图5)集成了4个与非门,其作用是通过硬件来产生与HS0038接收频率一致的红外线。
图3.2.8
(4)传感器的调试
电位器控制的LED发射光波的强弱,实际上是调节电阻大小来改变给红外二极管的电压,电位器中间接正极,两边均为负极。
3.2.3电机驱动电路设计
该部分主要包含两块L9110电机驱动芯片,L9110是为了控制和驱动电机设计的两通道推挽式功率放大专用集成电路器件,他分立电路集成在单片IC之中,使外围期间成本降低,整机可靠性提高。
该芯片有两个TTL/CMOS兼容电平的输入,具有良好的抗干扰性;两个输出端能直接驱动电机的正反向运动,它具有较大的电流驱动能力。
图3.2.9
L9110电机驱动芯片作用:
控制电机的转动圈数和正反转。
3.3软件设计
3.3.1电脑鼠正常行走程序设计
流程图:
图3.3.2小车直走
图3.3.3小车向左向右转弯
代码:
//启动左电机
voidstartML(unsignedcharcheck)
{
if(check==1)
{
ML1=0;
ML2=1;
}
else
{
ML1=1;
ML2=0;
}
}
//启动右电机
voidstartMR(unsignedcharcheck)
{
if(check==1)
{
MR1=1;
MR2=0;
}
else
{
MR1=0;
MR2=1;
}
}
//停止左电机
voidstopML()
{
ML1=0;
ML2=0;
}
//停止右电机
voidstopMR()
{
MR1=0;
MR2=0;
}
//直走
voidgo(unsignedchark)
{
//T0初始化
EA=1;
ET0=1;//开T0中断
TMOD&=0xf6;
TMOD|=0x06;//设定T0模式2,8位自动重装值定时计数器
TH0=256-ICP;
TL0=256-ICP;//设定T0计数初值,定义中断脉冲数
TR0=1;//启动T0计数
//T1初始化
EA=1;
ET1=1;//开T1中断
TMOD&=0x6f;
TMOD|=0x60;//设定T1模式2,8位自动重装值定时计数器
TH1=256-ICP;
TL1=256-ICP;//设定T1计数初值,定义中断脉冲数
TR1=1;//启动T1计数
intCount0=0;
intCount1=0;
while((intCount0 { if(intCount0>intCount1) { stopMR(); startML (1); } else { stopML(); startMR (1); } } stopML(); stopMR(); } //左转90度 voidturnL(unsignedchari) { //T0初始化 EA=1; ET0=1;//开T0中断 TMOD&=0xf6; TMOD|=0x06;//设定T0模式2,8位自动重装值定时计数器 TH0=256-ICP; TL0=256-ICP;//设定T0计数初值,定义中断脉冲数 TR0=1;//启动T0计数 //T1初始化 EA=1; ET1=1;//开T1中断 TMOD&=0x6f; TMOD|=0x60;//设定T1模式2,8位自动重装值定时计数器 TH1=256-ICP; TL1=256-ICP;//设定T1计数初值,定义中断脉冲数 TR1=1;//启动T1计数 intCount0=0; intCount1=0; while((intCount0 { if(intCount0>intCount1) { stopMR(); startML(0); } else { stopML(); startMR (1); } } stopML(); stopMR(); } //右转90度 voidturnR(unsignedchari) { //T0初始化 EA=1; ET0=1;//开T0中断 TMOD&=0xf6; TMOD|=0x06;//设定T0模式2,8位自动重装值定时计数器 TH0=256-ICP; TL0=256-ICP;//设定T0计数初值,定义中断脉冲数 TR0=1;//启动T0计数 //T1初始化 EA=1; ET1=1;//开T1中断 TMOD&=0x6f; TMOD|=0x60;//设定T1模式2,8位自动重装值定时计数器 TH1=256-ICP; TL1=256-ICP;//设定T1计数初值,定义中断脉冲数 TR1=1;//启动T1计数 intCount0=0; intCount1=0; while((intCount0 { if(intCount0>intCount1) { stopMR(); startML (1); } else { stopML(); startMR(0); } } stopML(); stopMR(); } //向后转 voidturnback(unsignedchari) { //T0初始化 EA=1; ET0=1;//开T0中断 TMOD&=0xf6; TMOD|=0x06;//设定T0模式2,8位自动重装值定时计数器 TH0=256-ICP; TL0=256-ICP;//设定T0计数初值,定义中断脉冲数 TR0=1;//启动T0计数 //T1初始化 EA=1; ET1=1;//开T1中断 TMOD&=0x6f; TMOD|=0x60;//设定T1模式2,8位自动重装值定时计数器 TH1=256-ICP; TL1=256-ICP;//设定T1计数初值,定义中断脉冲数 TR1=1;//启动T1计数 intCount0=0; intCount1=0; while((intCount0 { if(intCount0 { stopML(); startMR(0); } else { stopMR(); startML (1); } } stopML(); stopMR(); } 3.3.2蓝牙遥控程序设计 voidyanshi(unsignedintms) { unsignedchark; while(ms--) for(k=0;k<200;k++) ; } voidinit()//初始化子函数 { TMOD=0x20;//设定T1定时器的工作方式为2 TH1=0xfd;//T1定时器装初值 TL1=0xfd;//T1定时器装初值 TR1=1;//启动定时器 REN=1;//允许串口接受 SM0=0;//设定串口工作方式1/ SM1=1; EA=1;//开总中断 ES=1;//开串口中断 } voidmain() { init(); while (1) { if(flag==1) { SBUF=a; b=SBUF; while(! TI); TI=0; ES=1; if(b==8) go(98); yanshi(10); if(b==4) turnL(41); yanshi(10); if(b==6) turnR(41); yanshi(10); if(b==8) turnback(90); yanshi(10); if(b==1) turnL(4); yanshi(10); if(b==3) turnR(4); yanshi(10); ET1=0; init(); flag=0; } } } voidset()interrupt4//中断服务程序 { RI=0; a=SBUF; flag=1; } 4总结 4.1所遇问题及解决办法 (1)刚开始时,将焊接好89SC52芯片的小车主板拿去下驱动程序,结果发现下不了驱动程序,后来经过将芯片和下载电路的元件重新焊接一遍,才可以下载驱动程序,原因是芯片和下载电路中的某个地方存在虚焊。 (2)焊好传感器的板子,下载好传感器驱动程序,发现与传感器连接的二极管在接收到有障碍物的信号时,没有亮,一直处于熄灭状态。 后来经过请教同学和老师,发现是与传感器连接的可调电阻太大了,将电阻调小二极管才亮了。 (3)编写的直走程序下载到焊好的小车中,发现小车并没有按想象中那样直走,而是走偏了,经过请教老师和同学,由于小车存在硬件方面的原因,很难通过同时直接驱动左右电机让小车直走,需要通过定时器计数,控制左右电机启动才可以很好让小车直走,尽量减少小车走偏。 (4)编写好的向左向右程序下载到焊好的小车中,发现小车转弯的角度超过90度,经过思考,发现是控制转弯的参数太大了,需要逐步调小,才让小车向左右转弯很接近90度。 (5)将写好正常行走的驱动程序下载到焊好的小车放到迷宫中行走,发现小车走着走着就会碰到墙,不能顺利走迷宫,经过思考,原来小车行进中会存在走偏的情况,需要在行进中走偏了进行微调小车方向,让小车重新走回预定的路线。 4.2心得体会 通过做这次迷宫电脑鼠的设计实验,让我获益良多。 刚开始做这个实验,认为这个实验做起来很难,害怕自己做不了,后来发现做这个实验并没有想象中那么难。 本次课程设计提高了我的写程序能力和算法思想,比如遍历迷宫、向心法则、单一法则、小车方向计算、回溯算法和最短路生成算法等。 结果这个迷宫电脑鼠还是让我成功做出来了,虽然做出来的迷宫电脑鼠还存在一些瑕疵,但是已经让我感到莫大的成就感。 特别是自己做出了蓝牙遥控,让我对嵌入式的兴趣大增。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 迷宫 小车
![提示](https://static.bdocx.com/images/bang_tan.gif)