原文:https://circuitdigest.com/microcontroller-projects/arduino-fire-fighting-robot-code
基于Arduino的消防机器人
经过**阿斯温斯·拉吉(Aswinth Raj)** 2017年12月20日
根据国家犯罪记录局(NCRB)的估计,从2010年至2014年,印度发生的火灾事故已造成超过120万死亡。即使为火灾事故采取了许多预防措施,但这些自然/人为灾难确实时有发生。发生火灾时,为了营救人员和灭火,我们被迫使用不安全的人力资源。随着技术的进步,尤其是机器人技术的发展,很有可能用机器人代替人来灭火。这将提高消防员的效率,也将防止他们冒着生命危险。今天,我们将使用Arduino构建消防机器人,该机器人将自动感应火势并启动水泵
在这个项目中,我们将学习如何使用Arduino构建一个简单的机器人,该机器人可以朝着火势移动并在其周围抽水以扑灭大火。这是一个非常简单的机器人,可以教给我们有关机器人技术的基本概念。了解以下基本知识后,您就可以构建更复杂的机器人。因此,让我们开始吧…
所需材料:
- Arduino UNO
- 火灾传感器或火焰传感器(3个)
- 伺服马达(SG90)
- L293D电机驱动器模块
- 微型直流潜水泵
- 小面包板
- 带电机(2)和车轮(2)的机器人底盘(任何类型)
- 一小罐
- 连接线
消防机器人的工作理念:
该项目的主要大脑是Arduino,但是为了感知火情,我们使用了如下所示的火情传感器模块(火情传感器)。
如您所见,这些传感器具有用于检测火情的红外接收器(光电二极管)。这怎么可能?当火燃烧时,它会发出少量的红外光,该光将被传感器模块上的IR接收器接收。然后,我们使用运算放大器检查IR接收器两端的电压变化,以便在检测到火灾时输出引脚(DO)的输出为0V(LOW),如果没有火灾,则输出引脚的输出为5V(高的)。
因此,我们在机器人的三个方向上放置了三个这样的传感器,以感应火在哪个方向上燃烧。
我们可以通过通过L293D模块驱动我们的电动机来检测起火的方向,从而可以使电动机在起火附近移动。当着火时,我们必须用水灭火。使用一个小容器我们可以运载水,一个5V的泵也被放置在容器中,整个容器被放置在伺服电机的顶部,这样我们就可以控制喷水的方向。现在让我们继续进行连接
电路图:
该消防机器人的完整电路图如下所示
您可以连接所有显示的连接以上传程序以检查程序是否正常运行,也可以完全组装机器人,然后继续进行连接。两种方式的连接都非常简单,您应该能够正确进行连接。
根据您使用的机械手机箱,您可能无法使用与我使用的相同类型的容器。在这种情况下,请使用您自己的创造力来设置泵系统。但是,代码将保持不变。我用一个小的铝罐(凉饮料罐)将泵放入其中,并向其中倒水。然后,我将整个罐子组装在伺服电机的顶部,以控制水的方向。组装后,我的机器人看起来像这样。
如您所见,我已使用涂胶将伺服散热片固定在容器的底部,并使用螺母和螺栓将伺服电机与底盘固定在一起。我们可以简单地将容器放置在电动机的顶部,并触发其中的泵将水通过管子抽到外部。然后可以使用伺服器旋转整个容器,以控制水的方向。
编程Arduino:
准备好硬件后,您可以上传Arduino代码以执行某些操作。该完整的程序是在本页面末尾。但是,我在这里进一步解释了一些重要的细节。
众所周知,火灾传感器在发生火灾时将输出高电平,在发生火灾时将输出低电平。因此,如果发生任何火灾,我们必须继续检查这些传感器。如果没有火灾,请通过使所有销高的方式使电动机保持停止,如下所示
if(digitalRead(Left_S)== 1 && digitalRead(Right_S)== 1 && digitalRead(Forward_S)== 1)//如果未检测到火灾,则所有传感器均为零
{
//不要移动机器人
digitalWrite(LM1,HIGH);
digitalWrite(LM2,HIGH);
digitalWrite(RM1,HIGH);
digitalWrite(RM2,HIGH);
}
同样,如果发生火灾,我们可以通过旋转相应的电动机来要求机器人朝该方向移动。一旦着火,左右传感器将不会检测到火,因为它将直接站在火的前方。现在,我们使用名为“ fire ”的变量,该变量将执行阻止火灾的功能。
else if (digitalRead(Forward_S) ==0) //If Fire is straight ahead
{
//Move the robot forward
digitalWrite(LM1, HIGH);
digitalWrite(LM2, LOW);
digitalWrite(RM1, HIGH);
digitalWrite(RM2, LOW);
fire = true;
}
一旦变量fire变为true,消防机器人的arduino代码将执行put_off_fire函数,直到火灾被扑灭为止。这是使用下面的代码完成的。
while(fire == true)
{
put_off_fire();
}
在put_off_fire()内部,我们只需要通过将所有引脚设为高电平来停止机器人。然后打开泵将水推到容器外,同时我们也可以使用伺服电机旋转容器,以使水均匀地分配到整个容器中。这是使用下面的代码完成的
void put_off_fire()
{
delay (500);
digitalWrite(LM1, HIGH);
digitalWrite(LM2, HIGH);
digitalWrite(RM1, HIGH);
digitalWrite(RM2, HIGH);
digitalWrite(pump, HIGH); delay(500);
for (pos = 50; pos <= 130; pos += 1) {
myservo.write(pos);
delay(10);
}
for (pos = 130; pos >= 50; pos -= 1) {
myservo.write(pos);
delay(10);
}
digitalWrite(pump,LOW);
myservo.write(90);
fire=false;
}
消防机器人的工作:
建议分步检查机器人的输出,而不是第一次一起运行。您可以将机器人安装到伺服电机上,并检查其是否能够成功跟随火势。然后,您可以检查泵和伺服电机是否正常工作。一旦一切正常运行,您就可以运行下面的程序,并享受消防员机器人的全部工作。
机器人的完整工作原理请参见下面的视频。可以检测到火的最大距离取决于火的大小,对于小的火柴杆,该距离相对较小。您还可以使用模块顶部的电位器来控制机器人的灵敏度。我已经使用移动电源为机器人供电,您可以使用电池,甚至可以使用12V电池为其供电。
希望您理解该项目,并喜欢构建类似的东西。如果您在构建此版本时遇到任何问题,请使用下面的评论部分来发布您的需求或使用论坛获取技术帮助。
查看我们的机器人技术部分,以找到更多很棒的DIY机器人。
/*------ Arduino Fire Fighting Robot Code----- */
#include <Servo.h>
Servo myservo;
int pos = 0;
boolean fire = false;
/*-------defining Inputs------*/
#define Left_S 9 // left sensor
#define Right_S 10 // right sensor
#define Forward_S 8 //forward sensor
/*-------defining Outputs------*/
#define LM1 2 // left motor
#define LM2 3 // left motor
#define RM1 4 // right motor
#define RM2 5 // right motor
#define pump 6
void setup()
{
pinMode(Left_S, INPUT);
pinMode(Right_S, INPUT);
pinMode(Forward_S, INPUT);
pinMode(LM1, OUTPUT);
pinMode(LM2, OUTPUT);
pinMode(RM1, OUTPUT);
pinMode(RM2, OUTPUT);
pinMode(pump, OUTPUT);
myservo.attach(11);
myservo.write(90);
}
void put_off_fire()
{
delay (500);
digitalWrite(LM1, HIGH);
digitalWrite(LM2, HIGH);
digitalWrite(RM1, HIGH);
digitalWrite(RM2, HIGH);
digitalWrite(pump, HIGH); delay(500);
for (pos = 50; pos <= 130; pos += 1) {
myservo.write(pos);
delay(10);
}
for (pos = 130; pos >= 50; pos -= 1) {
myservo.write(pos);
delay(10);
}
digitalWrite(pump,LOW);
myservo.write(90);
fire=false;
}
void loop()
{
myservo.write(90); //Sweep_Servo();
if (digitalRead(Left_S) ==1 && digitalRead(Right_S)==1 && digitalRead(Forward_S) ==1) //If Fire not detected all sensors are zero
{
//Do not move the robot
digitalWrite(LM1, HIGH);
digitalWrite(LM2, HIGH);
digitalWrite(RM1, HIGH);
digitalWrite(RM2, HIGH);
}
else if (digitalRead(Forward_S) ==0) //If Fire is straight ahead
{
//Move the robot forward
digitalWrite(LM1, HIGH);
digitalWrite(LM2, LOW);
digitalWrite(RM1, HIGH);
digitalWrite(RM2, LOW);
fire = true;
}
else if (digitalRead(Left_S) ==0) //If Fire is to the left
{
//Move the robot left
digitalWrite(LM1, HIGH);
digitalWrite(LM2, LOW);
digitalWrite(RM1, HIGH);
digitalWrite(RM2, HIGH);
}
else if (digitalRead(Right_S) ==0) //If Fire is to the right
{
//Move the robot right
digitalWrite(LM1, HIGH);
digitalWrite(LM2, HIGH);
digitalWrite(RM1, HIGH);
digitalWrite(RM2, LOW);
}
delay(300); //Slow down the speed of robot
while (fire == true)
{
put_off_fire();
}
}