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 が代わりにタイプしてくれる」だけです.

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

Committer:
tosihisa
Date:
Fri Jan 03 07:24:39 2014 +0000
Revision:
2:34a647292050
Parent:
0:b11b455d4997
Child:
3:459a4f985a45
??ON/OFF????;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tosihisa 0:b11b455d4997 1
tosihisa 0:b11b455d4997 2 #include "mbed.h"
tosihisa 0:b11b455d4997 3 #include "GT511C3.h"
tosihisa 0:b11b455d4997 4
tosihisa 0:b11b455d4997 5 #define SET_AND_SUMADD(idx,val) sendbuf[idx]=((unsigned char)(val));sum += sendbuf[idx]
tosihisa 0:b11b455d4997 6
tosihisa 0:b11b455d4997 7 int GT511C3::Init(void)
tosihisa 0:b11b455d4997 8 {
tosihisa 0:b11b455d4997 9 baud(9600);
tosihisa 0:b11b455d4997 10 ClearLine();
tosihisa 0:b11b455d4997 11 return 0;
tosihisa 0:b11b455d4997 12 }
tosihisa 0:b11b455d4997 13
tosihisa 0:b11b455d4997 14 int GT511C3::SendCommand(unsigned long Parameter,unsigned short Command)
tosihisa 0:b11b455d4997 15 {
tosihisa 0:b11b455d4997 16 unsigned char sendbuf[12];
tosihisa 0:b11b455d4997 17 unsigned short sum = 0;
tosihisa 0:b11b455d4997 18 int idx = 0;
tosihisa 0:b11b455d4997 19 int i;
tosihisa 0:b11b455d4997 20
tosihisa 0:b11b455d4997 21 SET_AND_SUMADD(idx,0x55); idx++;
tosihisa 0:b11b455d4997 22 SET_AND_SUMADD(idx,0xAA); idx++;
tosihisa 0:b11b455d4997 23 SET_AND_SUMADD(idx,0x01); idx++;
tosihisa 0:b11b455d4997 24 SET_AND_SUMADD(idx,0x00); idx++;
tosihisa 0:b11b455d4997 25 SET_AND_SUMADD(idx,Parameter & 0xff); idx++;
tosihisa 0:b11b455d4997 26 SET_AND_SUMADD(idx,(Parameter >> 8) & 0xff); idx++;
tosihisa 0:b11b455d4997 27 SET_AND_SUMADD(idx,(Parameter >> 16) & 0xff); idx++;
tosihisa 0:b11b455d4997 28 SET_AND_SUMADD(idx,(Parameter >> 24) & 0xff); idx++;
tosihisa 0:b11b455d4997 29 SET_AND_SUMADD(idx,Command & 0xff); idx++;
tosihisa 0:b11b455d4997 30 SET_AND_SUMADD(idx,(Command >> 8) & 0xff); idx++;
tosihisa 0:b11b455d4997 31 sendbuf[idx] = sum & 0xff; idx++;
tosihisa 0:b11b455d4997 32 sendbuf[idx] = (sum >> 8) & 0xff; idx++;
tosihisa 0:b11b455d4997 33
tosihisa 0:b11b455d4997 34 for(i = 0;i < idx;i++){
tosihisa 0:b11b455d4997 35 while(!writeable());
tosihisa 0:b11b455d4997 36 putc(sendbuf[i]);
tosihisa 0:b11b455d4997 37 }
tosihisa 2:34a647292050 38 return 0;
tosihisa 0:b11b455d4997 39 }
tosihisa 0:b11b455d4997 40
tosihisa 0:b11b455d4997 41 int GT511C3::RecvResponse(unsigned long *Parameter,unsigned short *Response)
tosihisa 0:b11b455d4997 42 {
tosihisa 0:b11b455d4997 43 unsigned char buf[12];
tosihisa 0:b11b455d4997 44 unsigned short sum = 0;
tosihisa 0:b11b455d4997 45 int i;
tosihisa 0:b11b455d4997 46
tosihisa 0:b11b455d4997 47 *Parameter = 0;
tosihisa 0:b11b455d4997 48 *Response = CMD_Nack;
tosihisa 0:b11b455d4997 49
tosihisa 0:b11b455d4997 50 for(i = 0;i < sizeof(buf);i++){
tosihisa 0:b11b455d4997 51 while(!readable());
tosihisa 0:b11b455d4997 52 buf[i] = getc();
tosihisa 0:b11b455d4997 53 if(i < 9){
tosihisa 0:b11b455d4997 54 sum += buf[i];
tosihisa 0:b11b455d4997 55 }
tosihisa 0:b11b455d4997 56 if((i == 0) && (buf[i] != 0x55))
tosihisa 0:b11b455d4997 57 return -1;
tosihisa 0:b11b455d4997 58 if((i == 1) && (buf[i] != 0xAA))
tosihisa 0:b11b455d4997 59 return -1;
tosihisa 0:b11b455d4997 60 }
tosihisa 0:b11b455d4997 61 if(buf[10] != (sum & 0xff))
tosihisa 0:b11b455d4997 62 return -2;
tosihisa 0:b11b455d4997 63 if(buf[11] != ((sum >> 8) & 0xff))
tosihisa 0:b11b455d4997 64 return -2;
tosihisa 0:b11b455d4997 65
tosihisa 0:b11b455d4997 66 *Parameter = buf[7];
tosihisa 0:b11b455d4997 67 *Parameter = (*Parameter << 8) | buf[6];
tosihisa 0:b11b455d4997 68 *Parameter = (*Parameter << 8) | buf[5];
tosihisa 0:b11b455d4997 69 *Parameter = (*Parameter << 8) | buf[4];
tosihisa 0:b11b455d4997 70
tosihisa 0:b11b455d4997 71 *Response = buf[9];
tosihisa 0:b11b455d4997 72 *Response = (*Response << 8) | buf[8];
tosihisa 0:b11b455d4997 73
tosihisa 0:b11b455d4997 74 return 0;
tosihisa 0:b11b455d4997 75 }
tosihisa 0:b11b455d4997 76
tosihisa 2:34a647292050 77 int GT511C3::SendRecv(unsigned short Command,unsigned long *Parameter,unsigned short *Response)
tosihisa 2:34a647292050 78 {
tosihisa 2:34a647292050 79 int sts;
tosihisa 2:34a647292050 80 sts = SendCommand(*Parameter,Command);
tosihisa 2:34a647292050 81 if(sts == 0){
tosihisa 2:34a647292050 82 sts = RecvResponse(Parameter,Response);
tosihisa 2:34a647292050 83 }
tosihisa 2:34a647292050 84 return sts;
tosihisa 2:34a647292050 85 }
tosihisa 2:34a647292050 86
tosihisa 0:b11b455d4997 87 int GT511C3::ClearLine(void)
tosihisa 0:b11b455d4997 88 {
tosihisa 0:b11b455d4997 89 while(readable()){
tosihisa 0:b11b455d4997 90 (void)getc();
tosihisa 0:b11b455d4997 91 }
tosihisa 0:b11b455d4997 92 return 0;
tosihisa 0:b11b455d4997 93 }
tosihisa 0:b11b455d4997 94
tosihisa 2:34a647292050 95 int GT511C3::WaitPress(void)
tosihisa 2:34a647292050 96 {
tosihisa 2:34a647292050 97 unsigned long Parameter = 0;
tosihisa 2:34a647292050 98 unsigned short Response = 0;
tosihisa 2:34a647292050 99 int sts = 0;
tosihisa 2:34a647292050 100
tosihisa 2:34a647292050 101 while(1){
tosihisa 2:34a647292050 102 sts = SendRecv(CMD_IsPressFinger,&Parameter,&Response);
tosihisa 2:34a647292050 103 if(sts != 0)
tosihisa 2:34a647292050 104 break;
tosihisa 2:34a647292050 105 if((Response == CMD_Ack) && (Parameter == 0))
tosihisa 2:34a647292050 106 break;
tosihisa 2:34a647292050 107 }
tosihisa 2:34a647292050 108 return sts;
tosihisa 2:34a647292050 109 }