חיישן הדפסת אצבע, שאותו היינו רואים בסרטי מדע בדיוני לפני כמה שנים, נפוץ כיום מאוד לאימות זהותו של אדם למטרות שונות. בזמן הנוכחי אנו יכולים לראות מערכות מבוססות טביעות אצבע בכל מקום בחיי היומיום שלנו כמו השתתפות במשרדים, אימות עובדים בבנקים, משיכת מזומנים או הפקדות בכספומטים, לאימות זהות במשרדי ממשלה וכו '. כבר התממשקנו עם ארדואינו ו עם Raspberry Pi, היום אנו הולכים לממשק חיישן הדפסת אצבע עם מיקרו בקר PIC. באמצעות מיקרו-בקר PIC PIC16f877A זה, אנו יכולים לרשום טביעות אצבע חדשות במערכת ולמחוק את טביעות האצבע שכבר הוזנו. העבודה המלאה של המערכת הוצגה בסרטון הווידאו ניתן בסוף המאמר.
רכיבים נדרשים
- PIC16f877A מיקרו-בקר
- מודול טביעות אצבע
- לחצני כפתור או לוח מקשים
- LCD בגודל 16x2
- סיר 10k
- מתנד קריסטל 18.432000 מגה-הרץ
- לוח לחם או PCB (הוזמן מ- JLCPCB)
- חוטי מגשר
- LED (אופציונלי)
- נגד 150 אוהם -1 k אוהם (אופציונלי)
- ספק כוח 5v
תרשים מעגל והסבר
בכך הדפס PIC מיקרו אצבע חיישן ממשק הפרויקט, השתמשנו 4 לחצנים: כפתורים אלה משמשים multifunctioning. מפתח 1 משמש להתאמת זיהוי טביעת האצבע והגדלת טביעת האצבע בזמן אחסון או מחיקה של טביעת האצבע במערכת. מפתח 2 משמש לרישום טביעת האצבע החדשה ולצמצום מזהה טביעות האצבע בזמן אחסון או מחיקה של טביעת אצבע במערכת. מפתח 3 משמש למחיקת אצבע מאוחסנת מהמערכת ומפתח 4 משמש לאישור. LED משמש לציון שטביעת האצבע מזוהה או מותאמת. כאן השתמשנו במודול טביעות אצבע שעובד ב- UART. אז הנה ממשקנו את מודול טביעות האצבע הזה עם מיקרו-בקר PIC בקצב השידור המשמש כברירת מחדל שהוא 57600.
אז ראשית כל, עלינו ליצור את כל החיבורים הנדרשים כפי שמוצג בתרשים המעגל להלן. החיבורים פשוטים, הרגע חיברנו את מודול טביעות האצבע ל- UART של מיקרו-בקרת PIC. LCD 16x2 משמש להצגת כל ההודעות. סיר 10k משמש גם עם LCD לשליטה על הניגודיות של אותו. סיכות נתונים 16x2 LCD מחוברות סיכות PORTA. פינים d4, d5, d6 ו- d7 של LCD מחוברים עם פין RA0, RA1, RA2 ו- RA3 של מיקרו-בקר PIC בהתאמה. ארבעה כפתורי לחיצה (או לוח מקשים) מחוברים לפין RD0, RD1, RD2 ו- RD של PORTD. נורית LED מחוברת גם בסיכה RC3 של יציאת PORTC. כאן השתמשנו במתנד קריסטל חיצוני בגודל 18.432000 מגה-הרץ לשעון המיקרו-בקר.
הפעלת חיישן טביעות אצבע עם מיקרו בקר PIC
הפעלת פרויקט זה היא פשוטה, פשוט העלה קובץ hex, שנוצר מקוד מקור, למיקרו-בקר PIC בעזרת מתכנת PIC או צורב (PIckit2 או Pickit3 או אחרים) ואז תראה כמה הודעות מבוא על גבי LCD ואז המשתמש יתבקש להזין בחירה לפעולות. כדי להתאים למשתמש בטביעות האצבע צריך ללחוץ על מקש 1 ואז LCD יבקש למקם אצבע על חיישן הדפסת האצבע. כעת על ידי הצבת אצבע מעל מודול טביעות אצבע, אנו יכולים לבדוק האם טביעות האצבעות שלנו כבר שמורות או לא. אם טביעת האצבע שלך מאוחסנת אז LCD יציג את ההודעה עם מזהה האחסון של ' מזהה: 2 ' כמו טביעת אצבע אחרת זה יראה 'לא נמצא' .
כעת כדי לרשום הדפסת אצבע , המשתמש צריך ללחוץ על כפתור ההרשמה או על מקש 2 ולבצע את הודעות ההוראות על גבי מסך ה- LCD.
אם המשתמש רוצה למחוק טביעות אצבע כלשהן, המשתמש צריך ללחוץ על כפתור המחיקה או על מקש 3. לאחר מכן, LCD יבקש את מזהה טביעת האצבע אשר יימחק. כעת על ידי שימוש בלחיצת כפתור תוספת או מקש 1 (התאמת כפתור לחצן או מקש 1) וכפתור דחיפה או מקש 2 (רישום לחצן כפתור או מקש 2) לצורך הגדלה והקטנה, המשתמש יכול לבחור את מזהה הדפסת האצבע השמורה ולחץ על אישור כדי למחוק את טביעת האצבע. להבנה רבה יותר הסתכלו בסרטון שניתן בסוף הפרויקט.
ממשק FingerPrint הערה: התוכנית של פרויקט זה מורכבת מעט למתחילים. אך קוד הממשק הפשוט שלו נוצר באמצעות קריאת גיליון הנתונים של מודול טביעות האצבע. כל הוראות התפקוד של מודול טביעות אצבע זה ניתנות בגיליון הנתונים.
כאן השתמשנו בפורמט מסגרת כדי לדבר עם מודול טביעות האצבע. בכל פעם שאנחנו שולחים פקודה או מסגרת בקשת נתונים למודול טביעות אצבע, היא מגיבה לנו באותו פורמט מסגרת המכיל נתונים או מידע הקשור לפקודה שהוחלה. כל פורמט הנתונים ומסגרת הפקודה ניתן במדריך למשתמש או בגליון הנתונים של מודול טביעות האצבע R305.
הסבר על תכנות
בתכנות השתמשנו בתבנית המסגרת הבאה.
אנו מתחילים את התוכנית על ידי הגדרת סיביות התצורה והגדרת מאקרו וסיכות עבור LCD, לחצנים ו- LED, אותם תוכלו לבדוק בקוד השלם שניתן בסוף פרויקט זה. אם אתה חדש ב- PIC Microcontroller אז התחל עם תחילת העבודה עם PIC Microcontroller Project.
לאחר מכן הכרזנו ואותחלנו איזה משתנה ומערך, ויצרנו מסגרת שנצטרך להשתמש בה בפרויקט זה כדי לממשק מודול טביעות אצבע עם מיקרו-בקר PIC.
uchar buf; uchar buf1; מדד uint נדיף = 0; דגל int נדיף = 0; uint msCount = 0; uint g_timerflag = 1; ספירת צבעים נדיפה = 0; נתוני uchar; uint id = 1; enum { CMD, DATA, SBIT_CREN = 4, SBIT_TXEN, SBIT_SPEN, }; const char passPack = {0xEF, 0x1, 0xFF, 0xFF, 0xFF, 0xFF, 0x1, 0x0, 0x7, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1B}; const char f_detect = {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 ch, uchar rw) { LCDPORT = ch >> 4 & 0x0F; RS = rw; EN = 1; __השהיית_מס (5); EN = 0; LCDPORT = ch & 0x0F; EN = 1; __השהיית_מס (5); EN = 0; } Lcdprint (char * str) { while (* str) { lcdwrite (* str ++, DATA); // __ עיכוב_מס (20); } } lcdbegin () { uchar lcdcmd = {0x02,0x28,0x0E, 0x06,0x01}; uint i = 0; עבור (i = 0; i <5; i ++) lcdwrite (lcdcmd, CMD); }
הפונקציה הנתונה משמשת לאתחול UART
בטל סדרתי החל (uint baudrate) { SPBRG = (18432000UL / (long) (64UL * baudrate)) - 1; // קצב שידור @ 18.432000Mhz שעון TXSTAbits.SYNC = 0; // הגדרת מצב אסינכרוני, כלומר UART RCSTAbits.SPEN = 1; // מאפשר יציאה טורית TRISC7 = 1; // כפי שנקבע בגליון הנתונים TRISC6 = 0; // כפי שנקבע בגליון הנתונים RCSTAbits.CREN = 1; // מאפשר קבלה רציפה TXSTAbits.TXEN = 1; // מאפשר שידור GIE = 1; // ENABLE קוטע את INTCONbits.PEIE = 1; // EN הפסקות הפרעות היקפיות. PIE1bits.RCIE = 1; // הפעל USART לקבל הפרעות PIE1bits.TXIE = 0; // השבת את USART TX להפריע ל- PIR1bits.RCIF = 0; }
פונקציות נתונות משמשות להעברת פקודות למודול טביעות האצבע ולקבלת נתונים ממודול טביעות האצבע.
בטל הסדרה (char ch) { תוך (TXIF == 0); // המתן עד שרשם המשדרים יהיה ריק TXIF = 0; // נקה דגל משדר TXREG = ch; // טען את התו שיועבר לשידור reg } טביעת טורי (char * str) { בעוד (* str) { serialwrite (* str ++); } } בטל הפרעה SerialRxPinInterrupt (בטל) { אם ((PIR1bits.RCIF == 1) && (PIE1bits.RCIE == 1)) { uchar ch = RCREG; buf = ch; אם (אינדקס> 0) דגל = 1; RCIF = 0; // נקה דגל rx } } בטל serialFlush () { עבור (int i = 0; i
אחריה עלינו לבצע פונקציה המכינה נתונים שאמורים להיות מועברים לטביעת אצבע ולפענח את הנתונים המגיעים ממודול טביעות האצבע.
int sendcmd2fp (char * pack, int len) { uint res = ERROR; serialFlush (); אינדקס = 0; __השהיית_מס (100); עבור (int i = 0; i
כעת, ישנן ארבע פונקציות הזמינות בקוד לארבע משימות שונות:
- פונקציה להזנת מזהה טביעת האצבע - יחידה getId ()
- פונקציה להתאמת אצבע - התאמת ריק (אצבע) ()
- פונקציה לרישום אצבע חדשה - void enrolFinger ()
- פונקציה למחיקת אצבע - בטל deleteFinger ()
הקוד השלם עם כל ארבעת הפונקציות ניתן בסוף.
כעת בפונקציה הראשית אנו מאתחלים GPIO, LCD, UART ובודקים אם מודול טביעות האצבע מחובר למיקרו-בקר או לא. ואז זה מציג כמה הודעות מבוא על גבי LCD. לבסוף תוך כדי לולאה אנו קוראים את כל המקשים או כפתורי הלחיצה להפעלת הפרויקט.
int main () { void (* FP) (); ADCON1 = 0b00000110; LEDdir = 0; SWPORTdir = 0xF0; SWPORT = 0x0F; התחלה סדרתית (57600); LCDPORTDIR = 0x00; TRISE = 0; lcdbegin (); lcdprint ("טביעת אצבע"); lcdwrite (192, CMD); lcdprint ("ממשק"); __השהיית_מס (2000); lcdwrite (1, CMD); lcdprint ("שימוש ב- PIC16F877A"); lcdwrite (192, CMD); lcdprint ("מעגל עיכול"); __השהיית_מס (2000); אינדקס = 0; בעוד (sendcmd2fp (& passPack, sizeof (passPack))) { lcdwrite (1, CMD); lcdprint ("FP לא נמצא"); __השהיית_מס (2000); אינדקס = 0; } lcdwrite (1, CMD); lcdprint ("FP נמצא"); __השהיית_מס (1000); lcdinst (); ואילו (1) { FP = התאמה
קוד PIC מלא וסרטון עבודה מופיע להלן. בדוק גם את הפרויקטים האחרים שלנו באמצעות מודול חיישן הדפסת אצבע:
- מכונת הצבעה ביומטרית מבוססת טביעות אצבע באמצעות ארדואינו
- מערכת אבטחה ביומטרית באמצעות ארדואינו וחיישן טביעות אצבע
- מערכת נוכחות ביומטרית מבוססת טביעות אצבע באמצעות Arduino
- ממשק חיישן טביעות אצבע עם פטל פי