- Components necessaris
- Diagrama del circuit i explicació
- Funcionament del sensor d'empremta digital amb microcontrolador PIC
- Explicació de la programació
El sensor d’empremta digital, que solíem veure a les pel·lícules de ciència ficció fa uns anys, ara és molt comú per verificar la identitat d’una persona amb diversos propòsits. Actualment podem veure sistemes basats en empremtes dactilars a tot arreu de la nostra vida diària, com ara assistència a oficines, verificació d’empleats a bancs, retirada d’efectiu o dipòsits a caixers automàtics, verificació d’identitat a oficines governamentals, etc. amb Raspberry Pi, avui farem una interfície del sensor d’impressió digital amb microcontrolador PIC. Mitjançant aquest sistema d’impressió digital PIC16f877A del microcontrolador PIC, podem registrar noves empremtes digitals al sistema i eliminar les empremtes digitals ja alimentades. El vídeo mostra el funcionament complet del sistema donat al final de l'article.
Components necessaris
- Microcontrolador PIC16f877A
- Mòdul d’empremta digital
- Premeu els botons o el teclat
- LCD de 16x2
- Olla de 10k
- Oscil·lador de vidre de 18,432000 MHz
- Tauler de pa o PCB (demanat a JLCPCB)
- Filferros de pont
- LED (opcional)
- Resistència 150 ohm -1 k ohm (opcional)
- Alimentació 5v

Diagrama del circuit i explicació
En aquest projecte d’interfície de sensors d’impressió digital del microcontrolador PIC, hem utilitzat 4 botons policials: aquests botons s’utilitzen per a la multifunció. La clau 1 s’utilitza per fer coincidir la identificació d’empremta digital i d’empremta digital mentre s’emmagatzema o esborra l’empremta digital al sistema. La clau 2 s’utilitza per registrar la nova empremta digital i per disminuir la identificació d’empremtes digitals mentre s’emmagatzema o esborra l’empremta digital al sistema. La tecla 3 s’utilitza per suprimir el dit emmagatzemat del sistema i la tecla 4 s’utilitza per a OK. Un LED s’utilitza per indicar que s’ha detectat o coincidit l’empremta digital. Aquí hem utilitzat un mòdul d’empremta digital que funciona a UART. Així doncs, aquí hem interfaçat aquest mòdul d’empremtes digitals amb el microcontrolador PIC a la seva velocitat de transmissió per defecte, que és 57600.

Per tant, primer de tot, hem de fer tota la connexió necessària tal com es mostra al diagrama de circuits següent. Les connexions són senzilles, acabem de connectar el mòdul d’empremta digital a l’UART del microcontrolador PIC. S'utilitza una pantalla LCD de 16x2 per mostrar tots els missatges. També es fa servir una olla de 10 k amb LCD per controlar el contrast de la mateixa. Els pins de dades LCD de 16x2 estan connectats als pins PORTA. Els pins d4, d5, d6 i d7 de les LCD estan connectats amb els pins RA0, RA1, RA2 i RA3 del microcontrolador PIC respectivament. Quatre botons (o teclat) estan connectats als pins RD0, RD1, RD2 i RD de PORTD. El LED també està connectat al pin RC3 del port PORTC. Aquí hem utilitzat un oscil·lador de cristall extern de 18,432000 MHz per rellotjar el microcontrolador.

Funcionament del sensor d'empremta digital amb microcontrolador PIC
El funcionament d’aquest projecte és senzill, només cal que pengeu el fitxer hexadecimal, generat a partir del codi font, al microcontrolador PIC amb l’ajut del programador o gravador PIC (PIckit2 o Pickit3 o altres) i, a continuació, veureu alguns missatges d’introducció per LCD i després l’usuari se us demanarà que introduïu una opció per a les operacions. Per fer coincidir l’empremta digital, l’usuari ha de prémer la tecla 1 i, a continuació, la pantalla LCD us demanarà que col·loqueu el dit al sensor d’impressió digital. Ara, posant un dit sobre el mòdul d’empremtes digitals, podem comprovar si les nostres empremtes digitals ja estan emmagatzemades o no. Si la vostra empremta digital està emmagatzemada, la pantalla LCD mostrarà el missatge amb l'identificador d'emmagatzematge de l'identificador d'empremta digital " ID: 2", en cas contrari, mostrarà "No trobat" .
Ara, per registrar una impressió digital , l’ usuari ha de prémer el botó d’inscripció o la tecla 2 i seguir els missatges d’instruccions de la pantalla LCD.
Si l'usuari vol esborrar alguna empremta digital, ha de prémer el botó o la tecla de supressió 3. Després d'això, la pantalla LCD us demanarà l'identificador de l'empremta digital que s'ha de suprimir. Ara, mitjançant l’ús del botó d’increment o la tecla 1 (coincideix amb el botó o la tecla 1) i disminueix el botó o la tecla 2 (botó d’inscripció o tecla 2) per augmentar i disminuir, l’usuari pot seleccionar l’identificador de la impressió digital desada i prémer OK per esborrar aquesta empremta digital. Per obtenir més comprensió, mireu el vídeo donat al final del projecte.

