一、簡介
AS608是一款集成了指紋圖像采集和指紋比對算法的指紋識別模塊。它采用了高質(zhì)量的光學(xué)傳感器,能夠?qū)崟r(shí)采集人體指紋圖像,并通過指紋比對算法進(jìn)行指紋識別。AS608具有高精度、快速、可靠的特點(diǎn),廣泛應(yīng)用于各種指紋識別場景,如門禁系統(tǒng)、安防系統(tǒng)、考勤系統(tǒng)等。
本實(shí)驗(yàn)用到了CW32-48F大學(xué)計(jì)劃板、0.96寸OLED顯示屏模塊、AS608指紋模塊及Keil5開發(fā)環(huán)境。
CW32-48F大學(xué)計(jì)劃板
AS608指紋模塊
二、AS608指紋模塊使用說明
(1)引腳說明(該模塊共8個(gè)引腳,只使用前6個(gè)引腳)
(2)通訊方法
通過給AS608串口發(fā)送特定的指令調(diào)用模塊內(nèi)置的算法進(jìn)行相應(yīng)的操作。
常用的指令有:
指令格式有三種:命令包格式、數(shù)據(jù)包格式和結(jié)束包格式。
?以命令包格式為例,包頭是2個(gè)字節(jié)的數(shù)據(jù),固定為0xEF01;芯片地址4個(gè)字節(jié),默認(rèn)是0xFFFFFFFF;包識別用來區(qū)分指令類型,如命令包固定為0x01,數(shù)據(jù)包格式固定為0x02;包長度指這一條指令有多少個(gè)重要的數(shù)據(jù),包長度=包長度至校驗(yàn)和(指令、參數(shù)或數(shù)據(jù))的總字節(jié)數(shù),包含校驗(yàn)和,但不包含包長度本身的字節(jié)數(shù);指令就是需要AS608執(zhí)行的操作,參數(shù)和具體的指令有關(guān),不同的指令,參數(shù)的長度和數(shù)值都有所不同;校驗(yàn)和是為了確保串口通訊正確。
模塊接收到命令后會產(chǎn)生應(yīng)答,將有關(guān)命令執(zhí)行情況與結(jié)果上報(bào)給上位機(jī),上位機(jī)只有在收到模塊的應(yīng)答包后才能確認(rèn)模塊收包情況與指令執(zhí)行情況。模塊應(yīng)答包中包含一個(gè)參數(shù):確認(rèn)碼。確認(rèn)碼表示執(zhí)行指令完畢的情況。
確認(rèn)碼定義:
00H:表示指令執(zhí)行完畢或 OK;
01H:表示數(shù)據(jù)包接收錯(cuò)誤;
02H:表示傳感器上沒有手指;
03H:表示錄入指紋圖像失??;
...
(3)指紋錄入實(shí)現(xiàn)流程
錄入指紋圖像
當(dāng)手指放在光學(xué)指紋窗口時(shí),模塊自動拍下指紋圖像。
生成特征
記錄圖像中的指紋特征,并將該特征存入緩存區(qū)。
再次錄入圖像
當(dāng)手指放在光學(xué)指紋窗口時(shí),再次拍下指紋圖像。
再次生成特征
記錄二次圖像中的指紋特征,并將該特征存入另一緩存區(qū)。
精確比對兩枚指紋特征
對錄入的兩個(gè)指紋特征進(jìn)行比對。
合并特征(生成模板)
比對成功無誤后,將兩個(gè)特征合并成一個(gè)指紋模板。
儲存模板
將生成的模板存儲到到AS608內(nèi)部Flash,存儲時(shí)需指定存儲地址,即指紋ID。
上面以指紋錄入功能為例,簡要介紹了功能實(shí)現(xiàn)的基本流程,更多詳情請參考AS60x指紋識別SOC用戶手冊和ATK-AS608指紋識別模塊用戶手冊。
三、核心代碼
main.c: #include "main.h" #include "Uart.h" #include "LED.h" #include "AS608.h" #include "OLED.h" #include "Delay.h" #include "BTIM.h" #include "Key.h" uint8_t flag_add=0; //指紋錄制標(biāo)識位 uint8_t flag_passport=0; //密碼輸入標(biāo)識位 uint8_t flag_key_function=0; //按鍵功能標(biāo)識位 const uint16_t passpot=123; //管理員密碼 /*-----------------------刷指紋-----------------------*/ void AS608_MatchFingerPrints(void) { if(Is_Press==1) //有手指按下 { SearchResult seach; uint8_t result; result=PS_GetImage(); if(result==0x00)//獲取圖像成功 { result=PS_GenChar(CharBuffer1); OLED_Clear(); if(result==0x00) //生成特征成功 { result=PS_HighSpeedSearch(CharBuffer1,0,6,&seach); //自定義檢索ID為0~6的指紋庫,最大范圍為0~300 if(result==0x00)//搜索成功 { OLED_ShowString(2,1," ID= "); //指紋識別成功后自定義顯示內(nèi)容 OLED_ShowNum(2,10,seach.pageID,1); OLED_ShowString(3,1," Welcome! "); /* 指紋識別成功后的自定義功能 */ } else { OLED_ShowString(1,1," Refuse! "); //指紋識別失敗,遭到系統(tǒng)拒絕 } } else { OLED_ShowString(1,1," Error! "); //指紋識別過程出現(xiàn)錯(cuò)誤,3秒后重啟識別功能可再次識別 OLED_ShowString(2,1," 3 "); Delay_s(1); OLED_ShowString(2,1," 2 "); Delay_s(1); OLED_ShowString(2,1," 1 "); } Delay_s(1); } Display_Meum(); flag_passport=0; } } /*-----------------------錄指紋-----------------------*/ void AS608_AddFingerPrints(void) { uint8_t result,steps=0; flag_add=1; OLED_Clear(); OLED_ShowString(1,1,"AddFingerPrints"); while(1) //在指紋錄制環(huán)節(jié)中循環(huán) { switch (steps) { case 0: //錄制環(huán)節(jié)0 flag_key_function=1; OLED_ShowString(2,1,"Choose ID:"); //指紋ID選擇界面 OLED_ShowNum(2,11,Finger_ID,1); OLED_ShowString(3,1," "); OLED_ShowString(4,1,"back"); OLED_ShowString(4,8,"+"); OLED_ShowString(4,13,"ok"); switch(Key_Scan()) { case 1: //退出指紋錄制,返回主界面, Display_Meum(); return ; case 2: //選擇錄入的指紋對應(yīng)的ID if(Finger_ID!=6) Finger_ID++; else Finger_ID=1; break; case 3: //進(jìn)入下一個(gè)環(huán)節(jié) steps=1; break; } break; case 1: //錄制環(huán)節(jié)1 if(Key_Scan()!=0){Display_Meum();return ;}; //按任意鍵退出 OLED_ShowString(2,1," "); OLED_ShowString(3,1,"Please press..."); //操作提示 OLED_ShowString(4,1," "); result=PS_GetImage(); //首次獲取指紋圖像 if(result==0x00) { result=PS_GenChar(CharBuffer1);//生成特征1 if(result==0x00) { OLED_ShowString(3,1," OK! Get it... "); Delay_s(1); OLED_ShowString(2,1," "); steps=2; //進(jìn)入下一個(gè)環(huán)節(jié) } } break; case 2: //錄制環(huán)節(jié)2 if(Key_Scan()!=0){Display_Meum();return ;}; //按任意鍵退出 OLED_ShowString(3,1,"Press Again..."); //操作提示 result=PS_GetImage(); //再次獲取指紋圖像 if(result==0x00) { result=PS_GenChar(CharBuffer2);//生成特征2 if(result==0x00) { OLED_ShowString(3,1," OK! Get it... "); Delay_s(1); steps=3; //進(jìn)入下一個(gè)環(huán)節(jié) } } break; case 3: //錄制環(huán)節(jié)3 result=PS_Match(); //特征1與特征2進(jìn)行匹配 if(result==0x00) //匹配成功 { steps=4; //進(jìn)入下一個(gè)環(huán)節(jié) OLED_ShowString(3,1," Matching... "); } else //匹配失敗 { OLED_ShowString(2,1," Fail! "); OLED_ShowString(3,1," 3 "); Delay_s(1); OLED_ShowString(3,1," 2 "); Delay_s(1); OLED_ShowString(3,1," 1 "); steps=0; //回到錄制環(huán)節(jié)0 } Delay_s(1); break; case 4: //錄制環(huán)節(jié)4 result=PS_RegModel(); //合并特征,生成指紋模板 if(result==0x00) { steps=5; //進(jìn)入下一個(gè)環(huán)節(jié) OLED_ShowString(3,1," OK! "); } else { OLED_ShowString(2,1," Fail! "); OLED_ShowString(3,1," 3 "); Delay_s(1); OLED_ShowString(3,1," 2 "); Delay_s(1); OLED_ShowString(3,1," 1 "); steps=0; } Delay_s(1); break; case 5: result=PS_StoreChar(CharBuffer2,Finger_ID); //儲存指紋 if(result==0x00) { flag_key_function=0; OLED_ShowString(3,1,"AddSuccessfully"); Delay_s(1); Display_Meum(); //回到主頁面 return ; } break; } } } /*-----------------------主頁面-----------------------*/ void Display_Meum() { OLED_Clear(); flag_add = 0; flag_key_function = 0; if(PS_ValidTempleteNum(&validFinger_num)==0xff) //讀取指紋模塊當(dāng)下信息參數(shù) OLED_ShowString(2,1," ERROR!!! "); //提示讀取失敗,原因可能是線沒接好或者模塊損壞 else { OLED_ShowString(1,1,"----Welcome----"); OLED_ShowString(2,1,"ValidNum:"); OLED_ShowNum(2,10,validFinger_num,1); OLED_ShowString(4,1,"add delet "); if(delet_num==0) OLED_ShowString(4,15,"+"); else OLED_ShowNum(4,15,delet_num,1); } } /*-----------------------密碼輸入-----------------------*/ void PassportInput() { static uint8_t i=0; flag_key_function=1; OLED_ShowString(1,1,"No access!"); //密碼輸入提示 OLED_ShowString(2,1,"Input Passport:"); OLED_ShowNum(3,6,passport_num1,1); OLED_ShowNum(3,8,passport_num2,1); OLED_ShowNum(3,10,passport_num3,1); OLED_ShowString(4,1,"+"); if(i==0) OLED_ShowString(4,6,"^"); OLED_ShowString(4,12,"back"); switch(Key_Scan()) { case 1://加 if(i==0) {passport_num1++;if(passport_num1==10) passport_num1=0;} if(i==1) {passport_num2++;if(passport_num2==10) passport_num2=0;} if(i==2) {passport_num3++;if(passport_num3==10) passport_num3=0;} if((passport_num1*100+passport_num2*10+passport_num3)==passpot) { OLED_ShowNum(3,10,passport_num3,1); Delay_ms(500); OLED_Clear(); OLED_ShowString(2,1," Access! "); access=1; //打開指紋錄制/刪除權(quán)限 PA07_SETLOW(); //LED全部點(diǎn)亮,指示權(quán)限全開 PA08_SETLOW(); PC13_SETLOW(); Delay_s(2); Display_Meum(); flag_passport=0; passport_num1=0; passport_num2=0; passport_num3=0; i=0; } break; case 2:// 切換數(shù)字 if(++i==3) i=0; if(i==1) OLED_ShowString(4,6," ^ "); else if(i==2) OLED_ShowString(4,6," ^"); else if(i==0) OLED_ShowString(4,6,"^ "); break; case 3://退出 passport_num1=0; passport_num2=0; passport_num3=0; Display_Meum(); flag_passport=0; i=0; break ; } } /*------------------指紋錄制/刪除權(quán)限管理-------------------*/ void Permission_Management(void) { if(Key_Scan()==20) //若返回鍵值為20,則打開密碼輸入標(biāo)識 { OLED_Clear(); flag_passport=1; } if(flag_passport==1)//若密碼標(biāo)識打開,則進(jìn)入密碼輸入界面 PassportInput(); } /*--------------------------主函數(shù)--------------------------*/ int main() { LED_Init(); //3個(gè)LED指示燈 OLED_Init(); //OLED屏幕顯示 BTIM_Init(); //啟動定時(shí)器配合應(yīng)答包接收 UART2_Init(); //與AS608進(jìn)行串口通信,波特率為57600 Key_GPIO_Init(); //三個(gè)按鍵 AS608_WAK_GPIO_Init(); //WAK引腳,感應(yīng)手指按下 Display_Meum(); //屏幕主界面 while(1) { AS608_MatchFingerPrints(); //指紋識別 Permission_Management(); //權(quán)限管理 } }
四、最終實(shí)驗(yàn)現(xiàn)象
?
錄入指紋
?
識別指紋
?
刪除指紋
-
OLED
+關(guān)注
關(guān)注
119文章
6200瀏覽量
224193 -
指紋識別
+關(guān)注
關(guān)注
43文章
1742瀏覽量
102244 -
指紋模塊
+關(guān)注
關(guān)注
0文章
26瀏覽量
3896 -
CW32
+關(guān)注
關(guān)注
1文章
203瀏覽量
640
原文標(biāo)題:【CW32】基于CW32的AS608指紋模塊的應(yīng)用
文章出處:【微信號:CW32生態(tài)社區(qū),微信公眾號:CW32生態(tài)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論