Według naukowców z Pen State University ludzie są bardziej skłonni ufać maszynom niż ludziom, co prawdopodobnie wynika z tego, że tak łatwo ujawniamy nasz kod bankomatu maszynie. Obecnie w świecie, w którym sztuczna inteligencja, uczenie maszynowe, boty czatu, inteligentne głośniki, roboty itp. Aktywnie się rozwijają, ta synergia między ludźmi i robotami ma tylko wzrosnąć. Obecnie, od poborców opłat mostowych po kasjerów kasowych, wszystko wokół nas jest zastępowane przez maszyny, aby praca była łatwiejsza i wydajniejsza. Aby nadążyć za etapem, w tym projekcie zbudujemy system bio-metrycznej obecności z wykorzystaniem mikrokontrolerów AVR, aby zastąpić ręczną procedurę pobierania obecności. Ten system będzie bardziej niezawodny i wydajny, ponieważ pozwoliłby zaoszczędzić czas i uniknąć uników.
Systemy rejestracji linii papilarnych są już łatwo dostępne bezpośrednio na rynku, ale co jest fajniejszego niż ich zbudowanie? Wcześniej zbudowaliśmy również szeroką gamę systemów obecności, od prostego systemu obecności opartego na RFID po biometryczny system obecności oparty na IoT, wykorzystujący Arduino i Raspberry Pi. W tym projekcie do rejestracji obecności użyliśmy modułu linii papilarnych i AVR (atmega32). Dzięki zastosowaniu czytnika linii papilarnych system stanie się bezpieczniejszy dla użytkowników. W poniższych sekcjach wyjaśniono szczegóły techniczne tworzenia biometrycznego systemu obecności na podstawie odcisków palców przy użyciu AVR.
Wymagane komponenty
- Atmega32 -1
- Moduł czytnika linii papilarnych (r305) -1
- Przycisk lub przyciski membranowe - 4
- Diody LED -2
- Rezystor 1 K -2
- Rezystor 2,2 K -1
- Zasilacz 12 V.
- Przewody łączące
- Brzęczyk -1
- LCD 16x2 -1
- PCB lub płytka do chleba
- Moduł RTC (ds1307 lub ds3231) -1
- LM7805 -1
- 1000 uf, 10 uf kondensator -1
- Samiec Burgstips
- DC JACK (opcjonalnie)
- Tranzystor BC547 -1
W tym obwodzie systemu obecności odcisków palców użyliśmy modułu czujnika odcisków palców do uwierzytelnienia tożsamości osoby lub pracownika poprzez pobranie ich odcisków palców w systemie. Tutaj używamy 4 przycisków do zapisywania, usuwania, zwiększania i zmniejszania danych odcisków palców . Klucz 1 służy do wpisania nowej osoby do systemu. Kiedy więc użytkownik chce zarejestrować nowy palec, musi nacisnąć klawisz 1, a następnie wyświetlacz LCD dwukrotnie poprosi go o umieszczenie palca na czytniku linii papilarnych, a następnie zapyta o identyfikator pracownika. Podobnie, klawisz 2 ma podwójną funkcję, na przykład gdy użytkownik rejestruje nowy palec, wtedy musi wybrać identyfikator odcisków palcówużywając kolejnych dwóch klawiszy, a mianowicie 3 i 4. Teraz użytkownik musi nacisnąć klawisz 1 (tym razem ten klawisz zachowuje się jak OK), aby kontynuować z wybranym ID. Klawisz 2 jest również używany do resetowania lub usuwania danych z pamięci EEPROM mikrokontrolera.
Moduł czujnika odcisków palców przechwytuje obraz odcisku palca, a następnie konwertuje go na równoważny szablon i zapisuje w swojej pamięci zgodnie z wybranym identyfikatorem przez mikrokontroler. Cały proces jest sterowany przez mikrokontroler, podobnie jak wykonanie zdjęcia odcisku palca; przekształcić go w szablony i przechowywać jako identyfikator itp. Możesz również sprawdzić te inne projekty czujników odcisków palców, w których zbudowaliśmy system bezpieczeństwa czujnika odcisków palców i maszynę do głosowania za pomocą czujnika odcisków palców.
Schemat obwodu
Pełny schemat obwodu dla projektu systemu obecności opartego na odciskach palców pokazano poniżej. Posiada mikrokontroler Atmega32 do sterowania całym procesem projektu. Przycisk lub przycisk membranowy służy do zapisywania, usuwania, wybierania identyfikatorów do obecności, brzęczyk służy do wskazywania, a wyświetlacz LCD 16x2 informuje użytkownika o sposobie korzystania z urządzenia.
Jak pokazano na schemacie obwodu, przyciski lub przyciski membranowe są bezpośrednio podłączone do pinu PA2 (klawisz ENROLL 1), PA3 (klawisz DEL 2), PA0 (klawisz UP 3), PA1 (klawisz DOWN 4) mikrokontrolera względem masy lub PA4. Dioda LED jest podłączona do pinu PC2 mikrokontrolera względem masy poprzez rezystor 1k. Rx i Tx modułu linii papilarnych są bezpośrednio połączone z pinami szeregowymi PD1 i PD3 mikrokontrolera. Zasilanie 5v służy do zasilania całego obwodu za pomocą regulatora napięcia LM7805który jest zasilany przez adapter 12 v dc. Brzęczyk jest również podłączony do pinu PC3. Wyświetlacz LCD 16x2 jest skonfigurowany w trybie 4-bitowym, a jego RS, RW, EN, D4, D5, D6 i D7 są bezpośrednio podłączone do pinów PB0, PB1, PB2, PB4, PB5, PB6, PB7 mikrokontrolera. Moduł RTC jest podłączony do I2Cpin PC0 SCL i PC1 SDA. A PD7 jest używany jako miękki pin UART Tx do pobierania aktualnego czasu.
Jak działa system obsługi odcisków palców
Za każdym razem, gdy użytkownik umieści swój palec na module odcisków palców, moduł odcisków palców przechwytuje obraz palca i wyszukuje, czy jakikolwiek identyfikator jest powiązany z tym odciskiem palca w systemie. Jeśli wykryty zostanie odcisk palca, na wyświetlaczu LCD pojawi się zarejestrowana obecność, a jednocześnie brzęczyk wyda jeden sygnał dźwiękowy.
Wraz z modułem linii papilarnych zastosowaliśmy również moduł RTC dla danych czasu i daty. Godzina i data działają w systemie w sposób ciągły, więc Mikrokontroler może pobierać godzinę i datę za każdym razem, gdy prawdziwy użytkownik umieszcza palec na czytniku linii papilarnych, a następnie zapisuje je w pamięci EEPROM w przydzielonym gnieździe pamięci.
Użytkownik może pobrać dane dotyczące obecności naciskając i przytrzymując klawisz 4. Podłącz zasilanie do obwodu i poczekaj, a po pewnym czasie na wyświetlaczu LCD pojawi się komunikat „Pobieranie….”. I użytkownik może zobaczyć dane obecności na monitorze szeregowym, tutaj w tym kodzie oprogramowanie UART jest zaprogramowane na pinie PD7-pin20 jako Tx do wysyłania danych do terminala. Użytkownik potrzebuje również konwertera TTL na USB, aby zobaczyć dane dotyczące obecności przez terminal szeregowy.
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.