- Απαιτούμενα συστατικά
- Διάγραμμα κυκλώματος
- Πώς λειτουργεί το σύστημα παρακολούθησης δακτυλικών αποτυπωμάτων
- Code Explanation
Σύμφωνα με ερευνητές από το Πανεπιστήμιο Pen State, οι άνθρωποι είναι πιο πιθανό να εμπιστεύονται τα μηχανήματα έναντι των ανθρώπων, κάτι που είναι πιθανότατα προφανές από εμάς αποκαλύπτοντας την καρφίτσα ATM μας σε μια μηχανή τόσο εύκολα. Σήμερα, στον κόσμο όπου η AI, η μηχανική εκμάθηση, τα bots συνομιλίας, τα έξυπνα ηχεία, τα ρομπότ κ.λπ. προχωρούν ενεργά, αυτή η συνέργεια μεταξύ ανθρώπων και ρομπότ πρόκειται να αυξηθεί. Σήμερα, από τους συλλέκτες διοδίων γεφυρών έως ταμεία αναχώρησης τα πάντα γύρω μας αντικαθίστανται από μηχανήματα για να γίνει η εργασία πιο εύκολη και πιο αποτελεσματική. Για να συμβαδίζουμε με τη φάση, σε αυτό το έργο θα κατασκευάσουμε ένα σύστημα βιομετρικής παρακολούθησης χρησιμοποιώντας μικροελεγκτές AVR για να αντικαταστήσουμε τη χειροκίνητη διαδικασία συμμετοχής. Αυτό το σύστημα θα είναι πιο αξιόπιστο και αποτελεσματικό, καθώς θα εξοικονομούσε χρόνο και θα αποφύγει τους αποφεύγοντες.
Τα συστήματα παρακολούθησης δακτυλικών αποτυπωμάτων είναι ήδη άμεσα διαθέσιμα απευθείας από την αγορά, αλλά τι είναι πιο διασκεδαστικό από την κατασκευή ενός; Έχουμε επίσης δημιουργήσει μια ευρεία ποικιλία Συστημάτων Συμμετοχής νωρίτερα, από ένα απλό σύστημα Συμμετοχής με βάση RFID έως ένα σύστημα βιομετρικών Συμμετοχών βασισμένο σε IoT χρησιμοποιώντας Arduino και Raspberry Pi. Σε αυτό το έργο, χρησιμοποιήσαμε το δακτυλικό αποτύπωμα Module και AVR (atmega32) για να δηλώσουμε συμμετοχή. Χρησιμοποιώντας τον αισθητήρα δακτυλικών αποτυπωμάτων, το σύστημα θα γίνει πιο ασφαλές για τους χρήστες. Οι ακόλουθες ενότητες εξηγούν τις τεχνικές λεπτομέρειες της δημιουργίας ενός συστήματος βιομετρικής παρακολούθησης με βάση τα δακτυλικά αποτυπώματα χρησιμοποιώντας το AVR.
Απαιτούμενα συστατικά
- Atmega32 -1
- Ενότητα δακτυλικών αποτυπωμάτων (r305) -1
- Κουμπιά μπουτόν ή μεμβράνης - 4
- LED -2
- 1Κ Αντίσταση -2
- 2.2K αντίσταση -1
- Προσαρμογέας ισχύος 12v
- Σύνδεση καλωδίων
- Buzzer -1
- 16x2 LCD -1
- PCB ή πίνακας ψωμιού
- Ενότητα RTC (ds1307 ή ds3231) -1
- LM7805 -1
- 1000uf, πυκνωτής 10uf -1
- Αρσενικό θηλυκό Burgstips
- DC JACK (προαιρετικό)
- BC547 Τρανζίστορ -1
Σε αυτό το κύκλωμα συστήματος παρακολούθησης δακτυλικών αποτυπωμάτων, χρησιμοποιήσαμε τη μονάδα αισθητήρα δακτυλικών αποτυπωμάτων για τον έλεγχο ταυτότητας ενός ατόμου ή ενός υπαλλήλου, λαμβάνοντας την είσοδο δακτυλικών αποτυπωμάτων στο σύστημα. Εδώ χρησιμοποιούμε 4 κουμπιά για εγγραφή, Διαγραφή, αύξηση και μείωση δεδομένων δακτυλικών αποτυπωμάτων . Το κλειδί 1 χρησιμοποιείται για την εγγραφή ενός νέου ατόμου στο σύστημα. Έτσι, όταν ο χρήστης θέλει να εγγράψει νέο δάχτυλο, τότε πρέπει να πατήσει το πλήκτρο 1 και στη συνέχεια η LCD του ζητά να τοποθετήσει ένα δάχτυλο στον αισθητήρα δακτυλικών αποτυπωμάτων δύο φορές και ζητά ταυτότητα υπαλλήλου. Ομοίως, το κλειδί 2 έχει διπλή λειτουργία, όπως όταν ο χρήστης εγγράφει νέο δάχτυλο, τότε πρέπει να επιλέξει το αναγνωριστικό δακτυλικών αποτυπωμάτωνχρησιμοποιώντας άλλα δύο πλήκτρα, δηλαδή 3 και 4. Τώρα ο χρήστης πρέπει να πατήσει το πλήκτρο 1 (αυτή τη φορά αυτό το κλειδί συμπεριφέρεται σαν OK) για να προχωρήσει με το επιλεγμένο αναγνωριστικό. Και το κλειδί 2 χρησιμοποιείται επίσης για επαναφορά ή διαγραφή δεδομένων από το EEPROM του μικροελεγκτή.
Η μονάδα αισθητήρα δακτυλικών αποτυπωμάτων συλλαμβάνει την εικόνα εκτύπωσης του δακτύλου και στη συνέχεια τη μετατρέπει σε ισοδύναμο πρότυπο και τα αποθηκεύει στη μνήμη της σύμφωνα με το επιλεγμένο αναγνωριστικό από τον μικροελεγκτή. Όλη η διαδικασία διοικείται από τον μικροελεγκτή, σαν να τραβάτε μια εικόνα της εκτύπωσης του δακτύλου. μετατρέψτε το σε πρότυπα και αποθηκεύοντας ως αναγνωριστικό κ.λπ. Μπορείτε επίσης να δείτε αυτά τα άλλα έργα αισθητήρα δακτυλικών αποτυπωμάτων, όπου έχουμε δημιουργήσει σύστημα ασφαλείας αισθητήρα δακτυλικών αποτυπωμάτων και μηχάνημα ψηφοφορίας αισθητήρα δακτυλικών αποτυπωμάτων.
Διάγραμμα κυκλώματος
Το πλήρες διάγραμμα κυκλώματος για το έργο συστήματος παρακολούθησης βάσει δακτυλικών αποτυπωμάτων, φαίνεται παρακάτω. Διαθέτει μικροελεγκτή Atmega32 για τον έλεγχο όλης της διαδικασίας του έργου. Το πλήκτρο μεμβράνης ή μεμβράνης χρησιμοποιείται για την εγγραφή, τη διαγραφή, την επιλογή αναγνωριστικών για συμμετοχή, ένας βομβητής χρησιμοποιείται για ένδειξη και μια οθόνη LCD 16x2 για να καθοδηγήσει τον χρήστη πώς να χρησιμοποιήσει το μηχάνημα.
Όπως φαίνεται στο διάγραμμα κυκλώματος, τα κουμπιά ώθησης ή μεμβράνης συνδέονται απευθείας με τον πείρο PA2 (πλήκτρο ENROLL 1), PA3 (πλήκτρο DEL 2), PA0 (πλήκτρο UP 3), PA1 (πλήκτρο ΚΑΤΩ 4) του μικροελεγκτή σε σχέση με τη γείωση ή PA4. Και ένα LED συνδέεται στον ακροδέκτη PC2 του μικροελεγκτή σε σχέση με τη γείωση μέσω μιας αντίστασης 1k. Τα Rx και Tx της μονάδας δακτυλικών αποτυπωμάτων συνδέονται απευθείας στους σειριακούς ακροδέκτες PD1 και PD3 του μικροελεγκτή. Η τροφοδοσία 5v χρησιμοποιείται για την τροφοδοσία ολόκληρου του κυκλώματος χρησιμοποιώντας ρυθμιστή τάσης LM7805που τροφοδοτείται από προσαρμογέα 12v dc. Ένας βομβητής συνδέεται επίσης στο pin PC3. Μια οθόνη LCD 16x2 έχει διαμορφωθεί σε λειτουργία 4-bit και οι RS, RW, EN, D4, D5, D6 και D7 συνδέονται απευθείας στους ακροδέκτες PB0, PB1, PB2, PB4, PB5, PB6, PB7 του μικροελεγκτή. Η μονάδα RTC συνδέεται σε I2Cpin PC0 SCL και PC1 SDA. Και το PD7 χρησιμοποιείται ως μαλακός πείρος UART Tx για να πάρει την τρέχουσα ώρα.
Πώς λειτουργεί το σύστημα παρακολούθησης δακτυλικών αποτυπωμάτων
Κάθε φορά που ο χρήστης τοποθετεί το δάχτυλό του πάνω από τη μονάδα δακτυλικών αποτυπωμάτων, τότε η μονάδα δακτυλικών αποτυπωμάτων καταγράφει την εικόνα δακτύλου και αναζητά αν υπάρχει κάποιο ID με αυτό το δακτυλικό αποτύπωμα στο σύστημα. Εάν εντοπιστεί αναγνωριστικό δακτυλικού αποτυπώματος, τότε η οθόνη LCD θα εμφανίσει την παρουσία καταχωρημένη και ταυτόχρονα ο βομβητής θα ηχήσει μία φορά.
Along with the fingerprint module, we have also used an RTC module for Time and date data. Time and date are running continuously in the system, so Microcontroller can take time and date whenever a true user places his finger over fingerprint sensor and then save them in the EEPROM at the allotted slot of memory.
User may download the attendance data by pressing and holding key 4. Connect supply to circuit and wait and after some time, LCD will show ‘Downloading….’. And user can see the attendance data over serial monitor, here in this code software UART is programmed at pin PD7-pin20 as Tx to send data to terminal. User also needs a TTL to USB converter to see the attendance data over serial terminal.
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.