על פי חוקרים מאוניברסיטת פן סטייט, בני אדם נוטים יותר לסמוך על מכונות על אנשים, דבר שכנראה ניכר מאיתנו שחושף את סיכת הכספומט שלנו למכונה כל כך בקלות. כיום, בעולם שבו AI, למידת מכונה, בוטים בצ'ט, רמקולים חכמים, רובוטים וכו 'מתקדמים באופן פעיל, הסינרגיה הזו בין בני האדם לרובוטים רק אמורה להתגבר. כיום, החל מגובי אגרה בגשר וכלה בקופאי הצ'ק-אאוט, כל מה שמסביב מוחלף במכונות כדי לבצע את העבודה קלה ויעילה יותר. כדי להמשיך עם השלב, בפרויקט זה נבנה מערכת נוכחות ביו-מטרית באמצעות מיקרו-בקרי AVR כדי להחליף את ההליך הידני של השתתפות. מערכת זו תהיה אמינה ויעילה יותר מכיוון שהיא תחסוך זמן ותמנע ממשתמטים.
מערכות נוכחות טביעות אצבע כבר זמינות ישירות מהשוק, אבל מה יותר כיף מלבנות אחת? בנינו בעבר מגוון רחב של מערכות נוכחות ממערכת נוכחות פשוטה מבוססת RFID למערכת נוכחות ביומטרית מבוססת IoT באמצעות Arduino ו- Raspberry Pi. בפרויקט זה השתמשנו במודול טביעות האצבע וב- AVR (atmega32) כדי לרשום נוכחות. באמצעות חיישן טביעות אצבע, המערכת תהפוך לאבטחה יותר עבור המשתמשים. בסעיפים הבאים מסבירים פרטים טכניים לייצור מערכת נוכחות ביומטרית מבוססת טביעות אצבע באמצעות AVR.
רכיבים נדרשים
- Atmega32 -1
- מודול טביעות אצבע (r305) -1
- לחצני כפתור או קרום - 4
- נוריות -2
- נגד 1K -2
- נגן 2.2K -1
- מתאם מתח 12 וולט
- חוטי חיבור
- זמזם -1
- 16x2 LCD -1
- לוח PCB או לחם
- מודול RTC (ds1307 או ds3231) -1
- LM7805 -1
- 1000uf, 10uf קבלים -1
- נקבה זכר בורגסטיפס
- DC JACK (אופציונלי)
- טרנזיסטור BC547 -1
במעגל מערכת נוכחות טביעות אצבע זה, השתמשנו במודול חיישן טביעות האצבע כדי לאמת את זהותו של אדם או עובד על ידי לקיחת קלט טביעת האצבע שלהם במערכת. כאן אנו משתמשים בארבעה כפתורי לחיצה לרישום, מחיקה, הגדלה והקטנת נתוני טביעות האצבע . מפתח 1 משמש לרישום של אדם חדש למערכת. לכן כאשר המשתמש רוצה לרשום אצבע חדשה, אז הוא / היא צריך ללחוץ על מקש 1 ואז LCD מבקש ממנו להניח אצבע על חיישן טביעת האצבע פעמיים ואז הוא מבקש תעודת זהות לעובד. באופן דומה, למפתח 2 יש פונקציה כפולה, כמו כאשר המשתמש רושם אצבע חדשה, אז הוא / היא צריכים לבחור מזהה טביעת אצבעעל ידי שימוש בשני מקשים נוספים כלומר 3 ו 4. כעת המשתמש צריך ללחוץ על מקש 1 (הפעם מקש זה מתנהג כמו בסדר) כדי להמשיך עם המזהה שנבחר. ומפתח 2 משמש גם לאיפוס או מחיקת נתונים מ- EEPROM של המיקרו-בקר.
מודול חיישן טביעות אצבע לוכד את תמונת הדפסת האצבע ואז ממיר אותה לתבנית המקבילה ושומר אותם בזיכרון לפי המזהה שנבחר על ידי המיקרו-בקר. כל התהליך מצווה על ידי המיקרו-בקר, כמו צילום תמונה של הדפסת האצבע; להמיר אותו לתבניות ולאחסן בתור מזהה וכו '. תוכלו גם לבדוק את הפרויקטים האחרים של חיישני טביעת האצבע, שם בנינו מערכת אבטחה של חיישני טביעת אצבע ומכונת הצבעה לחיישן טביעות אצבע.
תרשים מעגל
תרשים המעגל השלם לפרויקט מערכת נוכחות מבוסס טביעות אצבע מוצג להלן. יש לו מיקרו-בקרה Atmega32 לבקרת כל תהליך הפרויקט. לחצן הלחיצה או הממברנה משמש לרישום, למחיקה, לבחירת תעודות זהות להשתתפות, זמזם משמש לאינדיקציה ו- LCD בגודל 16x2 כדי להנחות את המשתמש כיצד להשתמש במכונה.
כפי שמוצג בתרשים המעגל, לחצני הלחיצה או הממברנה מחוברים ישירות לסיכה PA2 (מקש ENROLL 1), PA3 (מקש DEL 2), PA0 (מקש UP 3), PA1 (מקש DOWN 4) של המיקרו-בקר ביחס לקרקע. או PA4. ונורית LED מחוברת בסיכה PC2 של המיקרו-בקר ביחס לקרקע דרך נגד 1k. Rx ו- Tx של מודול טביעות האצבע מחוברים ישירות בסיכה PD1 ו- PD3 הסידורי של המיקרו-בקר. אספקת 5V משמשת להפעלת המעגל כולו באמצעות רגולטור מתח LM7805שמופעל על ידי מתאם DC 12V. זמזם מחובר גם בסיכה PC3. LCD 16x2 מוגדר במצב של 4 סיביות וה- RS, RW, EN, D4, D5, D6 ו- D7 מחוברים ישירות בסיכה PB0, PB1, PB2, PB4, PB5, PB6, PB7 של מיקרו-בקר. מודול RTC מחובר ב- I2Cpin PC0 SCL ו- PC1 SDA. ו- PD7 משמש כסיכת UART Tx רכה לקבלת הזמן הנוכחי.
כיצד עובדת מערכת נוכחות טביעות אצבע
בכל פעם שמשתמש מניח את האצבע מעל מודול טביעות האצבע, אז מודול טביעות האצבע לוכד את תמונת האצבע, וחפש אם מזהה כלשהו משויך לטביעת אצבע זו במערכת. אם מזהה טביעת אצבע אז LCD יציג רשום נוכחות ובאותו זמן זמזם יצלצל פעם אחת.
יחד עם מודול טביעות האצבע, השתמשנו גם במודול RTC לנתוני זמן ותאריך. זמן ותאריך פועלים ברציפות במערכת, כך שמיקרו-בקר יכול לקחת זמן ותאריך בכל פעם שמשתמש אמיתי מניח את אצבעו על חיישן טביעות האצבע ואז לשמור אותם ב- EEPROM בחריץ הזיכרון המוקצב.
המשתמש רשאי להוריד את נתוני הנוכחות על ידי לחיצה ממושכת על מקש 4. חבר את האספקה למעגל והמתן ולאחר זמן מה, LCD יראה 'הורדה….'. והמשתמש יכול לראות את נתוני הנוכחות על צג סדרתי, כאן בתוכנת קוד זו UART מתוכנת בסיכה PD7-pin20 כ- Tx לשליחת נתונים למסוף. המשתמש זקוק גם לממיר TTL ל- USB כדי לראות את נתוני הנוכחות במסוף הסדרתי.
ואם המשתמש רוצה למחוק את כל הנתונים אז הוא / היא צריך ללחוץ לחיצה ארוכה על מקש 2 ואז לחבר חשמל ולהמתין זמן מה. עכשיו לאחר זמן מה LCD יראה 'אנא המתן…' ואז 'הקלטה נמחקה בהצלחה'. שני השלבים הללו לא מוצגים בסרטון ההדגמה שניתן בסופו של דבר.
הסבר קוד
הקוד השלם יחד עם הסרטון למערכת נוכחות ביומטרית זו ניתן בסוף. הקוד של הפרויקט הזה הוא מעט ארוך ומורכב למתחילים. לפיכך ניסינו לקחת משתנים תיאוריים כדי ליצור קריאה והבנה טובים. קודם כל, כללנו קובץ כותרת הכרחי ואז נכתב מאקרו למטרה שונה-שונה.
# הגדר F_CPU 8000000ul # כלול # כלול
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.