野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 570|回复: 0

【瑞萨RA MCU创意氛围赛】基于RA6M5的智能烟雾感应吸除系统

[复制链接]
发表于 2023-8-19 19:10:24 | 显示全部楼层 |阅读模式
本帖最后由 709676947 于 2023-8-22 11:36 编辑

摘要
该系统是基于野火启明RA6M5开发板制作的一款智能烟雾感应装置。创作背景是作者在手工焊接电子元器件或电路板时候,常常会因为长时间吸入焊接产生的烟雾而导致身体不适。因此趁着野火创意氛围赛提供的学习机会,在启明开发板上实现感应烟雾并利用风扇吸除的功能,经过初步验证,该系统能较好的达到理想控制状态。
一、项目简介
该系统使用的开发板是野火启明RA6M5,使用到的额外外设模块有一路继电器、7.4V电池模块、烟雾传感器。是基于瑞萨FSP库完成软件程序的编写,由于时间原因,所有电路连接采用杜邦线完成。
二、项目说明
该系统有两个工作模式,可通过野火启明RA6M5上板载按键2切换工作模式。
其中工作模式一是通过按键手动控制风扇转动。工作模式二是通过烟雾传感器感应烟雾从而发送信号驱动风扇转动。
三、系统方案
由于该系统结构比较简单,因此无需给出系统工作流程图。简述过程就是利用GPIO输出功能去驱动继电器打开,将风扇与7.4V模块导通转动。利用GPIO输入功能识别烟雾传感器电平信号从而驱动继电器。
四、硬件方案展示
1.风扇模块

风扇模块实物展示

风扇模块实物展示

                         图一

模块介绍:该模块额定电压为12V,工作电压为7~12V由于作者手上没有12V直流电池,因此用7.4V电池模块替代。

2.继电器模块

野火论坛202308191919461801..png

                             图二

模块介绍:由于风扇模块工作电压远高于单片机工作电压3.3V,因此利用继电器特性,可实现GPIO输出功能控制风扇转动或停止。

3.烟雾传感器

野火论坛202308191922597421..png

                               图三

                             图四

模块介绍:MQ-2气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。当传感器所处环境中存在可燃气体时,传感器的电导率随空气中可燃气体浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。可以用于该系统中烟雾监测装置,传感器特设M3固定安装孔,使用宽电压LM393比较器,信号干净,波形好,驱动能力强,超过15mA,配可调精密电位器调节灵敏度。

4.杜邦线连接介绍

继电器信号引脚连接P500,烟雾传感器信号线连接P200,按键、LED灯均使用板载外设,因此不在声明。

五、软件配置(RASC)与程序编写

1.RASC部分

(一)系统时钟配置

野火论坛202308212050137773..png

                                  图五

系统时钟使用默认设置200M

(二)LED灯配置

野火论坛202308201313395266..png

                      图六

启动板载LED灯用来显示当前工作状态

(三)按键配置

野火论坛202308201314052477..png

                       图七

配置按键用于切换功能

(四)烟雾传感器输入检测配置

野火论坛202308201315176549..png

                          图八

和按键配置同理

(五)继电器配置

野火论坛202308201316073248..png

                        图九

2.KEIL程序编写部分

(一)系统框图
野火论坛202308221135004855..png
                      图十
(二)LED部分
bsp_led.c代码

  1. #include "bsp_led.h"

  2. void Led_init(void)
  3. {
  4.         //调用 R_IOPORT_Open 函数来初始化 IOPORT 模块
  5.         R_IOPORT_Open (&g_ioport_ctrl, g_ioport.p_cfg);
  6. }
复制代码
bsp_led.h代码
  1. #ifndef _BSP_LED_H
  2. #define _BSP_LED_H

  3. #include "hal_data.h"

  4. #define LED1_TOGGLE R_PORT4->PODR ^= 1<<(BSP_IO_PORT_04_PIN_00 & 0xFF)
  5. #define LED2_TOGGLE R_PORT4->PODR ^= 1<<(BSP_IO_PORT_04_PIN_03 & 0xFF)
  6. #define LED3_TOGGLE R_PORT4->PODR ^= 1<<(BSP_IO_PORT_04_PIN_04 & 0xFF)

  7. #define LED1_ON R_IOPORT_PinWrite(&g_ioport_ctrl,BSP_IO_PORT_04_PIN_00,BSP_IO_LEVEL_LOW);
  8. #define LED2_ON R_IOPORT_PinWrite(&g_ioport_ctrl,BSP_IO_PORT_04_PIN_03,BSP_IO_LEVEL_LOW);
  9. #define LED3_ON R_IOPORT_PinWrite(&g_ioport_ctrl,BSP_IO_PORT_04_PIN_04,BSP_IO_LEVEL_LOW);

  10. #define LED1_OFF R_IOPORT_PinWrite(&g_ioport_ctrl,BSP_IO_PORT_04_PIN_00,BSP_IO_LEVEL_HIGH);
  11. #define LED2_OFF R_IOPORT_PinWrite(&g_ioport_ctrl,BSP_IO_PORT_04_PIN_03,BSP_IO_LEVEL_HIGH);
  12. #define LED3_OFF R_IOPORT_PinWrite(&g_ioport_ctrl,BSP_IO_PORT_04_PIN_04,BSP_IO_LEVEL_HIGH);

  13. void Led_init(void);

  14. #endif
