极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2296|回复: 0

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

[复制链接]
发表于 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):
  1. /*------------------------------------------------------------------------------------

  2.   版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.

  3.            Distributed under MIT license.See file LICENSE for detail or copy at

  4.            https://opensource.org/licenses/MIT

  5.            by 机器谱 2023-07-14 https://www.robotway.com/

  6.   ------------------------------*/

  7. #include <Servo.h>//调用舵机库函数


  8. #define middle1 105//定义对应舵机的中间值,即停止转动的值

  9. #define middle2 89//此值需要测量,各个舵机不一定相同


  10. Servo myservo[2];//声明舵机类数组,用于控制的两个舵机


  11. void setup()

  12. {

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

  14. myservo[1].attach(3);

  15. }


  16. void loop()

  17. {

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

  19. delay(1000);//延时函数


  20. Right();

  21. delay(1000);


  22. Forwards();

  23. delay(1000);


  24. stop();

  25. delay(1000);

  26. }


  27. void Left()//左转函数

  28. {

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

  30. myservo[1].write(middle2 + 20);

  31. }


  32. void Right()//右转函数

  33. {

  34. myservo[0].write(middle1 - 20);

  35. myservo[1].write(middle2);

  36. }


  37. void Forwards()//前进函数

  38. {

  39. myservo[0].write(middle1 - 20);

  40. myservo[1].write(middle2 + 20);

  41. }


  42. void stop()//后退函数

  43. {

  44. myservo[0].write(middle1);

  45. myservo[1].write(middle2);

  46. }
复制代码

② 下面提供一个控制风扇转动与停止的参考例程(Test2.ino):
  1. /*------------------------------------------------------------------------------------

  2.   版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.

  3.            Distributed under MIT license.See file LICENSE for detail or copy at

  4.            https://opensource.org/licenses/MIT

  5.            by 机器谱 2023-07-14 https://www.robotway.com/

  6.   ------------------------------*/

  7. void setup()

  8. {

  9. pinMode(5, OUTPUT);//设置引脚5的功能为输出

  10. }


  11. void loop()

  12. {

  13. WindStart();

  14. delay(1000);


  15. WindStop();

  16. delay(1000);

  17. }


  18. void WindStart()//风扇旋转函数

  19. {

  20. digitalWrite(5, HIGH);//置高引脚5的输出电平

  21. }


  22. void WindStop()//风扇旋转停止函数

  23. {

  24. digitalWrite(5, LOW);//置低引脚5的输出电平

  25. }
复制代码

③ 下面提供一个超声波模块测试距离的参考例程(Test3.ino):
  1. /*------------------------------------------------------------------------------------

  2.   版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.

  3.            Distributed under MIT license.See file LICENSE for detail or copy at

  4.            https://opensource.org/licenses/MIT

  5.            by 机器谱 2023-07-14 https://www.robotway.com/

  6.   ------------------------------*/

  7. #define ECHOPIN A3//使用宏定义对超声波模块连接的引脚进行定义

  8. #define TRIGPIN 2

  9. void setup()

  10. {

  11.   Serial.begin(9600);//打开串口

  12.   pinMode(ECHOPIN, INPUT);

  13.   pinMode(TRIGPIN, OUTPUT);

  14. }


  15. void loop()

  16. {

  17.   Serial.println(Distance());//串口打印距离

  18.   delay(500);

  19. }


  20. int Distance()//超声波距离测量函数,返回测量的距离

  21. {

  22. digitalWrite(TRIGPIN, LOW);

  23.   delayMicroseconds(2);

  24.   digitalWrite(TRIGPIN, HIGH);

  25.   delayMicroseconds(10);

  26.   digitalWrite(TRIGPIN, LOW);

  27.   int distance = pulseIn(ECHOPIN, HIGH);

  28.   distance= distance/58;

  29.   return distance;

  30. }
复制代码

