- Zahtevane komponente
- Shema vezja in razlaga
- Delovanje senzorja za prstne odtise z mikrokrmilnikom PIC
- Pojasnilo programiranja
Senzor za prstni odtis, ki smo ga pred nekaj leti gledali v sci-fi filmih, je zdaj zelo pogost za preverjanje identitete osebe za različne namene. V današnjem času lahko sisteme, ki temeljijo na prstnih odtisih, vidimo povsod v vsakdanjem življenju, na primer za obiskovanje pisarn, preverjanje zaposlenih v bankah, dvig gotovine ali polog na bankomatih, preverjanje identitete v vladnih uradih itd. Z Arduinom in z Raspberry Pi bomo danes povezali senzor za tiskanje prstov z mikrokrmilnikom PIC. Z uporabo tega mikrokrmilnika PIC PIC16f877A Finger Print System lahko v sistem vpišemo nove prstne odtise in izbrišemo že podane prstne odtise. Popolno delovanje sistema je prikazano v videu podana na koncu članka.
Zahtevane komponente
- PIC16f877A Mikrokrmilnik
- Modul prstnih odtisov
- Tipke ali tipkovnica
- 16x2 LCD
- 10k lonec
- 18,432000 MHz kristalni oscilator
- Krušna plošča ali PCB (naročeno pri JLCPCB)
- Jumper žice
- LED (neobvezno)
- Upor 150 ohm -1 k ohm (neobvezno)
- 5v napajalnik
Shema vezja in razlaga
V tem projektu povezovanja senzorjev s prstnim odtisom PIC smo uporabili 4 tipke: ti gumbi se uporabljajo za večnamensko delovanje. Tipka 1 se uporablja za ujemanje prstnega odtisa in povečanje ID-ja prstnega odtisa med shranjevanjem ali brisanjem prstnega odtisa v sistemu. Tipka 2 se uporablja za vpis novega prstnega odtisa in za zmanjšanje ID prstnega odtisa med shranjevanjem ali brisanjem prstnih odtisov v sistemu. Tipka 3 se uporablja za brisanje shranjenega prsta iz sistema, tipka 4 pa za v redu. LED se uporablja za označevanje, da je zaznan ali usklajen prstni odtis. Tu smo uporabili modul za prstne odtise, ki deluje na UART. Tu smo torej ta modul prstnih odtisov povezali z mikrokrmilnikom PIC pri privzeti hitrosti prenosa 57600.
Najprej moramo najprej vzpostaviti vse zahtevane povezave, kot je prikazano na spodnjem vezju. Povezave so preproste, pravkar smo priključili modul prstnih odtisov na UART mikrokrmilnika PIC. Za prikaz vseh sporočil se uporablja LCD 16x2. 10k lonec se uporablja tudi z LCD-jem za nadzor kontrasta istega. Podatkovni zatiči LCD 16x2 so povezani zatiči PORTA. Zatiči d4, d5, d6 in d7 LCD-ja so povezani z Pin RA0, RA1, RA2 in RA3 mikrokrmilnika PIC. Štirje gumbi (ali tipkovnica) so priključeni na PORTD-jeve pin RD0, RD1, RD2 in RD. LED je priključen tudi na pin PORTC-jev pin RC3. Tu smo za urjenje mikrokrmilnika uporabili zunanji kristalni oscilator z 18,432000 MHz.
Delovanje senzorja za prstne odtise z mikrokrmilnikom PIC
Delo s tem projektom je preprosto, le naloži šestnajstiško datoteko, ustvarjeno iz izvorne kode, v mikrokrmilnik PIC s pomočjo programerja ali gorilnika PIC (PIckit2 ali Pickit3 ali drugi), nato pa boste na LCD-ju videli nekaj uvodnih sporočil in nato uporabnik boste morali vnesti izbiro za operacije. Če se želite ujemati s prstnim odtisom, morate pritisniti tipko 1, nato bo LCD vprašal za postavitev prsta na senzor za tiskanje prstov. Zdaj, ko položimo prst na modul prstnih odtisov, lahko preverimo, ali so naši prstni odtisi že shranjeni ali ne. Če je vaš prstni odtis shranjen, bo na LCD-prikazovalniku prikazano sporočilo z ID-jem za shranjevanje prstnega odtisa " ID: 2", sicer bo prikazano "Not Found" .
Zdaj za vpis prst Print, se potrebe uporabnikov na gumb pritisnite zazna ali ključnega 2 in sledite navodilom sporočila na zaslonu LCD.
Če želi uporabnik izbrisati katerega koli prstnega odtisa, mora uporabnik pritisniti gumb za brisanje ali tipko 3. Nato bo LCD zahteval ID prstnega odtisa, ki ga želite izbrisati. Zdaj lahko z uporabo tipke za prirastek ali tipke 1 (tipka za ujemanje ali tipka 1) in tipke za zmanjšanje ali tipke 2 (tipka za vpis ali tipka 2) za povečanje in zmanjšanje izbere ID shranjenega prstnega odtisa in pritisne OK, da izbrišete ta prstni odtis. Za boljše razumevanje si oglejte videoposnetek na koncu projekta.
Vmesnik FingerPrint Opomba: Program tega projekta je za začetnike nekoliko zapleten. Toda njegova preprosta vmesniška koda, narejena z uporabo branja podatkovnega lista modula prstnih odtisov r305 Vsa navodila za delovanje tega modula prstnih odtisov so podana v obrazcu.
Tukaj smo za pogovor z modulom prstnih odtisov uporabili format okvirja. Kadarkoli pošljemo ukaz ali okvir zahteve za podatke modulu prstnih odtisov, nam odgovori z enako obliko okvira, ki vsebuje podatke ali informacije, povezane z uporabljenim ukazom. Vsa oblika zapisa podatkov in ukaznega okvira je podana v uporabniškem priročniku ali v obrazcu modula prstnih odtisov R305.
Pojasnilo programiranja
Pri programiranju smo uporabili spodnjo obliko okvira.
Program začnemo z nastavitvijo konfiguracijskih bitov in definiranjem makrov in nožic za LCD, gumbe in LED, kar lahko preverite v celotni kodi, navedeni na koncu tega projekta. Če ste nov v PIC Microcontrollerju, začnite s tem, kako začeti s PIC Microcontroller Project.
Nato smo deklarirali in inicializirali neko spremenljivko in matriko ter izdelali okvir, ki ga moramo uporabiti v tem projektu za povezovanje modula prstnih odtisov z mikrokrmilnikom PIC.
uchar buf; uchar buf1; spremenljiv indeks uint = 0; hlapna zastavica int = 0; uint msCount = 0; uint g_timerflag = 1; hlapno število uintov = 0; podatki 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};
Po njem smo naredili funkcijo LCD za pogon LCD-ja.
void lcdwrite (uchar ch, uchar rw) { LCDPORT = ch >> 4 & 0x0F; RS = rw; EN = 1; __zakasnitev_ms (5); EN = 0; LCDPORT = ch & 0x0F; EN = 1; __zakasnitev_ms (5); EN = 0; } Lcdprint (char * str) { while (* str) { lcdwrite (* str ++, DATA); // __ zakasnitev_ms (20); } } lcdbegin () { uchar lcdcmd = {0x02,0x28,0x0E, 0x06,0x01}; uint i = 0; za (i = 0; i <5; i ++) lcdwrite (lcdcmd, CMD); }
Dana funkcija se uporablja za inicializacijo UART
void serialbegin (uint baudrate) { SPBRG = (18432000UL / (long) (64UL * baudrate)) - 1; // hitrost prenosa @ 18.432000Mhz Clock TXSTAbits.SYNC = 0; // Nastavitev asinhronega načina, tj. UART RCSTAbits.SPEN = 1; // Omogoča serijska vrata TRISC7 = 1; // Kot je predpisano v obrazcu TRISC6 = 0; // Kot je predpisano v podatkovnem listu RCSTAbits.CREN = 1; // Omogoča neprekinjen sprejem TXSTAbits.TXEN = 1; // Omogoča prenos GIE = 1; // Omogoči prekinitve INTCONbits.PEIE = 1; // Enable periferne prekinitve. PIE1bits.RCIE = 1; // Omogoči USART prejemanje prekinitve PIE1bits.TXIE = 0; // onemogočimo prekinitev USART TX PIR1bits.RCIF = 0; }
Dane funkcije se uporabljajo za prenos ukazov v modul prstnih odtisov in sprejemanje podatkov iz modula prstnih odtisov.
void serialwrite (char ch) { while (TXIF == 0); // Počakajte, da se oddajniški register izprazni TXIF = 0; // Počisti zastavico oddajnika TXREG = ch; // naloži char, ki se prenaša, v prenos 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 (indeks> 0) zastava = 1; RCIF = 0; // počisti rx zastavico } } void serialFlush () { for (int i = 0; i
Po njem moramo narediti funkcijo, ki pripravi podatke, ki jih je treba prenesti na prstni odtis, in dekodiraj podatke, ki prihajajo iz modula prstnih odtisov.
int sendcmd2fp (char * pack, int len) { uint res = NAPAKA; serialFlush (); indeks = 0; __zakasnitev_ms (100); za (int i = 0; i
Zdaj so v kodi na voljo štiri funkcije za štiri različne naloge:
- Funkcija za vnos ID prstnega odtisa - enota getId ()
- Funkcija za ujemanje prsta - void matchFinger ()
- Funkcija za vpis novega prsta - void enrolFinger ()
- Funkcija za brisanje prsta - void deleteFinger ()
Na koncu je podana celotna koda z vsemi štirimi funkcijami.
Zdaj v glavni funkciji inicializiramo GPIO, LCD, UART in preverimo, ali je modul prstnih odtisov povezan z mikrokrmilnikom ali ne. Nato na LCD-prikazovalniku prikaže nekaj uvodnih sporočil. Na koncu v zanki while preberemo vse tipke ali gumbe za upravljanje projekta.
int main () { void (* FP) (); ADCON1 = 0b00000110; LEDdir = 0; SWPORTdir = 0xF0; SWPORT = 0x0F; serijski začetek (57600); LCDPORTDIR = 0x00; TRISE = 0; lcdbegin (); lcdprint ("Prstni odtis"); lcdwrite (192, CMD); lcdprint ("Vmesnik"); __delay_ms (2000); lcdwrite (1, CMD); lcdprint ("Uporaba PIC16F877A"); lcdwrite (192, CMD); lcdprint ("Circuit Digest"); __delay_ms (2000); indeks = 0; while (sendcmd2fp (& passPack, sizeof (passPack))) { lcdwrite (1, CMD); lcdprint ("FP ni najden"); __delay_ms (2000); indeks = 0; } lcdwrite (1, CMD); lcdprint ("FP najden"); __zakasnitev_ms (1000); lcdinst (); while (1) { FP = ujemanje
Spodaj je navedena celotna koda PIC in delovni video. Preverite tudi druge naše projekte z modulom senzorja za tiskanje prstov:
- Biometrični glasovalni stroj na osnovi prstnih odtisov z uporabo Arduina
- Biometrični varnostni sistem z uporabo Arduina in senzorja za prstne odtise
- Biometrični sistem za spremljanje na osnovi prstnih odtisov z uporabo Arduina
- Vmesnik senzorja za prstne odtise z Raspberry Pi