超声波避障小车的设计书.docx
《超声波避障小车的设计书.docx》由会员分享,可在线阅读,更多相关《超声波避障小车的设计书.docx(11页珍藏版)》请在冰豆网上搜索。
超声波避障小车的设计书
超声波避障小车的设计书
1.1立项目的
(1)设计一辆利用超声波传感器来实现避障功能的小车,使小车对其运动方向受到的阻碍作出各种躲避障碍的动作。
(2)进一步学习单片机原理及其应用,了解超声波传感器的工作原理。
1.2立项意义
在科学探索及紧急抢险中经常要对一些危险或人类不能直接到达的地域进行探测,这就需要用机器人来完成。
而机器人在复杂地形行进时自动避障是一项必不可少也是最基本的功能。
因此,自动避障系统的研发也就应运而生。
自动避障小车就是基于这一系统开发而成的。
随着科技的发展,对于未知空间和人类所不能直接到达的地域的探索逐步成为热门,这就使机器人自动避障功能的研发有了重大意义。
通过对自动避障小车的设计,我们可以将其运用于自动避障小车,以作为地域探索机器人和紧急抢险机器人的运动系统,让机器人在行进中自动避过障碍物。
1.3设计要求
(1)在车前方没有障碍物时,小车沿直线向前走。
(2)在车前方有障碍物时,小车能避开障碍物,避障方法如下:
先向左边转90度,如果前面没有障碍物,再沿直线向前走;
如果前面仍有障碍物,则向右转180度,如果前面没有障碍物,则直线行走;
如果前面仍有障碍物,则向右90度,然后直线行走
2课题设计
2.1设计原理
该智能车系统可分为四个主要模块:
传感器避障模块,单片机主控核心模块,电机驱动模块,USB下载模块。
鉴于电机驱动模块、USB下载模块已经由实验室直接提供了,我们对于传感器避障模块和单片机主控核心模块进行了讨论。
(1)传感器避障模块。
智能车避障系统中的传感器一般分为接触型和非接触型两种,接触型相对比较简单。
这里我们使用了超声波传感器进行测量,也即非接触型传感器。
超声波是一种振动频率高于声波的机械波,由换能晶片在电压的激励下发生震动产生的,在碰到杂质获分界面会产生显著反射从而形成反射回波,超声波传感器就是根据超声波在障碍物界面上的反射来判断检测物体的存在以及距离的。
超声波频率高,波长短,绕射现象小,方向性好,再加上信息处理简单且价格低廉,所以这里我们使用28015-PING-v1.6超声波传感器对小车行进前方路况进行探测以及判断,它能实现从3cm到1.8m距离的测量,从而识别出范围内的障碍物。
我们将其作为传感器避障模块,利用其返回的数据,从而实现小车避障的功能。
图2.1.1超声波传感器
(2)单片机主控核心模块。
在这次设计中我们选用已经学过的MCS-51单片机为核心作为控制模块。
MCS-51系列单片机是美国Intel公司于1980年推出的产品,MCS-51系列单片机的影响及其深远,许多公司都推出了兼容系列单片机,使MCS-51内核成为一个8位单片机的标准,其典型产品有8031、8051、8751等等。
(3)电机驱动模块。
电机驱动模块是由两个伺服电机组成,伺服电机控制原理如下所示:
控制电机运动转速的是高电平持续的时间,当高电平持续时间为1.3ms时,电机顺时针全速旋转,当高电平持续时间1.7ms时,电机逆时针速旋转。
图2.1.2伺服电机控制时序图
2.2设计内容
系统主要原理是:
通过超声波避障模块(即感测模块)实时监测路面情况并及时传输给单片机。
由单片机主控核心模块根据感测模块给予的信息控制小车两电机转动工作状态。
电机驱动模块驱动两电机转动,实现前进或者左、右转。
小车的避障流程如下:
(1)在车前方没有障碍物时,小车沿直线向前走。
(2)在车前方有障碍物时,小车能避开障碍物,避障方法如下:
先向左边转90度,如果前面没有障碍物,再沿直线向前走;
如果前面仍有障碍物,则向右转180度,如果前面没有障碍物,则沿直线向前行走;
如果前面仍有障碍物,则向右90度,然后直线行走
根据小车的避障流程画出小车避障程序的程序流程图如下:
根据程序流程图编写单片机控制程序(见附录)
2.3设计结果
组装出来的避障小车图2.3.1所示。
将编写好的C语言程序转换成.hex文件,将.hex文件“烧入”单片机中,接通电源,小车向前沿直线行走,把手放在传感器前,小车立即向左旋转90度;放开手,小车又沿直线向前走。
把手一直放在传感器前面,小车会先向左转90度,再右旋转180度,再接着向右旋转90度,再向左旋转90度,然后一直循环……通过不同的测试发现下车完全满足设计要求。
图2.3.1
结题报告
1、课题完成情况介绍
将编写好的C语言程序转换成.hex文件,将.hex文件“烧入”单片机中,接通电源,小车向前沿直线行走,把手放在传感器前,小车立即向左旋转90度;放开手,小车又沿直线向前走。
把手一直放在传感器前面,小车会先向左转90度,再右旋转180度,再接着向右旋转90度,再向左旋转90度,然后一直循环……通过不同的测试发现下车完全满足设计要求。
2、设计中发现的问题及相应的解决情况
2.1、发现的问题
(1)通电之后,小车不停地旋转,旋转次序与设计的避障旋转次序一致,说明子函数“getx()”返回的Dis的值一直小于10.
(2)小车通电之后,小车在避障功能上完全满足要求,但是前进时,小车却每行进两三厘米就停顿一下,然后再行进两三厘米就停顿。
2.2、解决情况
(1)出现这个结果的问题是子函数“getx()”里面的子函数delay_nus
(1),因为delay_nus
(1)的实现的延时时间实际上不是1us,因为delay_nus()函数里面有这样的语句“i=i/10”,这样实际上i就等于0;为了解决这个问题我们重新编写了一个延时函数delay_nus1
(1),结果小车正常运行。
(2)出现这个问题的原因是程序每循环一次时都应该初始化Sig口,我们在程序中加上了“delay_nus(20000);Sig=0;”结果小车正常运行。
3、课程设计的心得体会
通过这次课程设计,我对单片机的原理和应用有了更深的理解。
在这次课程设计中,我重新学习了一遍张毅刚老师编写的教材《单片机原理及应用》,将以前学习的知识重新看了一遍,加深了我对单片机知识的印象。
最重要的是,我知道如何在实际设计中使用单片机,这个是在课本上学不来的。
在这次课程设计中我们遇到了很多问题,尤其是在调试程序的时候,虽然我们严格的按照程序流程图的逻辑来编写程序,编译也没有出错,但是把程序“烧入”单片机运行时小车总是不能按照预想的情况运行,经过我们耐心的调试和修改,以及在胡瑞强老师的耐心指导下,我们最终还是成功了。
4、参考文献
【1】张毅刚.《单片机原理及应用》.高等教育出版社。
附录
#include
intdis,ltime,htime,time;//dis代表距离,time代表时间
sbitSIG=P3^4;//P3^4控制和读取传感器IO口状态
sbitleft=P1^0;//左轮
sbitright=P1^1;//右轮
//延时程序
voiddelay(inti)//用于延时i微秒
{
i=i/10-14;//这里减去14因为通过debug得到精确时间
while(i--);
}
voiddelay1(inti)//用于产生脉冲,激发超声波
{
while(i--);
}
//初始化
voidinit()
{
TMOD=0x01;//T0方式1
TH0=0;TL0=0;//计时器清零
ET0=1;//定时器0中断允许
EA=1;//总中断允许
TR0=0;//定时器0先不开始计时
}
//行车程序
voidxingjin(intl,intr)//方便下面程序的编写
{
left=1;//给左轮提供长度为l微秒的脉冲
delay(l);
left=0;
right=1;//给右轮提供长度为r微秒的脉冲
delay(r);
right=0;
delay(18000);
}
voidleft_90()//原地左转90度,两轮均为顺时针
{
inti=30;
while(i)
{
xingjin(1300,1300);
i--;
}
}
voidright_90()//原地右转90度,两轮均为逆时针
{
inti=30;
while(i)
{
xingjin(1700,1700);
i--;
}
}
voidright_180()//原地右转180度,两轮均为逆时针
{
inti=60;
while(i)
{
xingjin(1700,1700);
i--;
}
}
voidforward()//前行,左轮逆时针,右轮顺时针
{
xingjin(1700,1300);
}
//测距子程序
intgetx(inta)
{
TH0=TL0=0;
if(a)//通过产生一个脉冲,使发出超声波
{
SIG=0;
SIG=1;
delay1
(1);
SIG=0;
}
while(SIG);//除噪
while(!
SIG);//当超声波发出时低电平结束
TR0=1;//定时器0开始计时
while(SIG);//当收到回波或超时时高电平结束
TR0=0;//定时器0停止计时
ltime=TL0;//分别存储定时器高低位的数据
htime=TH0;//经过debug可知每次计时约为1.085us
time=htime*256+ltime;//将数据转化为时间,单位为微秒
dis=time/(2*29);//将时间转化为距离,单位为厘米
}
//主程序
voidmain()
{
init();//对定时器进行初始化,为计时测距做准备
while
(1)//保证小车始终进行下面的判断
{
getx
(1);//获得小车行进方向的障碍物信息
if(dis>=10)//若距离大于10cm则继续前行,结束本循环
{
forward();
}
else
{
left_90();//否则左转90度,并进行下一次判断
getx
(1);
if(dis>=10)//若距离大于10cm则继续前行,结束本循环
{
forward();
}
else
{
right_180();//否则右转180度,并进行下一次判断
getx
(1);
if(dis>=10)//若距离大于10cm则继续前行,结束本循环
{
forward();
}
else
{
right_90();//否则右转90度,结束本循环
}
}
}
delay(20000);//这里考虑到有时会出现运行出错的现象
SIG=0;//加入了一个延时与清零的过程
}
}