小型双轮差速底盘灭火功能的实现

news2024/9/23 9:33:00

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);

}

程序源代码资料详见 小型双轮差速底盘-灭火

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/814695.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

cadence virtuoso layout MOS串联线在layout中合并(merge)掉

如图&#xff0c;net10合并掉 解决办法&#xff1a; shiftE&#xff0c;取消勾选Abut server&#xff0c;save

第六章应用层

1.应用层概述 应用层是计算机网络体系结构的最顶层&#xff0c;是设计和建立计算机网络的最终目的&#xff0c;也是计算机网络中发展最快的部分。 早期基于文本的应用(电子邮件、远程登录、文件传输、新闻组) 20世纪90年代将因特网带入千家万户的万维网www 当今流行的即时通信…

彻底解决IDEA输出中文乱码问题

本文一共有3种方法&#xff0c;针对的情况是输出中文乱码问题 问题描述 无法正确输出中文字符&#xff1a;&#xff08;请正确分辨自己是哪一种乱码问题&#xff01;&#xff09; 解决方法 1、最容易想到 File -> Settings -> File Encodings下设置编码格式为UTF-8…

安卓:JzvdStd——网络视频播放器

目录 一、JzvdStd介绍 JzvdStd的特点和功能&#xff1a; JzvdStd常用方法&#xff1a; 二、JzvdStd使用 1、补充知识&#xff1a; 例子&#xff1a; MainActivity &#xff1a; VideoPageAdapter &#xff1a; activity_main&#xff1a; video_page&#xff1a; …

如何在C#中处理空值

在任何编程语言中开发应用程序时&#xff0c;经常会遇到空异常或空引用异常。空指针或空引用是指不引用有效的内存位置或对象的指针。这是一个困扰程序员已经很久的问题&#xff0c;自从程序员开始编写程序以来。空值是一个特殊的值&#xff0c;表示没有有效值可用。当将空值赋…

hbuilderx主题色分享-github风格

效果 步骤 hbuilderx总共有三种主题&#xff0c;绿柔主题Default,酷黑主题Monokai,雅黑主题Atom One Dark,修改主题色是基于三种主题之一的&#xff0c;不能直接创建一个新主题&#xff0c;比如下方配置是基于Atom One Dark(对象名为[Atom One Dark])&#xff0c;则当前hbuild…

【Sortable】前端拖拽库 | 简洁 | 实用 | 强大

前言 官网 - http://www.sortablejs.com/index.html中文文档 - https://www.itxst.com/sortablejs/neuinffi.htmlnpm - https://www.npmjs.com/package/sortablejs npm下载 npm i sortablejsumd <script src"https://www.itxst.com/package/sortable/sortable.min.js…

达梦数据库食用说明

环境准备 达梦数据库支持Windows、Linux和Unix操作系统&#xff0c;达梦正式版需要授权&#xff0c;我们学习的话选择试用即可&#xff0c;在本机使用VM安装一个Centos&#xff0c;然后去达梦官网下载适用自己平台的安装包。 本教程使用的是VM安装的centos7.9。所以选择X86架…

伯俊ERP与金蝶云星空对接集成表头表体组合查询连通应付单新增(应付单(伯俊)(KD 应付单)ok)

