وفقًا للباحثين من جامعة Pen State ، من المرجح أن يثق البشر بالآلات أكثر من الناس ، وهو ما يتضح على الأرجح منا للكشف عن دبوس ATM الخاص بنا إلى جهاز بسهولة. اليوم ، في العالم الذي يشهد تقدمًا نشطًا في مجال الذكاء الاصطناعي والتعلم الآلي وروبوتات الدردشة ومكبرات الصوت الذكية والروبوتات ، فإن هذا التآزر بين البشر والروبوتات سيتزايد فقط. اليوم ، بدءًا من جامعي رسوم الجسر وحتى الصرافين ، يتم استبدال كل شيء من حولنا بآلات لإنجاز العمل بشكل أسهل وأكثر كفاءة. لمواكبة هذه المرحلة ، سنقوم في هذا المشروع ببناء نظام الحضور البيولوجي المتري باستخدام متحكمات AVR لتحل محل الإجراء اليدوي لأخذ الحضور. سيكون هذا النظام أكثر موثوقية وفعالية لأنه سيوفر الوقت ويتجنب المتهربين.
أنظمة الحضور بالبصمة متاحة بالفعل مباشرة من السوق ، ولكن ما هو أكثر متعة من بناء واحد؟ لقد قمنا أيضًا ببناء مجموعة متنوعة من أنظمة الحضور في وقت سابق من نظام الحضور البسيط المستند إلى RFID إلى نظام الحضور البيومتري القائم على إنترنت الأشياء باستخدام Arduino و Raspberry Pi. في هذا المشروع ، استخدمنا وحدة البصمة و AVR (atmega32) لتسجيل الحضور. باستخدام مستشعر بصمات الأصابع ، سيصبح النظام أكثر أمانًا للمستخدمين. تشرح الأقسام التالية التفاصيل الفنية لإنشاء نظام الحضور البيومتري المستند إلى بصمات الأصابع باستخدام AVR.
المكونات المطلوبة
- Atmega32 -1
- وحدة بصمات الأصابع (r305) -1
- زر الضغط أو أزرار الغشاء - 4
- المصابيح -2
- 1 كيلو المقاوم -2
- 2.2 كيلو المقاوم -1
- محول طاقة 12 فولت
- توصيل الأسلاك
- الجرس -1
- 16x2 LCD -1
- ثنائي الفينيل متعدد الكلور أو مجلس الخبز
- وحدة RTC (ds1307 أو ds3231) -1
- LM7805 -1
- 1000 فائق التوهج ، 10 فائق التوهج مكثف -1
- ذكر بورغستيبس أنثى
- DC JACK (اختياري)
- BC547 الترانزستور -1
في دائرة نظام الحضور ببصمة الإصبع ، استخدمنا وحدة مستشعر بصمات الأصابع لمصادقة هوية الشخص أو الموظف من خلال أخذ مدخلات بصمات الأصابع في النظام. نحن هنا نستخدم 4 أزرار ضغط لتسجيل بيانات بصمات الأصابع وحذفها وزيادتها وإنقاصها . يستخدم المفتاح 1 لتسجيل شخص جديد في النظام. لذلك عندما يريد المستخدم تسجيل إصبع جديد ، فإنه يحتاج إلى الضغط على المفتاح 1 ثم تطلب منه شاشة LCD وضع إصبعه على مستشعر بصمات الأصابع مرتين ثم يطلب معرف الموظف. وبالمثل ، فإن المفتاح 2 له وظيفة مزدوجة ، مثل عندما يسجل المستخدم إصبعًا جديدًا ، فإنه يحتاج إلى تحديد معرف بصمة الإصبعباستخدام مفتاحين آخرين هما 3 و 4. الآن يحتاج المستخدم إلى الضغط على المفتاح 1 (هذه المرة يتصرف هذا المفتاح مثل موافق) للمتابعة مع المعرف المحدد. ويستخدم المفتاح 2 أيضًا لإعادة تعيين البيانات أو حذفها من EEPROM الخاص بالميكروكونترولر.
تلتقط وحدة مستشعر بصمة الإصبع صورة بصمة الإصبع ثم تحولها إلى قالب مكافئ وتحفظها في ذاكرتها وفقًا للمعرف المحدد بواسطة متحكم دقيق. يتم تنفيذ كل العملية بواسطة متحكم دقيق ، مثل التقاط صورة لبصمة الإصبع ؛ تحويله إلى قوالب وتخزينه كمعرف وما إلى ذلك. يمكنك أيضًا التحقق من مشاريع مستشعر بصمات الأصابع الأخرى ، حيث قمنا ببناء نظام أمان مستشعر بصمات الأصابع وآلة تصويت بمستشعر بصمات الأصابع.
مخطط الرسم البياني
الرسم البياني الكامل للدائرة لمشروع نظام الحضور القائم على بصمات الأصابع ، موضح أدناه. يحتوي على متحكم Atmega32 للتحكم في جميع عمليات المشروع. يتم استخدام زر الضغط أو الغشاء للتسجيل والحذف واختيار المعرفات للحضور ، ويتم استخدام الجرس للإشارة وشاشة LCD مقاس 16 × 2 لإرشاد المستخدم حول كيفية استخدام الجهاز.
كما هو موضح في الرسم البياني للدائرة ، فإن أزرار الضغط أو الغشاء متصلة مباشرة بالدبوس PA2 (مفتاح ENROLL 1) ، PA3 (مفتاح DEL 2) ، PA0 (مفتاح UP 3) ، PA1 (مفتاح DOWN 4) لوحدة التحكم الدقيقة فيما يتعلق بالأرض أو PA4. ويتم توصيل LED عند pin PC2 من متحكم دقيق فيما يتعلق بالأرض من خلال المقاوم 1k. تم توصيل Rx و Tx لوحدة بصمة الإصبع مباشرة في Serial pin PD1 و PD3 لوحدة التحكم الدقيقة. يستخدم مصدر الطاقة 5 فولت لتشغيل الدائرة بأكملها باستخدام منظم الجهد LM7805وهو مدعوم من محول تيار مستمر 12 فولت. يتم توصيل الجرس أيضًا في pin PC3. تم تكوين شاشة LCD مقاس 16 × 2 في وضع 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 لبيانات الوقت والتاريخ. يعمل الوقت والتاريخ بشكل مستمر في النظام ، لذلك يمكن أن يستغرق Microcontroller الوقت والتاريخ عندما يقوم مستخدم حقيقي بوضع إصبعه على مستشعر بصمة الإصبع ثم حفظهما في EEPROM في الفتحة المخصصة للذاكرة.
يمكن للمستخدم تنزيل بيانات الحضور بالضغط مع الاستمرار على المفتاح 4. قم بتوصيل الإمداد بالدائرة وانتظر وبعد مرور بعض الوقت ، ستظهر شاشة LCD عبارة "جارٍ التنزيل…". ويمكن للمستخدم رؤية بيانات الحضور عبر الشاشة التسلسلية ، وهنا في هذا البرنامج الكود تم برمجة UART في pin PD7-pin20 كـ Tx لإرسال البيانات إلى المحطة. يحتاج المستخدم أيضًا إلى محول TTL إلى USB لرؤية بيانات الحضور عبر المحطة التسلسلية.
وإذا كان المستخدم يريد حذف جميع البيانات ، فعليه الضغط مع الاستمرار على المفتاح 2 ثم توصيل الطاقة والانتظار لبعض الوقت. الآن بعد مرور بعض الوقت ، ستظهر شاشة LCD "الرجاء الانتظار…" ثم "تم حذف السجل بنجاح". هاتان الخطوتان غير معروضتين في الفيديو التوضيحي الوارد في النهاية.
شرح الكود
يتم تقديم الرمز الكامل مع الفيديو الخاص بنظام الحضور البيومتري هذا في النهاية. رمز هذا المشروع طويل ومعقد بعض الشيء للمبتدئين. ومن ثم حاولنا أخذ المتغيرات الوصفية لجعل القراءة والفهم جيدة. بادئ ذي بدء ، قمنا بتضمين بعض ملفات الرأس الضرورية ثم كتبنا وحدات الماكرو لغرض مختلف.
#define 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.