复制代码
(三)按键部分
bsp_key.c代码

  1. #include "bsp_key.h"

  2. /* 定义宏 KEY_ON 表示按键按下
  3. 定义宏 KEY_OFF 表示按键没有按下
  4. */

  5. /* 按键初始化函数 */
  6. void Key_Init(void)
  7. {
  8.     /* 初始化配置引脚(这里重复初始化了,可以注释掉) */
  9.     //R_IOPORT_Open (&g_ioport_ctrl, g_ioport.p_cfg);
  10. }

  11. uint32_t Key_Scan(bsp_io_port_pin_t key)
  12. {
  13.         bsp_io_level_t state;
  14.         // 读取按键引脚电平
  15.         R_IOPORT_PinRead(&g_ioport_ctrl, key, &state);
  16.         if (BSP_IO_LEVEL_HIGH == state)
  17.         {
  18.                 return KEY_OFF; //按键没有被按下
  19.         }
  20.         else
  21.         {
  22.         do //等待按键释放
  23.         {
  24.                 R_IOPORT_PinRead(&g_ioport_ctrl, key, &state);
  25.         } while (BSP_IO_LEVEL_LOW == state);
  26.         }
  27.         return KEY_ON; //按键被按下了
  28. }
复制代码
bsp_key.h代码
  1. #ifndef _BSP_KEY_H
  2. #define _BSP_KEY_H

  3. #include "hal_data.h"

  4. #define KEY_ON 1
  5. #define KEY_OFF 0

  6. #define KEY1_SW2_PIN BSP_IO_PORT_00_PIN_04
  7. #define KEY2_SW3_PIN BSP_IO_PORT_00_PIN_05

  8. #define FAN_TOGGLE R_PORT5->PODR ^= 1<<(BSP_IO_PORT_05_PIN_00 & 0xFF)//继电器状态翻转

  9. void Key_Init(void);
  10. uint32_t Key_Scan(bsp_io_port_pin_t key);

  11. #endif
复制代码
(四)系统滴答定时器部分
bsp_SysTick.c代码

  1. #include "bsp_SysTick.h"

  2. static __IO uint32_t IT_nums;  //延时需要触发中断的次数
  3. static uint32_t IT_Period;  //中断周期(单位为时钟节拍数)

  4. uint32_t Mode_mstick;
  5. uint32_t Systick_mstick;

  6. /**
  7. * @brief 启动系统滴答计时器 SysTick
  8. * @param IT_frequency: 滴答计时器每秒的中断次数
  9. * @retval 无
  10. */
  11. void SysTick_Init(uint32_t IT_frequency)
  12. {
  13.     /* SystemFrequency在这里默认为200M
  14.      * SystemFrequency / 1000    1ms中断一次
  15.      * SystemFrequency / 100000  10us中断一次
  16.      * SystemFrequency / 1000000 1us中断一次
  17.      */
  18.     IT_Period = SystemCoreClock / IT_frequency;//个人理解:设置分频
  19.     uint32_t err = SysTick_Config (IT_Period);//把分频设置进系统
  20.     assert(err==0); //capture error
  21. }

  22. /**
  23. * @brief 延时程序
  24. * @param delay: 延时的单位时间
  25. * @param unit: 延时的单位
  26. * @retval 无
  27. */
  28. void SysTick_Delay(uint32_t delay, sys_delay_units_t unit)
  29. {
  30.         uint32_t SumTime = delay * unit; //计算总延时时间 (单位为时钟节拍数)
  31.         IT_nums = SumTime/IT_Period;//计算次数,比如1ms一次中断,设置1000,就是1s
  32.         while (IT_nums != 0);//中断进去一次-一次,直到为0跳出
  33. }

  34. /**
  35.   * @brief  SysTick的中断服务函数
  36.   * @param  无
  37.   * @retval 无
  38.   * @attention 用e2 studio编译会出现警告,但是没有影响,不需要管
  39.   */

  40. void SysTick_Handler(void)
  41. {
  42.     Systick_mstick++;
  43. }

  44. /*********************************************END OF FILE**********************/
复制代码
bsp_Systick.h代码
  1. #ifndef _BSP_SYSTICK_H
  2. #define _BSP_SYSTICK_H

  3. #include "hal_data.h"

  4. typedef enum
  5. {
  6.     SYS_DELAY_UNITS_SECONDS      = 200000000, ///< Requested delay amount is in seconds
  7.     SYS_DELAY_UNITS_MILLISECONDS = 200000,    ///< Requested delay amount is in milliseconds
  8.     SYS_DELAY_UNITS_MICROSECONDS = 200        ///< Requested delay amount is in microseconds
  9. } sys_delay_units_t;

  10. void SysTick_Init(uint32_t IT_frequency);
  11. void SysTick_Delay(uint32_t delay, sys_delay_units_t unit);

  12. #endif