④ 下面提供一个识别火焰的参考例程(Test4.ino):
  1. /*------------------------------------------------------------------------------------

  2.   版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.

  3.            Distributed under MIT license.See file LICENSE for detail or copy at

  4.            https://opensource.org/licenses/MIT

  5.            by 机器谱 2023-07-14 https://www.robotway.com/

  6.   ------------------------------*/

  7. int pin[3] = {A0, A2, A4};//定义火焰传感器的引脚,此处用到了三个

  8. int value[3]; //用于存储传感器的变量值


  9. void setup()

  10. {

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

  12. }


  13. void loop()

  14. {

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

  16.     value[i] = analogRead(pin[i]);//analogRead()用于读取传感器的AD值

  17. }

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

  19.     delay(500);

  20. }


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

  22. {

  23. if(value[0] < 900 || value[1] < 900 || value[2] < 900){

  24.     if(value[0] < value[1]){

  25.         if(value [0] < value[2]){

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

  27.         }

  28.         else

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

  30.     }

  31.     else

  32.     {

  33.     if(value[1] < value[2]){

  34.         return 1;//A2引脚连接的传感器触发

  35.     }

  36.     else

  37.     return 2;

  38.     }

  39. }

  40. return 3;//无触发

  41. }
复制代码

⑤ 下面提供一个小车在行进间进行避障的参考例程(Test5.ino):
  1. /*------------------------------------------------------------------------------------

  2.   版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.

  3.            Distributed under MIT license.See file LICENSE for detail or copy at

  4.            https://opensource.org/licenses/MIT

  5.            by 机器谱 2023-07-14 https://www.robotway.com/

  6.   ------------------------------*/

  7. #include <Servo.h>


  8. #define ECHOPIN A3

  9. #define TRIGPIN 2

  10. #define middle1 105

  11. #define middle2 89


  12. int pin[3] = {A0, A2, A4};

  13. int value[3];

  14. Servo myservo[2];


  15. void setup()

  16. {

  17. pinMode(ECHOPIN, INPUT);

  18.   pinMode(TRIGPIN, OUTPUT);

  19. myservo[0].attach(4);

  20. myservo[1].attach(3);

  21. pinMode(5, OUTPUT);

  22. }


  23. void loop()

  24. {

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

  26.     value[i] = analogRead(pin[i]);

  27. }


  28. int distance = Distance();


  29. switch (ValueDeal()) {//根据传感器处理函数的返回值进行相应的处理

  30. case 0:

  31. Left();

  32. break;

  33.     case 1:

  34.     Forward();

  35.       break;

  36.     case 2:

  37.         Right();

  38.         break;

  39.     case 3:

  40.     if(distance < 10){//当小车距离障碍10CM时进行避障处理

  41.     Back();

  42.     delay(1000);

  43.         Left();

  44.         delay(500);

  45.     }

  46.     else

  47.     Forward();

  48.     break;

  49.     default:

  50.     Stop();

  51. }

  52. }


  53. int ValueDeal()

  54. {

  55. if(value[0] < 900 || value[1] < 900 || value[2] < 900){

  56.     if(value[0] < value[1]){

  57.         if(value [0] < value[2]){

  58.             return 0;

  59.         }

  60.         else

  61.         return 2;

  62.     }

  63.     else

  64.     {

  65.     if(value[1] < value[2]){

  66.         return 1;

  67.     }

  68.     else

  69.     return 2;

  70.     }

  71. }

  72. return 3;

  73. }


  74. int Distance()

  75. {

  76. digitalWrite(TRIGPIN, LOW);

  77.     delayMicroseconds(2);

  78.     digitalWrite(TRIGPIN, HIGH);

  79.     delayMicroseconds(10);

  80.     digitalWrite(TRIGPIN, LOW);

  81.     int distance = pulseIn(ECHOPIN, HIGH, 14705);

  82.     distance = (int)(distance/58);

  83.     return distance;

  84. }


  85. void Forward()

  86. {

  87. myservo[0].write(middle1 - 30);

  88. myservo[1].write(middle2 + 30);

  89. }

  90. void Back()

  91. {

  92. myservo[0].write(middle1 + 20);

  93. myservo[1].write(middle2 - 20);

  94. }


  95. void Left()

  96. {

  97. myservo[0].write(middle1);

  98. myservo[1].write(middle2 + 30);

  99. }


  100. void Right()

  101. {

  102. myservo[0].write(middle1 - 30);

  103. myservo[1].write(middle2);

  104. }


  105. void Stop()

  106. {

  107. myservo[0].write(middle1);

  108. myservo[1].write(middle2);

  109. }