伯俊ERP与金蝶云星空对接集成表头表体组合查询连通应付单新增(应付单(伯俊)&#xff08;KD 应付单&#xff09;ok) 数据源系统:伯俊ERP 伯俊科技&#xff0c;依托在企业信息化建设方面的领先技术与实践积累&#xff0c;致力于帮助企业实现全渠道一盘货。伯俊提供数字经营的咨询…

经典文献阅读之--NoPe-NeRF(优化无位姿先验的神经辐射场)

0. 简介 在没有预先计算相机姿态的情况下训练神经辐射场&#xff08;NeRF&#xff09;是具有挑战性的。最近在这个方向上的进展表明&#xff0c;在前向场景中可以联合优化NeRF和相机姿态。然而&#xff0c;这些方法在剧烈相机运动时仍然面临困难。我们通过引入无畸变单目深度先…

SZMMSZ5246BT1G 稳压二极管(齐纳Zener二极管)的特性和应用详解

关于齐纳二极管&#xff1a;是一种特殊的二极管&#xff0c;也被称为肖特基二极管&#xff08;Schottky Diode&#xff09;。它是由金属与半导体材料的结合构成的。与普通的PN结二极管不同&#xff0c;齐纳二极管的结由金属与半导体材料组成&#xff0c;而不是两个不同的半导体…

菜单 vue3 h函数创建组件

目录 index/.vue <template><div class"menu_table"><divclass"table_row"v-for"(item, index) in menuList"click"item.disabled ! true && itemClick(item)"><!-- :style"{border-top:item.line…

一文了解DMX512透明屏的工作原理

DMX512透明屏是一种新型的显示屏技术&#xff0c;它采用了DMX512控制协议&#xff0c;可以实现透明显示效果。 DMX512是一种数字控制协议&#xff0c;常用于舞台灯光和音响设备的控制&#xff0c;通过DMX512控制器可以实现对透明屏的亮度、颜色、动画等参数的调节。 DMX512透明…

泛微最新漏洞汇总

泛微 e-cology 前台SQL注入漏洞 app.name"泛微 e-cology 9.0 OA" 验证poc: POST /weaver/weaver.file.FileDownloadForOutDoc HTTP/1.1 Host: {{Hostname}} Accept: */* Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q0.9 Connection: close …

探索前端图片如何携带token进行验证

前言 图片在前端开发中扮演了重要的角色&#xff0c;它们不仅仅是美观的元素&#xff0c;还可以传递信息和激发用户的兴趣。随着应用场景的增多&#xff0c;前端开发人员就需要在图片加载过程中携带验证的信息。如 token&#xff0c;用于身份验证、权限控制等方面。通过在图片的…

揭示C语言中CPU对register变量分配的决策过程

揭示C语言中CPU对register变量分配的决策过程 博主简介一、引言1.1、register变量的定义和用途1.2、CPU对register变量分配的重要性 二、CPU寄存器分配的概述2.1、CPU寄存器的作用和程序执行过程中的角色2.2、不同类型的CPU寄存器&#xff08;通用寄存器、特殊寄存器等&#xf…

redis基础总结(数据类型)

Redis十大数据类型 String String 是redis最基本数据类型,一个key对应一个value. String类型是二进制安全的,意思是Redis的string类型可以包含任何数据,比如jpg图片或者序列化的对象; String类型是最基本的数据类型,一个redis中字符串value最多是512M; String类型在redis底层…

【已解决】span的宽度与高度如何设置

本博文源于笔者基础不扎实的情况下遇到的一个问题&#xff0c;问题是我有三个span&#xff0c;想让它们宽度与高度再大点&#xff0c;结果发现怎样设置都设置不了。最后不经意间解决问题 文章目录 1、问题再现2、解决方案3、解决效果 1、问题再现 <span>1</span>…

邪恶版ChatGPT来了!

「邪恶版」ChatGPT 出现&#xff1a;每月 60 欧元&#xff0c;毫无道德限制&#xff0c;专为“网络罪犯”而生。 WormGPT 并不是一个人工智能聊天机器人&#xff0c;它的开发目的不是为了有趣地提供无脊椎动物的人工智能帮助&#xff0c;就像专注于猫科动物的CatGPT一样。相反&…

一份热乎乎的字节面试真题

一份热乎乎的字节面试真题 说说Redis为什么快 基于内存存储实现 内存读写是比在磁盘快很多的&#xff0c;Redis基于内存存储实现的数据库&#xff0c;相对于数据存在磁盘的MySQL数据库&#xff0c;省去磁盘I/O的消耗。 高效的数据结构 Mysql索引为了提高效率&#xff0c;选…