今日分享野火瑞薩創意氛圍賽選手的作品——基于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
左右滑動查看更多
#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開發板,在學習野火瑞薩開發板中,我領略到了不同于意法半導體系列開發板的魅力。我認為瑞薩半導體是一個非常值得學習的芯片系列,其圖形化配置有良好的生態,在學習野火編寫的教學文檔中也受益匪淺。在此,再次感謝野火舉辦創意氛圍賽,讓我有機會接觸瑞薩開發板。如果有機會參與下一期創意氛圍賽,我會努力創造更有特色的產品。
-
繼電器
+關注
關注
132文章
5363瀏覽量
149628 -
單片機
+關注
關注
6044文章
44624瀏覽量
638949 -
mcu
+關注
關注
146文章
17356瀏覽量
352788 -
瑞薩
+關注
關注
35文章
22312瀏覽量
86821 -
開發板
+關注
關注
25文章
5128瀏覽量
98323
原文標題:【瑞薩RA MCU創意氛圍賽作品賞析】項目12——智能煙霧感應吸除系統
文章出處:【微信號:瑞薩MCU小百科,微信公眾號:瑞薩MCU小百科】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
【野火啟明6M5開發板體驗】1 RA6M5開發環境搭建
使用RA6M5開發板的簡易熱成像儀設計
![使用<b class='flag-5'>RA6M5</b>開發板的簡易熱成像儀設計](https://file1.elecfans.com/web2/M00/BA/56/wKgZomWTpGmAFb20AACDj7NQaZM398.png)
評論