本項(xiàng)目利用GT511C3指紋傳感器(FPS)模塊,在Aduino開發(fā)板上實(shí)現(xiàn)了一個(gè)高精度、快速響應(yīng)的指紋掃描儀。項(xiàng)目通過Arduino錄入指紋,在需要的時(shí)候檢測、驗(yàn)證指紋,還可通過硬姐智造PCBA一站式服務(wù)將項(xiàng)目從DIY拓展到新興的生物識(shí)別市場。
所需的組件:
Arduino UNO開發(fā)板
GT511C3指紋傳感器模塊
162A LCD顯示屏
1K電阻
2K電阻
10K電位器
按鈕
連接跳線
面包板
了解GT511C3指紋傳感器模塊
與電容式、超聲波指紋傳感器模塊不同,GT511C3指紋傳感器模塊采用光學(xué)技術(shù)。該模塊內(nèi)置一個(gè)攝像頭,可以拍攝指紋圖案,再由內(nèi)部HOLTEK ARM Cortex M3 MCU處理這些指紋圖案。該掃描儀模塊最多可保存200次指紋掃描,并為每個(gè)指紋分配一個(gè)從0到199的ID。
該光學(xué)傳感器模塊外形小巧,可輕松集成到具有串行UART接口的應(yīng)用中。模塊有四根線:兩根線用于TX和RX,兩根線用于電源。傳感器可在3.3-6V電壓范圍內(nèi)工作,通信引腳(Rx和Tx)可承受3.3V電壓。
GT511C3模塊可通過USB直接與計(jì)算機(jī)連接。使用USB連接時(shí),可使用SDK_DEMO.exe應(yīng)用程序控制此模塊。此應(yīng)用程序允許用戶錄/驗(yàn)證/刪除指紋。
?
?
GT511C3模塊的特性和規(guī)格:
工作電壓:3.3-6VDC
工作電流:<130mA
工作溫度:~20°C ~ +60°C
CPU:ARM Cortex M3內(nèi)核(Holtek HT32F2755)
最大指紋數(shù):200個(gè)指紋
傳感器:光學(xué)傳感器
串行通信:UART(默認(rèn):9600波特)和USB v1.1
錯(cuò)誤接受率 (FAR):< 0.001%
錯(cuò)誤拒絕率 (FRR): < 0.01%
注冊(cè)時(shí)間 < 3 秒(3個(gè)指紋)
識(shí)別時(shí)間:<1.0秒(200個(gè)指紋)
GT511C3指紋傳感器模塊有4個(gè)引腳,紅色線是VCC,黑色是GND,綠色線是Rx,白色線是Tx。
GT511C3 SDK演示軟件
?
GT511C3 SDK是一套快速入門套件。使用時(shí),首先將指紋傳感器連接到USB轉(zhuǎn)TTL模塊,將紅色線連接到VCC,黑色線連接到GND,綠色線連接到Tx,白色線連接到Rx。
?
USB轉(zhuǎn)TTL FTDI模塊與GT511C3指紋傳感器的UART連接?
接下來,按以下操作在電腦上使用SDK:
1. 下載 SDK_DEMO.exe
2. 解壓文件夾。
3. 進(jìn)入解壓后的目錄
4. 打開 SDK_DEMO.exe 可執(zhí)行文件。
5. 在“串行端口號(hào)”下拉菜單中選擇FTDI枚舉的COM端口。
6. 在波特率的下拉菜單中選擇9600。
7. 單擊打開按鈕。
?
?
連接正確后,將顯示固件版本和設(shè)備序列號(hào),以及其他選項(xiàng),例如錄取、驗(yàn)證、識(shí)別、獲取圖像、刪除、獲取數(shù)據(jù)庫等。如果要?jiǎng)h除指紋,只需單擊“全部刪除”選項(xiàng)即可完成。
將GT511C3模塊與Arduino連接
根據(jù)線路圖,將指紋傳感器與Arduino連接起來。
?
?
由于傳感器UART引腳僅承受3.3V電壓,本項(xiàng)目使用了一個(gè)由2K電阻和1K電阻組成的分壓器網(wǎng)絡(luò),將綠色線(Rx)連接到Arduino開發(fā)板的D5引腳,將白色線(Tx)連接到Arduino開發(fā)板的D4引腳。
?
GT511C3 Arduino庫?
現(xiàn)在要做的,就是把GT511C3 Arduino庫上傳到Arduino IDE。該庫由Sparkfun編寫,已經(jīng)在其他類型的指紋傳感器上進(jìn)行了測試。
以下是指紋錄入代碼:
#include "FPS_GT511C3.h"
#include "SoftwareSerial.h"
FPS_GT511C3 fps(4, 5); ? ? ? ? ?// ? ?digital pin 5(arduino Tx, fps Rx)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// ? ?digital pin 4(arduino Rx, fps Tx)
void setup()
{
?Serial.begin(9600); ? ? ? ? ? //default baud rate
?delay(100);
?fps.Open();
?fps.SetLED(true);
?Enroll();
}
void Enroll()
{
?int enrollid = 0; ? ? ? ? ? ? // find open enroll id
?bool okid = true;
?while (okid == true)
?{
? ?okid = fps.CheckEnrolled(enrollid);
? ?if (okid==true) enrollid++;
?}
?fps.EnrollStart(enrollid); ? // enroll
?
?Serial.print("Press finger to Enroll #");?
?Serial.println(enrollid);
?while(fps.IsPressFinger() == false) delay(100);
?bool bret = fps.CaptureFinger(true);
?int iret = 0;
?if (bret != false)
?{
? ?Serial.println("Remove finger");
? ?fps.Enroll1();?
? ?while(fps.IsPressFinger() == true) delay(100);
? ?Serial.println("Press same finger again");
? ?while(fps.IsPressFinger() == false) delay(100);
? ?bret = fps.CaptureFinger(true);
? ?if (bret != false)
? ?{
? ? ?Serial.println("Remove finger");
? ? ?fps.Enroll2();
? ? ?while(fps.IsPressFinger() == true) delay(100);
? ? ?Serial.println("Press same finger yet again");
? ? ?while(fps.IsPressFinger() == false) delay(100);
? ? ?bret = fps.CaptureFinger(true);
? ? ?if (bret != false)
? ? ?{
? ? ? ?Serial.println("Remove finger");
? ? ? ?iret = fps.Enroll3();
? ? ? ?if (iret == 0)
? ? ? ?{
? ? ? ? ?Serial.println("Enrolling Successfull");
? ? ? ?}
? ? ? ?else
? ? ? ?{
? ? ? ? ?Serial.print("Enrolling Failed with error code:");
? ? ? ? ?Serial.println(iret);
? ? ? ?}
? ? ?}
? ? ?else Serial.println("Failed to capture third finger");
? ?}
? ?else Serial.println("Failed to capture second finger");
?}
?else Serial.println("Failed to capture first finger");
}
void loop()
{
?delay(100);
}
上傳代碼后,打開串口監(jiān)視器,系統(tǒng)將要求你放置一個(gè)手指,進(jìn)行錄入并注冊(cè)。
?
?
以下是讀取指紋的代碼:
#include "FPS_GT511C3.h"
#include "SoftwareSerial.h"
FPS_GT511C3 fps(4, 5); ? ? ? ? ?// ? ?digital pin 5(arduino Tx, fps Rx)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// ? ?digital pin 4(arduino Rx, fps Tx)
void setup()
{
?Serial.begin(9600); ? ? ? ? ? //default baud rate
?delay(100);
?fps.Open();
?fps.SetLED(true);
}
void loop()
{
?// Identify fingerprint test
?if (fps.IsPressFinger())
?{
? ?fps.CaptureFinger(false);
? ?int id = fps.Identify1_N();
? ?if (id <200)
? ?{
? ? ?Serial.print("Verified ID:");
? ? ?Serial.println(id);
? ?}
? ?else
? ?{
? ? ?Serial.println("Finger not found");
? ?}
?}
?else
?{
? ?Serial.println("Please press finger");
?}
?delay(100);
}
?
再次上傳代碼并進(jìn)行測試。上傳代碼后,打開串口監(jiān)視器,系統(tǒng)將請(qǐng)求放置手指進(jìn)行驗(yàn)證。你可以放置剛剛注冊(cè)的手指,也可以隨意放一個(gè)指頭上去,讓設(shè)備自己讀取你的指紋并進(jìn)行驗(yàn)證對(duì)比。
采用Arduino和LCD屏的便攜式指紋掃描儀
經(jīng)過對(duì)GT511C3的了解和使用,我們?cè)谏鲜鲭娐穲D中再添加一個(gè)LCD顯示屏,就構(gòu)成了一個(gè)簡單的便攜式指紋掃描儀。
?
GT511C3指紋傳感器、LCD顯示屏與Arduino開發(fā)板的連接電路圖?
這里,我們通過一個(gè)按鈕開關(guān),將GT511C3連接到Arduino數(shù)字引腳2。按下按鈕時(shí),傳感器將進(jìn)入指紋錄入模式。新添加的16x2字符LCD顯示屏,用來顯示用戶與指紋傳感器交互時(shí)的實(shí)時(shí)數(shù)據(jù)。
增加了LCD顯示屏后,組合了指紋錄入、驗(yàn)證和LCD顯示庫的完整代碼如下:
#include?
const int rs = 12, en = 11, d4 = 10, d5 = 9, d6 = 8, d7 = 7;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
#include "FPS_GT511C3.h"
#include "SoftwareSerial.h"
FPS_GT511C3 fps(4, 5); ? ? ? ? ?// ? ?digital pin 5(arduino Tx, fps Rx)
void setup()
{
?Serial.begin(9600); ? ? ? ? ? //default baud rate
?lcd.begin(16, 2);
?delay(100);
?fps.Open();
?fps.SetLED(true);
?pinMode(2, INPUT_PULLUP); //Connect to internal pull up resistor as input pin
?lcd.setCursor(4, 0);
?lcd.print("GT511C3");
?lcd.setCursor(3, 1);
?lcd.print("FPS Sensor");
?delay(2500);
}
void loop()
{
?read_fps();
?if (digitalRead(2) == 0) //If button pressed
?{
? ?Enroll(); //Enroll a fingerprint
?}
?delay(100);
}
void Enroll()
{
?int enrollid = 0; ? ? ? ? ? ? // find open enroll id
?bool okid = true;
?while (okid == true)
?{
? ?okid = fps.CheckEnrolled(enrollid);
? ?if (okid == true) enrollid++;
?}
?fps.EnrollStart(enrollid); ? // enroll
?Serial.print("Press finger to Enroll #");
?Serial.println(enrollid);
?lcd.setCursor(0, 0);
?lcd.print("Put Finger to");
?lcd.setCursor(0, 1);
?lcd.print("Enroll: #");
?lcd.print(enrollid);
?while (fps.IsPressFinger() == false)
? ?delay(100);
?bool bret = fps.CaptureFinger(true);
?int iret = 0;
?if (bret != false)
?{
? ?Serial.println("Remove finger");
? ?lcd.clear();
? ?lcd.setCursor(0, 0);
? ?lcd.print("Remove finger");
? ?fps.Enroll1();
? ?while (fps.IsPressFinger() == true)
? ? ?delay(100);
? ?Serial.println("Press same finger again");
? ?lcd.clear();
? ?lcd.setCursor(0, 0);
? ?lcd.print("Put same finger");
? ?lcd.setCursor(0, 1);
? ?lcd.print("again");
? ?while (fps.IsPressFinger() == false)
? ? ?delay(100);
? ?bret = fps.CaptureFinger(true);
? ?if (bret != false)
? ?{
? ? ?Serial.println("Remove finger");
? ? ?lcd.clear();
? ? ?lcd.setCursor(0, 0);
? ? ?lcd.print("Remove finger");
? ? ?fps.Enroll2();
? ? ?while (fps.IsPressFinger() == true)
? ? ? ?delay(100);
? ? ?Serial.println("Press same finger yet again");
? ? ?lcd.clear();
? ? ?lcd.setCursor(0, 0);
? ? ?lcd.print("Put same finger");
? ? ?lcd.setCursor(0, 1);
? ? ?lcd.print("yet again");
? ? ?while (fps.IsPressFinger() == false)
? ? ? ?delay(100);
? ? ?bret = fps.CaptureFinger(true);
? ? ?if (bret != false)
? ? ?{
? ? ? ?Serial.println("Remove finger");
? ? ? ?iret = fps.Enroll3();
? ? ? ?if (iret == 0)
? ? ? ?{
? ? ? ? ?Serial.println("Enrolling Successfull");
? ? ? ? ?lcd.clear();
? ? ? ? ?lcd.setCursor(0, 0);
? ? ? ? ?lcd.print("Enrolling");
? ? ? ? ?lcd.setCursor(0, 1);
? ? ? ? ?lcd.print("Successfull");
? ? ? ?}
? ? ? ?else
? ? ? ?{
? ? ? ? ?Serial.print("Enrolling Failed with error code:");
? ? ? ? ?Serial.println(iret);
? ? ? ? ?lcd.clear();
? ? ? ? ?lcd.setCursor(0, 0);
? ? ? ? ?lcd.print("Enrolling Failed");
? ? ? ? ?lcd.setCursor(0, 1);
? ? ? ? ?lcd.print(iret);
? ? ? ?}
? ? ?}
? ? ?else
? ? ? ?Serial.println("Failed to capture third finger");
? ? ?lcd.clear();
? ? ?lcd.setCursor(0, 0);
? ? ?lcd.print("Failed Capturing");
? ? ?lcd.setCursor(0, 1);
? ? ?lcd.print("third finger");
? ?}
? ?else
? ? ?Serial.println("Failed to capture second finger");
? ?lcd.clear();
? ?lcd.setCursor(0, 0);
? ?lcd.print("Failed Capturing");
? ?lcd.setCursor(0, 1);
? ?lcd.print("second finger");
?}
?else
? ?Serial.println("Failed to capture first finger");
?lcd.clear();
?lcd.setCursor(0, 0);
?lcd.print("Failed Capturing");
?lcd.setCursor(0, 1);
?lcd.print("first finger");
}
void read_fps()
{
?// Identify fingerprint test
?if (fps.IsPressFinger())
?{
? ?fps.CaptureFinger(false);
? ?int id = fps.Identify1_N();
? ?if (id < 200)
? ?{
? ? ?Serial.print("Verified ID:");
? ? ?Serial.println(id);
? ? ?lcd.clear();
? ? ?lcd.setCursor(0, 0);
? ? ?lcd.print("Verified ID:");
? ? ?lcd.setCursor(0, 1);
? ? ?lcd.print(id);
? ?}
? ?else
? ?{
? ? ?Serial.println("Finger not found");
? ? ?lcd.clear();
? ? ?lcd.setCursor(0, 0);
? ? ?lcd.print("Finger Not Found");
? ?}
?}
?else
?{
? ?Serial.println("Please press finger");
? ?lcd.clear();
? ?lcd.setCursor(0, 0);
? ?lcd.print("Please Put ");
? ?lcd.setCursor(0, 1);
? ?lcd.print("Finger");
?}
?delay(100);
}
選擇Arduino Nano開發(fā)板型號(hào)和COM端口并上傳。代碼上傳完成后,LCD顯示屏?xí)崾痉胖檬种?,同時(shí),指紋模塊中的藍(lán)色LED將會(huì)點(diǎn)亮。
如果要錄入指紋,請(qǐng)按下按鈕,然后掃描手指3次。完成后,指紋錄取完畢。
要驗(yàn)證指紋,請(qǐng)將同一根手指放在指紋模塊上。
上面就是一個(gè)便攜式指紋掃描儀模型的制作全過程了。如果你覺得這個(gè)項(xiàng)目非常好,還想進(jìn)行小批量生產(chǎn),就需要將其中的面包板換成PCB板。這里的PCB打樣很簡單,硬姐智造PCBA一站式“打樣+批量”服務(wù)可滿足創(chuàng)客的各種定制需求,把項(xiàng)目從DIY拓展到指紋鎖、POS機(jī)等生物識(shí)別領(lǐng)域。
?
評(píng)論
查看更多