1、消防机器人设计报告消防机器人设计报告基于ATmega2560单片机的智能避障灭火小车 一、 设计方案: 1、控制系统: Arduino Mega2560是采用USB接口的核心电路板,具有54路数字输入输出,适合需要大量IO接口的设计。处理器核心是ATmega2560, 同时具有54路数字输入/输出口(其中16路可作为PWM输出),16路模拟输入,4路UART接口,一个16MHz晶体振荡器,一个USB口,一个电源 插座,一个ICSP header和一个复位按钮。Arduino Mega2560也能兼容为Arduino UNO设计的扩展板。 该核心电路板能提供大量IO接口,因此为以后的传感器和功能
2、拓展提供了便捷,同时搭配传感器拓展板,在使用和调试便捷性上优于其它单片机。 Arduino2560原理电路: 2、传感器: 方案一:光电循迹传感器+火焰传感器+红外线测距传感器 光电开关在一般情况下,由三部分构成,它们分为:发送器、接收器和检测电路。 它的检测头里也装有一个发光器和一个收光器,它的检测头里也装有一个发光器和一个收光器,但前方没有反光板。正常情况下发光器发出的光受光器是接收不到的,当有物体通过时挡住了光,并把光反射回来,受光器就接收到了光信号,输出一个开关信号。 当遇到黑色线格的时候,由于黑色吸收了大部分光线,因此光电开光就会输出电平变化,单片机接收到信号以后做出相应的动作。 火
3、焰传感器的基本构成及原理: 火焰传感器由红外线接收管、电平比较电路、灵敏度调节电位器三部分组成。通过红外线接收管探测周围环境,当接收到较强的红外线的时候,由电平比较器反馈给单片机电平变化信号。可通过电位器调节火焰传感器的灵敏度。 红外测距传感器: 红外测距传感器由四部分构成,红外线二极管,红外线接收管,电平比较器,距离调节电位器。 通过红外线二极管发射出红外线,接收管收到物体反射的红外线,通过电平比较器后输出一个变化电平信号。通过电位器调节,可以控制接收管给电平比较器的信号,而达到控制探测距离的目的。但由于红外线测距模块对火焰比较敏感,因此用在消防机器人上面不是很合适。 方案二:光电循迹传感器
4、+火焰传感器+超声波传感器 该方案使用了超声波测距模块,利用超声波发射和接收模组,通过一定频率的超声波并接收该频率的反射波,通过两者的时差进行计算,准确得出障碍距小车的距离,屏蔽了火焰对测距模块的影响,能有效应用于避障机构。 3、动力机构: 方案一、四线二相步进电机*2 该方案中,步进电机能够按照特定的步进角进行运转,设定好步数,电机则运行相应的角度以下图为例: 虽然步进电机能很准确的对小车进行控制,但是由于其功耗和控制电路的因素,该方案未采用。 方案二、直流减速电机*2 使用L298N驱动两个直流电机,L298N驱动电路如下图: 该驱动电路可两路直流电机或一路步进电机,控制直流电机时,IN1
5、、IN2、IN3、IN4分别接单片机数字IO口,通过IO口控制电机的转动方向,ENA、ENB接单片机PWM输出口,控制电机的转速。该方案电路简单,控制方便,故采用该方案。 4、灭火风扇: 方案一:采用模块化设计,在调试和安装上方便快捷。用两个直流小电机作为灭火装置,由单片机IO口控制,并通过三极管扩流,由L7805将12V锂电池电压稳压为5V,供全部系统使用,在测试过程中发现,当火焰传感器探测到火焰,电机转动时使得系统板电压骤降,导致单片机不断复位,达不到灭火的效果。 方案二:通过给单片机系统单独供电,用IO口控制两个继电器来间接控制灭火小电机,电机电源采用电机驱动板上的5V电源接口。该方案解
6、决了单片机因电压不足而无限重启的现象,使得单片机系统能够稳定运作。因此我采用该方案。 5、电源模块: 现有2200mah航模锂电池一块,输出电压11.1V,最大放电能力30C,完全满足小车需要。采用两路L7805单独给单片机系统和电机驱动系统供电,传感器由单片机系统电源供电,灭火风扇由电机驱动系统供电。电源模块电路原理图如下: 6、数据交互模块: 传感器的数据除了传递给小车系统之外,还需要通过显示屏呈现出来,同样的,有两套方案, 方案一:系统接收到数据之后直接处理,然后显示到LCD1602。该方案使用到1602液晶,在arduino上使用液晶来显示数据参数不是很困难,但是由于小车所使用到的单片
7、机系统为8位单片机,虽然已经有很丰富的IO接口,但数据处理能力着实一般,在使用液晶和单总线的DIS18B20温度传感器时,会使得系统的操作显得很慢,导致程序不能够正常运行。而且1602液晶只能显示两行、16个字符,对于该小车来说着实有点紧张。 方案二:单片机在处理传感器数据的同时,将数据通过串口转发给另一单片机,在另一单片机进行处理后,将参数显示到2004液晶上面,将控制信号反馈给主控单片机,最大限度的使主控单片机的速度不受影响。由于本系统采用集成串口的mega2560单片机与mega328p单片机,只需要通过TXD和RXD两根线进行通信。而且能将部分控制指令直接分配给mega328p,因此,
8、提高了系统的稳定性和工作效率。因此我采用方案二。 二、 小车结构: 电源模块 电机驱动模块 灭火小车四路循迹模块 火焰传感器模块 系统板 灭火模块 数据交互模块 三、 程序设计: 小车从安全位置出发,无固定路线,在火焰传感器的引导下自行选择靠近火源的路线行走,距离火源一定距离时停下,进行灭火操作。灭火完成后继续前往下一个火源。途中遇到障碍物时能够自行避开障碍物,寻找离火源最近的路线前进。小车能够自行判断自己在场地中的位置,防止走出场地,其位置判断与火源计数以及报警部分由mega328p进行。 部分程序: /mega2560部分/ int Motor_L=4; int Motor_R=5; in
9、t Track_L=30; int Track_0=31; int Track_1=A4; int Track_R=32; int Flame_L_D=40; int Flame_R_D=41; int Flame_L_A=A0; int Flame_R_A=A1; int Relay_L=A10; int Relay_R=A11; int F_L_A=0; int F_R_A=0; char D; void setup() pinMode(4,OUTPUT); pinMode(5,OUTPUT); pinMode(22,OUTPUT); pinMode(23,OUTPUT); pinMode
10、(24,OUTPUT); pinMode(25,OUTPUT);/Motor_L&Motor_R. pinMode(30,INPUT); pinMode(31,INPUT); pinMode(A4,INPUT); pinMode(32,INPUT);/Track_L&Track_0&Track_R pinMode(40,INPUT); pinMode(41,INPUT); pinMode(A0,INPUT); pinMode(A1,INPUT);/Flame Digital&Analog Input pinMode(A10,OUTPUT); pinMode(A11,OUTPUT);/Relay
11、 L&R Serial.begin(9600); void loop() F_L_A=analogRead(A0); F_R_A=analogRead(A1); while(1) /*Flame*/ if(digitalRead(40)=0) stop(); relay_L_H(); else straight(); relay_L_K(); if(digitalRead(41)=0) stop(); relay_R_H(); else straight(); relay_R_K(); /*Track Start*/ if(analogRead(A4)500&digitalRead(31)=1
12、&analogRead(A0)500&analogRead(A1)870) right(); straight(); Serial.print(B); else straight(); /*Main End*/ /*/ /*Motor Control*/ /*/ /*Straight*/ void straight(void) if(digitalRead(30)=1&digitalRead(32)=1) digitalWrite(22,HIGH); digitalWrite(23,LOW); digitalWrite(24,HIGH); digitalWrite(25,LOW); analo
13、gWrite(4,255); analogWrite(5,240); else if(digitalRead(30)=0) digitalWrite(22,HIGH); digitalWrite(23,LOW); digitalWrite(24,HIGH); digitalWrite(25,LOW); analogWrite(4,255); analogWrite(5,0); else if(digitalRead(32)=0) digitalWrite(22,HIGH); digitalWrite(23,LOW); digitalWrite(24,HIGH); digitalWrite(25
14、,LOW); analogWrite(4,0); analogWrite(5,240); /*Stop*/ void stop(void) digitalWrite(22,HIGH); digitalWrite(23,LOW); digitalWrite(24,HIGH); digitalWrite(25,LOW); analogWrite(4,0); analogWrite(5,0); /*Back*/ void back(void) digitalWrite(22,LOW); digitalWrite(23,HIGH); digitalWrite(24,LOW); digitalWrite
15、(25,HIGH); analogWrite(4,250); analogWrite(5,230); /*Left*/ void left(void) digitalWrite(22,LOW); digitalWrite(23,HIGH); digitalWrite(24,HIGH); digitalWrite(25,LOW); analogWrite(4,240); analogWrite(5,255); delay(700); /*Right*/ void right(void) digitalWrite(22,HIGH); digitalWrite(23,LOW); digitalWri
16、te(24,LOW); digitalWrite(25,HIGH); analogWrite(4,255); analogWrite(5,255); delay(600); /*/ /*Relay*/ /*/ /*Relay_L*/ void relay_L_H(void) digitalWrite(A10,HIGH); delay(600); void relay_L_K(void) digitalWrite(A10,LOW); /*Realay_R*/ void relay_R_H(void) digitalWrite(A11,HIGH); delay(600); void relay_R
17、_K(void) digitalWrite(A11,LOW); /mega328p串口通讯及LCD测试程序/ #include #include char D; LiquidCrystal_I2C lcd(0x27,20,4); / set the LCD address to 0x27 for a 16 chars and 2 line display void setup() lcd.init(); / initialize the lcd lcd.backlight(); lcd.print(X=); lcd.setCursor(0,1); lcd.print(Y=); Serial.begin(9600); void loop() D=Serial.read(); lcd.setCursor(3,0); if(Serial.read()=A) lcd.print(X); lcd.setCursor(3,1); if(Serial.read()=B) lcd.print(Y);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1