Test Program of GT-511C3 / GT-511C31 Fingerprint reader module.

Dependencies:   GT511C3 mbed

GT-511-C31 指紋スキャンモジュールを mbed で動かしてみる

年末に大阪日本橋にあるデジットに行くと,指紋スキャンモジュールを販売していました.

値段は少しお高め(三千円〜八千円超え)ですが,使えると色々と応用が出来そうなので,GT-511-C31を購入して mbed で動かしてみました.

/media/uploads/tosihisa/2014-01-03_23.43.55.jpg

使い方とか

このページにある GT511C3test をそのままプログラムとしてインポートして下さい.

クラスライブラリ化していますので,クラスライブラリを使う場合は,以下からインポートして下さい. ドキュメントが追いついていなくてすみません.テストプログラムを参考にして頂けたらと思います...

Import libraryGT511C3

Class library of fingerprint reader module "GT-511C3 / GT-511C31"

テストプログラムでは,mbed と p28,p27 でシリアル通信します.Vin と GND はそのまま mbed の 3.3V と GND が使えます.

finger.Enroll(11,progress); この関数の呼び出しで,ID番号11番に指紋を登録します.同じ指紋を3回あてると登録できます.

その後,finger.Identify(); の呼び出しで指紋があたっていれば認識して,同じ指紋であればID番号11番を返すはずです. それ以外の指紋があたっていると -1 を返します.

注意点として,指紋の登録あるいは認識をする場合は,必ず CmosLed を点灯させて下さい.点灯させると指紋検出面が青く光ります.これが消灯していると,指紋の検出が出来ないようです.

雑感

指紋の認識は,感覚的にですが1秒ほどで認識します.10本の指それぞれで色々な角度であててみましたが,誤認識無く,登録した指紋があたるとIDが返ります.説明書によると,「違う指紋を同じ指紋として誤る確率:0.001%未満」と言うことなので,10万回に1回の確率で間違えそうですが,実用レベルだと感じます.

うまく使うと,mbed で生体認証チックな事ができそうですね.

/media/uploads/tosihisa/2014-01-03_23.44.18.jpg

指紋認証器モドキ(自動ログインのデモ)

これは,青mbed ではなく,lpclcd と指紋スキャンモジュールを組み合わせて,指紋認証器モドキを作って Mac に自動ログインするプロトタイプです.

lpclcd は mbed と同じように USBKeyboard の様に振る舞わせることが出来ますので,登録された指紋があたると,lpclcd で USBKeyboard::printf("パスワード\n"); を実行してあたかもパスワードがUSB Keyboard で打ち込まれたかの様に動作させています.

この指紋認証器モドキのメリットは,PCから見ればUSBキーボードの様に見えるので­,特別なドライバを必要としないことです.要するに「登録された指紋があたれば事前に­プログラムされた文字列を lpclcd が代わりにタイプしてくれる」だけです.

実用を考えた時,セキュリティ強度は 強くはないでしょう.このテストプログラムは,パスワードを生文字列で抱き込んでいる­ので,バイナリレベルで解析すればすぐに生文字列が分かってしまいます.なので指紋認­証器モドキです.

Files at this revision

API Documentation at this revision

Comitter:
tosihisa
Date:
Fri Jan 03 07:24:39 2014 +0000
Parent:
1:4a1be9379e92
Child:
3:459a4f985a45
Commit message:
??ON/OFF????;

Changed in this revision

GT511C3.cpp Show annotated file Show diff for this revision Revisions of this file
GT511C3.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/GT511C3.cpp	Fri Jan 03 06:34:26 2014 +0000
+++ b/GT511C3.cpp	Fri Jan 03 07:24:39 2014 +0000
@@ -35,7 +35,7 @@
         while(!writeable());
         putc(sendbuf[i]);
     }
-    return idx;
+    return 0;
 }
 
 int GT511C3::RecvResponse(unsigned long *Parameter,unsigned short *Response)
@@ -74,6 +74,16 @@
     return 0;
 }
 
