ペン州立大学の研究者によると、人間は人間よりも機械を信頼する可能性が高いとのことです。これは、ATMピンを機械に簡単に公開することからも明らかです。今日、AI、機械学習、チャットボット、スマートスピーカー、ロボットなどが活発に進歩している世界では、人間とロボットの間のこの相乗効果はますます増大するように設定されています。今日、橋の通行料徴収人からチェックアウトキャッシャーまで、私たちの周りのすべてのものが、作業をより簡単かつ効率的に行うために機械に置き換えられています。このフェーズに追いつくために、このプロジェクトでは、AVRマイクロコントローラーを使用してバイオメトリック出席システムを構築し、手動で出席する手順を置き換えます。このシステムは、時間を節約し、覆い焼きを回避するため、より信頼性が高く効率的です。
指紋出席システムはすでに市場から直接入手できますが、それを構築するよりも楽しいことは何ですか?また、単純なRFIDベースの出席システムから、ArduinoとRaspberry Piを使用したIoTベースの生体認証出席システムまで、さまざまな出席システムを以前に構築しました。このプロジェクトでは、指紋モジュールとAVR(atmega32)を使用して出席を登録しました。指紋センサーを使用することにより、システムはユーザーにとってより安全になります。次のセクションでは、AVRを使用して指紋ベースの生体認証システムを作成する技術的な詳細について説明します 。
必要なコンポーネント
- Atmega32 -1
- 指紋モジュール(r305)-1
- プッシュボタンまたはメンブレンボタン-4
- LED -2
- 1K抵抗-2
- 2.2K抵抗-1
- 電源12vアダプター
- 接続線
- ブザー-1
- 16x2 LCD -1
- PCBまたはブレッドボード
- RTCモジュール(ds1307またはds3231)-1
- LM7805-1
- 1000uf、10ufコンデンサ-1
- Burgstipsオスメス
- DCジャック(オプション)
- BC547トランジスタ-1
この 指紋出席システム回路では、指紋センサーモジュール を使用して、システムに指紋入力を取得することにより、個人または従業員のIDを認証しました。ここでは、4つのプッシュボタンを使用して、指紋データの登録、削除、インクリメント、およびデクリメントを行っています。キー1は、システムへの新しい人の登録に使用されます。したがって、ユーザーが新しい指を登録する場合は、キー1を押す必要があり、LCDは指紋センサーに指を2回置くように要求し、次に従業員IDを要求します。同様に、キー2には、ユーザーが新しい指を登録するときのように、指紋IDを選択する必要があるという2つの機能があります。別の2つのキー、つまり3と4を使用します。次に、ユーザーはキー1を押す必要があります(今回はこのキーはOKのように動作します)。選択したIDに進みます。また、キー2は、マイクロコントローラのEEPROMからのデータのリセットまたは削除にも使用されます。
指紋センサーモジュールは、指の印刷画像をキャプチャし、それを同等のテンプレートに変換して、マイクロコントローラーによって選択されたIDに従ってメモリに保存します。指のプリントの画像を撮るなど、すべてのプロセスはマイクロコントローラーによって命令されます。テンプレートに変換し、IDなどとして保存します。指紋センサーセキュリティシステムと指紋センサー投票機を構築した、これらの他の指紋センサープロジェクトも確認できます。
回路図
指紋ベースの出席システムプロジェクトの完全な回路図を以下に示します。プロジェクトのすべてのプロセスを制御するためのAtmega32マイクロコントローラーを備えています。プッシュボタンまたはメンブレンボタンは、登録、削除、出席のためのIDの選択に使用され、ブザーは表示に使用され、16x2LCDはユーザーにマシンの使用方法を指示するために使用されます。
回路図に示すように、プッシュボタンまたはメンブレンボタンは、マイクロコントローラのピンPA2(ENROLキー1)、PA3(DELキー2)、PA0(UPキー3)、PA1(DOWNキー4)に直接接続されています。またはPA4。また、LEDは1k抵抗を介してグランドに対してマイクロコントローラのピンPC2に接続されています。マイクロコントローラのシリアルピンPD1およびPD3に直接接続された指紋モジュールのRxおよびTx。 5V電源は、LM7805電圧レギュレータを使用して回路全体に電力を供給するために使用されますこれは12vDCアダプターを搭載しています。PC3ピンにもブザーが接続されています。16x2 LCDは4ビットモードで構成され、そのRS、RW、EN、D4、D5、D6、およびD7は、マイクロコントローラーのピンPB0、PB1、PB2、PB4、PB5、PB6、PB7に直接接続されています。RTCモジュールはI2CpinPC0SCLとPC1SDAに接続されています。また、PD7は、現在の時刻を取得するためのソフトUARTTxピンとして使用されます。
指紋出席システムの仕組み
ユーザーが指紋モジュールの上に指を置くと、指紋モジュールが指の画像をキャプチャし、システム内でこの指紋に関連付けられているIDがあるかどうかを検索します。指紋IDが検出されると、LCDに出席が登録されたことが表示され、同時にブザーが1回鳴ります。
指紋モジュールに加えて、時刻と日付のデータにRTCモジュールも使用しました 。時刻と日付はシステム内で継続的に実行されているため、マイクロコントローラーは、真のユーザーが指紋センサーに指を置くたびに時刻と日付を取得し、割り当てられたメモリスロットのEEPROMに保存できます。
ユーザーはキー4を押し続けることで出席データをダウンロードできます。電源を回路に接続して待つと、しばらくするとLCDに「ダウンロード中…」と表示されます。また、ユーザーはシリアルモニターで出席データを確認できます。このコードでは、ソフトウェアUARTがピンPD7〜ピン20でTxとしてプログラムされ、データを端末に送信します。ユーザーは、シリアル端末を介して出席データを表示するために、TTLからUSBへのコンバーターも必要です。
And if the user wants to delete all the data then he/she has to press and hold key 2 and then connect power and wait for some time. Now after some time LCD will show ‘Please wait…’ and then ‘Record Deleted successfully’. These two steps are not shown in demonstration video given in the end.
Code Explanation
Complete code along with the video for this biometric attendance system is given at the end. Code of this project is a little bit lengthy and complex for beginner. Hence we have tried to take descriptive variables to make good readability and understanding. First of all, we have included some necessary header file then written macros for different-different purpose.
#define F_CPU 8000000ul #include #include
After this, we have declared some variables and arrays for fingerprint command and response. We have also added some functions for fetching and setting data to RTC.
void RTC_stp() { TWCR=(1<
Then we have some functions for LCD which are responsible to drive the LCD. LCD driver function is written for 4-bit mode drive. Followed by that we also have some UART driver functions which are responsible for initializing UART and exchanging data between fingerprint sensor and microcontroller.
void serialbegin() { UCSRC = (1 << URSEL) - (1 << UCSZ0) - (1 << UCSZ1); UBRRH = (BAUD_PRESCALE >> 8); UBRRL = BAUD_PRESCALE; UCSRB=(1<
Now we have some more UART function but they are software UART. It is used for transferring saved data to the computer via serial terminal. These functions are delay-based and don’t use any type of interrupt. And for UART only tx signal will work and we have hardcoded baud rate for soft UART as 9600.
void SerialSoftWrite(char ch) { PORTD&=~(1<<7); _delay_us(104); for(int i=0;i<8;i++) { if(ch & 1) PORTD-=(1<<7); else PORTD&=~(1<<7); _delay_us(104); ch>>=1; } PORTD-=(1<<7); _delay_us(104); } void SerialSoftPrint(char *str) { while(*str) { SerialSoftWrite(*str); str++; } }
Followed by that we have functions that are responsible for displaying the RTC time in the LCD. The below given functions are used for writing attendance data to EEPROM and reading attendance data from EEPROM.
int eeprom_write(unsigned int add,unsigned char data) { while(EECR&(1<
The below function is responsible for reading fingerprint image and convert them in template and matching with already stored image and show result over LCD.
void matchFinger() { // lcdwrite(1,CMD); // lcdprint("Place Finger"); // lcdwrite(192,CMD); // _delay_ms(2000); if(!sendcmd2fp((char *)&f_detect,sizeof(f_detect))) { if(!sendcmd2fp((char *)&f_imz2ch1,sizeof(f_imz2ch1))) { if(!sendcmd2fp((char *)&f_search,sizeof(f_search))) { LEDHigh; buzzer(200); uint id= data; id<<=8; id+=data; uint score=data; score<<=8; score+=data; (void)sprintf((char *)buf1,"Id: %d",(int)id); lcdwrite(1,CMD); lcdprint((char *)buf1); saveData(id); _delay_ms(1000); lcdwrite(1,CMD); lcdprint("Attendance"); lcdwrite(192,CMD); lcdprint("Registered"); _delay_ms(2000); LEDLow; }
Followed by that we have a function that is used for enrolling a new finger and displaying the result or status on LCD. Then the below function is used for deleting stored fingerprint from the module by using id number and show status of the same.
void deleteFinger() { id=getId(); f_delete=id>>8 & 0xff; f_delete=id & 0xff; f_delete=(21+id)>>8 & 0xff; f_delete=(21+id) & 0xff; if(!sendcmd2fp(&f_delete,sizeof(f_delete))) { lcdwrite(1,CMD); sprintf((char *)buf1,"Finger ID %d ",id); lcdprint((char *)buf1); lcdwrite(192, CMD); lcdprint("Deleted Success"); } else { lcdwrite(1,CMD); lcdprint("Error"); } _delay_ms(2000); }
Below function is responsible for sending attendance data to serial terminal via soft UART pin PD7 and TTL to USB converter.
/*function to show attendence data on serial moinitor using softserial pin PD7*/ void ShowAttendance() { char buf; lcdwrite(1,CMD); lcdprint("Downloding…."); SerialSoftPrintln("Attendance Record"); SerialSoftPrintln(" "); SerialSoftPrintln("S.No ID1 ID2 Id3 ID4 ID5 "); //serialprintln("Attendance Record"); //serialprintln(" "); //serialprintln("S.No ID1 ID2 Id3 ID4 ID5"); for(int cIndex=1;cIndex<=8;cIndex++) { sprintf((char *)buf,"%d " "%d:%d:%d %d/%d/20%d " "%d:%d:%d %d/%d/20%d " "%d:%d:%d %d/%d/20%d " "%d:%d:%d %d/%d/20%d " "%d:%d:%d %d/%d/20%d ", cIndex, eeprom_read((cIndex*6)),eeprom_read((cIndex*6)+1),eeprom_read((cIndex*6)+2),eeprom_read((cIndex*6)+3),eeprom_read((cIndex*6)+4),eeprom_read((cIndex*6)+5), eeprom_read((cIndex*6)+48),eeprom_read((cIndex*6)+1+48),eeprom_read((cIndex*6)+2+48),eeprom_read((cIndex*6)+3+48),eeprom_read((cIndex*6)+4+48),eeprom_read((cIndex*6)+5+48), eeprom_read((cIndex*6)+96),eeprom_read((cIndex*6)+1+96),eeprom_read((cIndex*6)+2+96),eeprom_read((cIndex*6)+3+96),eeprom_read((cIndex*6)+4+96),eeprom_read((cIndex*6)+5+96), eeprom_read((cIndex*6)+144),eeprom_read((cIndex*6)+1+144),eeprom_read((cIndex*6)+2+144),eeprom_read((cIndex*6)+3+144),eeprom_read((cIndex*6)+4+144),eeprom_read((cIndex*6)+5+144), eeprom_read((cIndex*6)+192),eeprom_read((cIndex*6)+1+192),eeprom_read((cIndex*6)+2+192),eeprom_read((cIndex*6)+3+192),eeprom_read((cIndex*6)+4+192),eeprom_read((cIndex*6)+5+192)); SerialSoftPrintln(buf); //serialprintln(buf); } lcdwrite(192,CMD); lcdprint("Done"); _delay_ms(2000); }
Below function is used for deleting all the attendance data from the microcontroller’s EEPROM.
void DeleteRecord() { lcdwrite(1,CMD); lcdprint("Please Wait…"); for(int i=0;i<255;i++) eeprom_write(i,10); _delay_ms(2000); lcdwrite(1,CMD); lcdprint("Record Deleted"); lcdwrite(192,CMD); lcdprint("Successfully"); _delay_ms(2000); }
In the main function we will initialize all the used module and gpio pins. Finally, all-controlling event are performed in this as shown below
while(1) { RTC(); // if(match == LOW) // { matchFinger(); // } if(enrol == LOW) { buzzer(200); enrolFinger(); _delay_ms(2000); // lcdinst(); } else if(delet == LOW) { buzzer(200); getId(); deleteFinger(); _delay_ms(1000); } } return 0; }
The complete working set-up is shown in the video linked below. Hope you enjoyed the project and learnt something new. If you have any questions leave them in the comment section or use the forums for other technical questions.