Arduino案例实操 -- 智能巡防小车火焰检测功能扩展

Posted GenCoder

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Arduino案例实操 -- 智能巡防小车火焰检测功能扩展相关的知识,希望对你有一定的参考价值。

当小车可以自行完成巡线功能后,在有剩余空闲I/O口的情况下,还可以为巡线小车添加火焰检测功能,让它成为名副其实的 “巡防小车” !


4.1 添加器件

  • 火焰检测传感器 * 2
  • 继电器模块 * 1
  • 直流电机 * 1
  • 扇叶 * 1
  • 直流电机支架 * 1
  • 9g小型舵机 * 1
  • 杜邦线/导线若干

4.2 火焰传感器原理

4.2.1 功能说明

火焰传感器是机器人专门用来搜寻火源的传感器,当然火焰传感器也可以用来检测光线的亮度,只是本传感器对火焰特别灵敏。火焰传感器利用红外线对火焰非常敏感的特点,使用特制的红外线接受管来检测火焰,然后把火焰的亮度转化为高低变化的电平信号,输入到中央处理器中,中央处理器根据信号的变化做出相应的程序处理。

4.2.2 原理

火焰传感器:由各种燃烧生成物、中间物、高温气体、碳氢物质以及无机物质为主体的高温固体微粒构成的。火焰的热辐射具有离散光谱的气体辐射和连续光谱的固体辐射。不同燃烧物的火焰辐射强度、波长分布有所差异,但总体来说,其对应火焰温度的近红外波长域及紫外光域具有很大的辐射强度,根据这种特性可制成火焰传感器。

4.2.3 分类

  • 远红外火焰传感器
    功能用途:远红外火焰传感器可以用来探测火源或其它一些波长在700纳米~1000纳米范围内的热源。在机器人比赛中,远红外火焰探头起着非常重要的作用,它可以用作机器人的眼睛来寻找火源或足球。利用它可以制作灭火机器人、足球机器人等。
    原理介绍:远红外火焰传感器能够探测到波长在700纳米~1000纳米范围内的红外光,探测角度为60,其中红外光波长在880纳米附近时,其灵敏度达到最大。远红外火焰探头将外界红外光的强弱变化转化为电流的变化,通过A/D转换器反映为0~255范围内数值的变化。外界红外光越强,数值越小;红外光越弱,数值越大。
  • 紫外火焰传感器
    紫外火焰传感器可以用来探测火源发出的400纳米以下热辐射。原理介绍:通过下紫外光,可根据实际设定探测角度,紫外透射可见吸收玻璃(滤光片)能够探测到波长在400纳米范围以其中红外光波长在350纳米附近时,其灵敏度达到最大。紫外火焰探头将外界红外光的强弱变化转化为电流的变化,通过A/D转换器反映为0~255范围内数值的变化。外界紫外光越强,数值越小;紫外光越弱,数值越大。
    在这里插入图片描述

4.2.4 传感器安装

如图,火焰检测传感器成45度角安装在车头两侧,方便小车行走过程中进行火焰检测
在这里插入图片描述

4.3 风扇安装

一般在某宝采购的DIY小风扇都是直流电机+扇叶+电机底座,没有电机底座的小伙伴也可以自己3D打印一个或者直接用热熔胶固定在小车的小型舵机的转盘上,并将舵机安装在车头正上方

4.3.1 简陋支架安装

如图,博主在测试阶段是用一次性筷子折弯热熔胶固定来进行功能测试的
在这里插入图片描述

4.3.2 3D打印件支架安装

有条件的也可以采用3D打印件作为底座
在这里插入图片描述

注意,风扇朝向应该为朝下一定角度,而不是朝正前方,在角度确定时可以先固定在舵机上进行左右转动,观察风扇是否能朝向同侧的车轮外侧,因为车轮外侧是安放火点(蜡烛)的位置,要确保风扇能吹到且可以将火点吹灭的角度
直流电机(风扇)供电线的一段接在继电器上,通过控制继电器来控制风扇开关

