長期以來,生物識別技術(shù)一直被用作可靠的身份驗證系統(tǒng)。今天存在復(fù)雜的生物識別系統(tǒng),可以通過他的心跳節(jié)奏甚至他的 DNA 來識別一個人。其他可行的方法包括語音識別、人臉識別、虹膜掃描和指紋掃描。其中指紋識別是使用最廣泛的方法,我們可以從簡單的考勤系統(tǒng)到智能手機(jī)再到安全檢查等等。
在本教程中,我們將學(xué)習(xí)如何在Arduino 中使用流行的 GT511C3 指紋傳感器 (FPS)。有許多可用的 FPS,我們已經(jīng)學(xué)會了如何使用它們來構(gòu)建考勤系統(tǒng)、投票機(jī)、安全系統(tǒng)等設(shè)計。但 GT511C3 更先進(jìn),精度更高,響應(yīng)時間更快,所以我們將學(xué)習(xí)如何使用它使用 Arduino 在其上注冊指紋,然后在需要時檢測指紋。所以讓我們開始吧。
所需材料
Arduino納米/UNO
GT511C3 指紋傳感器
16x2液晶屏
Pot – 10k 和 1k、10k、22k 電阻器
按鈕
連接電線
面包板
GT511C3 指紋傳感器 (FPS) 模塊
在深入項目之前,讓我們了解GT511C3 指紋傳感器模塊及其工作原理。該傳感器與我們智能手機(jī)中常用的電容式和超聲波指紋傳感器非常不同。GT511C3是一種光學(xué)指紋傳感器,這意味著它依靠您的指紋圖像來識別其圖案。是的,你沒看錯,傳感器內(nèi)部實際上有一個攝像頭,它可以拍攝你的指紋照片,然后使用強(qiáng)大的內(nèi)置 ARM Cortex M3 IC 處理這些圖像。下圖顯示了傳感器的正面和背面以及引腳。
如您所見,傳感器有一個被藍(lán)色 LED 包圍的攝像頭(黑點(diǎn)),必須點(diǎn)亮這些 LED 才能拍攝清晰的指紋圖像。然后通過使用ARM 微控制器與 EEPROM 耦合來處理這些圖像并將其轉(zhuǎn)換為二進(jìn)制值。該模塊還有一個綠色 SMD LED 來指示電源。每個指紋圖像為 202x258 像素,分辨率為 450dpi。該傳感器最多可以注冊 200 個指紋,并且為每個指紋模板分配一個 ID 表格,從 0 到 199。然后在檢測過程中,它可以自動將掃描的指紋與所有 200 個模板進(jìn)行比較,如果找到匹配項,它會使用Smack Finger 3.0給出該特定指紋的 ID 號ARM 微控制器上的算法。該傳感器可以在 3.3V 至 6V 的電壓范圍內(nèi)工作,并通過9600 的串行通信進(jìn)行通信。據(jù)說通信引腳(Rx 和 Tx)只能承受 3.3V,但數(shù)據(jù)表并沒有具體說明。GT511C3 FPS 的引腳如下所示。
除了串行通信外,該模塊還可以使用上圖所示的引腳通過 USB 連接直接連接到計算機(jī)。一旦連接到計算機(jī),就可以使用SDK_DEMO.exe應(yīng)用程序控制模塊,該應(yīng)用程序可以從鏈接下載。此應(yīng)用程序允許用戶注冊/驗證/刪除指紋以及識別指紋。該軟件還可以幫助您讀取傳感器捕獲的圖像,值得一試?;蛘撸词箓鞲衅髋c Arduino 連接,您也可以使用此軟件,我們將在本文后面討論。
傳感器的另一個有趣特征是感應(yīng)區(qū)域周圍的金屬外殼。正如我之前所說,必須打開藍(lán)色 LED 才能使傳感器工作。但是在傳感器應(yīng)該主動等待指紋的應(yīng)用中,不可能讓 LED 一直亮著,因為它會加熱傳感器并因此損壞它。因此,在這些情況下,金屬外殼可以連接到 MCU 的電容式觸摸輸入引腳,以檢測它是否被觸摸。如果是,則可以打開 LED 并開始感應(yīng)過程。由于超出了本文的范圍,因此此處不演示此方法。
在 3.3V 下工作時,傳感器消耗大約 130mA。注冊一個手指需要近 3 秒,識別它需要 1 秒。但是,如果注冊的模板數(shù)量較少,則識別速度會很高。有關(guān)傳感器的更多詳細(xì)信息,您可以參考模塊官方制造商 ADH-Tech 提供的 此數(shù)據(jù)表。
將 GT511C3 指紋傳感器與 Arduino 連接
GT511C3 FPS 有兩個電源引腳,可以由 Arduino 的 +5V 引腳供電,兩個通信引腳 Rx 和 Tx 可以連接到 Arduino 的任何數(shù)字引腳進(jìn)行串行通信。此外,我們還添加了一個按鈕和一個 LCD 來顯示傳感器狀態(tài)。Arduino GT511C3 指紋傳感器接口的完整電路圖 如下所示。
由于 Rx 和 Tx 引腳可承受 3.3V電壓,我們在 Rx 側(cè)使用分壓器將 5V 轉(zhuǎn)換為 3.3V。10k 電阻和 22k 電阻將來自 Arduino Tx 引腳的 5V 信號在到達(dá) FPS 的 Rx 引腳之前轉(zhuǎn)換為 3.3V。傳感器也可以由 3.3V 供電,但請確保您的 Arduino 可以為傳感器提供足夠的電流。我們已經(jīng)連接了由 Arduino 的 5V 引腳供電的 4 位模式的 LCD。一個 按鈕連接到引腳 D2,按下該按鈕后,程序?qū)⑦M(jìn)入注冊模式,用戶可以注冊新手指。注冊后,程序?qū)⒈3衷趻呙枘J揭話呙枞魏问种赣|摸傳感器。
Arduino GT511C3 指紋傳感器庫
如前所述,GT511C3 FPS 通過串行通信進(jìn)行通信,傳感器理解十六進(jìn)制代碼,并且針對每個十六進(jìn)制代碼執(zhí)行特定操作。如果您有興趣,可以查看數(shù)據(jù)表以了解所有十六進(jìn)制值及其相應(yīng)的功能。但是,幸運(yùn)的是,bboyho已經(jīng)創(chuàng)建了一個庫,可以直接與 Arduino 一起使用來注冊和檢測指紋。
該鏈接將下載一個 ZIP 文件,然后您必須按照命令Sketch -》 Include Library -》 Add .ZIP Library將其添加到您的 Arduino IDE 。添加庫后,重新啟動 IDE,您應(yīng)該能夠在 File -》 Example -》 Fingerprint Scanner TTL 下找到 GT511C3 FSP 的示例程序,如下所示
您應(yīng)該看到四個示例程序,閃爍程序?qū)㈤W爍 FPS 上的藍(lán)色 LED,注冊和 ID 手指程序可用于相應(yīng)地注冊和識別手指。請注意,一旦注冊的手指將始終被模塊記住,即使它已關(guān)閉電源。
串行直通程序可以上傳到 Arduino 以使用我們在本文前面討論的Demo_SDK.exe應(yīng)用程序。要刪除任何指紋模板或在您的計算機(jī)上保存副本,可以使用此 SDK 應(yīng)用程序。
Arduino指紋傳感器代碼
我們的目標(biāo)是編寫一個程序,當(dāng)按下按鈕時注冊手指并顯示已注冊手指的 ID 號。我們還應(yīng)該能夠在 LCD 上顯示所有信息,以使項目成為一個獨(dú)立的項目。完成相同操作的完整代碼在本頁底部給出。在這里,我將其分解為小片段,以幫助您更好地理解。
與往常一樣,我們通過包含所需的庫來開始程序,這里我們需要 FPS_GT511C3 庫用于我們的 FPS 模塊,軟件串行使用 D4 和 D5 進(jìn)行串行通信以及液晶用于 LCD 接口。然后我們需要提到 FPS 和 LCD 連接到哪些引腳。如果您按照這樣的電路圖進(jìn)行操作,則 FPS 為 4 和 5,LCD 為 D6 至 D11。相同的代碼如下所示
?
#include "FPS_GT511C3.h" //從 https://github.com/sparkfun/Fingerprint_Scanner-TTL 獲取庫 #include "SoftwareSerial.h" //軟件串行庫 #include//LCD 庫 FPS_GT511C3 fps(4, 5); //FPS連接到D4和D5 const int rs = 6, en = 7, d4 = 8, d5 = 9, d6 = 10, d7 = 11; //記液晶連接的管腳號 LiquidCrystal lcd(rs, en, d4, d5, d6, d7);//初始化液晶方法
?
在setup函數(shù)中,我們在 LCD 上顯示一些介紹性消息,然后初始化 FPS 模塊。命令 fps.SetLED(true) 將打開傳感器上的藍(lán)色 LED,您可以在不需要時通過 fps.SetLED(false) 將其關(guān)閉,因為如果持續(xù)打開它會加熱傳感器。我們還將引腳 D2 作為輸入引腳,并將其連接到內(nèi)部上拉電阻,以便將按鈕連接到引腳。
?
無效設(shè)置() { 序列.開始(9600); lcd.begin(16, 2); //初始化16*2 LCD lcd.print("GT511C3 FPS"); //介紹消息行 1 lcd.setCursor(0, 1); lcd.print("與 Arduino"); //介紹消息第 2 行 延遲(2000); lcd.clear(); fps.Open(); //發(fā)送串口命令初始化fp fps.SetLED(true); //打開 LED 以便 fps 可以看到指紋 pinMode(2,INPUT_PULLUP); //連接到內(nèi)部上拉電阻作為輸入引腳 }
?
在void 循環(huán)函數(shù)中,我們必須檢查按鈕是否被按下,如果按下,我們將注冊一個新手指并使用注冊函數(shù)將其模板與 ID 號一起保存。如果不是,我們將繼續(xù)等待手指按下傳感器。如果按下,我們將通過使用 1:N 方法將指紋與所有注冊的指紋模板進(jìn)行比較來識別指紋。一旦發(fā)現(xiàn) ID 號,我們將顯示歡迎,然后顯示 ID 號。如果指紋與任何已注冊的手指不匹配,則 id 計數(shù)將為 200,在這種情況下,我們將顯示歡迎未知。
?
if (digitalRead(2))//如果按下按鈕 { Enroll(); //注冊指紋 } // 識別指紋測試 if (fps.IsPressFinger()) { fps.CaptureFinger(false); int id = fps.Identify1_N(); lcd.clear(); lcd.print("歡迎您:"); if (id==200) lcd.print("未知"); //如果無法識別 lcd.print(id); 延遲(1000); }
?
注冊功能必須采用三個樣本輸入才能成功注冊一根手指。注冊后,將為該特定手指創(chuàng)建一個模板,除非用戶通過 HEX 命令強(qiáng)制它,否則該模板將不會被刪除。登記手指的代碼如下所示。IsPressFinger方法用于檢查是否檢測到手指,如果是,則使用CaptureFinger捕獲圖像然后最后將 Enroll1、Enroll2 和 Enroll3 用于三個不同的樣本,以成功注冊一個手指。如果注冊成功,LCD 會顯示手指的 ID 號,否則會顯示帶有代碼的失敗消息。代碼 1 表示指紋沒有被清晰地捕獲,因此您必須重試。代碼 2 是內(nèi)存失敗指示,代碼 3 表示手指已被登記。
?
void Enroll() //從庫示例程序中注冊函數(shù) { int enrollid = 0; bool usedid = true; while (usedid == true) { usedid = fps.CheckEnrolled(enrollid); if (usedid==true) 注冊ID++; } fps.EnrollStart(enrollid); // 注冊 lcd.print("注冊 #"); lcd.print(enrollid); 而(fps.IsPressFinger() == false) 延遲(100); bool bret = fps.CaptureFinger(true); int iret = 0; 如果(布雷特!=假) { lcd.clear(); lcd.print("移除手指"); fps.Enroll1(); 而(fps.IsPressFinger() == true) 延遲(100); lcd.clear(); lcd.print("再按一次"); 而(fps.IsPressFinger() == false) 延遲(100); 布雷特 = fps.CaptureFinger(true); 如果(布雷特!=假) { lcd.clear();lcd.print("移除手指"); fps.Enroll2(); 而(fps.IsPressFinger() == true) 延遲(100); lcd.clear(); lcd.print("再按一次"); 而(fps.IsPressFinger() == false) 延遲(100); 布雷特 = fps.CaptureFinger(true); 如果(布雷特!=假) { lcd.clear();lcd.print("移除手指"); iret = fps.Enroll3(); if (iret == 0) { lcd.clear(); lcd.print("報名成功"); 否則 { lcd.clear(); lcd.print("注冊失敗:"); lcd.print(iret); } } else lcd.print("失敗 1"); } else lcd.print("失敗 2"); } else lcd.print("失敗 3"); }
?
GT511C3指紋傳感器與Arduino的工作
現(xiàn)在我們的硬件和代碼已經(jīng)準(zhǔn)備好,是時候測試我們的項目了。將代碼上傳到 Arduino 并啟動,我只是使用 micro-usb 端口為項目供電。在啟動時,我們應(yīng)該在 LCD 上看到介紹信息,然后它應(yīng)該顯示“Hi!。.”。這意味著 FPS 已準(zhǔn)備好掃描手指,如果按下任何注冊的手指,它會說“歡迎”,然后是該手指的 ID 號。
如果必須注冊新手指,我們可以使用按鈕進(jìn)入注冊模式并按照 LCD 說明注冊手指。注冊過程完成后,LCD 將再次顯示“Hi!。.”,表示已讀取以再次識別手指。完整的工作可以在下面鏈接的視頻中找到。
/*
* 帶有 GT511C2 指紋傳感器 (FPS) 的 Arduino
* 注冊和檢測手指的代碼
* 適用于:www.circuitdigest.com
* 日期:6-5-19
* 代碼作者:Aswinth
*
* 將 FPS 的 Tx 連接到 Arduino 引腳 D4 和FPS 到 D5 的 Rx
*/
#include "FPS_GT511C3.h" //從https://github.com/sparkfun/Fingerprint_Scanner-TTL獲取庫 ;
#include "SoftwareSerial.h" //軟件串口庫
#include
FPS_GT511C3 fps(4, 5); //FPS連接到D4和D5
const int rs = 6, en = 7, d4 = 8, d5 = 9, d6 = 10, d7 = 11; //記液晶連接的管腳號
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);//初始化液晶方法
無效設(shè)置()
{
序列.開始(9600);
lcd.begin(16, 2); //初始化16*2 LCD
lcd.print("GT511C3 FPS"); //介紹消息行 1
lcd.setCursor(0, 1);
lcd.print("與 Arduino"); //介紹消息第 2 行
延遲(2000);
lcd.clear();
fps.Open(); //發(fā)送串口命令初始化fps
fps.SetLED(true); //打開 LED 以便 fps 可以看到指紋
pinMode(2,INPUT_PULLUP); //連接到內(nèi)部上拉電阻作為輸入引腳
}
void loop()
{
if (digitalRead(2)==0)//如果按下按鈕
{
Enroll(); //注冊指紋
}
// 識別指紋測試
if (fps.IsPressFinger())
{
fps.CaptureFinger(false);
int id = fps.Identify1_N();
lcd.clear();
lcd.print("歡迎您:");
if (id==200) lcd.print("未知"); //如果無法識別
lcd.print(id);
延遲(1000);
}
其他
{
lcd.clear(); lcd.print("嗨!....."); //準(zhǔn)備掃描時顯示hi
}
}
void Enroll() //從庫示例程序中注冊函數(shù)
{
int enrollid = 0;
bool usedid = true;
while (usedid == true)
{
usedid = fps.CheckEnrolled(enrollid);
if (usedid==true) 注冊ID++;
}
fps.EnrollStart(enrollid);
// 注冊
lcd.clear();
lcd.print("報名#");
lcd.print(enrollid);
而(fps.IsPressFinger() == false) 延遲(100);
bool bret = fps.CaptureFinger(true);
int iret = 0;
如果(布雷特!=假)
{
lcd.clear();
lcd.print("移除手指");
fps.Enroll1();
而(fps.IsPressFinger() == true) 延遲(100);
lcd.clear(); lcd.print("再按一次");
而(fps.IsPressFinger() == false) 延遲(100);
布雷特 = fps.CaptureFinger(true);
如果(布雷特!=假)
{
lcd.clear();lcd.print("移除手指");
fps.Enroll2();
而(fps.IsPressFinger() == true) 延遲(100);
lcd.clear(); lcd.print("再按一次");
而(fps.IsPressFinger() == false) 延遲(100);
布雷特 = fps.CaptureFinger(true);
如果(布雷特!=假)
{
lcd.clear();lcd.print("移除手指");
iret = fps.Enroll3();
if (iret == 0)
{
lcd.clear(); lcd.print("報名成功");
}
其他
{
lcd.clear();
lcd.print("注冊失?。?);
lcd.print(iret);
}
}
else lcd.print("失敗 1");
否則 lcd.print("失敗 2");
}
else lcd.print("失敗 3");
}
評論
查看更多