+int GT511C3::SendRecv(unsigned short Command,unsigned long *Parameter,unsigned short *Response)
+{
+    int sts;
+    sts = SendCommand(*Parameter,Command);
+    if(sts == 0){
+        sts = RecvResponse(Parameter,Response);
+    }
+    return sts;
+}
+
 int GT511C3::ClearLine(void)
 {
     while(readable()){
@@ -82,3 +92,18 @@
     return 0;
 }
 
+int GT511C3::WaitPress(void)
+{
+    unsigned long Parameter = 0;
+    unsigned short Response = 0;
+    int sts = 0;
+
+    while(1){
+        sts = SendRecv(CMD_IsPressFinger,&Parameter,&Response);
+        if(sts != 0)
+            break;
+        if((Response == CMD_Ack) && (Parameter == 0))
+            break;
+    }
+    return sts;
+}
--- a/GT511C3.h	Fri Jan 03 06:34:26 2014 +0000
+++ b/GT511C3.h	Fri Jan 03 07:24:39 2014 +0000
@@ -60,5 +60,7 @@
     int Init(void);
     int SendCommand(unsigned long Parameter,unsigned short Command);
     int RecvResponse(unsigned long *Parameter,unsigned short *Response);
+    int SendRecv(unsigned short Command,unsigned long *Parameter,unsigned short *Response);
     int ClearLine(void);
+    int WaitPress(void);
 };
--- a/main.cpp	Fri Jan 03 06:34:26 2014 +0000
+++ b/main.cpp	Fri Jan 03 07:24:39 2014 +0000
@@ -6,11 +6,31 @@
 DigitalOut myled(LED1);
 GT511C3 finger(p28,p27);
 
+int Enroll(void)
+{
+    int EnrollID = 10;
+    unsigned long Parameter = 0;
+    unsigned short Response = 0;
+    int sts = 0;
+
+    debug.printf("CMD_EnrollStart\n");
+    Parameter = EnrollID;
+    sts = finger.SendRecv(GT511C3::CMD_EnrollStart,&Parameter,&Response);
+    debug.printf("sts = %d,Response=0x%04x Parameter=0x%08lx\n",sts,Response,Parameter);
+    if(sts != 0)
+        return sts;
+    if(Response != GT511C3::CMD_Ack)
+        return -100;
+    //
+    return sts;
+}
+
 int main() {
     unsigned long Parameter;
     unsigned short Response;
     int sts = 0;
     int count = 0;
+    int ispress;
 
     debug.format(8,Serial::None,1);
     debug.baud(115200);
@@ -18,19 +38,29 @@
     debug.printf("Init\n");
     finger.Init();
     debug.printf("Open\n");
-    finger.SendCommand(0,GT511C3::CMD_Open);
-    sts = finger.RecvResponse(&Parameter,&Response);
+    Parameter = 0;
+    sts = finger.SendRecv(GT511C3::CMD_Open,&Parameter,&Response);
     debug.printf("sts = %d,Response=0x%04x\n",sts,Response);
 
+        Parameter = 1;
+        sts = finger.SendRecv(GT511C3::CMD_CmosLed,&Parameter,&Response);
+        debug.printf("sts = %d,Response=0x%04x\n",sts,Response);
     while(1) {
-        debug.printf("Led\n");
-        finger.SendCommand(count & 1,GT511C3::CMD_CmosLed);
-        sts = finger.RecvResponse(&Parameter,&Response);
-        debug.printf("sts = %d,Response=0x%04x\n",sts,Response);
+        ispress = 0;
+        Parameter = 0;
+        sts = finger.SendRecv(GT511C3::CMD_IsPressFinger,&Parameter,&Response);
+        debug.printf("sts = %d,Response=0x%04x Parameter=0x%08lx\n",sts,Response,Parameter);
+        if(sts == 0){
+            if((Response == GT511C3::CMD_Ack) && (Parameter == 0)){
+                ispress = 1;
+            }
+        }
+#if 0
         myled = 1;
         wait(0.5);
         myled = 0;
         wait(0.5);
+#endif
         count++;
     }
 }