本帖最后由 机器谱 于 2023-7-31 10:19 编辑
1. 功能说明
灭火机器人是一种特殊的机器人,专门用于进行火灾扑救和灭火任务。它们通常具备以下功能和特点:
① 火灾侦测:灭火机器人配备了各种传感器和探测设备,可以检测烟雾、温度升高等火灾迹象。
② 火灾扑救:灭火机器人可携带水枪或干粉喷射器等扑救工具,能够快速响应并灭除小型火灾或控制火势。
③ 自主导航:灭火机器人通常拥有自主导航和避障系统,能够在火灾现场进行移动和操作,同时规避障碍物。
④ 远程操作:由于火灾环境通常危险且恶劣,灭火机器人通常可以通过遥控或预设指令来进行操作,使人员可以在安全区域远程操控。
⑤ 视频监控:一些灭火机器人还配备了摄像头或红外传感器,能够实时传输图像或视频给指挥中心,以辅助决策和情报收集。
⑥ 多种应用场景:灭火机器人广泛应用于各类场所,如工厂、仓库、地下车库、建筑物、船舶等,帮助人们更有效地对抗火灾。
本文示例将实现当R023样机小型双轮差速底盘机器人检测到火源时进行灭火的一个功能。
2. 结构装配
按照下图所示方式进行安装:
3. 电子硬件
在这个示例中,我们采用了以下硬件,请大家参考:
主控板 | Basra主控板(兼容Arduino Uno)
| 扩展板 | Bigfish2.1扩展板
| 传感器 | 超声测距模块 | 火焰传感器 | 电池 | 7.4V锂电池 | 其它 | 风扇、马达驱动 |
按照下图所示方式进行电路连接:
4. 功能实现
编程环境:Arduino 1.8.19
① 下面提供一个控制小车前后左右停的参考例程(Test1.ino):
② 下面提供一个控制风扇转动与停止的参考例程(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);
- }
复制代码
5. 资料下载
资料内容:程序源代码
资料下载地址:小型双轮差速底盘-灭火 https://www.robotway.com/h-col-113.html
|