4.4 火焰检测及灭火功能编程

为了不造成代码量繁杂不利阅读,以下代码基于智能巡防小车巡线编程基础上添加
定义风扇转动的舵机类对象

Servo FANServo;

定义风扇开关引脚(继电器引脚)和蜂鸣器引脚

int RelayPin = A5;				//风扇电机(继电器)引脚
int BuzzerPin = A0;				//蜂鸣器引脚

添加风扇舵机控制函数

//风扇转动角度控制
void FANTurn(short angle)
{
	FANServo.write(angle);
	LastServoFAngle = angle;
}

创建火焰状态值变量

bool FireState = false;

获取火焰传感器的状态来控制风扇的开关,编写火焰检测函数

//火焰检测状态获取
bool FireStateGet()
{
	if(!(digitalRead(FireSensor_Left) && digitalRead(FireSensor_Right)))
		FireState = true;
	else if(digitalRead(FireSensor_Left) && digitalRead(FireSensor_Right))
		FireState = false;

	return FireState;
}

风扇灭火函数,当左侧或者右侧火焰传感器检测到火源时,控制风扇持续小范围转动吹灭火焰

//风扇灭火函数
void FireFighting()
{
		//增加灭火时长
		for(int i = 1;i<100;i++){
			if(FireStateGet() == false){
				RunOrder = false;
				delay(10);
			
				return;
			}
	}

		//小车停止行走并进行蜂鸣器提示
	CarStop();
		digitalWrite(BuzzerPin, LOW);
		delay(500);
		digitalWrite(BuzzerPin, HIGH);
	
		//持续灭火
		while(!(digitalRead(FireSensor_Left))){
		RunOrder = false;
		FANControl(1);
		for(int i = 110; i<=160; i+=5){
			FANTurn(i);
		    delay(25);
		}
		for(int i = 160;i>=110;i-=5){
			FANTurn(i);
		    delay(25);
		}
		// delay(1000);
	}
	while(!(digitalRead(FireSensor_Right))){
		RunOrder = false;
		FANControl(1);
		for(int i = 70; i>=20; i-=5){
		    FANTurn(i);
		    delay(25);
		}
		for(int i = 20;i<=70;i+=5){
			FANTurn(i);
		    delay(25);
		}
	}
	
	//风扇方向复位,风扇停转
	delay(350);
	FANTurn(90);
	FANControl(0);
}

setup函数中,对风扇(继电器)引脚初始化,蜂鸣器引脚初始化,火焰传感器引脚初始化,舵机引脚及角度初始化等配置

//setup函数
void setup()
{
//初始化风扇舵机引脚及初始角度
FANServo.attach(A1);
FANServo.write(90);

  	//初始化火焰传感器IO口为输入模式
  	pinMode(FireSensor_Left, INPUT);
  	pinMode(FireSensor_Right, INPUT);
  	
  	//初始化风扇电机IO为输出模式
  	pinMode(RelayPin, OUTPUT);
  	digitalWrite(RelayPin, LOW);

  	//初始化蜂鸣器IO为输出模式
  	pinMode(BuzzerPin, OUTPUT);
  	digitalWrite(BuzzerPin, HIGH);
  	delay(50);	
}

loop函数中,在巡线的同时进行火源检测

//loop函数
void loop()
{
		if(FireStateGet() == false)			OpenMV_LinePatrol();
		else if(FireStateGet() == true) 	FireFighting();
}

烧录代码之后可以根据实际效果再做代码微调

以上是关于Arduino案例实操 -- 智能巡防小车火焰检测功能扩展的主要内容,如果未能解决你的问题,请参考以下文章

Arduino案例实操 -- 智能巡防小车图形化巡线小车编程

Arduino案例实操 -- 智能巡防小车小车APP功能扩展

智能小车23:检测电压模块实验

用PID和Arduino,怎么让小车走直线,自动同步左右轮胎的速度?

Arduino智能小车--只是随便一搞

智能小车-Arduino IDE使用说明