今日分享野火瑞萨创意氛围赛选手的作品——基于RA6M5的智能烟雾感应吸除系统。
该系统是基于野火启明RA6M5开发板制作的一款智能烟雾感应装置。创作背景是作者在手工焊接电子元器件或电路板时候,常常会因为长时间吸入焊接产生的烟雾而导致身体不适。因此趁着野火创意氛围赛提供的学习机会,在启明开发板上实现感应烟雾并利用风扇吸除的功能,经过初步验证,该系统能较好的达到理想控制状态。
一、项目简介
该系统使用的开发板是野火启明RA6M5,使用到的额外外设模块有一路继电器、7.4V电池模块、烟雾传感器。是基于瑞萨FSP库完成软件程序的编写,由于时间原因,所有电路连接采用杜邦线完成。
二、项目说明
该系统有两个工作模式,可通过野火启明RA6M5上板载按键2切换工作模式。其中工作模式一是通过按键手动控制风扇转动。工作模式二是通过烟雾传感器感应烟雾从而发送信号驱动风扇转动。
三、系统方案
由于该系统结构比较简单,因此无需给出系统框图。简述过程就是利用GPIO输出功能去驱动继电器打开,将风扇与7.4V模块导通转动。利用GPIO输入功能识别烟雾传感器电平信号从而驱动继电器。
四、硬件方案展示
1.风扇模块
模块介绍:该模块额定电压为12V,工作电压为7~12V由于作者手上没有12V直流电池,因此用7.4V电池模块替代。
2.继电器模块
模块介绍:由于风扇模块工作电压远高于单片机工作电压3.3V,因此利用继电器特性,可实现GPIO输出功能控制风扇转动或停止。
3.烟雾传感器 
模块介绍:MQ-2气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡 (SnO2)。当传感器所处环境中存在可燃气体时,传感器的电导率随空气中可燃气体浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。可以用于该系统中烟雾监测装置,传感器特设M3固定安装孔,使用宽电压LM393比较器,信号干净,波形好,驱动能力强,超过15mA,配可调精密电位器调节灵敏度。
4.杜邦线连接介绍
继电器信号引脚连接P500,烟雾传感器信号线连接P200,按键、LED灯均使用板载外设,因此不再声明。
五、软件配置(RASC)
与程序编写
1.RASC部分
(一)系统时钟配置
系统时钟使用默认设置200M
(二)LED灯配置

启动板载LED灯用来显示当前工作状态
(三)按键配置

配置按键用于切换功能
(四)烟雾传感器输入检测配置

和按键配置同理
(五)继电器配置

2.KEIL程序编写部分
(一)系统框图

