智能灭火车(A题)
所在学院:电气信息工程学院
小组成员:
指导教师:
2015年11月13日
摘 要
本次设计以STM32作为主控芯片,利用红处开关管探测障碍物,使得小车能够避开障碍,利用火焰传感器找到火源,从而做出灭火动作。完成了作品基本功能要求。
随着社会与国家的发展,在经济迅速增长的同时,各种危险场所不可避免的火灾频繁出现,给社会安全造成了很多隐患,于是现代火灾及时补救已成为迫在眉睫需要解决的问题,救火早一刻就少一分损失,消防救援人员固然速度已经很快,但也需要一段不小的时间,而且进入救火现场还有生命危险的可能,于是智能灭火小车的理念诞生了。 本设计主要就是针对智能灭火车的单片机控制与制作进行研究。通过对灭火机器人国内外研究现状的分析,进行了智能灭火车包括硬件方案和软件方案的整体方案设计,具体就驱动电机、传感器等进行了分析比较。电源电路提供系统所需的工作电源,L298N电机驱动芯片驱动电机控制小车揣测不同方向的前进后退以及转向,红外传感器模块完成寻迹和避障,火焰传感器检测火焰,灭火风扇进行灭火。本系统硬件配置合理,控制方案优化,实现了智能灭火车在不同的外部坏境下的循迹、避障和灭火的准确控制。本设计制作的灭火机器人具有简易灭火功能,达到了实现现场灭火的目的。
关键词:智能小车 红外接近开关 PWM 火焰传感器 红外对管
目 录
一、系统方案 1
1、循迹模块的论证与选择 1
2、电机驱动模块的论证与选择 1
3、寻找火源模块的论证与选择 2
二、系统理论分析与计算 2
1、循迹方法种类的的分析 2
2、利用延时控制小车转动角度的计算 2
三、电路与程序设计 3
1、电路的设计 3
(1)系统总体框图 3
(2)电路原理图 3
(4)电源 4
2、程序的设计 4
(1)程序功能描述与设计思路 4
(2)主程序流程图 5
四、测试方案与测试结果 6
1、测试方案 6
2、测试条件与仪器 6
五、结论与心得 6
六、参考文献 7
附录1:实物图 8
附录2:源程序 9
智能灭火小车(A题)
一、系统方案
本系统主要由循迹模块、避障模块、寻源模块、电源模块、电机驱动模块组成,下面分别论证这几个模块的选择。
1、循迹模块的论证与选择
方案一:采用发光二极管加光敏电阻。易受到外界光源的干扰,有时甚至检测不到黑线,主要因为可见光的反射效果跟地表的平坦程度,地表材料的反射情况均对检测效果产生直接影响。
方案二:采用CCD传感器,此种方法虽然能对路面信息进行准确完备的反应,但它存在信息处理满,实时性差等缺点,因此若采用CCD传感器,无疑会加重单片机的处理负担,不利于实现更好的控制策略
方案三:用红外对管作为寻迹传感器。红外反射式传感器由1个红外发射管(发射器)和1个光电二极管(接收器)构成。红外发射管发出的红外光在遇到反光性较强的物体(表面为白色或近白色)后被折回,被光电二极管接收到,引起光电二极管光生电流的增大。将这个变化转为电压信号,该电压通过比较器LM339后转换为高电平(单片机的有效电平),检测出白线;若接收不到发射管发出的光线则输出为低电压,该电压通过比较器LM339后转换为低电平(单片机的有效电平),检测出黑线,且红外对管使用方便,
综合以上三种方案,选择方案三。
2、电机驱动模块的论证与选择
方案一:采用分立组件组成的平衡式驱动电路。可以由单片机直接对其进行控制,但由于分立组件占空间较大,考虑到电机的体积问题,还需要继电器,此方案不够理想
方案二:采用L298N电机驱动模块。此模块工作较稳定,且编程简单,体积小,内部集成了两个H桥,可以同时控制两个电机。硬件实现较简单。
综合以上二种方案,选择方案二。
3、寻找火源模块的论证与选择
方案一:采用超声波。能检测到障碍物但不能准确的检测到光源 。
方案二:采用火焰传感器。火焰传感器能够探测到波长在700纳米~1000纳米范围内的红外光,探测角度为60,其中红外光波长在880纳米附近时候的灵敏度达到最大。远红外火焰探头将外界红外光的强弱变化转化为电流的变化,通过A/D转换器反映为0~255范围内数值的变化。外界红外光越强,数值越小;反之则越大。
综合考虑采用方案二。
二、系统理论分析与计算
1、循迹方法种类的的分析
我们利用红外传感器来进行循迹,红外传感器上有七个灯,我们选择其中的几个灯进行组合,来达到按特定路线循迹的目的。
2、利用延时控制小车转动角度的计算
在小车行进过程中,有时需要转动不同的角度,而这个角度的控制是利用延时来实现的。通过多次测量实验,确定一定的角度,并进行记录,从而实现要求。
三、电路与程序设计
1、电路的设计
(1)系统总体框图
图1 系统总体框图
(2)电路原理图
图2 红外对管电路
图3 红外接近开关电路
图4 火焰传感器电路
(4)电源
电源由变压部分、滤波部分、稳压部分组成。为整个系统提供7.2V电压,确保电路的正常稳定工作。
2、程序的设计
(1)程序功能描述与设计思路
1、程序功能描述
根据题目要求软件部分主要实现循迹、避障、寻源、灭火等功能。
1)循迹:利用红外对管对黑线的反应,进行控制。
2)避障:利用红外接近开关检测障碍物,让小车进行一定的躲避。
3) 寻源:采用火焰传感器寻找火焰。
4)灭火:自制小风扇进行灭火。
2、程序设计思路
根据题目,场地中有很多黑线构成网格,于是我们便想到了利用黑线的条数去控制小车的前进后退,以达到比赛要求,发挥部分我们 利用上避障功能,并且我们自己制作了适合本比赛的风扇,使得灭火效果更好,更符合题目要求。
(2)主程序流程图
四、测试方案与测试结果
1、测试方案
(1)硬件测试:调节红外接近开关、火焰传感器的灵敏度,使其相互配合以达到最好效果。
(2)软件仿真测试:通过仿真反复地对程序进行修改,以达到理想效果。
(3)硬件软件联调
2、测试条件与仪器
测试条件:检查多次,仿真电路和硬件电路必须与系统原理图完全相同,并且检查无误,硬件电路保证无虚焊。
测试仪器:高精度的数字毫伏表,模拟示波器,数字示波器,数字万用表,指针式万用表。
五、结论与心得
通过这次比赛我们明白了,任何好成绩的取得都建立在充分的准备之上,只有准备的充分,在面临困难时才显得没有那么畏惧。要有团队精神,多多听取他人的建议,把自己的真实水平发挥出来。
我们还知道了,在比赛中,要表现出真实的自己,欣赏自己,让自己表现得更好,也欣赏他人,学习他人的长处。要互相鼓励,互相帮助。
这次比赛,让我们总结出四个字--越挫越勇,我们还懂得了:不要被自我感觉所蒙蔽,自己还有许多要学习的地方,要多多努力,尽量多的抓住机会,从每一件事中找到进步的目标,让自己变得越来越优秀。困难面前,不畏惧,不退缩。勇往直前,为自己鼓掌。
六、参考文献
[1] 谭浩强.C语言程序设计[M].北京:清华大学出版社,2012
附录1:实物图
附录2:源程序
主函数
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"
#include "exti.h"
#include "stm32f10x_exti.h"
#include "voice.h"
#include "Tracking.h"
#include "Motor.h"
#include "Fire.h"
#include "Phosen.h"
float H_H=1000;
static int fire_flag=0; int mm=0;
int s_s=0;
int judge_fire()
{
int flag=0;
if((GPIO_ReadInputDataBit(FIRE_PORT, Fire_Left_1)== 0)||(GPIO_ReadInputDataBit(FIRE_PORT, Fire_Left_2)== 0)||(GPIO_ReadInputDataBit(FIRE_PORT, Fire_Right_1)== 0)||(GPIO_ReadInputDataBit(FIRE_PORT, Fire_Right_2)== 0))
{
fire_flag=1;
}
return flag;
}
int main(void)
{
NVIC_Configuration();
// TIM2_Init(500, 7199);
// WT588D_Init();
TIM3_Pwm_Init(35999, 0);
Tracking_IO_Init();
Motor_IO_Init();
Fire_IO_Init();
PhoSen_IO_Init();
while(1)
{
judge_fire();
if(fire_flag==0)
{
Dir_Control();
}
if(fire_flag>0)
{
Fire_Control();
}
}
}
子函数1
#include "sys.h"
#include "PhoSen.h"
#include "Motor.h"
void PhoSen_IO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //¶¨ÒåPB0µ½PB2Ϊ¸¡¿ÕÊäÈë
GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = Left_Sensor;// | Mid_Sensor | Right_Sensor;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
子函数2
#include "timer.h"
#include "usart.h"
#include "Tracking.h"
#include "Fire.h"
void TIM2_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseStructure.TIM_Period = arr; TIM_TimeBaseStructure.TIM_Prescaler =psc; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE );
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM2, ENABLE); //ʹÄÜTIMx
}
void TIM2_IRQHandler(void) //TIM2ÖжÏ
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
Black_Line_Count();
TIM_ClearITPendingBit(TIM2, TIM_IT_Update );
}
}
void TIM3_Pwm_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = arr; TIM_TimeBaseStructure.TIM_Prescaler =psc; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_Cmd(TIM3, ENABLE);
子函数3
#include "sys.h"
#include "Motor.h"
#include "time.h"
long FLAG=0;
void Motor_IO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = MOTOR_PIN_IN1 | MOTOR_PIN_IN2 | MOTOR_PIN_IN3 | MOTOR_PIN_IN4;
GPIO_Init(GPIOB,&GPIO_InitStructure);
void Motor_Go_Forward(int Speed)
{
TIM_SetCompare2(TIM3, Speed);
GPIO_SetBits(GPIOB, MOTOR_PIN_IN2);
GPIO_ResetBits(GPIOB, MOTOR_PIN_IN1);
GPIO_SetBits(GPIOB, MOTOR_PIN_IN4);
GPIO_ResetBits(GPIOB, MOTOR_PIN_IN3);
}
void Motor_Go_Back(int Speed)
{
TIM_SetCompare2(TIM3, Speed);
GPIO_SetBits(GPIOB, MOTOR_PIN_IN1);
GPIO_ResetBits(GPIOB, MOTOR_PIN_IN2);
GPIO_SetBits(GPIOB, MOTOR_PIN_IN3);
GPIO_ResetBits(GPIOB, MOTOR_PIN_IN4);
}
void Forward_Motor_Turn_Left(int Speed)
{
TIM_SetCompare2(TIM3, Speed);
GPIO_SetBits(GPIOB, MOTOR_PIN_IN1);
GPIO_ResetBits(GPIOB, MOTOR_PIN_IN2);
GPIO_SetBits(GPIOB, MOTOR_PIN_IN4);
GPIO_ResetBits(GPIOB, MOTOR_PIN_IN3);
FLAG++;
if(FLAG>10000)
{
FLAG=0;
}
}
void Back_Motor_Turn_Left(int Speed)
{
TIM_SetCompare2(TIM3, Speed);
GPIO_SetBits(GPIOB, MOTOR_PIN_IN1);
GPIO_ResetBits(GPIOB, MOTOR_PIN_IN2);
GPIO_SetBits(GPIOB, MOTOR_PIN_IN4);
GPIO_ResetBits(GPIOB, MOTOR_PIN_IN3);
}
void Forward_Motor_Turn_Right(int Speed)
{
TIM_SetCompare2(TIM3, Speed);
GPIO_SetBits(GPIOB, MOTOR_PIN_IN2);
GPIO_ResetBits(GPIOB, MOTOR_PIN_IN1);
GPIO_SetBits(GPIOB, MOTOR_PIN_IN3);
GPIO_ResetBits(GPIOB, MOTOR_PIN_IN4);
}
void Back_Motor_Turn_Right(int Speed)
{
TIM_SetCompare2(TIM3, Speed);
GPIO_SetBits(GPIOB, MOTOR_PIN_IN3);
GPIO_ResetBits(GPIOB, MOTOR_PIN_IN4);
GPIO_SetBits(GPIOB, MOTOR_PIN_IN2);
GPIO_ResetBits(GPIOB, MOTOR_PIN_IN1);
}
void Motor_Stop(void)
{
TIM_SetCompare2(TIM3, 35999 );
GPIO_ResetBits(GPIOB, MOTOR_PIN_IN1);
GPIO_ResetBits(GPIOB, MOTOR_PIN_IN2);
GPIO_ResetBits(GPIOB, MOTOR_PIN_IN3);
GPIO_ResetBits(GPIOB, MOTOR_PIN_IN4);
}