智能寻迹灭火小车
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
智能寻迹灭火小车
摘要:
本设计为使小车在轨道上按要求准确运行采用了单片机AT89C51最小系统作为电动车的检测和控制系统。
通过红外发射接收一体探头检测路面黑色寻迹线,使小车按预定轨道行驶,通过步进电机进行扫描,根据火焰传感器检测火焰。
再加上基于AT89C51单片机的键盘,构成了整个系统的硬件总电路。
最后通过软件设计,实现了按预定轨道行驶、蔽障、检测火焰、灭火等功能。
关键词:寻迹线蔽障火焰传感器红外发射接收一体探头灭火
1·系统方案设计、比较与论证
根据题目的基本要求,设计任务主要完成小车在规定的时间内按规定路径进行扫描,寻迹,蔽障,灭火等功能。
为完成相应的功能,系统可以分为以下几个基本模块:电机驱动模块,电机扫描模块,风扇驱动模块,寻迹线探测模块,蔽障模块,火焰检测模块,电源模块,风扇模块。
图一
1.1 寻迹线探测模块
探测路面黑色寻迹线的原理:光线照射到路面并反射,由于黑线和白纸的反射系数不同,可根据接受到反射光强弱由传感器产生高低电平并最终通过单片机判断是否到达黑线偏离跑道。
方案一:由可见光发光二极管与光敏二极管组成的发射-接收电路。
该方案成本较低,易于制作,但其缺点在于周围环境光源会对光敏二极管的工作产生很大干扰,一旦外界光亮条件改变,很可能造成误判和漏判;如果采用超高亮发光管和高灵敏度光敏管可以降低一定的干扰,但又将增加额外的功率损耗。
方案二:自制红外探头电路。
此种方法简单,价格便宜,灵敏度可调,但易受到周围环境影响,特别是较强光照对检测信号的影响,会造成系统不稳定。
再加上时间有限,制作分立电路较繁琐。
方案三:集成式红外探头。
可以采用集成断续式光电开关探测器,它具有集成度高、工作性能可靠的优点,只须调节探头上的一个旋钮即可以控制探头的灵敏度。
此种探头还能有效地防止普通光源(如日光灯等)的干扰。
基于上述考虑,为了提高系统信号采集检测的精度,我们采用方案三。
1.2电动机及其驱动模块的选择
在选用驱动模块方面由以下两种方案:采用专用驱动芯片。
该芯片集成度高,占用空间小,主要应用于电机调速场合。
采用分立三极管驱动电路。
经分析此电动车所要求的功能比较简单,不需复杂的调速,用电动机专用集成驱动电路可以达到预期的目标。
故我们最后决定用后方案。
1.3 电源选择
方案一:所有器件采用单一电源(5节五号电池)。
这样供电比较简单,但是由于电动机启动瞬间电流很大,会造成电压不稳、有毛刺等干扰,严重时可能会造成单片机系统掉电,使之不能完成预定行程。
方案二:双电源供电。
电动机驱动电源采用5节五号电池,单片机及其外围电路电源采用5V钮扣电池供电,两路电源完全分开,这样做虽然不如单电源方便灵活,但可以将电动机驱动所造成的干扰彻底消除,提高了系统稳定性。
我们认为本设计的稳定可靠性更为重要,故拟采用方案二。
1.4灭火装置模块
可燃物的燃烧的条件有两个:一是有助燃物,二是可燃物的温度达到着火点以上。
因此灭火也就有两种方案:一是将助燃物与可燃物隔离开,二是降低可燃物的温度至着火点以下。
我们小车采用第二种方案,即降低温度至着火点以下。
方案1:干冰灭火干冰升华时,吸收大量的热,降低可燃物温度,同时二氧化碳气体会覆盖在可燃物上,将助燃物和可燃物隔离开。
对于我们的课题此方案的劣势太多。
方案2:喷水灭火利用微型水泵喷出适量的水来灭掉火源。
喷水灭火是现实生活中灭火的最主要的方式,但是对于我们的只能灭火小车,有两个致命的缺点:一是几乎买不到小型可控的喷水装置,二是装上大量水后,小车的负载过大。
方案3:风扇灭火利用一个不减速的直流小电机带动一个小扇叶进行简单的灭火。
这种方案有三个子方案;
(1)电源直接供电这种方案是最简单的,但是小车驱动电机和各种芯片的额定工作电流和电压都受到很大的限制,且干电池的输
出电压和电流也不可能达到很大,所以灭火电机的电压和电流
较小无法达到预期效果。
(2)芯片控制灭火风扇电机的转速和转向都不需要控制,只要在一定范围内转的越开越好。
因此采用这种方案有点麻烦,而且
还会浪费时间和精力。
(3)三极管放大电路直接利用三极管驱动。
将电机放在三极管的射极,然后在基极加上一个限流电阻即可驱动电机正常工作,
这种方案不仅电路简单、易实现,会减少很多电路上不必要的
麻烦,而且驱动效率也大大提高,不仅如此其维修性也很强,
出现故障能及时快速维修。
同时为了保证电路稳定性,我们采
用多个三极管并联供电的方式。
鉴于以上各种方案的比较,我们选择方案3中子方案(3)
1.5 探测装置模块
在进行这个项目之前,我们三个就从未接触过类似的项目课题,一时真的不知该如何着手解决这个棘手的问题。
不过有一点我们几个都清楚地知道我们的检测方法肯定是得利用火源发出的光和温度的性质来将这一特殊的“目标物”与周围环境物区别开来。
考虑到实际情况即蜡烛发出的光中不仅仅只有可见光,红外和紫外都占有一定比例,蜡烛发光的过程中肯定还伴随着烟雾等附带物的释放,而且周围环境的温度也会发生不同程度的变化,但是这种变化较小。
以上这些都可以作为检测蜡烛位置的依据,所以我们常见的有红外传感器、紫外传感器、火焰传感器、烟雾传感器,温度传感器等。
方案1:以两个热敏电阻为核心的传感器实验中发现在一定距离范围
内,空气温度变化非常小,热敏电阻几乎不发生任何变化。
方案2:以两个光敏电阻为核心的传感器利用光敏电阻对不同距离及不同强度的光照均有较好的光敏特性来将外界光信号转换成电信号,提供给单片机进行相关判断操作。
实验中我们发现这种方案有很大的缺点,抗干扰能力极差,而且误差偏大,不能准确测定火源位置。
方案3:为了更准确的保证小车能够在距离火源3—5cm的范围内停下来,我们在方案2的基础上增加了光电对管进行短距离测距。
但是实验中发现光电对管是不起任何作用的。
原因是蜡烛是圆柱形,对广电对管发射的光信号是漫反射的不是镜面反射,光电对管几乎接收不到反射回来的信号。
光电对管几乎起不到任何作用。
方案4:用缠有黑色胶布的塑料管将光敏电阻四周包围起来。
这样只有垂直于光敏电阻表明的光才能作用到光敏电阻,改变光敏电阻的阻值,进而改变电流和电压值,通过判断电压和电流的变化就可以准确测定光源的方向,然后小车水平直线前进。
通过实验我们发现这种方案较好,他抗干扰能力强,探测距离远(可达3米左右),探测火源位置准确。
方案5: 以方案2为基础,采用多个光敏电阻共同探测火源位置。
他们的信号通过或门传递给mega16单片机。
但是在实际情况中我们发现这种方案实际效果不大,而且电路较为麻烦。
鉴于以上5种方案的比较,我们选择方案4。
小结:
经过一番仔细的论证与比较,我们决定了系统各个主要模块的最终方案如下:
1、小车基本模型模块用电路板为底座自己动手做一个小车,采用两轮驱动,一个万向轮支撑来保证小车的平稳和转向灵活快捷。
2、电机驱动模块利用L298芯片控制两个驱动电机的旋转时间、方向和快慢,进而控制小车的前进和转向。
3、灭火装置模块多个三极管放大电路供电控制灭火风扇电机,进行风扇灭火。
4、探测装置模块用缠有黑色胶布的塑料管将光敏电阻四周包围起来,绕后通过两只光敏电阻来探测火源的位置。
当火源位于小车正前方的时候,蜡烛与小车中线在同一直线上,即蜡烛在两只光敏电阻连线的垂直平分线上,这样两只光敏电阻所受光照条件大致相同,因而其阻值也相差不大,从而使两个电路电压电流之差在一个很小的范围内这一性质来确定火源位置。
5,电源:双电源供电
二系统的具体设计与实现
系统的组成及其原理图如下所示。
以下分为硬件与软件两个方面进行具体分析。
1 系统的硬件设计
电动机的驱动设计与实现
用L298N作为电机驱动芯片。
L298N是一个具有高压大电流的全桥驱动芯片,他相应频率高,一片L298N可以控制两个直流电机,而且还有控制使能端。
驱动电路的设计原理图
路面黑线检测模块电路的设计与实现
2.1寻迹线探测电路
采用型号为红外线传感器,该探头输出端只有三根线(电源线、地线、信号线),只要将信号线接在单片机的I/O口,然后不停地对该I/O口进行扫描检测,当其为高电平时则检测到白纸,当为低电平时则检测到黑线区域。
小车前进(倒退)时,始终保持黑线在车头(车尾)两个传感器之间,当小车偏离黑线时,探测器一旦探测到有黑线,单片机就会按照预先编定的程序发送指令给小车的控制系统,控制系统再对小车路径予以纠正。
当小车回到了轨道上时,车头(车尾)两个探测器都只检测到白纸,则小车继续直线行走,否则小车会持续进行方向调整操作,直到小车恢复正常。
系统的软件设计
三实际测试1 测试设备模拟跑道:
2 测试结果附录
软件程序
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char temp;
unsigned char signal;
unsigned int s;
unsigned char j;
unsigned char k;
unsigned char l;
unsigned char m;
sbit f=P1^5;
sbit in4=P3^3;
sbit in3=P3^2;
sbit in2=P3^1;
sbit in1=P3^0;
sbit y=P1^3;
void delay300(void) // 300ms
{
unsigned char a,b,c;
for(c=123;c>0;c--)
for(b=116;b>0;b--)
for(a=9;a>0;a--);
}
void delay200(void) //误差 0us
{
unsigned char a,b,c;
for(c=4;c>0;c--)
for(b=116;b>0;b--)
for(a=214;a>0;a--);
_nop_(); //if Keil,require use intrins.h }
void delay()
{
unsigned int i,j;
for(i=30;i>0;i--)
for(j=30;j>0;j--);
}
void delay1()
{
unsigned int i,j;
for(i=20;i>0;i--)
for(j=20;j>0;j--);
}
void delay2() //误差 0us
{
unsigned char a,b,c;
for(c=189;c>0;c--)
for(b=230;b>0;b--)
for(a=33;a>0;a--);
}
void delay3(uchar t) //误差 0us {
unsigned char a,b,c;
while(t--)
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
//return_A()
//{}
//return_B()
//{}
//return_C()
//{}
//return_D()
//{}
void forward()
{
P2=0xfa;
delay();
}
//void back()
//{
//P0=0xf5;
// delay();
//}
void stop()
{
P2=0xff;
delay300();delay300();
s++;
}
void left_quick()
{
//unsigned char i;
// for(i=20;i>0;i--)
// {
P2=0xf8;
delay1(); //delay1();delay1();delay1();delay1();delay1(); //}
}
void left()
{
P2=0xf9;
delay();
}
void rignt_quick()
{
//unsigned char i;
// for(i=20;i>0;i--)
//{
P2=0xf2;
delay1(); //delay1();delay1();delay1();delay1();delay1();
//}
}
void rignt()
{
P2=0xf6;
delay();
}
void saomiao()
{
uchar i;
for(i=0;i<129;i++) //正转90°,扫描左半部{ in1=0;
in2=1;
in3=1;
in4=1;
delay3(11);
in1=1;
in2=0;
in3=1;
in4=1;
delay3(11);
in1=1;
in2=1;
in3=0;
in4=1;
delay3(11);
in1=1;
in2=1;
in3=1;
in4=0;
delay3(11);
if(f==0) f=0;
}
for(i=0;i<129;i++) //转回原点,停止扫描{ in1=1;
in2=1;
in3=1;
in4=0;
delay3(11);
in1=1;
in2=1;
in3=0;
in4=1;
delay3(11);
in1=1;
in2=0;
in3=1;
in4=1;
delay3(11);
in1=0;
in2=1;
in3=1;
in4=1;
delay3(11);
}
}
void main()
{
forward();
forward();
forward();
forward();
while(1)
{
// forward();
//back();
temp=P1;
signal=temp&0xff;
// l=signal;
if(s==4)
{//uchar f=1;
stop();
delay300();
saomiao();
if(f==0) {left();delay300();delay300();m=1;f=1;} //没延时else { rignt();delay300();delay300();m=0;}//没延时 }
if(s==6)
{ //uchar f=1;
stop();
delay300();
saomiao();
if(f==0) {left();delay300();delay200();k=1;f=1;}//左拐延时没给
else { rignt();delay300();delay200();k=0;}//右拐延时没给
forward();delay300();delay300();
stop();delay300();delay300();
left();delay300();delay300();delay300();delay200();
forward();delay300();delay300();
if(k==1){rignt();delay300();delay200();}
else{left();delay300();delay200();}
}
if(s==9)
{
stop();delay300();
if(m==0){rignt();delay300();delay300();}
if(m==1){left();delay300();delay300();}
}
// if(j==0&&k==0) return_A();
// if(j==0&&k==1) return_B();
// if(j==1&&k==0) return_C();
// if(j==1&&k==1) return_D();
switch(signal)
{
/* case 0xf9: //2、3检测到黑线
forward();
break;
case 0xfb: //左快,3检测到白线,2检测到黑线11111011
left_quick();
break;
case 0xf7: //直角弯,左拐,1检测到黑线,11110111 left();
break;
case 0xf3://左慢11110011
left_quick();
break;
case 0xfc: //右慢,3、4检测到黑线11111100
rignt_quick();
break;
case 0xfd: //右快,2检测到白线,3检测到黑线11111101
rignt_quick();
break;
case 0xfe: //11111110
rignt();
break;
case 0xf8:
rignt();
case 0xff:
forward();
break;
//case 0xf0:
// stop();
// break;*/
case 0xff:
forward();
break;
case 0xfe:
rignt();
break;
case 0xfd:
rignt_quick();
break;
case 0xfc:
rignt();
break;
case 0xfb:
left_quick();
break;
case 0xf9:
forward();
break;
case 0xf8:
rignt();
break;
case 0xf7:
left();
break;
case 0xf3:
left();
break;
case 0xf1:
left();
break;
case 0xf0:
stop();
default:
forward();
break;
}
}
}。