数年前にSF映画で見た指紋センサーは、さまざまな目的で人物の身元を確認するために非常に一般的になっています。現在、指紋ベースのシステムは、オフィスへの出席、銀行での従業員の確認、ATMでの現金の引き出しや預金、役所での本人確認など、日常生活のいたるところに見られます。すでにArduinoやRaspberry Piを使用して、今日は指紋センサーをPICマイクロコンピューターとインターフェースします。このPICマイクロコントローラーPIC16f877A指紋システムを使用して、システムに新しい指紋を登録し、すでに供給されている指紋を削除することができます。システムの完全な動作はビデオで示されています 記事の最後に記載されています。
必要なコンポーネント
- PIC16f877Aマイクロコントローラー
- 指紋モジュール
- プッシュボタンまたはキーパッド
- 16x2 LCD
- 10kポット
- 18.432000MHz水晶発振器
- ブレッドボードまたはPCB(JLCPCBから注文)
- ジャンパー線
- LED(オプション)
- 抵抗器150オーム-1kオーム(オプション)
- 5v電源
回路図と説明
この PICマイクロコントローラー指紋センサーインターフェースプロジェクトでは、4つのプッシュボタンを使用しました。これらのボタンは多機能に使用されます。キー1は、システムで指紋を保存または削除するときに、指紋を照合し、指紋IDをインクリメントするために使用されます。キー2は、新しい指紋を登録し、システムで指紋を保存または削除するときに指紋IDをデクリメントするために使用されます。キー3はシステムから保存された指を削除するために使用され、キー4はOKのために使用されます。A LED 指紋が検出または照合されたことを示すために使用されます。ここでは、UARTで動作する指紋モジュールを使用しました。したがって、ここでは、この指紋モジュールをPICマイクロコントローラーとデフォルトのボーレートである57600でインターフェースしました。
したがって、まず、以下の回路図に示すように、必要なすべての接続を行う必要があります。接続は簡単です。指紋モジュールをPICマイクロコントローラーのUARTに接続しました。16x2 LCDは、すべてのメッセージを表示するために使用されます。10kポットは、LCDのコントラストを制御するためにも使用されます。16x2LCDデータピンはPORTAピンに接続されています。LCDのd4、d5、d6、およびd7ピンは、それぞれPICマイクロコントローラのピンRA0、RA1、RA2、およびRA3に接続されています。4つの押しボタン(またはキーパッド)がPORTDのピンRD0、RD1、RD2、およびRDに接続されています。LEDはポートPORTCのピンRC3にも接続されています。ここでは、18.432000MHzの外部水晶発振器を使用してマイクロコントローラーにクロックを供給しました。
PICマイクロコントローラーによる指紋センサーの操作
このプロジェクトの操作は簡単です。PICプログラマーまたはバーナー(PIckit2またはPickit3など)を使用して、ソースコードから生成された16進ファイルをPICマイクロコントローラーにアップロードするだけで、LCDとユーザーにいくつかの紹介メッセージが表示されます。操作の選択肢を入力するように求められます。指紋を一致させるには、ユーザーはキー1を押す必要があり、LCDは指紋 センサーに指を 置く ように要求します。これで、指紋モジュールに指を置くことで、指紋がすでに保存されているかどうかを確認できます。指紋が保存されている場合、LCDには「 ID:2」の ような指紋の保存IDを持つメッセージが表示され ます。 それ以外の場合は 「見つかりません」 と表示 され ます。
今、 指登録するには 、印刷をプレス登録]ボタンまたはキー2のユーザーのニーズや液晶画面の指示メッセージに従ってください。
ユーザーが指紋のいずれかを削除したい場合、ユーザー は 削除 ボタンまたはキー3を押す必要があります。 その後、LCDは削除される指紋のIDを要求します。インクリメントプッシュボタンまたはキー1(一致プッシュボタンまたはキー1)およびデクリメントプッシュボタンまたはキー2(登録プッシュボタンまたはキー2)を使用してインクリメントおよびデクリメントすることにより、ユーザーは保存された指紋のIDを選択して[OK]を押すことができます。その指紋を削除するボタン。詳細について は、プロジェクトの最後に提供されているビデオをご覧ください 。
FingerPrintインターフェース注:このプロジェクトのプログラムは、初心者にとっては少し複雑です。しかし、r305指紋モジュールのデータシートを読んで作成されたその単純なインターフェースコード。この指紋モジュールの機能に関するすべての説明は、データシートに記載されています。
ここでは、フレーム形式を使用して指紋モジュールと通信しました。コマンドまたはデータ要求フレームを指紋モジュールに送信するたびに、適用されたコマンドに関連するデータまたは情報を含む同じフレーム形式で応答します。すべてのデータおよびコマンドフレーム形式は、ユーザーマニュアルまたはR305フィンガープリントモジュールのデータシートに記載されています。
プログラミングの説明
プログラミングでは、以下のフレームフォーマットを使用しました。
プログラムは、構成ビットを設定し、LCD、ボタン、およびLEDのマクロとピンを定義することから始めます。これらは、このプロジェクトの最後に記載されている完全なコードで確認できます。PICマイクロコントローラーを初めて使用する場合は、PICマイクロコントローラープロジェクトの開始から始めてください。
次に、いくつかの変数と配列を宣言して初期化し、指紋モジュールをPICマイクロコントローラーとインターフェイスさせるためにこのプロジェクトで使用する必要のあるフレームを作成しました。
uchar buf; uchar buf1; 揮発性uintインデックス= 0; volatile int flag = 0; uint msCount = 0; uint g_timerflag = 1; 揮発性uintカウント= 0; ucharデータ; uint id = 1; 列挙型 { CMD、 DATA、 SBIT_CREN = 4、 SBIT_TXEN、 SBIT_SPEN、 }; const char passPack = {0xEF、0x1、0xFF、0xFF、0xFF、0xFF、0x1、0x0、0x7、0x13、0x0、0x0、0x0、0x0、0x0、0x1B}; const char f_detect = {0xEF、0x1、0xFF、0xFF、0xFF、0xFF、0x1、0x0、0x3、0x1、0x0、0x5}; const char f_imz2ch1 = {0xEF、0x1、0xFF、0xFF、0xFF、0xFF、0x1、0x0、0x4、0x2、0x1、0x0、0x8}; const char f_imz2ch2 = {0xEF、0x1、0xFF、0xFF、0xFF、0xFF、0x1、0x0、0x4、0x2、0x2、0x0、0x9}; const char f_createModel = {0xEF、0x1,0xFF、0xFF、0xFF、0xFF、0x1,0x0,0x3,0x5,0x0,0x9}; char f_storeModel = {0xEF、0x1,0xFF、0xFF、0xFF、0xFF、0x1,0x0,0x6,0x6,0x1,0x0,0x1,0x0,0xE}; const char f_search = {0xEF、0x1、0xFF、0xFF、0xFF、0xFF、0x1、0x0、0x8、0x1B、0x1、0x0、0x0、0x0、0xA3、0x0、0xC8}; char f_delete = {0xEF、0x1,0xFF、0xFF、0xFF、0xFF、0x1,0x0,0x7,0xC、0x0,0x0,0x0,0x1,0x0,0x15};
その後、LCDを駆動するLCD機能を作りました。
void lcdwrite (uchar ch、uchar rw ){ LCDPORT = ch >> 4&0x0F; RS = rw; EN = 1; __delay_ms(5); EN = 0; LCDPORT = ch&0x0F; EN = 1; __delay_ms(5); EN = 0; } lcdprint(char * str){ while(* str){ lcdwrite(* str ++、DATA); // __ delay_ms(20); } } lcdbegin(){ uchar lcdcmd = {0x02,0x28,0x0E、0x06,0x01}; uint i = 0; for(i = 0; i <5; i ++)lcdwrite(lcdcmd、CMD); }
与えられた関数はUARTの初期化に使用されます
void serialbegin (uint baudrate ) { SPBRG =(18432000UL /(long)(64UL * baudrate))-1; //ボーレート@ 18.432000Mhzクロック TXSTAbits.SYNC = 0; //非同期モードの設定、つまりUART RCSTAbits.SPEN = 1; //シリアルポートを有効にし ますTRISC7 = 1; //データシートに規定されている とおりTRISC6 = 0; //データシートに規定されている とおりRCSTAbits.CREN = 1; //連続受信を有効にし ますTXSTAbits.TXEN = 1; //送信を有効にし ますGIE = 1; // ENABLE割り込み INTCONbits.PEIE = 1; //周辺機器の割り込みを有効にします。 PIE1bits.RCIE = 1; // USART受信割り込みを 有効にするPIE1bits.TXIE = 0; // USARTTX 割り込みを無効にしますPIR1bits.RCIF = 0; }
指定された関数は、コマンドを指紋モジュールに転送し、指紋モジュールからデータを受信するために使用されます。
void serialwrite (char ch) { while(TXIF == 0); //トランスミッタレジスタが空になるまで待ちます TXIF = 0; //トランスミッタフラグをクリアし ますTXREG = ch; //送信する文字を送信 レジスタにロードします} serialprint(char * str) { while(* str) { serialwrite(* str ++); } } void割り込みSerialRxPinInterrupt(void) { if((PIR1bits.RCIF == 1)&&(PIE1bits.RCIE == 1)) { uchar ch = RCREG; buf = ch; if(index> 0)flag = 1; RCIF = 0; // rxフラグをクリアします} } void serialFlush(){ for(int i = 0; i
その後、指紋に送信されるデータを準備し、指紋モジュールからのデータをデコードする関数を作成する必要があります。
int sendcmd2fp(char * pack、int len ) { uint res = ERROR; serialFlush(); index = 0; __delay_ms(100); for(int i = 0; i
これで、4つの異なるタスクのコードで使用できる4つの関数があります。
- 指紋IDを入力するための関数– unit getId()
- 指を照合するための関数– void matchFinger()
- 新しい指を登録するための関数– void enrolFinger()
- 指を削除するための関数– void deleteFinger()
4つの関数すべてを含む完全なコードを最後に示します。
ここで、main関数で、GPIO、LCD、UARTを初期化し、指紋モジュールがマイクロコントローラーに接続されているかどうかを確認します。次に、LCDを介していくつかの紹介メッセージを表示します。最後に、 while ループで、プロジェクトを操作するためにすべてのキーまたはプッシュボタンを読み取ります。
int main() { void(* FP)(); ADCON1 = 0b00000110; LEDdir = 0; SWPORTdir = 0xF0; SWPORT = 0x0F; serialbegin(57600); LCDPORTDIR = 0x00; TRISE = 0; lcdbegin(); lcdprint( "Fingerprint"); lcdwrite(192、CMD); lcdprint( "インターフェース"); __delay_ms(2000); lcdwrite(1、CMD); lcdprint( "PIC16F877Aの使用"); lcdwrite(192、CMD); lcdprint( "回路ダイジェスト"); __delay_ms(2000); index = 0; while(sendcmd2fp(&passPack、sizeof(passPack))) { lcdwrite(1、CMD); lcdprint( "FPが見つかりません"); __delay_ms(2000); index = 0; } lcdwrite(1、CMD); lcdprint( "FPが見つかりました"); __delay_ms(1000); lcdinst(); while(1) { FP =一致
完全なPICコードと作業ビデオ を以下に示します。指紋センサーモジュールを使用した他のプロジェクトも確認してください。
- Arduinoを使用した指紋ベースの生体認証投票機
- Arduinoと指紋センサーを使用した生体認証セキュリティシステム
- Arduinoを使用した指紋ベースの生体認証システム
- RaspberryPiとインターフェースする指紋センサー