单片机应用设计报告.docx
《单片机应用设计报告.docx》由会员分享,可在线阅读,更多相关《单片机应用设计报告.docx(28页珍藏版)》请在冰豆网上搜索。
单片机应用设计报告
单片机应用设计报告
设计题目:
智能灭火机器人
班级:
08机械电子工程(3)班
姓名:
余见旦林士晓黄悦城
学号:
BBB
指导教师:
张建义
2011年6月
概述
智能机器人灭火的课程设计过程是:
首先了解关于广茂达机器人的一些性能和相关的硬件,选择自己要用到的有关灭火的套件。
然后就要看机器人产品附带的材料书,了解各个传感器的功能,使用情况,动手检测一下各个器件是否可用。
根据题目想象一下自己要实现的各个过程,大体的包括开始行进、进门、寻找火源、灭火这几个过程,然后就按照这几个过程一步一步的实现,最后达到灭火的目标。
总体运动图:
灭火机器人
行走路线
火源
黑纸
黑纸
*
对于这个问题分析如下:
首先要确定机器人的开始行走路径。
假设机器人在房门外,那么我们可以让机器人沿直线走下去,这样就可以节省一定的时间。
其次就是要找到门口,然后拐进去。
对于这个问题,可以用灰度传感器感知门口的灰度变化。
我闷可以在门口放置一条黑线,当机器人到达这个位置高应到灰度变化时就会拐进去。
再次就是寻找火源。
可以用远红外火焰传感器检测火源,然后通过改变左右轮的速度调整到达火源的路线,假如火源在房屋深处,可以让机器人进屋后做避
Ⅰ
障运动前行,当感知到火源是在寻找过去。
最后就是灭火过程。
当然这是最后的关键一步,可以用灰度传感器感知地面的变化,然后停下前进的步伐,打开灭火风扇灭火,为了使灭火的效果更佳,使用在原位旋转机器人风扇灭火的方法,因为这样可以扩大灭火的范围,提高灭火的效率。
当灭火过程持续一段时间后,灭火风扇就可以自动停止,机器人也停止旋转运动。
当拿到灭火配件后,按照自己的构想把所需的器件安装到智能风暴机器人上,主要是灭火套件(包括远红外传感器、红外传感器、地面灰度传感器扩展套件、风扇套件)。
安装中先将红外传感器、光敏传感器的插线拔下,将机器人的上盖拿下来,然后把把光敏传感器换成远红外传感器,固定好套圈和传感器以免脱落。
接下来把风扇电机托架和灰度传感器安装托架固定到机器前方,再把灰度扩展卡插到主板上,注意方向不能插反。
再把风扇及电机安装到托架上,最后把上盖重装。
安装后还要编写一些自测的程序检测各个传感器的使用范围等一些参数,如灰度传感器在地面和在黑纸上的灰度值,远红外火焰传感器的火焰感应值和无火时屋内的值,红外传感器的感应距离,当然材料上会有一些程序提供给你,但是有些程序是错误的,因此自己要看过后适当的修改一下。
记录下相关参留待以后编程用。
编写最后的程序时可以分段完成,每一段写好可以烧录到机器人中检测是否可行,最后把这些程序连在一起就可以实现目标。
在这一过程中要进行反复的修改,因此不要烦躁。
设计实现的结果是机器人在门外直走,当检测到门口的黑纸时就拐进去,然后寻找火源,当没有检测到是就做避障运动,同时远红外火焰传感器一直在检测,当感知到火源时就会寻着火源走过去,在到达火源前的黑纸,灰度传感器检测到灰度的变化,机器人就会旋转并打开风扇灭火,然后停止运动关闭风扇。
Ⅱ
一、设计的目标和实现的主要功能……..1
二、硬件电路设计及描述…………………1
1.硬件组成…………………………………..1
2.装配图片…………………………………..2
3.整体功能模块……………………………..3
4.各功能模块………………………………..4
4.1地面灰度传感器…………………………..4
4.2远红外火焰传感器………………………..6
4.3红外传感器……………………………….7
4.4碰撞传感器……………………………….8
4.5灭火风扇装置……………………………10
三、软件设计流程及描述……………….12
四、源代码…………………………………18
五、调试结果………………………………22
六、课程设计总结………………………..23
七、参考文献……………………………...24
一、设计的目标和实现的主要功能
“智能机器人灭火”这一课题设计的目标主要是用机器人通过传感器的控制来寻找火源进而实现灭火。
设计实现的主要功能分为:
灰度传感器控制拐弯和旋转
碰撞传感器和红外传感器实现躲避障碍
远红外火焰传感器寻找火源
风扇灭火`
二、硬件电路设计及描述(整体功能模块图,各功能模块的详细介绍)
1、硬件组成
名称
型号
图片
能力风暴智能机器人大学版
AS-U51
1
器件名称
主要参数
型号
灭火比赛扩展套件
1个灭火风扇及风扇支架,1个直流电机,1个地面灰度检测卡,1个地面灰度传感器及支架,2个远红外火焰传感器。
工作电压:
5V
AS-FireSuite
红外发射传感器
工作电压:
5V,检测距离:
10—80cm,工作角度:
60°
AS-IREmitter
红外接收器
工作电压:
5V,检测距离:
10—80cm。
含红外接受管,前置放大器,限幅放大器,带通滤波器,峰值检波器。
AS-IR
远红外火焰传感器
2个远红外火焰探头,
火源波长:
700nm~1000nm,工作温度为-25℃~85℃,探测角度为60°,工作电压:
5V
AS-FireCard
地面灰度检测套件
1个地面灰度传感器探头,1个地面灰度接口卡,1个机械固定支架
AS-FloorSensor
2、装配图片
2
3、整体功能模块图
3
4.各功能模块
4.1地面灰度传感器
地面灰度检测卡利用光敏电阻的阻值会随着光照强弱的变化而变化的这一特性。
地面灰度检测传感器通过发光二极管照亮地面,地面的反射光线被光敏电阻接收,电阻值根据反射光线强弱而改变。
地面灰度深,光敏电阻值大;地面灰度浅,光敏电阻值小。
然后,阻值的变转变成电信号,通过模拟口PE5输入到机器人主板上的微控制器,再由微控制器中的A/D转换器将电信号进行转换后供程序使用。
地面灰度传感器原理图:
4
BUS总线上:
PE5连接AD9,引用返回值的时候用AI(9);所以AI(9)的返回值便是灰度传感器的返回值。
灰度传感器扩展卡:
注意扩展卡插在主板上时要使ASBUSA,ASBUSB分别对应主板上的A,B面
灰度传感器测试程序:
#include"M51Robot.H"/*头文件定义,请勿删除*/
#include"reg51.h"
#include
externcharxdatashowbuf[33];
unsignedintigray;
voidmain()
{
InitRobot();
while
(1)
{
igray=AI(9);/*地面灰度检测*/
5
sprintf(showbuf,"%d/n",igray);
PutString(showbuf);
}
}
运行程序,将机器人放在地面上和黑带上,分别读取LED上的显示值就可以完成对传感器的测试。
4.2远红外火焰传感器
远红外火焰探头可以用来探测火源或其它一些波长在700nm~1000nm范围内的热源。
利用远红外火焰探头可以制作灭火机器人、足球机器人、火警机器人等。
将远红外探头插在原光敏传感器插针上,位置如图。
注意方向不要插反,一般情况,插头上带金属的一面朝外。
运行下载的程序,让机器人远红外探头面向热源(如点燃的蜡烛、点亮的灯泡),慢慢靠近热源,观察机器人显示屏上的读数变化。
远红外火焰探头将外界红外光的变化转化为电流的变化,通过A/D转换器反映为0~255范围内的数值。
外界红外光越强,数值越小。
因此越靠近热源,机器人显示读数越小。
根据函数返回值的变化能判断红外光线的强弱,从而能大致判别出火源的远近。
如果机器人读数不变化,一直为255,可能远红外探头插反了,将插针方向反过来即可。
注意,由于远红外火焰探头工作温度为-25℃~85℃,存放温度为30℃~100℃,超过以上温度范围,远红外火焰探头可能会出现工作失常甚至损坏,所以在使用过程中应注意火焰探头离热源的距离不能太近,以免造成损坏。
此外,远红外火焰探头探测角度为60°,测试时最好让热源处于探头的探测范围内。
6
测试程序:
#include"M51Robot.H"/*头文件定义,请勿删除*/
#include"reg51.h"
#include
externcharxdatashowbuf[33];
voidmain()
{
unsignedintphoto_1=0;
unsignedintphoto_2=0;
InitRobot();
while
(1)
{
photo_1=AI(6);
photo_2=AI(7);
sprintf(showbuf,"L=%d,R=%d\n",photo_1,photo_2);
PutString(showbuf);
wait(0.2);
}
}
运行程序,测定有火源时和无火源时LED的显示值
4.3红外传感器
红外接收传感器通常由红外接收二极管与放大电路组成。
我们使用的红外接收传感器将红外接收管与放大电路集成在一体,封装在一个金属屏蔽盒里,体积小(大小与一只中功率三极管相当),密封性好,灵敏度和抗干扰性都非常好。
它仅有三条管脚,分别是电源正极、电源负极以及信号输出端,其工作电压在5V左右。
只要给它接上电源即是一个完整的红外接收放大器,使用十分方便。
可以说是一个接收红外信号的理想装置。
红外接收器:
接收电路:
7
测试程序:
#include"M51Robot.H"/*头文件定义,请勿删除*/
#include"reg51.h"
#include
unsignedcharir;
externcharxdatashowbuf[33];
voidmain()
{
InitRobot();
while
(1)
{
ir=ir_detector();
sprintf(showbuf,"%d/n",ir);
PutString(showbuf);
wait(0.2);
}
}
运行程序,LED上会显示出0/1/2/3,0代表前方无障碍物,1代表左前方有障碍物,2代表右前方有障碍物,3代表前方有障碍物
4.4碰撞传感器
碰撞传感器是使能力风暴智能机器人有感知碰撞环上的碰撞信息能力的传感器。
在能力风暴智能机器人的左前、右前、左后、右后设置有四个碰撞开关(常开),它们与碰撞环共同构成了碰撞传感器。
碰撞环与底盘柔性连接,在受力后与底盘产生相对位移,触发固连在底盘上相应的碰撞开关,使之闭合。
我们把来自四周的碰撞分为八个方向
8
碰撞传感器原理图:
测试程序:
#include"M51Robot.H"/*头文件定义,请勿删除*/
#include"reg51.h"
9
#include
externcharxdatashowbuf[33];
voidmain()
{
unsignedintbumpvalue;
InitRobot();
while
(1)
{
bumpvalue=AI(8);
sprintf(showbuf,"bump=%d/n",bumpvalue);
PutString(showbuf);
wait(0.2);
}
}
运行程序,碰撞不同位置的传感器LED上显示不同的值。
这些值就代表了不同的方位。
4.5灭火风扇装置
灭火风扇装置为能力风暴专用灭火装置,在灭火比赛时扇叶旋转可以用来吹灭烛火。
风扇电机驱动选择DO6:
10
风扇套件:
测试程序:
#include"M51Robot.H"/*头文件定义,请勿删除*/
#include"reg51.h"
#include
#include
sbitOUT6=P3^2;
voidmain()
{
InitRobot();
while
(1)
{
OUT6=0;
wait(3);
OUT6=1;
wait(3);
}
}
运行程序,电机会先停3s后转3s反复进行。
11
三、软件设计流程及描述
主程序流程图:
主程序
初始化
避开障碍前进
结束
寻光灭火
避障运动
拐弯进门
继续走
永远循环
灰度检测有无黑纸
远红外检测火源
N
Y
N
Y
永远循环
12
寻光灭火分函数:
voidfind()/*循光灭火函数*/
{
while(a!
=1)
{
photo_1=AI(6);
photo_2=AI(7);
igray=AI(9);/*地面灰度检测*/
if(igray>700)/*如果检测到蜡烛前的黑线,就高速旋转,并启动扩展电机灭火*/
{
SetMoto(0,90);
SetMoto(1,-90);
OUT6=1;
wait(10.0);
OUT6=0;
a=1;
while
(1)
{
stop();
}
}
if(photo_1<(photo_2+50))/*如果左眼对着火焰,则划左弧线前进*/
{
SetMoto(0,20);
SetMoto(1,40);
wait(0.05);
}
elseif(photo_2<(photo_1+50))/*如果右眼对着火焰,则划右弧线前进*/
{
SetMoto(0,40);
SetMoto(1,20);
wait(0.05);
}
}
}
13
流程图:
主程序
初始化
划左弧线走
打开风扇灭火
结束
停止运动
划右弧线走
永远循环
远红外火焰检测值左>右
灰度检测值>700
永远循环
N
Y
Y
N
14
避障分函数:
voidavoid()/*自动避障函数*/
{
while
(1)
{
photo_1=AI(6);
photo_2=AI(7);
igray=AI(9);
bmp=Bumper();
ir=ir_detector();
SetMoto(0,80);
SetMoto(1,88);
if(bmp==1&&(ir!
=2||ir!
=3))/*如果左前方有碰撞,右前方或者前方没有障碍*/
{
SetMoto(0,0);/*停止运动*/
SetMoto(1,0);
SetMoto(0,-80);/*后退*/
SetMoto(1,-80);
wait(0.3);
SetMoto(0,80);/*右转*/
SetMoto(1,0);
wait(0.134);
continue;
}
elseif(bmp==2&&(ir!
=1||ir!
=3))/*如果右前方有碰撞,左方或前方没有障碍*/
{
SetMoto(0,0);/*停止运动*/
SetMoto(1,0);
SetMoto(0,-80);/*后退*/
SetMoto(1,-80);
wait(0.3);
SetMoto(0,0);
SetMoto(1,80);
wait(0.134);
continue;
}
elseif(bmp==3)/*如果前方有碰撞*/
{
SetMoto(0,0);/*停止运动*/
SetMoto(1,0);
SetMoto(0,-80);/*后退*/
15
SetMoto(1,-80);
wait(0.2);
if(ir==1)/*左边有障碍*/
{
SetMoto(0,80);/*右转*/
SetMoto(1,0);
wait(0.134);
continue;
}
elseif(ir==2)
{
SetMoto(0,0);
SetMoto(1,80);
wait(0.134);
}
}
elseif(bmp)/*三面有碰撞*/
{
SetMoto(0,0);
SetMoto(1,0);
SetMoto(0,-80);/*后退*/
SetMoto(1,-80);
wait(0.3);
SetMoto(0,80);
SetMoto(1,0);
wait(0.9);
SetMoto(0,80);
SetMoto(1,88);
}
if(photo_1<900||photo_2<900)
{
find();/*循光灭火*/
}
}
}
流程图:
16
主程序
初始化
永远循环
左前方有碰撞,右前方或者前方没有障碍
远红外检测火源
N
Y
Y
N
Y
N
前方有碰撞右前方有障碍
前方有碰撞左前方有障碍
三面碰撞
右前方有碰撞,左前方或者前方没有障碍
后退右转35度
后退左转35度
后退右转35度
后退左转35度
N
N
Y
Y
结束
后退右转90度
N
Y
寻火灭火
17
四、源程序代码
#include"M51Robot.H"/*头文件定义,请勿删除*/
#include"reg51.h"
#include
externcharxdataShowBuf[33];
unsignedcharBumper();/*碰撞函数*/
sbitOUT6=P3^2;/*风扇电机开关*/
intphoto_1=0;/*左远红外变量*/
intphoto_2=0;/*右远红外变量*/
unsignedcharbmp=0;/*碰撞检测变量*/
unsignedcharir=0;/*红外检测信号*/
intigray=0;/*灰度变量*/
inta=0;
inti;
externcharxdatashowbuf[33];
voidstop();
voidgo(intx);
voidfind();
voidavoid();
/*?
÷3ìDò*/
voidmain()
{
InitRobot();
OUT6=0;/*关闭电机*/
go(30);
while
(1)
{
photo_1=AI(6);/*远红外火焰检测*/
photo_2=AI(7);
find();
}
}
voidavoid()/*避障函数*/
{
for(i=0;i<100;i++)
{
ir=ir_detector();
bmp=Bumper();
SetMoto(0,30);
SetMoto(1,30);
if(bmp==1&&(ir!
=2||ir!
=3))/*前碰撞,右边无障碍*/
{
SetMoto(0,0);
SetMoto(1,0);
SetMoto(0,-50);/*后退*/
SetMoto(1,-50);
wait(0.3);
SetMoto(0,90);/*向右转*/
SetMoto(1,0);
wait(0.3);
continue;
}
elseif(bmp==2&&(ir!
=1||ir!
=3))/*前碰撞,左边无障碍*/
{
SetMoto(0,0);
SetMoto(1,0);
SetMoto(0,-50);/*后退*/
SetMoto(1,-50);
wait(0.3);
SetMoto(0,0);/*向左转*/
SetMoto(1,90);
wait(0.3);
continue;
}
elseif(bmp==3)/*leftfront碰撞*/
{
SetMoto(0,0);
SetMoto(1,0);
SetMoto(0,-50);/*后退*/
SetMoto(1,-50);
wait(0.3);
SetMoto(0,90);/*向右转*/
SetMoto(1,0);
wait(0.3);
continue;
}
elseif(bmp==4)/*rightfront碰撞*/
{
SetMoto(0,0);
SetMoto(1,0);
SetMoto(0,-50);/*后退*/
SetMoto(1,-50);
wait(0.3);
SetMoto(0,0);/*向左转*/
SetMoto(1,90);
wait(0.3);
continue;
}
}
}
unsignedcharBumper()/*返回碰撞方向*/
{
xdataunsignedintbmpr;
bmpr=AI(8);
if(bmpr>=110&&bmpr<=140)return1;/*左前方*/
if(bmpr>=240&&bmpr<=260)return2;/*右前方*/
if(bmpr>=370)return3;/*前方*/
return0;
}
voidstop()/*停止函数*/
{
SetMoto(0,0);
SetMoto(1,0);
}
voidgo(intx)/*前进函数*/
{
SetMoto(0,x);
SetMoto(1,x);
}
voidfind()/*寻光灭火函数*/
{
while(a!
=1)
{
photo_1=AI(6);
photo_2=AI(7);
igray=AI(9);/*地面灰度检测*/
sprintf(showbuf,"L=%d,R=%d\n",photo_1,photo_2);
PutString(showbuf);
wait(0.02);
if(photo_1<920)/*如果左传感对着火焰,则向左偏转相应角度再前进*/
{SetMoto(0,0);
SetMoto(1,0);
wait(0.1);
SetMoto(0,-10);
SetMoto(1,30);
wait(0.3);
go(10);
wait(0.2);}
elseif(photo_2<700)/*如果右传感对着火焰,则向右偏转相应角度再前进*/
{SetMoto(0,0);
SetMoto(1,0);
wait(0.1);
SetMoto(0,30);
SetMoto(1,-10);
wait(0.3);
go(10);
wait(0.2);}
else{go(30);}
while(igray>700)/*如果检测到蜡烛前的黑线,调整角度,启动电机灭火*/
{