- Vereiste componenten
- Schakelschema en uitleg
- Werking van vingerafdruksensor met PIC-microcontroller
- Uitleg over programmeren
Vingerafdruksensor, die we een paar jaar geleden in sciencefictionfilms zagen, is nu heel gewoon geworden om de identiteit van een persoon voor verschillende doeleinden te verifiëren. Tegenwoordig kunnen we op vingerafdrukken gebaseerde systemen overal in ons dagelijks leven zien, zoals voor aanwezigheid op kantoren, verificatie van werknemers bij banken, voor geldopname of stortingen in geldautomaten, voor identiteitsverificatie in overheidskantoren enz. We hebben het al gekoppeld aan Arduino en met Raspberry Pi gaan we vandaag de vingerafdruksensor koppelen aan de PIC-microcontroller. Met behulp van dit PIC-microcontroller PIC16f877A vingerafdruksysteem kunnen we nieuwe vingerafdrukken in het systeem registreren en de reeds ingevoerde vingerafdrukken verwijderen. De volledige werking van het systeem is te zien in de video gegeven aan het einde van artikel.
Vereiste componenten
- PIC16f877A Microcontroller
- Vingerafdrukmodule
- Drukknoppen of toetsenbord
- 16x2 LCD
- 10k pot
- Kristaloscillator van 18,432000 MHz
- Broodplank of printplaat (besteld bij JLCPCB)
- Doorverbindingsdraden
- LED (optioneel)
- Weerstand 150 ohm -1 k ohm (optioneel)
- 5v voeding
Schakelschema en uitleg
In dit PIC Microcontroller Finger Print sensor interfacing project hebben we 4 drukknoppen gebruikt: deze knoppen worden gebruikt voor multifunctionaliteit. Sleutel 1 wordt gebruikt om de vingerafdruk en de oplopende vingerafdruk-ID te matchen tijdens het opslaan of verwijderen van de vingerafdruk in het systeem. Sleutel 2 wordt gebruikt voor het registreren van de nieuwe vingerafdruk en voor het verlagen van de vingerafdruk-ID tijdens het opslaan of verwijderen van een vingerafdruk in het systeem. Toets 3 wordt gebruikt om de opgeslagen vinger uit het systeem te verwijderen en toets 4 wordt gebruikt voor OK. Een led wordt gebruikt om aan te geven dat een vingerafdruk is gedetecteerd of overeenkomt. Hier hebben we een vingerafdrukmodule gebruikt die werkt op UART. Dus hier hebben we deze vingerafdrukmodule gekoppeld aan de PIC-microcontroller met de standaard baudrate van 57600.
Dus allereerst moeten we alle vereiste verbindingen maken zoals weergegeven in het onderstaande schakelschema. Verbindingen zijn eenvoudig, we hebben zojuist de vingerafdrukmodule aangesloten op de UART van de PIC-microcontroller. Een 16x2 LCD wordt gebruikt voor het weergeven van alle berichten. Een 10k-pot wordt ook gebruikt met LCD om het contrast ervan te regelen. 16x2 LCD-datapinnen zijn verbonden PORTA-pinnen. De d4-, d5-, d6- en d7-pinnen van het LCD-scherm zijn verbonden met respectievelijk pin RA0, RA1, RA2 en RA3 van de PIC-microcontroller. Vier drukknoppen (of toetsenbord) zijn verbonden met PORTD's Pin RD0, RD1, RD2 en RD. LED is ook aangesloten op poort PORTC's pin RC3. Hier hebben we een 18.432000 MHz externe kristaloscillator gebruikt om de microcontroller te klokken.
Werking van vingerafdruksensor met PIC-microcontroller
De bediening van dit project is eenvoudig, upload gewoon een hex-bestand, gegenereerd vanuit de broncode, naar de PIC-microcontroller met behulp van de PIC-programmeur of -brander (PIckit2 of Pickit3 of anderen) en dan zie je enkele introberichten op het LCD-scherm en vervolgens de gebruiker wordt gevraagd om een keuze voor bewerkingen in te voeren. Om de vingerafdruk te matchen, moet de gebruiker op toets 1 drukken en vervolgens zal het LCD-scherm vragen om vinger op vingerafdruksensor te plaatsen. Door nu een vinger over de vingerafdrukmodule te plaatsen, kunnen we controleren of onze vingerafdrukken al zijn opgeslagen of niet. Als uw vingerafdruk is opgeslagen, toont het LCD-scherm het bericht met de opslag-ID van de vingerafdrukachtige ' ID: 2', anders wordt 'Niet gevonden' weergegeven .
Nu in te schrijven een vinger afdrukken, de behoeften van de gebruiker te drukken inschrijven knop of toets 2 en volg de instructies berichten op het LCD-scherm.
Als de gebruiker vingerafdrukken wil verwijderen, moet de gebruiker op de verwijderknop of toets 3 drukken. Daarna zal het LCD-scherm vragen om de ID van de vingerafdruk die moet worden verwijderd. Door nu de ophoogdrukknop of toets 1 (matchdrukknop of toets 1) en verlagingsdrukknop of toets 2 (enroll-drukknop of toets 2) te gebruiken voor verhoging en verlaging, kan de gebruiker de ID van de opgeslagen vingerafdruk selecteren en op OK drukken knop om die vingerafdruk te verwijderen. Bekijk voor meer begrip de video die aan het einde van het project wordt gegeven.
Vingerafdruk-interface Opmerking: het programma van dit project is een beetje ingewikkeld voor een beginner. Maar de eenvoudige interfacecode is gemaakt door het lezen van het gegevensblad van de r305-vingerafdrukmodule. Alle instructies voor het functioneren van deze vingerafdrukmodule worden gegeven in de datasheet.
Hier hebben we een frame-indeling gebruikt om met een vingerafdrukmodule te praten. Telkens wanneer we een commando of gegevensverzoekframe naar de vingerafdrukmodule sturen, antwoordt het ons met hetzelfde frameformaat met gegevens of informatie met betrekking tot de toegepaste opdracht. Alle gegevens en het formaat van het opdrachtframe zijn vermeld in de gebruikershandleiding of in het gegevensblad van de R305-vingerafdrukmodule.
Uitleg over programmeren
Bij het programmeren hebben we het onderstaande frame-formaat gebruikt.
We beginnen het programma met het instellen van de configuratiebits en het definiëren van macro's en pinnen voor LCD, knoppen en LED, die u kunt controleren in de volledige code die aan het einde van dit project wordt gegeven. Als PIC Microcontroller nieuw voor je is, begin dan met Aan de slag met PIC Microcontroller Project.
Vervolgens hebben we een variabele en array gedeclareerd en geïnitialiseerd, en een frame gemaakt dat we in dit project moeten gebruiken om de vingerafdrukmodule te koppelen aan de PIC-microcontroller.
uchar buf; uchar buf1; vluchtige uint-index = 0; vluchtige int vlag = 0; uint msCount = 0; uint g_timerflag = 1; vluchtige uint-telling = 0; uchar gegevens; 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};
Daarna hebben we de LCD-functie gemaakt om LCD aan te sturen.
leegte 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; voor (i = 0; i <5; i ++) lcdwrite (lcdcmd, CMD); }
De gegeven functie wordt gebruikt voor het initialiseren van UART
void serialbegin (uint baudrate) { SPBRG = (18432000UL / (long) (64UL * baudrate)) - 1; // baudrate @ 18.432000Mhz Klok TXSTAbits.SYNC = 0; // Asynchrone modus instellen, dwz UART RCSTAbits.SPEN = 1; // Schakelt seriële poort TRISC7 = 1 in; // Zoals voorgeschreven in gegevensblad TRISC6 = 0; // Zoals voorgeschreven in gegevensblad RCSTAbits.CREN = 1; // Maakt continue ontvangst mogelijk TXSTAbits.TXEN = 1; // Schakelt transmissie GIE = 1 in; // ENABLE onderbreekt INTCONbits.PEIE = 1; // ENable randapparatuur interrupts. PIE1bits.RCIE = 1; // INSCHAKELEN USART ontvangen interrupt PIE1bits.TXIE = 0; // schakel USART TX interrupt PIR1bits.RCIF = 0 uit; }
Gegeven functies worden gebruikt voor het overbrengen van opdrachten naar de vingerafdrukmodule en het ontvangen van gegevens van de vingerafdrukmodule.
void serialwrite (char ch) { while (TXIF == 0); // Wacht tot het zenderregister leeg is TXIF = 0; // Wis zendervlag TXREG = ch; // laad de te verzenden char in 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) vlag = 1; RCIF = 0; // clear rx flag } } void serialFlush () { voor (int i = 0; i
Hierna moeten we een functie maken die gegevens voorbereidt die naar de vingerafdruk moeten worden verzonden en de gegevens die uit de vingerafdrukmodule komen, decoderen.
int sendcmd2fp (char * pack, int len) { uint res = ERROR; serialFlush (); index = 0; __delay_ms (100); voor (int i = 0; i
Nu zijn er vier functies beschikbaar in de code voor vier verschillende taken:
- Functie voor het invoeren van de vingerafdruk-ID - unit getId ()
- Functie voor matching finger - void matchFinger ()
- Functie voor het registreren van een nieuwe vinger - void enrolFinger ()
- Functie voor het verwijderen van een vinger - void deleteFinger ()
De volledige code met alle vier de functies wordt aan het einde gegeven.
Nu in de hoofdfunctie initialiseren we GPIO's, LCD, UART en controleren of de vingerafdrukmodule is verbonden met een microcontroller of niet. Vervolgens toont het enkele introberichten via LCD. Ten slotte lezen we in de while- lus alle toetsen of drukknoppen om het project te bedienen.
int main () { void (* FP) (); ADCON1 = 0b00000110; LEDdir = 0; SWPORTdir = 0xF0; SWPORT = 0x0F; serialbegin (57600); LCDPORTDIR = 0x00; TRISE = 0; lcdbegin (); lcdprint ("vingerafdruk"); lcdwrite (192, CMD); lcdprint ("Interfacing"); __delay_ms (2000); lcdwrite (1, CMD); lcdprint ("Met behulp van PIC16F877A"); lcdwrite (192, CMD); lcdprint ("Circuit Digest"); __delay_ms (2000); index = 0; while (sendcmd2fp (& passPack, sizeof (passPack))) { lcdwrite (1, CMD); lcdprint ("FP niet gevonden"); __delay_ms (2000); index = 0; } lcdwrite (1, CMD); lcdprint ("FP Found"); __delay_ms (1000); lcdinst (); while (1) { FP = match
De volledige PIC-code en een werkvideo worden hieronder gegeven. Bekijk ook onze andere projecten met Finger Print Sensor Module:
- Op vingerafdruk gebaseerde biometrische stemmachine met Arduino
- Biometrisch beveiligingssysteem met Arduino en vingerafdruksensor
- Op vingerafdruk gebaseerd biometrisch aanwezigheidssysteem met Arduino
- Vingerafdruksensor-interface met Raspberry Pi