1. 功能说明
灭火机器人是一种特殊的机器人,专门用于进行火灾扑救和灭火任务。它们通常具备以下功能和特点:
① 火灾侦测:灭火机器人配备了各种传感器和探测设备,可以检测烟雾、温度升高等火灾迹象。
② 火灾扑救:灭火机器人可携带水枪或干粉喷射器等扑救工具,能够快速响应并灭除小型火灾或控制火势。
③ 自主导航:灭火机器人通常拥有自主导航和避障系统,能够在火灾现场进行移动和操作,同时规避障碍物。
④ 远程操作:由于火灾环境通常危险且恶劣,灭火机器人通常可以通过遥控或预设指令来进行操作,使人员可以在安全区域远程操控。
⑤ 视频监控:一些灭火机器人还配备了摄像头或红外传感器,能够实时传输图像或视频给指挥中心,以辅助决策和情报收集。
⑥ 多种应用场景:灭火机器人广泛应用于各类场所,如工厂、仓库、地下车库、建筑物、船舶等,帮助人们更有效地对抗火灾。
本文示例将实现当小型双轮差速底盘机器人检测到火源时进行灭火的一个功能。
2. 结构装配
按照下图所示方式进行安装:
3. 电子硬件
在这个示例中,我们采用了以下硬件,请大家参考:
主控板 | Basra主控板(兼容Arduino Uno) |
扩展板 | Bigfish2.1扩展板 |
传感器 | 超声测距模块 |
火焰传感器 | |
电池 | 7.4V锂电池 |
其它 | 风扇、马达驱动 |
按照下图所示方式进行电路连接:
4. 功能实现
编程环境:Arduino 1.8.19
① 下面提供一个控制小车前后左右停的参考例程(Test1.ino):
/*------------------------------------------------------------------------------------
版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.
Distributed under MIT license.See file LICENSE for detail or copy at
https://opensource.org/licenses/MIT
by 机器谱 2023-07-14 https://www.robotway.com/
------------------------------*/
#include <Servo.h>//调用舵机库函数
#define middle1 105//定义对应舵机的中间值,即停止转动的值
#define middle2 89//此值需要测量,各个舵机不一定相同
Servo myservo[2];//声明舵机类数组,用于控制的两个舵机
void setup()
{
myservo[0].attach(4);//绑定舵机的输出引脚
myservo[1].attach(3);
}
void loop()
{
Left();//调用左转函数
delay(1000);//延时函数
Right();
delay(1000);
Forwards();
delay(1000);
stop();
delay(1000);
}
void Left()//左转函数
{
myservo[0].write(middle1);//输出相应的舵机参数,使舵机运行
myservo[1].write(middle2 + 20);
}
void Right()//右转函数
{
myservo[0].write(middle1 - 20);
myservo[1].write(middle2);
}
void Forwards()//前进函数
{
myservo[0].write(middle1 - 20);
myservo[1].write(middle2 + 20);
}
void stop()//后退函数
{
myservo[0].write(middle1);
myservo[1].write(middle2);
}
② 下面提供一个控制风扇转动与停止的参考例程(Test2.ino):
/*------------------------------------------------------------------------------------
版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.
Distributed under MIT license.See file LICENSE for detail or copy at
https://opensource.org/licenses/MIT
by 机器谱 2023-07-14 https://www.robotway.com/
------------------------------*/
void setup()
{
pinMode(5, OUTPUT);//设置引脚5的功能为输出
}
void loop()
{
WindStart();
delay(1000);
WindStop();
delay(1000);
}
void WindStart()//风扇旋转函数
{
digitalWrite(5, HIGH);//置高引脚5的输出电平
}
void WindStop()//风扇旋转停止函数
{
digitalWrite(5, LOW);//置低引脚5的输出电平
}
③ 下面提供一个超声波模块测试距离的参考例程(Test3.ino):
/*------------------------------------------------------------------------------------
版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.
Distributed under MIT license.See file LICENSE for detail or copy at
https://opensource.org/licenses/MIT
by 机器谱 2023-07-14 https://www.robotway.com/
------------------------------*/
#define ECHOPIN A3//使用宏定义对超声波模块连接的引脚进行定义
#define TRIGPIN 2
void setup()
{
Serial.begin(9600);//打开串口
pinMode(ECHOPIN, INPUT);
pinMode(TRIGPIN, OUTPUT);
}
void loop()
{
Serial.println(Distance());//串口打印距离
delay(500);
}
int Distance()//超声波距离测量函数,返回测量的距离
{
digitalWrite(TRIGPIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIGPIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGPIN, LOW);
int distance = pulseIn(ECHOPIN, HIGH);
distance= distance/58;
return distance;
}
④ 下面提供一个识别火焰的参考例程(Test4.ino):
/*------------------------------------------------------------------------------------
版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.
Distributed under MIT license.See file LICENSE for detail or copy at
https://opensource.org/licenses/MIT
by 机器谱 2023-07-14 https://www.robotway.com/
------------------------------*/
int pin[3] = {A0, A2, A4};//定义火焰传感器的引脚,此处用到了三个
int value[3]; //用于存储传感器的变量值
void setup()
{
SerialUSB.begin(9600);//打开串口
}
void loop()
{
for(int i=0; i<3; i++){//通过循环扫描读取传感器的值
value[i] = analogRead(pin[i]);//analogRead()用于读取传感器的AD值
}
SerialUSB.println(ValueDeal());//串口打印传感器的触发状态
delay(500);
}
int ValueDeal()//火焰传感器识别函数,根据返回值的不同可以判断传感器的触发状态
{
if(value[0] < 900 || value[1] < 900 || value[2] < 900){
if(value[0] < value[1]){
if(value [0] < value[2]){
return 0;//A0引脚连接的传感器触发
}
else
return 2;//A4引脚连接的传感器触发
}
else
{
if(value[1] < value[2]){
return 1;//A2引脚连接的传感器触发
}
else
return 2;
}
}
return 3;//无触发
}
⑤ 下面提供一个小车在行进间进行避障的参考例程(Test5.ino):
/*------------------------------------------------------------------------------------
版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.
Distributed under MIT license.See file LICENSE for detail or copy at
https://opensource.org/licenses/MIT
by 机器谱 2023-07-14 https://www.robotway.com/
------------------------------*/
#include <Servo.h>
#define ECHOPIN A3
#define TRIGPIN 2
#define middle1 105
#define middle2 89
int pin[3] = {A0, A2, A4};
int value[3];
Servo myservo[2];
void setup()
{
pinMode(ECHOPIN, INPUT);
pinMode(TRIGPIN, OUTPUT);
myservo[0].attach(4);
myservo[1].attach(3);
pinMode(5, OUTPUT);
}
void loop()
{
for(int i=0; i<3; i++){
value[i] = analogRead(pin[i]);
}
int distance = Distance();
switch (ValueDeal()) {//根据传感器处理函数的返回值进行相应的处理
case 0:
Left();
break;
case 1:
Forward();
break;
case 2:
Right();
break;
case 3:
if(distance < 10){//当小车距离障碍10CM时进行避障处理
Back();
delay(1000);
Left();
delay(500);
}
else
Forward();
break;
default:
Stop();
}
}
int ValueDeal()
{
if(value[0] < 900 || value[1] < 900 || value[2] < 900){
if(value[0] < value[1]){
if(value [0] < value[2]){
return 0;
}
else
return 2;
}
else
{
if(value[1] < value[2]){
return 1;
}
else
return 2;
}
}
return 3;
}
int Distance()
{
digitalWrite(TRIGPIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIGPIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGPIN, LOW);
int distance = pulseIn(ECHOPIN, HIGH, 14705);
distance = (int)(distance/58);
return distance;
}
void Forward()
{
myservo[0].write(middle1 - 30);
myservo[1].write(middle2 + 30);
}
void Back()
{
myservo[0].write(middle1 + 20);
myservo[1].write(middle2 - 20);
}
void Left()
{
myservo[0].write(middle1);
myservo[1].write(middle2 + 30);
}
void Right()
{
myservo[0].write(middle1 - 30);
myservo[1].write(middle2);
}
void Stop()
{
myservo[0].write(middle1);
myservo[1].write(middle2);
}
⑥ 下面提供一个实现灭火的完整程序(FireOffCar.ino):
/*------------------------------------------------------------------------------------
版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.
Distributed under MIT license.See file LICENSE for detail or copy at
https://opensource.org/licenses/MIT
by 机器谱 2023-07-14 https://www.robotway.com/
------------------------------*/
#include <Servo.h>
#define ECHOPIN A3
#define TRIGPIN 2
#define middle1 105
#define middle2 89
int pin[3] = {A0, A2, A4};
int value[3];
Servo myservo[2];
void setup()
{
SerialUSB.begin(9600);
pinMode(ECHOPIN, INPUT);
pinMode(TRIGPIN, OUTPUT);
myservo[0].attach(4);
myservo[1].attach(3);
pinMode(5, OUTPUT);
}
void loop()
{
for(int i=0; i<3; i++){
value[i] = analogRead(pin[i]);
}
int distance = Distance();
SerialUSB.println(distance);
switch (ValueDeal()) {
case 0:
Left();
break;
case 1:
Forward();
if(distance < 10){
while(analogRead(pin[1]) < 900){
Stop();
WindStart();
delay(2000);
}
}
break;
case 2:
Right();
break;
case 3:
if(distance < 10){
Back();
delay(1000);
Left();
delay(500);
}
else
Forward();
break;
default:
Stop();
}
WindStop();
}
int ValueDeal()
{
if(value[0] < 900 || value[1] < 900 || value[2] < 900){
if(value[0] < value[1]){
if(value [0] < value[2]){
return 0;
}
else
return 2;
}
else
{
if(value[1] < value[2]){
return 1;
}
else
return 2;
}
}
return 3;
}
int Distance()
{
digitalWrite(TRIGPIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIGPIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGPIN, LOW);
int distance = pulseIn(ECHOPIN, HIGH, 14705);
distance = (int)(distance/58);
return distance;
}
void WindStart()
{
digitalWrite(5, HIGH);
}
void WindStop()
{
digitalWrite(5, LOW);
}
void Forward()
{
myservo[0].write(middle1 - 30);
myservo[1].write(middle2 + 30);
}
void Back()
{
myservo[0].write(middle1 + 20);
myservo[1].write(middle2 - 20);
}
void Left()
{
myservo[0].write(middle1);
myservo[1].write(middle2 + 30);
}
void Right()
{
myservo[0].write(middle1 - 30);
myservo[1].write(middle2);
}
void Stop()
{
myservo[0].write(middle1);
myservo[1].write(middle2);
}
程序源代码资料详见 小型双轮差速底盘-灭火