机器谱 发表于 2023-7-31 10:19:14

小型双轮差速底盘机器人实现灭火功能

本帖最后由 机器谱 于 2023-7-31 10:19 编辑

1. 功能说明
灭火机器人是一种特殊的机器人,专门用于进行火灾扑救和灭火任务。它们通常具备以下功能和特点:
       ① 火灾侦测:灭火机器人配备了各种传感器和探测设备,可以检测烟雾、温度升高等火灾迹象。
       ② 火灾扑救:灭火机器人可携带水枪或干粉喷射器等扑救工具,能够快速响应并灭除小型火灾或控制火势。
       ③ 自主导航:灭火机器人通常拥有自主导航和避障系统,能够在火灾现场进行移动和操作,同时规避障碍物。
       ④ 远程操作:由于火灾环境通常危险且恶劣,灭火机器人通常可以通过遥控或预设指令来进行操作,使人员可以在安全区域远程操控。
       ⑤ 视频监控:一些灭火机器人还配备了摄像头或红外传感器,能够实时传输图像或视频给指挥中心,以辅助决策和情报收集。
       ⑥ 多种应用场景:灭火机器人广泛应用于各类场所,如工厂、仓库、地下车库、建筑物、船舶等,帮助人们更有效地对抗火灾。

      本文示例将实现当R023样机小型双轮差速底盘机器人检测到火源时进行灭火的一个功能。

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;//声明舵机类数组,用于控制的两个舵机


void setup()

{

myservo.attach(4);//绑定舵机的输出引脚

myservo.attach(3);

}


void loop()

{

Left();//调用左转函数

delay(1000);//延时函数


Right();

delay(1000);


Forwards();

delay(1000);


stop();

delay(1000);

}


void Left()//左转函数

{

myservo.write(middle1);//输出相应的舵机参数,使舵机运行

myservo.write(middle2 + 20);

}


void Right()//右转函数

{

myservo.write(middle1 - 20);

myservo.write(middle2);

}


void Forwards()//前进函数

{

myservo.write(middle1 - 20);

myservo.write(middle2 + 20);

}


void stop()//后退函数

{

myservo.write(middle1);

myservo.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 = {A0, A2, A4};//定义火焰传感器的引脚,此处用到了三个

int value; //用于存储传感器的变量值


void setup()

{

SerialUSB.begin(9600);//打开串口

}


void loop()

{

for(int i=0; i<3; i++){//通过循环扫描读取传感器的值

    value = analogRead(pin);//analogRead()用于读取传感器的AD值

}

    SerialUSB.println(ValueDeal());//串口打印传感器的触发状态

    delay(500);

}


int ValueDeal()//火焰传感器识别函数,根据返回值的不同可以判断传感器的触发状态

{

if(value < 900 || value < 900 || value < 900){

    if(value < value){

      if(value < value){

            return 0;//A0引脚连接的传感器触发

      }

      else

      return 2;//A4引脚连接的传感器触发

    }

    else

    {

    if(value < value){

      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 = {A0, A2, A4};

int value;

Servo myservo;


void setup()

{

pinMode(ECHOPIN, INPUT);

pinMode(TRIGPIN, OUTPUT);

myservo.attach(4);

myservo.attach(3);

pinMode(5, OUTPUT);

}


void loop()

{

for(int i=0; i<3; i++){

    value = analogRead(pin);

}


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 < 900 || value < 900 || value < 900){

    if(value < value){

      if(value < value){

            return 0;

      }

      else

      return 2;

    }

    else

    {

    if(value < value){

      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.write(middle1 - 30);

myservo.write(middle2 + 30);

}

void Back()

{

myservo.write(middle1 + 20);

myservo.write(middle2 - 20);

}


void Left()

{

myservo.write(middle1);

myservo.write(middle2 + 30);

}


void Right()

{

myservo.write(middle1 - 30);

myservo.write(middle2);

}


void Stop()

{

myservo.write(middle1);

myservo.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 = {A0, A2, A4};

int value;

Servo myservo;


void setup()

{

SerialUSB.begin(9600);

pinMode(ECHOPIN, INPUT);

pinMode(TRIGPIN, OUTPUT);

myservo.attach(4);

myservo.attach(3);

pinMode(5, OUTPUT);

}


void loop()

{

for(int i=0; i<3; i++){

    value = analogRead(pin);

}


int distance = Distance();

SerialUSB.println(distance);


switch (ValueDeal()) {

case 0:

Left();

break;

    case 1:

    Forward();   

    if(distance < 10){

      while(analogRead(pin) < 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 < 900 || value < 900 || value < 900){

    if(value < value){

      if(value < value){

            return 0;

      }

      else

      return 2;

    }

    else

    {

    if(value < value){

      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.write(middle1 - 30);

myservo.write(middle2 + 30);

}

void Back()

{

myservo.write(middle1 + 20);

myservo.write(middle2 - 20);

}


void Left()

{

myservo.write(middle1);

myservo.write(middle2 + 30);

}


void Right()

{

myservo.write(middle1 - 30);

myservo.write(middle2);

}


void Stop()

{

myservo.write(middle1);

myservo.write(middle2);

}
5. 资料下载
资料内容:程序源代码
资料下载地址:小型双轮差速底盘-灭火 https://www.robotway.com/h-col-113.html



页: [1]
查看完整版本: 小型双轮差速底盘机器人实现灭火功能