博客專欄

        EEPW首頁 > 博客 > 靈動微MM32W系列低功耗MCU智能鎖解決方案

        靈動微MM32W系列低功耗MCU智能鎖解決方案

        發布人:英尚微電子 時間:2020-06-24 來源:工程師 發布文章

        智能鎖方案中使用到靈動微MM32W系列低功耗MCU,配合手機通過APP讀取智能鎖藍牙信息,嘗試配對,配對成功即可正常通訊,手機APP通過藍牙把指令發送給智能鎖進行解鎖,整個流程簡單可靠,該方案將徹底告別傳統鑰匙開鎖。藍牙智能鎖安全便捷,符合用戶的需求,可應用的日常場景廣泛,例如:門鎖(家門、倉庫門、貨車門等);車鎖(電動車鎖、自行車鎖、摩托車鎖等);私人箱柜鎖(抽屜鎖、更衣柜、旅行箱、工具箱等)。接下來靈動微總代理英尚微給大家介紹一個使用場景非常豐富的藍牙應用方案——基于MM32W系列開發的藍牙智能鎖方案。
         

        方案場景

        圖1方案場景

         
         
        硬件資源如下:
        本方案基于MM32BLE_TestBoard進行測試驗證,搭配上一顆微型的雙向直流馬達作為開鎖方式的載體,這里只用馬達驅動開鎖,關鎖默認為手動操作,用戶可以通過手機APP來操作開鎖。在硬件原理上,本方案使用到的DC馬達是通過一顆專用的IC芯片來驅動,其控制引腳連接到MCU的PD2和PD3,通過控制兩個IO的電平可以對馬達進行不同運動狀態的操作;使用PB1連接到綠色LED指示燈,可作為藍牙連接狀態的指示;模擬鎖體狀態功能引腳PA1配置為上拉輸入,低功耗喚醒引腳選擇PA0配置為上拉輸入;藍牙相關的功能引腳與前面介紹的方案一致,此處不做過多展開。以下為DC馬達驅動原理圖:
         

        方案應用圖

         

        圖2 方案應用圖

         
        軟件資源如下:
        結合上述使用到的硬件資源,下面我們著重介紹軟件實現流程以及相關配置代碼。由于本應用方案ble藍牙芯片與APP建立連接過程中需要應用到配對的功能,利用藍牙庫的接口函數可以實現,這里將配對秘鑰設置為“123456”,在連接時候需要設置正確才能配對成功并且連接上;控制DC馬達的功能引腳全都配成推挽輸出模式,直接連到驅動IC上去,通過改變高低電平組合來控制電機的正反轉和啟停;另外再對測試和模擬功能的引腳進行配置,從而更為直觀地對應用效果的觀測和驗證,且使能看門狗復位功能來保證藍牙服務的穩定性能;由于方案應用電池供電對低功耗的需要,本方案低功耗采用STOP模式。
         
        以下為主函數初始化配置內容,主要將所有的外設資源和藍牙協議棧初始化,并且以中斷服務程序的方式運行藍牙,主函數的循環中主要實現的功能為判斷是否進入低功耗模式,并且喚醒后根據接收到的藍牙數據對DC馬達進行不同的操作,代碼如下:

         

        下面簡單介紹一下藍牙低功耗和DC馬達操作相關的幾個函數:
         
        //初始化DC馬達控制引腳PD2、PD3,并且全部置為低電平
        void MOTOR_Init(void);//停止DC馬達的轉動
        static void MOTOR_Stop(void);//根據不同方向參數去控制DC馬達運轉
        static void MOTOR_Run(unsigned char direction);
         
         
        在MOTOR_Proc()處理函數中針對藍牙接收到的密碼數據進行解析,如果與默認設置的4位0-9數字密碼完全匹配上則操作解鎖,將DC馬達按照設定方向控制運轉,為了簡易驗證,模擬一個信號表示解鎖成功,這里是通過采集指定IO引腳PA1的輸入來實現,采集到輸入為高電平那么停止DC馬達轉動,且清零鎖定標志位。以下為代碼實現內容:
         

         

        我們在gatt_user_send_notify_data_callback函數中給手機發送數據,該函數屬于回調函數,協議棧會在系統允許的時候(異步)回調本函數,該函數被用于藍牙模塊端主動發送是否解鎖狀態信息給手機APP,函數內部不得增加阻塞代碼。詳細實現代碼如下:
         
        //藍牙連接成功后協議在空閑的時候會調用本回調函數
         void gatt_user_send_notify_data_callback(void)
        {
        static u8 LockFlagBak = 1;
        if (LockFlagBak != LockFlag)
        {
        LockFlagBak = LockFlag;//LockFlag標志位會在MOTOR_Proc()中清零和置位      
        sconn_notifydata(&LockFlagBak,1);
        }
        }
         
        藍牙協議會周期性回調本UsrProcCallback()函數,無論是在廣播狀態還是連接狀態,在該函數中可以做運行和低功耗模式切換的超時計數,給IrqMcuGotoSleepAndWakeup()來處理是否進入低功耗模式,并且針對獲取到的是否連接信息用LED指示燈做不同的狀態顯示。詳細實現代碼如下:
         
        //藍牙協議會周期性回調本函數
        void UsrProcCallback(void) 
        {
        static unsigned char led_flash = 0;    
        IWDG_ReloadCounter();
        StandbyTimeout ++; 
        if(gConnectedFlag){  //連接成功
        StandbyTimeout = 0;
        LED_ONOFF(1);
        }else{
        led_flash ++;
        LED_ONOFF(!(led_flash%10)); //藍牙未連接,指示燈快閃
        }
        }
         
        除了上述關鍵的藍牙數據發送函數外,下面再簡單介紹一些與藍牙相關的特征值定義,在const BLE_CHAR AttCharList[] 中定義了本案中的兩個特征值:
         
        {TYPE_CHAR,0x0011,{ATT_CHAR_PROP_W_NORSP,0x12,0,0xf1,0xff}, UUID16_FORMAT},//解鎖命令
        {TYPE_CHAR,0x0013,{ATT_CHAR_PROP_RD|ATT_CHAR_PROP_NTF,0x14,0,0xf2,0xff}, UUID16_FORMAT},//鎖體狀態
        在void att_server_rdByGrType( u8 pdu_type, u8 attOpcode, u16 st_hd, u16 end_hd, u16 att_type )中實現了自定義特征值服務聲明;
        在void ser_write_rsp()中實現對手機APP發送的藍牙數據接收和存儲:
        if (StartEncryption)
        {
            if (valueLen_w < 9)//對藍牙數據進行解析和存儲
            {
             Password_wr[0] = valueLen_w;
             memcpy(&Password_wr[1], attValue, valueLen_w);
             }
             }else{ //無效數據,不保存
             Password_wr[0] = 0;
        }
         
        在void server_rd_rsp(u8 attOpcode, u16 attHandle, u8 pdu_type)中實現把鎖體狀態回復給手機APP:
        att_server_rd( pdu_type, attOpcode, attHandle, &LockFlag, 1); //將LockFlag 標志位返回給手機APP
         
         
        手機操作流程如下:
        使用手機原生藍牙界面查找設備,找到MM32_Lock后點擊進行配對。默認配對密碼為123456,配對成功后MM32_LOCK設備自動保存到配對設備列表,以后不需要該步驟;
         
        手機打開App,開始搜索BLE設備,選擇對應名稱(MM32_LOCK)的藍牙設備并進行配對,等待連接成功。連接成功后會有相應提示,按鈕Connect名字會變成Disconnect;
         
        連接成功后,對UUID為fff1的特征值寫0x31323334(模擬用戶輸入密碼”1234”),測試板上連接的馬達開始轉動,執行開鎖動作;
         
        給PA1輸入低電平模擬鎖開啟完成,UUID為fff2的特征值結果為0表示鎖體開啟,給PA1輸入高電平模擬鎖體鎖上,UUID為fff2的特征值結果為1表示鎖體鎖上。這里只用馬達驅動開鎖,關鎖默認為手動操作。
         

        手機APP圖  

         

        圖3 手機APP圖

        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



        關鍵詞:

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 建水县| 嘉黎县| 曲靖市| 闽清县| 郧西县| 南通市| 册亨县| 新乡县| 噶尔县| 逊克县| 长沙市| 砚山县| 富源县| 西安市| 旬阳县| 岑巩县| 比如县| 改则县| 炎陵县| 安远县| 广德县| 闽清县| 昔阳县| 铜川市| 汝南县| 重庆市| 神木县| 宁国市| 游戏| 皋兰县| 含山县| 华阴市| 乌拉特中旗| 环江| 宁津县| 尼玛县| 孟连| 蒙阴县| 象州县| 河东区| 武强县|