Interfície FingerPrint Nota: el programa d'aquest projecte és una mica complex per a principiants. Però el seu codi d'interfície simple es fa mitjançant la lectura del full de dades del mòdul d'empremta digital r305. Totes les instruccions de funcionament d’aquest mòdul d’empremtes digitals es donen al full de dades.
Aquí hem utilitzat un format de marc per parlar amb el mòdul d’empremta digital. Sempre que enviem una comanda o un marc de sol·licitud de dades al mòdul d’empremtes digitals, ens respon amb el mateix format de marc que conté dades o informació relacionada amb l’ordre aplicat. Tot el format de marc de dades i comandes s’ha donat al manual de l’usuari o al full de dades del mòdul d’empremta digital R305.
Explicació de la programació
A la programació, hem utilitzat el format de fotograma següent.

Comencem el programa establint els bits de configuració i definint macros i pins per a LCD, Buttons i LED, que podeu consultar al codi complet que es dóna al final d’aquest projecte. Si no coneixeu PIC Microcontroller, comenceu per Introducció al PIC Microcontroller Project.
Després vam declarar i inicialitzar algunes variables i matrius, i vam fer un marc que hem d’utilitzar en aquest projecte per a la interfície del mòdul d’empremta digital amb el microcontrolador PIC.
uchar buf; uchar buf1; índex uint volàtil = 0; bandera int volàtil = 0; uint msCount = 0; uint g_timerflag = 1; recompte de volatils uint = 0; dades 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};
Després d'això, hem creat la funció LCD per conduir 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; per a (i = 0; i <5; i ++) lcdwrite (lcdcmd, CMD); }
La funció donada s’utilitza per inicialitzar UART
void serialbegin (uint baudrate) { SPBRG = (18432000UL / (long) (64UL * baudrate)) - 1; // taxa de transmissió @ 18.432000Mhz Rellotge TXSTAbits.SYNC = 0; // Configuració del mode asíncron, és a dir, UART RCSTAbits.SPEN = 1; // Habilita el port sèrie TRISC7 = 1; // Segons es prescriu al full de dades TRISC6 = 0; // Segons es prescriu al full de dades RCSTAbits.CREN = 1; // Activa la recepció contínua TXSTAbits.TXEN = 1; // Activa la transmissió GIE = 1; // ENABLE interromp INTCONbits.PEIE = 1; // Habilita les interrupcions perifèriques. PIE1bits.RCIE = 1; // ACTIVA USART rebre interrupció PIE1bits.TXIE = 0; // desactiva la interrupció PIR1bits de USART TX.RCIF = 0; }
Les funcions donades s’utilitzen per transferir ordres al mòdul d’empremtes digitals i rebre dades des del mòdul d’empremtes digitals.
void serialwrite (char ch) { while (TXIF == 0); // Espereu fins que el registre del transmissor quedi buit TXIF = 0; // Esborra el senyal del transmissor TXREG = ch; // carregueu el caràcter que es transmetrà a transmissió 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; // esborra la bandera rx } } void serialFlush () { for (int i = 0; i
Després d'això, hem de fer una funció que prepari les dades que s'han de transmetre a l'empremta digital i descodificar les dades procedents del mòdul d'empremtes digitals.
int sendcmd2fp (char * pack, int len) { uint res = ERROR; serialFlush (); índex = 0; __delay_ms (100); per a (int i = 0; i
Ara, hi ha quatre funcions disponibles al codi per a quatre tasques diferents:
- Funció per introduir l'identificador d'empremta digital - unitat getId ()
- Funció per fer coincidir els dits: void matchFinger ()
- Funció per inscriure un nou dit: void enrolFinger ()
- Funció per esborrar un dit: elimina el dit Finger ()
Al final es dóna el codi complet amb les quatre funcions.
Ara, a la funció principal, inicialitzem GPIO, LCD, UART i comprovem si el mòdul d’empremta digital està connectat o no amb un microcontrolador. A continuació, mostra alguns missatges d'introducció per LCD. Finalment, mentre el bucle llegim totes les tecles o els botons per fer funcionar el projecte.
int main () { void (* FP) (); ADCON1 = 0b00000110; LEDdir = 0; SWPORTdir = 0xF0; SWPORT = 0x0F; serialbegin (57600); LCDPORTDIR = 0x00; TRISE = 0; lcdbegin (); lcdprint ("Empremta digital"); lcdwrite (192, CMD); lcdprint ("Interfacing"); __delay_ms (2000); lcdwrite (1, CMD); lcdprint ("Ús de PIC16F877A"); lcdwrite (192, CMD); lcdprint ("Circuit Digest"); __delay_ms (2000); índex = 0; while (sendcmd2fp (& passPack, sizeof (passPack))) { lcdwrite (1, CMD); lcdprint ("FP no trobat"); __delay_ms (2000); índex = 0; } lcdwrite (1, CMD); lcdprint ("FP trobat"); __delay_ms (1000); lcdinst (); mentre (1) { FP = coincidència
A continuació es mostra un codi PIC complet i un vídeo de treball. Consulteu també els nostres altres projectes mitjançant el mòdul del sensor d’impressió digital:
- Màquina de vot biomètric basada en empremta digital que utilitza Arduino
- Sistema de seguretat biomètric que utilitza Arduino i sensor d’empremta digital
- Sistema d'assistència biomètric basat en empremta digital que utilitza Arduino
- Interfície del sensor d’empremta digital amb Raspberry Pi
