- Componente necesare
- Diagrama și explicația circuitului
- Funcționarea senzorului de amprentă digitală cu microcontroler PIC
- Explicație de programare
Senzorul de amprentă digitală, pe care îl vedeam în filmele Sci-Fi cu câțiva ani în urmă, a devenit acum foarte obișnuit pentru a verifica identitatea unei persoane în diferite scopuri. În prezent, putem vedea sisteme bazate pe amprente peste tot în viața noastră de zi cu zi, cum ar fi prezența la birouri, verificarea angajaților în bănci, retragerea numerarului sau depozitele în bancomate, verificarea identității în birourile guvernamentale etc. L-am interfațat deja cu Arduino și cu Raspberry Pi, astăzi vom interfața Finger Print Sensor cu microcontroler PIC. Folosind acest microcontroler PIC PIC16f877A Finger Print System, putem înregistra noi amprente digitale în sistem și putem șterge amprentele deja alimentate. Funcționarea completă a sistemului a fost prezentată în videoclip dat la sfârșitul articolului.
Componente necesare
- Microcontroler PIC16f877A
- Modul de amprentă digitală
- Apăsați butoanele sau tastatura
- 16x2 LCD
- Oala de 10k
- 18.432000 MHz Oscilator de cristal
- Panou sau PCB (comandat de la JLCPCB)
- Sârme de jumper
- LED (opțional)
- Rezistor 150 ohm -1 k ohm (opțional)
- Alimentare 5v
Diagrama și explicația circuitului
În acest proiect de interfață a senzorului de imprimare digitală PIC Microcontroller, am folosit 4 butoane: aceste butoane sunt utilizate pentru multifuncționalitate. Tasta 1 este utilizată pentru potrivirea amprentei digitale și a creșterii ID-ului de amprentă în timp ce stocați sau ștergeți amprenta în sistem. Tasta 2 este utilizată pentru înregistrarea noii amprente și pentru scăderea ID-ului de amprentă în timp ce stocați sau ștergeți amprenta în sistem. Tasta 3 este utilizată pentru ștergerea degetului stocat din sistem, iar tasta 4 este utilizată pentru OK. Un LED este utilizat pentru a indica faptul că amprenta este detectată sau potrivită. Aici am folosit un modul de amprentă care funcționează pe UART. Așadar, aici am interfațat acest modul de amprentă digitală cu microcontrolerul PIC la rata de transmisie implicită, care este 57600.
Deci, în primul rând, trebuie să realizăm toate conexiunile necesare așa cum se arată în schema de circuite de mai jos. Conexiunile sunt simple, tocmai am conectat modulul de amprentă digitală la UART al microcontrolerului PIC. Un ecran LCD de 16x2 este utilizat pentru afișarea tuturor mesajelor. Un vas de 10k este, de asemenea, utilizat cu LCD pentru a controla contrastul acestuia. Pinii de date LCD de 16x2 sunt pini PORTA conectați. Pinii LCD d4, d5, d6 și d7 sunt conectați la pinul RA0, RA1, RA2 și respectiv RA3 al microcontrolerului PIC. Patru butoane (sau tastatură) sunt conectate la pinul PORTD RD0, RD1, RD2 și RD. LED-ul este, de asemenea, conectat la pinul portului PORTC RC3. Aici am folosit un oscilator de cristal extern de 18,432000 MHz pentru a monitoriza microcontrolerul.
Funcționarea senzorului de amprentă digitală cu microcontroler PIC
Funcționarea acestui proiect este simplă, trebuie doar să încărcați fișierul hex, generat din codul sursă, în microcontrolerul PIC cu ajutorul programatorului sau arzătorului PIC (PIckit2 sau Pickit3 sau altele) și apoi veți vedea câteva mesaje introductive pe LCD și apoi utilizatorul i se va cere să introducă o alegere pentru operațiuni. Pentru a se potrivi amprentelor, utilizatorul trebuie să apese tasta 1, apoi LCD-ul va solicita plasarea degetului pe senzorul de amprentă. Acum, punând un deget peste modulul de amprentă, putem verifica dacă amprentele noastre sunt deja stocate sau nu. Dacă amprenta dvs. este stocată, atunci LCD va afișa mesajul cu ID-ul de stocare al „ ID: 2” de tip amprentă , în caz contrar va afișa „Not Found” .
Acum, pentru a înregistra o imprimare digitală , utilizatorul trebuie să apese butonul de înregistrare sau tasta 2 și să urmeze mesajele de instrucțiuni de pe ecranul LCD.
Dacă utilizatorul dorește să șteargă oricare dintre amprentele, atunci utilizatorul trebuie să apese butonul de ștergere sau tasta 3. După care, LCD va cere ID-ul amprentei care urmează să fie șters. Acum, utilizând butonul de creștere sau tasta 1 (butonul de potrivire sau tasta 1) și butonul de scădere sau tasta 2 (butonul de înregistrare sau tasta 2) pentru creșterea și scăderea, utilizatorul poate selecta ID-ul memoriei digitale și apăsați OK pentru a șterge acea amprentă digitală. Pentru mai multă înțelegere, aruncați o privire asupra videoclipului prezentat la sfârșitul proiectului.
Interfață FingerPrint Notă: Programul acestui proiect este puțin complex pentru un începător. Dar codul său simplu de interfațare realizat prin citirea fișei tehnice a modulului de amprentă r305. Toate instrucțiunile de funcționare ale acestui modul de amprentă sunt date în fișa tehnică.
Aici am folosit un format cadru pentru a vorbi cu modulul de amprentă digitală. Ori de câte ori trimitem o comandă sau un cadru de cerere de date către modulul de amprentă, acesta ne răspunde cu același format de cadru care conține date sau informații legate de comanda aplicată. Toate formatele cadrului de date și de comandă au fost date în manualul de utilizare sau în fișa tehnică a modulului de amprentă R305.
Explicație de programare
În programare, am folosit formatul cadrului de mai jos.
Începem programul setând biții de configurare și definind macrocomenzi și pini pentru LCD, Butoane și LED-uri, pe care le puteți verifica în codul complet dat la sfârșitul acestui proiect. Dacă sunteți nou în PIC Microcontroller, începeți cu Noțiuni introductive despre PIC Microcontroller Project.
Apoi am declarat și inițializat unele variabile și matrice și am făcut un cadru pe care trebuie să îl folosim în acest proiect pentru a interfața modulul de amprentă digitală cu microcontrolerul PIC.
uchar buf; uchar buf1; indice uint volatil = 0; pavilion int volatil = 0; uint msCount = 0; uint g_timerflag = 1; număr uint volatil = 0; date 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};
După aceasta, am creat funcția LCD pentru a conduce LCD.
void lcdwrite (uchar ch, uchar rw) { LCDPORT = ch >> 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 i = 0; pentru (i = 0; i <5; i ++) lcdwrite (lcdcmd, CMD); }
Funcția dată este utilizată pentru inițializarea UART
void serialbegin (uint baudrate) { SPBRG = (18432000UL / (long) (64UL * baudrate)) - 1; // baud rate @ 18.432000Mhz Clock TXSTAbits.SYNC = 0; // Setarea modului asincron, adică UART RCSTAbits.SPEN = 1; // Activează portul serial TRISC7 = 1; // După cum este prescris în foaia de date TRISC6 = 0; // După cum este prescris în foaia de date RCSTAbits.CREN = 1; // Activează recepția continuă TXSTAbits.TXEN = 1; // Activează transmisia GIE = 1; // ENABLE întrerupe INTCONbits.PEIE = 1; // Activați întreruperile periferice. PIE1bits.RCIE = 1; // ACTIVAȚI USART primi întrerupere PIE1bits.TXIE = 0; // dezactivează întreruperea USART TX PIR1bits.RCIF = 0; }
Funcțiile date sunt utilizate pentru transferul comenzilor în modulul de amprentă digitală și primirea de date din modulul de amprentă digitală.
void serialwrite (char ch) { while (TXIF == 0); // Așteptați până când registrul emițătorului devine gol TXIF = 0; // Ștergeți steagul transmițătorului TXREG = ch; // încărcați caracterul care urmează să fie transmis în transmit reg } serialprint (char * str) { while (* str) { serialwrite (* str ++); } } void interrupt SerialRxPinInterrupt (void) { if ((PIR1bits.RCIF == 1) && (PIE1bits.RCIE == 1)) { uchar ch = RCREG; buf = ch; if (index> 0) flag = 1; RCIF = 0; // șterge rx flag } } void serialFlush () { for (int i = 0; i
După aceasta, trebuie să realizăm o funcție care pregătește datele care urmează să fie transmise amprentei și decodifică datele provenite de la modulul de amprentă.
int sendcmd2fp (char * pack, int len) { uint res = ERROR; serialFlush (); index = 0; __delay_ms (100); pentru (int i = 0; i
Acum, există patru funcții disponibile în cod pentru patru sarcini diferite:
- Funcție pentru introducerea ID-ului de amprentă - unitate getId ()
- Funcție pentru potrivirea degetului - nul matchFinger ()
- Funcție pentru înscrierea degetului nou - void enrolFinger ()
- Funcția de ștergere a unui deget - ștergeți degetul ()
Codul complet cu toate cele patru funcții este dat la sfârșit.
Acum, în funcția principală, inițializăm GPIO-uri, LCD, UART și verificăm dacă modulul de amprentă este conectat sau nu cu un microcontroler. Apoi afișează câteva mesaje introductive pe ecranul LCD. În sfârșit, în bucla while citim toate tastele sau butoanele pentru a opera proiectul.
int main () { void (* FP) (); ADCON1 = 0b00000110; LEDdir = 0; SWPORTdir = 0xF0; SWPORT = 0x0F; serialbegin (57600); LCDPORTDIR = 0x00; TRISE = 0; lcdbegin (); lcdprint („Amprentă digitală”); lcdwrite (192, CMD); lcdprint („Interfațare”); __delay_ms (2000); lcdwrite (1, CMD); lcdprint („Utilizarea PIC16F877A”); lcdwrite (192, CMD); lcdprint ("Circuit Digest"); __delay_ms (2000); index = 0; while (sendcmd2fp (& passPack, sizeof (passPack))) { lcdwrite (1, CMD); lcdprint ("FP Not Found"); __delay_ms (2000); index = 0; } lcdwrite (1, CMD); lcdprint ("FP găsit"); __delay_ms (1000); lcdinst (); în timp ce (1) { FP = meci
Codul PIC complet și un videoclip de lucru sunt prezentate mai jos. Verificați și celelalte proiecte ale noastre folosind modulul senzor de amprentă digitală:
- Mașină de vot biometric pe bază de amprentă care utilizează Arduino
- Sistem de securitate biometrică utilizând Arduino și senzor de amprentă
- Sistem de prezență biometrică bazat pe amprentă digitală care utilizează Arduino
- Interfațarea senzorului de amprentă digitală cu Raspberry Pi