(二)LED部分
bsp_led.c代码
左右滑动查看更多
#include "bsp_led.h"
void Led_init(void)
{
//调用 R_IOPORT_Open 函数来初始化 IOPORT 模块
R_IOPORT_Open (&g_ioport_ctrl, g_ioport.p_cfg);
}
bsp_led.h代码
左右滑动查看更多
#ifndef _BSP_LED_H #define _BSP_LED_H #include "hal_data.h" #define LED1_TOGGLE R_PORT4->PODR ^= 1<<(BSP_IO_PORT_04_PIN_00 & 0xFF) #define LED2_TOGGLE R_PORT4->PODR ^= 1<<(BSP_IO_PORT_04_PIN_03 & 0xFF) #define LED3_TOGGLE R_PORT4->PODR ^= 1<<(BSP_IO_PORT_04_PIN_04 & 0xFF) #define LED1_ON R_IOPORT_PinWrite(&g_ioport_ctrl,BSP_IO_PORT_04_PIN_00,BSP_IO_LEVEL_LOW); #define LED2_ON R_IOPORT_PinWrite(&g_ioport_ctrl,BSP_IO_PORT_04_PIN_03,BSP_IO_LEVEL_LOW); #define LED3_ON R_IOPORT_PinWrite(&g_ioport_ctrl,BSP_IO_PORT_04_PIN_04,BSP_IO_LEVEL_LOW); #define LED1_OFF R_IOPORT_PinWrite(&g_ioport_ctrl,BSP_IO_PORT_04_PIN_00,BSP_IO_LEVEL_HIGH); #define LED2_OFF R_IOPORT_PinWrite(&g_ioport_ctrl,BSP_IO_PORT_04_PIN_03,BSP_IO_LEVEL_HIGH); #define LED3_OFF R_IOPORT_PinWrite(&g_ioport_ctrl,BSP_IO_PORT_04_PIN_04,BSP_IO_LEVEL_HIGH); void Led_init(void); #endif
(三)按键部分
bsp_key.c代码
左右滑动查看更多
#include "bsp_key.h"
/* 定义宏 KEY_ON 表示按键按下
定义宏 KEY_OFF 表示按键没有按下
*/
/* 按键初始化函数 */
void Key_Init(void)
{
/* 初始化配置引脚(这里重复初始化了,可以注释掉) */
//R_IOPORT_Open (&g_ioport_ctrl, g_ioport.p_cfg);
}
uint32_t Key_Scan(bsp_io_port_pin_t key)
{
bsp_io_level_t state;
// 读取按键引脚电平
R_IOPORT_PinRead(&g_ioport_ctrl, key, &state);
if (BSP_IO_LEVEL_HIGH == state)
{
return KEY_OFF; //按键没有被按下
}
else
{
do //等待按键释放
{
R_IOPORT_PinRead(&g_ioport_ctrl, key, &state);
} while (BSP_IO_LEVEL_LOW == state);
}
return KEY_ON; //按键被按下了
}
bsp_key.h代码
左右滑动查看更多
#ifndef _BSP_KEY_H #define _BSP_KEY_H #include "hal_data.h" #define KEY_ON 1 #define KEY_OFF 0 #define KEY1_SW2_PIN BSP_IO_PORT_00_PIN_04 #define KEY2_SW3_PIN BSP_IO_PORT_00_PIN_05 #define FAN_TOGGLE R_PORT5->PODR ^= 1<<(BSP_IO_PORT_05_PIN_00 & 0xFF)//继电器状态翻转 void Key_Init(void); uint32_t Key_Scan(bsp_io_port_pin_t key); #endif
(四)系统滴答定时器部分
bsp_SysTick.c代码
左右滑动查看更多
#include "bsp_SysTick.h"
static __IO uint32_t IT_nums; //延时需要触发中断的次数
static uint32_t IT_Period; //中断周期(单位为时钟节拍数)
uint32_t Mode_mstick;
uint32_t Systick_mstick;
/**
* @brief 启动系统滴答计时器 SysTick
* @param IT_frequency: 滴答计时器每秒的中断次数
* @retval 无
*/
void SysTick_Init(uint32_t IT_frequency)
{
/* SystemFrequency在这里默认为200M
* SystemFrequency / 1000 1ms中断一次
* SystemFrequency / 100000 10us中断一次
* SystemFrequency / 1000000 1us中断一次
*/
IT_Period = SystemCoreClock / IT_frequency;//个人理解:设置分频
uint32_t err = SysTick_Config (IT_Period);//把分频设置进系统
assert(err==0); //capture error
}
/**
* @brief 延时程序
* @param delay: 延时的单位时间
* @param unit: 延时的单位
* @retval 无
*/
void SysTick_Delay(uint32_t delay, sys_delay_units_t unit)
{
uint32_t SumTime = delay * unit; //计算总延时时间 (单位为时钟节拍数)
IT_nums = SumTime/IT_Period;//计算次数,比如1ms一次中断,设置1000,就是1s
while (IT_nums != 0);//中断进去一次-一次,直到为0跳出
}
/**
* @brief SysTick的中断服务函数
* @param 无
* @retval 无
* @attention 用e2 studio编译会出现警告,但是没有影响,不需要管
*/
void SysTick_Handler(void)
{
Systick_mstick++;
}
/*********************************************END OF FILE**********************/
bsp_Systick.h代码
左右滑动查看更多
#ifndef _BSP_SYSTICK_H
#define _BSP_SYSTICK_H
#include "hal_data.h"
typedef enum
{
SYS_DELAY_UNITS_SECONDS = 200000000, ///< Requested delay amount is in seconds
SYS_DELAY_UNITS_MILLISECONDS = 200000, ///< Requested delay amount is in milliseconds
SYS_DELAY_UNITS_MICROSECONDS = 200 ///< Requested delay amount is in microseconds
} sys_delay_units_t;
void SysTick_Init(uint32_t IT_frequency);
void SysTick_Delay(uint32_t delay, sys_delay_units_t unit);
#endif
(五)烟雾传感器部分
bsp_sensor.c代码
左右滑动查看更多
#include "bsp_sensor.h"
void Eensor_Init(void)
{
//调用 R_IOPORT_Open 函数来初始化 IOPORT 模块
R_IOPORT_Open (&g_ioport_ctrl, g_ioport.p_cfg);
}
bsp_sensor.h代码
左右滑动查看更多
#ifndef _BSP_SENSOR_H #define _BSP_SENSOR_H #include "hal_data.h" #define Fan_PIN BSP_IO_PORT_02_PIN_00 #define FAN_ON R_IOPORT_PinWrite(&g_ioport_ctrl,BSP_IO_PORT_05_PIN_00,BSP_IO_LEVEL_HIGH); #define FAN_OFF R_IOPORT_PinWrite(&g_ioport_ctrl,BSP_IO_PORT_05_PIN_00,BSP_IO_LEVEL_LOW); extern uint32_t Mode_mstick; extern uint32_t Systick_mstick; void Eensor_Init(void); #endif
(六)主函数部分
其余部分均为默认程序,在这里不进行展示。至此,硬件和软件部分均介绍完成。
左右滑动查看更多
#include "hal_data.h"
#include "led/bsp_led.h"
#include "key/bsp_key.h"
#include "SysTick/bsp_SysTick.h"
#include "sensor/bsp_sensor.h"
FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTER
void Fan_Proc(void);//系统运行函数
bsp_io_level_t Fan_flag;//风扇开启变量,0-关闭,1-打开
uint8_t Work_Mode = 0;//工作模式 0-手动模式 1-烟雾传感器模式
/*******************************************************************************************************************//**
* main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used. This function
* is called by main() when no RTOS is used.
**********************************************************************************************************************/
void hal_entry(void)
{
/* TODO: add your own code here */
Led_init();//LED灯初始化
Key_Init();//按键初始化
Eensor_Init();//传感器初始化
SysTick_Init(1000);//滴答定时器1ms
while(1){
Fan_Proc();
}
#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
void Fan_Proc(void)
{
if(Systick_mstick-Mode_mstick <= 50)return;
Mode_mstick = Systick_mstick;
if( Key_Scan(KEY1_SW2_PIN) == KEY_ON && Work_Mode == 0) //扫描按键1
{
LED1_TOGGLE; //翻转 LED1 状态
FAN_TOGGLE; //开启风扇
}
if( Key_Scan(KEY2_SW3_PIN) == KEY_ON ) //扫描按键2
{
LED3_TOGGLE; //翻转 LED3 状态
Work_Mode ^= 1;//反转模式
}
if(Work_Mode == 1)
{
R_IOPORT_PinRead(&g_ioport_ctrl, Fan_PIN, &Fan_flag);
if(Fan_flag == BSP_IO_LEVEL_LOW)
{
LED2_ON; //打开
FAN_ON;//风扇开启
}
else if(Fan_flag == BSP_IO_LEVEL_HIGH)
{
LED2_OFF; //关闭
FAN_OFF;//风扇关闭
}
}
}
六、总结
此次项目由于时间紧迫,整体设计较为简单,主要原因是由于本人前期一直在准备电子设计竞赛,直到14号综测结束才开始学习瑞萨启明RA6M5开发板,在学习野火瑞萨开发板中,我领略到了不同于意法半导体系列开发板的魅力。我认为瑞萨半导体是一个非常值得学习的芯片系列,其图形化配置有良好的生态,在学习野火编写的教学文档中也受益匪浅。在此,再次感谢野火举办创意氛围赛,让我有机会接触瑞萨开发板。如果有机会参与下一期创意氛围赛,我会努力创造更有特色的产品。
全部0条评论
快来发表一下你的评论吧 !