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

智能鎖方案中使用到靈動微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表示鎖體鎖上。這裏只用馬達驅動開鎖,關鎖默認爲手動操作。
在這裏插入圖片描述

圖3 手機APP圖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章