Po mnenju raziskovalcev z univerze Pen State imajo ljudje večjo verjetnost, da strojem zaupajo ljudem, kar je verjetno razvidno iz tega, da smo tako enostavno razkrili svoj PIN pri bankomatu. Danes se v svetu, kjer AI, strojno učenje, klepetalnice, pametni zvočniki, roboti itd. Aktivno napredujejo, ta sinergija med ljudmi in roboti šele povečuje. Danes vse od pobiralcev cestnin do odjavnih blagajn nadomeščajo stroji, da bi bilo delo lažje in učinkovitejše. Da bi sledili fazi, bomo v tem projektu zgradili sistem Bio-metric Attendance z uporabo mikrokrmilnikov AVR, ki bo nadomestil ročni postopek udeležbe. Ta sistem bo bolj zanesljiv in učinkovit, saj bo prihranil čas in se izognil izmikačem.
Sistemi za spremljanje prstnih odtisov so že takoj na voljo neposredno na trgu, a kaj je bolj zabavno kot izdelava sistema? Prav tako smo že prej zgradili najrazličnejše sisteme Attendance, od preprostega sistema RF Attendance na osnovi RFID do biometričnega sistema Attendance, ki temelji na IoT, z uporabo Arduino in Raspberry Pi. V tem projektu smo uporabili modul za prstne odtise in AVR (atmega32) za registracijo prisotnosti. Z uporabo senzorja za prstne odtise bo sistem postal varnejši za uporabnike. V naslednjih razdelkih so pojasnjene tehnične podrobnosti izdelave biometričnega sistema za spremljanje na osnovi prstnih odtisov z uporabo AVR.
Zahtevane komponente
- Atmega32 -1
- Modul prstnih odtisov (r305) -1
- Gumb ali membranski gumbi - 4
- LED-diode -2
- 1K upor -2
- 2.2K upor -1
- Napajalnik 12v
- Priključne žice
- Zvočni signal -1
- 16x2 LCD -1
- PCB ali krušna plošča
- RTC modul (ds1307 ali ds3231) -1
- LM7805 -1
- 1000uf, 10uf kondenzator -1
- Burgstips moški samica
- DC JACK (neobvezno)
- BC547 Tranzistor -1
V tem vezju sistema za spremljanje prstnih odtisov smo z modulom senzorja za prstne odtise preverili identiteto osebe ali zaposlenega, tako da smo v sistem vnesli njihov prstni odtis. Tukaj uporabljamo 4 tipke za vpis, brisanje, povečanje in zmanjšanje podatkov o prstnih odtisih . Ključ 1 se uporablja za vpis nove osebe v sistem. Torej, ko uporabnik želi vpisati nov prst, mora pritisniti tipko 1, nato ga LCD vpraša, naj dvakrat položi prst na senzor prstnih odtisov, nato pa zahteva ID zaposlenega. Podobno ima tipka 2 dvojno funkcijo, na primer ko uporabnik vpiše nov prst, potem mora izbrati ID prstnega odtisaz uporabo drugih dveh tipk, in sicer 3 in 4. Zdaj mora uporabnik pritisniti tipko 1 (tokrat se ta tipka obnaša kot OK), da nadaljuje z izbranim ID-jem. Tipka 2 se uporablja tudi za ponastavitev ali brisanje podatkov iz EEPROM-a mikrokrmilnika.
Modul senzorja za prstne odtise zajame sliko prstnega odtisa, nato pa jo pretvori v enakovredno predlogo in jih shrani v svoj pomnilnik v skladu z izbranim ID-jem mikrokrmilnika. Ves postopek zapoveduje mikrokrmilnik, na primer fotografiranje prstnih odtisov; pretvorite v predloge in shranite kot ID itd. Ogledate si lahko tudi te druge projekte senzorjev za prstne odtise, kjer smo zgradili varnostni sistem senzorja za prstne odtise in stroj za glasovanje s senzorjem za prstne odtise.
Shema vezja
Popoln diagram vezja za projekt sistema prisotnosti na podlagi prstnih odtisov je prikazan spodaj. Ima mikrokrmilnik Atmega32 za nadzor celotnega procesa projekta. Tipka ali membranski gumb se uporablja za vpisovanje, brisanje, izbiranje ID-jev za udeležbo, zvočni signal se uporablja za prikaz in LCD 16x2, ki uporabnika pouči, kako uporablja stroj.
Kot je prikazano na vezju, so potisni ali membranski gumbi neposredno priključeni na zatič PA2 (tipka ENROLL 1), PA3 (tipka DEL 2), PA0 (tipka UP 3), PA1 (tipka DOL 4) mikrokrmilnika. ali PA4. In LED je priključen na pin PC2 mikrokrmilnika glede na zemljo prek 1k upora. Rx in Tx modula prstnih odtisov sta neposredno priključena na serijski pin PD1 in PD3 mikrokrmilnika. Napajanje 5v se uporablja za napajanje celotnega vezja z uporabo napetostnega regulatorja LM7805ki ga napaja 12v enosmerni adapter. Na pin PC3 je priključen tudi zvočni signal. LCD 16x2 je konfiguriran v 4-bitnem načinu, njegovi RS, RW, EN, D4, D5, D6 in D7 pa so neposredno povezani na pin PB0, PB1, PB2, PB4, PB5, PB6, PB7 mikrokrmilnika. RTC modul je povezan na I2Cpin PC0 SCL in PC1 SDA. PD7 pa se uporablja kot mehki UART Tx zatič za določanje trenutnega časa.
Kako deluje sistem za spremljanje prstnih odtisov
Kadar koli uporabnik položi prst na modul prstnih odtisov, potem modul prstnih odtisov zajame prstno sliko in poišče, ali je v sistemu s tem prstnim odtisom povezan kakšen ID. Če je zaznan ID prstnega odtisa, bo na LCD-prikazovalniku prikazano prisotnost, hkrati pa bo zvočni signal enkrat zapiskal.
Skupaj z modulom prstnih odtisov smo uporabili tudi modul RTC za podatke o času in datumu. Čas in datum se v sistemu neprekinjeno izvajata, zato lahko mikrokrmilnik vzame čas in datum, kadar resnični uporabnik položi prst na senzor prstnih odtisov in jih nato shrani v EEPROM v dodeljeno režo pomnilnika.
Uporabnik lahko podatke o prisotnosti prenese s pritiskom in držanjem tipke 4. Priključite napajanje na vezje in počakajte, čez nekaj časa pa se na LCD-prikazovalniku izpiše "Prenos….". Uporabnik lahko vidi podatke o prisotnosti prek serijskega monitorja, tukaj je v tej programski opremi za kodo UART programiran na pin PD7-pin20 kot Tx za pošiljanje podatkov na terminal. Uporabnik potrebuje tudi pretvornik TTL v USB za ogled podatkov o prisotnosti prek serijskega terminala.
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.