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功能扩展