复制代码
(五)烟雾传感器部分
bsp_sensor.c代码

  1. #include "bsp_sensor.h"
  2.         
  3. void Eensor_Init(void)
  4. {
  5.         //调用 R_IOPORT_Open 函数来初始化 IOPORT 模块
  6.         R_IOPORT_Open (&g_ioport_ctrl, g_ioport.p_cfg);
  7. }
复制代码
bsp_sensor.h代码
  1. #ifndef _BSP_SENSOR_H
  2. #define _BSP_SENSOR_H

  3. #include "hal_data.h"

  4. #define Fan_PIN BSP_IO_PORT_02_PIN_00
  5. #define FAN_ON R_IOPORT_PinWrite(&g_ioport_ctrl,BSP_IO_PORT_05_PIN_00,BSP_IO_LEVEL_HIGH);
  6. #define FAN_OFF R_IOPORT_PinWrite(&g_ioport_ctrl,BSP_IO_PORT_05_PIN_00,BSP_IO_LEVEL_LOW);

  7. extern uint32_t Mode_mstick;
  8. extern uint32_t Systick_mstick;

  9. void Eensor_Init(void);

  10. #endif
复制代码
(六)主函数部分
  1. #include "hal_data.h"
  2. #include "led/bsp_led.h"
  3. #include "key/bsp_key.h"
  4. #include "SysTick/bsp_SysTick.h"
  5. #include "sensor/bsp_sensor.h"

  6. FSP_CPP_HEADER
  7. void R_BSP_WarmStart(bsp_warm_start_event_t event);
  8. FSP_CPP_FOOTER

  9. void Fan_Proc(void);//系统运行函数
  10. bsp_io_level_t Fan_flag;//风扇开启变量,0-关闭,1-打开
  11. uint8_t Work_Mode = 0;//工作模式 0-手动模式 1-烟雾传感器模式
  12. /*******************************************************************************************************************//**
  13. * main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used.  This function
  14. * is called by main() when no RTOS is used.
  15. **********************************************************************************************************************/
  16. void hal_entry(void)
  17. {
  18.     /* TODO: add your own code here */
  19.         Led_init();//LED灯初始化
  20.         Key_Init();//按键初始化
  21.         Eensor_Init();//传感器初始化
  22.         SysTick_Init(1000);//滴答定时器1ms
  23.         
  24.         while(1){
  25.                 Fan_Proc();
  26.         }
  27.         
  28. #if BSP_TZ_SECURE_BUILD
  29.     /* Enter non-secure code */
  30.     R_BSP_NonSecureEnter();
  31. #endif
  32. }

  33. void Fan_Proc(void)
  34. {
  35.         if(Systick_mstick-Mode_mstick <= 50)return;
  36.                 Mode_mstick = Systick_mstick;
  37.         
  38.         if( Key_Scan(KEY1_SW2_PIN) == KEY_ON && Work_Mode == 0) //扫描按键1
  39.         {
  40.                 LED1_TOGGLE; //翻转 LED1 状态
  41.                 FAN_TOGGLE; //开启风扇
  42.         }
  43.         if( Key_Scan(KEY2_SW3_PIN) == KEY_ON ) //扫描按键2
  44.         {
  45.                 LED3_TOGGLE; //翻转 LED3 状态
  46.                 Work_Mode ^= 1;//反转模式
  47.         }
  48.         if(Work_Mode == 1)
  49.         {
  50.                 R_IOPORT_PinRead(&g_ioport_ctrl, Fan_PIN, &Fan_flag);
  51.                 if(Fan_flag == BSP_IO_LEVEL_LOW)
  52.                 {
  53.                         LED2_ON; //打开
  54.                         FAN_ON;//风扇开启
  55.                 }
  56.                 else if(Fan_flag == BSP_IO_LEVEL_HIGH)
  57.                 {
  58.                         LED2_OFF; //关闭
  59.                         FAN_OFF;//风扇关闭
  60.                 }
  61.         }
  62. }
复制代码
其余部分均为默认程序,在这里不进行展示。至此,硬件和软件部分均介绍完成。
六、总结
此次项目由于时间紧迫,整体设计较为简单,主要原因是由于本人前期一直在准备电子设计竞赛,直到14号综测结束才开始学习瑞萨启明RA6M5开发板,在学习野火瑞萨开发板中,我领略到了不同于意法半导体系列开发板的魅力。我认为瑞萨半导体是一个非常值得学习的芯片系列,其图形化配置有良好的生态,在学习野火编写的教学文档中也受益匪浅。在此,再次感谢野火举办创意氛围赛,让我有机会接触瑞萨开发板。如果有机会参与下一期创意氛围赛,我会努力创造更有特色的产品。
七、附录
(一)程序源码链接:链接:https://pan.baidu.com/s/12kDk14qO5L4vcuxyfZ-LWw?pwd=ib3f
提取码:ib3f
(二)B站视频展示链接:https://b23.tv/LPnDkKC

野火论坛202308191924001373..png
野火论坛202308212040531438..png
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-2 10:45 , Processed in 0.041083 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表