复制代码

⑥ 下面提供一个实现灭火的完整程序(FireOffCar.ino):
  1. /*------------------------------------------------------------------------------------

  2.   版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.

  3.            Distributed under MIT license.See file LICENSE for detail or copy at

  4.            https://opensource.org/licenses/MIT

  5.            by 机器谱 2023-07-14 https://www.robotway.com/

  6.   ------------------------------*/

  7. #include <Servo.h>


  8. #define ECHOPIN A3

  9. #define TRIGPIN 2

  10. #define middle1 105

  11. #define middle2 89


  12. int pin[3] = {A0, A2, A4};

  13. int value[3];

  14. Servo myservo[2];


  15. void setup()

  16. {

  17. SerialUSB.begin(9600);

  18. pinMode(ECHOPIN, INPUT);

  19.   pinMode(TRIGPIN, OUTPUT);

  20. myservo[0].attach(4);

  21. myservo[1].attach(3);

  22. pinMode(5, OUTPUT);

  23. }


  24. void loop()

  25. {

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

  27.     value[i] = analogRead(pin[i]);

  28. }


  29. int distance = Distance();

  30. SerialUSB.println(distance);


  31. switch (ValueDeal()) {

  32. case 0:

  33. Left();

  34. break;

  35.     case 1:

  36.     Forward();   

  37.     if(distance < 10){

  38.         while(analogRead(pin[1]) < 900){

  39.             Stop();

  40.             WindStart();

  41.             delay(2000);

  42.         }

  43.     }

  44.       break;

  45.     case 2:

  46.         Right();

  47.         break;

  48.     case 3:

  49.     if(distance < 10){

  50.     Back();

  51.     delay(1000);

  52.         Left();

  53.         delay(500);

  54.     }

  55.     else

  56.     Forward();

  57.     break;

  58.     default:

  59.     Stop();

  60. }

  61. WindStop();

  62. }


  63. int ValueDeal()

  64. {

  65. if(value[0] < 900 || value[1] < 900 || value[2] < 900){

  66.     if(value[0] < value[1]){

  67.         if(value [0] < value[2]){

  68.             return 0;

  69.         }

  70.         else

  71.         return 2;

  72.     }

  73.     else

  74.     {

  75.     if(value[1] < value[2]){

  76.         return 1;

  77.     }

  78.     else

  79.     return 2;

  80.     }

  81. }

  82. return 3;

  83. }


  84. int Distance()

  85. {

  86. digitalWrite(TRIGPIN, LOW);

  87.     delayMicroseconds(2);

  88.     digitalWrite(TRIGPIN, HIGH);

  89.     delayMicroseconds(10);

  90.     digitalWrite(TRIGPIN, LOW);

  91.     int distance = pulseIn(ECHOPIN, HIGH, 14705);

  92.     distance = (int)(distance/58);

  93.     return distance;

  94. }


  95. void WindStart()

  96. {

  97. digitalWrite(5, HIGH);

  98. }


  99. void WindStop()

  100. {

  101. digitalWrite(5, LOW);

  102. }


  103. void Forward()

  104. {

  105. myservo[0].write(middle1 - 30);

  106. myservo[1].write(middle2 + 30);

  107. }

  108. void Back()

  109. {

  110. myservo[0].write(middle1 + 20);

  111. myservo[1].write(middle2 - 20);

  112. }


  113. void Left()

  114. {

  115. myservo[0].write(middle1);

  116. myservo[1].write(middle2 + 30);

  117. }


  118. void Right()

  119. {

  120. myservo[0].write(middle1 - 30);

  121. myservo[1].write(middle2);

  122. }


  123. void Stop()

  124. {

  125. myservo[0].write(middle1);

  126. myservo[1].write(middle2);

  127. }
复制代码

5. 资料下载

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



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-2 02:54 , Processed in 0.041945 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表