أصبح مستشعر بصمة الإصبع ، الذي اعتدنا رؤيته في أفلام الخيال العلمي قبل بضع سنوات ، شائعًا جدًا للتحقق من هوية الشخص لأغراض مختلفة. في الوقت الحالي ، يمكننا أن نرى أنظمة تعتمد على بصمات الأصابع في كل مكان في حياتنا اليومية مثل الحضور في المكاتب ، والتحقق من الموظفين في البنوك ، والسحب النقدي أو الإيداع في أجهزة الصراف الآلي ، للتحقق من الهوية في المكاتب الحكومية وما إلى ذلك ، لقد قمنا بالفعل بتوصيلها مع Arduino و مع Raspberry Pi ، سنقوم اليوم بتوصيل مستشعر بصمة الإصبع مع متحكم PIC. باستخدام نظام بصمة الإصبع PIC16f877A PIC ، يمكننا تسجيل بصمات أصابع جديدة في النظام ويمكننا حذف بصمات الأصابع التي تم تغذيتها بالفعل. تم عرض العمل الكامل للنظام في الفيديو المقدمة في نهاية المقال.
المكونات المطلوبة
- متحكم PIC16f877A
- وحدة البصمة
- أزرار الضغط أو لوحة المفاتيح
- 16x2 LCD
- 10 كيلو وعاء
- مذبذب كريستال 18.432000 ميجا هرتز
- لوح الخبز أو ثنائي الفينيل متعدد الكلور (أمر من JLCPCB)
- أسلاك توصيل
- LED (اختياري)
- مقاوم 150 أوم -1 كيلو أوم (اختياري)
- 5 فولت امدادات الطاقة
مخطط الدائرة وشرحها
في مشروع واجهة مستشعر بصمة الإصبع PIC Microcontroller ، استخدمنا 4 أزرار ضغط: تُستخدم هذه الأزرار للوظائف المتعددة. يستخدم المفتاح 1 لمطابقة بصمة الإصبع وزيادة معرف بصمة الإصبع أثناء تخزين أو حذف البصمة في النظام. يتم استخدام المفتاح 2 لتسجيل بصمة الإصبع الجديدة ولتقليل معرف بصمة الإصبع أثناء تخزين أو حذف بصمة الإصبع في النظام. يستخدم المفتاح 3 لحذف الإصبع المخزن من النظام ويستخدم المفتاح 4 لـ OK. A LED يستخدم للإشارة إلى اكتشاف بصمة الإصبع أو مطابقتها. استخدمنا هنا وحدة البصمة التي تعمل على UART. لذلك قمنا هنا بتوصيل وحدة البصمة هذه مع متحكم PIC بمعدل الباود الافتراضي وهو 57600.
لذا ، أولاً وقبل كل شيء ، نحتاج إلى إجراء كل التوصيلات المطلوبة كما هو موضح في مخطط الدائرة أدناه. الاتصالات بسيطة ، لقد قمنا للتو بتوصيل وحدة بصمة الإصبع بوحدة التحكم الدقيقة UART الخاصة بـ PIC. يتم استخدام شاشة LCD مقاس 16 × 2 لعرض جميع الرسائل. يتم استخدام وعاء 10 كيلو أيضًا مع شاشة LCD للتحكم في تباين نفس الشيء. تم توصيل دبابيس بيانات LCD مقاس 16 × 2 بأطراف PORTA. تتصل دبابيس d4 و d5 و d6 و d7 بشاشات الكريستال السائل بـ Pin RA0 و RA1 و RA2 و RA3 من متحكم PIC على التوالي. أربعة أزرار ضغط (أو لوحة مفاتيح) متصلة بـ PORTD's Pin RD0 و RD1 و RD2 و RD. يتم توصيل LED أيضًا في منفذ PORTC's pin RC3. استخدمنا هنا مذبذبًا بلوريًا خارجيًا بقوة 18.432000 ميغاهرتز لتوقيت المتحكم الدقيق.
تشغيل مستشعر بصمات الأصابع مع متحكم PIC
تشغيل هذا المشروع بسيط ، ما عليك سوى تحميل ملف سداسي عشري ، تم إنشاؤه من الكود المصدري ، إلى وحدة التحكم الدقيقة PIC بمساعدة مبرمج PIC أو ناسخ (PIckit2 أو Pickit3 أو غيرهما) ثم سترى بعض الرسائل التمهيدية عبر LCD ثم المستخدم سيُطلب منك إدخال اختيار للعمليات. لمطابقة بصمة الإصبع ، يحتاج المستخدم إلى الضغط على المفتاح 1 ثم تطلب شاشة LCD وضع الإصبع على مستشعر بصمة الإصبع. الآن من خلال وضع وحدة بصمة الإصبع ، يمكننا التحقق مما إذا كانت بصمات أصابعنا مخزنة بالفعل أم لا. إذا تم تخزين البصمة الخاصة بك ثم سوف LCD تظهر الرسالة مع ID تخزين البصمة مثل " ID: 2" وإلا فإنه سوف تظهر "لم يتم العثور على" .
الآن لتسجيل بصمة الإصبع ، يحتاج المستخدم إلى الضغط على زر التسجيل أو المفتاح 2 واتباع رسائل التعليمات على شاشة LCD.
إذا أراد المستخدم حذف أي من بصمات الأصابع ، فسيحتاج المستخدم إلى الضغط على زر الحذف أو المفتاح 3. بعد ذلك ، ستطلب شاشة LCD معرف بصمة الإصبع المراد حذفها. الآن باستخدام زر زيادة الضغط أو المفتاح 1 (زر المطابقة أو المفتاح 1) وزر الضغط أو المفتاح 2 (تسجيل زر الضغط أو المفتاح 2) للزيادة والإنقاص ، يمكن للمستخدم تحديد معرف بصمة الإصبع المحفوظة والضغط على موافق زر لحذف تلك البصمة. لمزيد من الفهم ، ألق نظرة على الفيديو المقدم في نهاية المشروع.
واجهة بصمة الإصبع ملاحظة: برنامج هذا المشروع معقد بعض الشيء بالنسبة للمبتدئين. لكن رمز التفاعل البسيط الخاص به تم إنشاؤه باستخدام قراءة ورقة بيانات وحدة بصمات الأصابع r305. يتم تقديم جميع تعليمات عمل وحدة البصمة هذه في ورقة البيانات.
هنا استخدمنا تنسيق إطار للتحدث مع وحدة بصمات الأصابع. عندما نرسل إطار طلب أمر أو بيانات إلى وحدة بصمة الإصبع ، فإنه يستجيب لنا بنفس تنسيق الإطار الذي يحتوي على بيانات أو معلومات متعلقة بالأمر المطبق. تم تقديم جميع البيانات وتنسيق إطار الأوامر في دليل المستخدم أو في ورقة البيانات الخاصة بوحدة بصمة الإصبع R305.
شرح البرمجة
في البرمجة ، استخدمنا تنسيق الإطار أدناه.
نبدأ البرنامج من خلال تعيين بتات التكوين وتحديد وحدات الماكرو والدبابيس لشاشات الكريستال السائل والأزرار و LED ، والتي يمكنك التحقق من الكود الكامل المعطى في نهاية هذا المشروع. إذا كنت جديدًا على PIC Microcontroller ، فابدأ بـ Getting started with PIC Microcontroller Project.
ثم أعلنا وأعدنا تهيئة بعض المتغيرات والمصفوفات ، وصنعنا إطارًا نحتاج إلى استخدامه في هذا المشروع لواجهة وحدة بصمات الأصابع مع متحكم PIC.
أوشار بوف. uchar buf1 ؛ مؤشر uint المتطاير = 0 ؛ علم int المتطاير = 0 ؛ uint msCount = 0 ؛ uint g_timerflag = 1 ؛ عدد uint المتطاير = 0 ؛ بيانات uchar معرف uint = 1 ؛ تعداد { CMD، DATA، SBIT_CREN = 4، SBIT_TXEN، SBIT_SPEN، } ؛ حزمة مرور الأحرف الثابتة = {0xEF ، 0x1 ، 0xFF ، 0xFF ، 0xFF ، 0xFF ، 0x1 ، 0x0 ، 0x7 ، 0x13 ، 0x0 ، 0x0 ، 0x0 ، 0x0 ، 0x0 ، 0x1B} ؛ كشف الحرف الثابت = {0xEF ، 0x1 ، 0xFF ، 0xFF ، 0xFF ، 0xFF ، 0x1 ، 0x0 ، 0x3 ، 0x1 ، 0x0 ، 0x5} ؛ const char f_imz2ch1 = {0xEF ، 0x1 ، 0xFF ، 0xFF ، 0xFF ، 0xFF ، 0x1 ، 0x0 ، 0x4 ، 0x2 ، 0x1 ، 0x0 ، 0x8} ؛ const char f_imz2ch2 = {0xEF ، 0x1 ، 0xFF ، 0xFF ، 0xFF ، 0xFF ، 0x1 ، 0x0 ، 0x4 ، 0x2 ، 0x2 ، 0x0 ، 0x9} ؛ const char f_createModel = {0xEF، 0x1،0xFF، 0xFF، 0xFF، 0xFF، 0x1،0x0،0x3،0x5،0x0،0x9} ؛ char f_storeModel = {0xEF، 0x1،0xFF، 0xFF، 0xFF، 0xFF، 0x1،0x0،0x6،0x6،0x1،0x0،0x1،0x0،0xE} ، const char f_search = {0xEF ، 0x1 ، 0xFF ، 0xFF ، 0xFF ، 0xFF ، 0x1 ، 0x0 ، 0x8 ، 0x1B ، 0x1 ، 0x0 ، 0x0 ، 0x0 ، 0xA3 ، 0x0 ، 0xC8} ؛ char f_delete = {0xEF، 0x1،0xFF، 0xFF، 0xFF، 0xFF، 0x1،0x0،0x7،0xC، 0x0،0x0،0x0،0x1،0x0،0x15} ؛
بعد ذلك ، قمنا بعمل وظيفة LCD لقيادة LCD.
الفراغ lcdwrite (uchar الفصل، uchar RW) { LCDPORT = الفصل >> 4 و 0x0F. RS = rw ؛ EN = 1 ؛ __delay_ms (5) ؛ EN = 0 ؛ LCDPORT = ch & 0x0F ؛ EN = 1 ؛ __delay_ms (5) ؛ EN = 0 ؛ } lcdprint (char * str) { while (* str) { lcdwrite (* str ++، DATA)؛ // __ delay_ms (20) ؛ } } lcdbegin () { uchar lcdcmd = {0x02،0x28،0x0E، 0x06،0x01} ؛ uint أنا = 0 ؛ لـ (i = 0 ؛ i <5 ؛ i ++) كتابة LCD (lcdcmd ، CMD) ؛ }
يتم استخدام وظيفة معينة لتهيئة UART
بدء تسلسلي باطل (معدل باود غير منتظم) { SPBRG = (18432000UL / (طويل) (64UL * baudrate)) - 1 ؛ // معدل الباود @ 18.432000 ميجا هرتز على مدار الساعة TXSTAbits.SYNC = 0 ؛ // إعداد الوضع غير المتزامن ، مثل UART RCSTAbits.SPEN = 1 ؛ // تمكين المنفذ التسلسلي TRISC7 = 1 ؛ // كما هو موضح في ورقة البيانات TRISC6 = 0 ؛ // على النحو المنصوص عليه في ورقة البيانات RCSTAbits.CREN = 1 ؛ // تمكين الاستقبال المستمر TXSTAbits.TXEN = 1 ؛ // تمكين الإرسال GIE = 1 ؛ // تمكين المقاطعات INTCONbits.PEIE = 1 ؛ // تمكين المقاطعات الطرفية. PIE1bits.RCIE = 1 ؛ // ENABLE USART تلقي المقاطعة PIE1bits.TXIE = 0 ؛ // تعطيل USART TX مقاطعة PIR1bits.RCIF = 0 ؛ }
تُستخدم الوظائف المعينة لنقل الأوامر إلى وحدة بصمات الأصابع وتلقي البيانات من وحدة بصمة الإصبع.
كتابة تسلسلية باطلة (char ch) { while (TXIF == 0) ؛ // انتظر حتى يصبح سجل جهاز الإرسال فارغًا TXIF = 0 ؛ // مسح إشارة جهاز الإرسال TXREG = ch ؛ // تحميل الحرف لإرساله إلى regit reg } serialprint (char * str) { while (* str) { serialwrite (* str ++)؛ } } void interrupt SerialRxPinInterrupt (void) { if ((PIR1bits.RCIF == 1) && (PIE1bits.RCIE == 1)) { uchar ch = RCREG؛ buf = الفصل ؛ إذا (الفهرس> 0) العلم = 1 ؛ RCIF = 0 ؛ // clear rx flag } } void serialFlush () { for (int i = 0؛ i
بعد ذلك نحتاج إلى إنشاء وظيفة تقوم بإعداد البيانات التي سيتم نقلها إلى بصمة الإصبع وفك تشفير البيانات الواردة من وحدة البصمة.
int sendcmd2fp (char * pack، int len) { uint res = ERROR؛ متسلسل فلوش () ؛ الفهرس = 0 ؛ __delay_ms (100) ؛ لـ (int i = 0 ؛ i
الآن ، هناك أربع وظائف متوفرة في الكود لأربع مهام مختلفة:
- وظيفة لإدخال معرف بصمة الإصبع - وحدة getId ()
- وظيفة لمطابقة الاصبع - تطابق باطل الاصبع ()
- وظيفة لتسجيل إصبع جديد - void enrolFinger ()
- وظيفة لحذف إصبع - حذف باطل
يتم تقديم الكود الكامل مع جميع الوظائف الأربعة في النهاية.
الآن في الوظيفة الرئيسية ، نقوم بتهيئة GPIOs و LCD و UART والتحقق مما إذا كانت وحدة بصمات الأصابع متصلة بمتحكم دقيق أم لا. ثم يعرض بعض الرسائل التمهيدية على شاشة LCD. أخيرًا في حلقة أثناء قراءة جميع المفاتيح أو أزرار الضغط لتشغيل المشروع.
int main () { void (* FP) () ؛ ADCON1 = 0b00000110 ؛ ليددير = 0 ؛ SWPORTdir = 0xF0 ؛ SWPORT = 0x0F ؛ المسلسل يبدأ (57600) ؛ LCDPORTDIR = 0x00 ؛ TRISE = 0 ؛ lcdbegin () ، بصمة LCD ("بصمة") ؛ LCDwrite (192 ، CMD) ؛ lcdprint ("التواصل") ؛ __delay_ms (2000) ؛ LCDwrite (1 ، CMD) ؛ lcdprint ("باستخدام PIC16F877A") ؛ LCDwrite (192 ، CMD) ؛ lcdprint ("ملخص الدائرة") ؛ __delay_ms (2000) ؛ الفهرس = 0 ؛ while (sendcmd2fp (& passPack، sizeof (passPack))) { lcdwrite (1، CMD) ؛ lcdprint ("FP غير موجود") ؛ __delay_ms (2000) ؛ الفهرس = 0 ؛ } LCDwrite (1 ، CMD) ؛ lcdprint ("FP Found") ؛ __delay_ms (1000) ؛ lcdinst () ، بينما (1) { FP = match
أكمل كود الموافقة المسبقة عن علم وفيديو العمل موضح أدناه. تحقق أيضًا من مشاريعنا الأخرى باستخدام وحدة استشعار بصمة الإصبع:
- آلة التصويت البيومترية القائمة على بصمات الأصابع باستخدام Arduino
- نظام الأمان البيومتري باستخدام Arduino ومستشعر بصمات الأصابع
- نظام الحضور البيومتري المستند إلى بصمات الأصابع باستخدام Arduino
- واجهة مستشعر بصمة الإصبع مع Raspberry Pi