- Erforderliche Komponenten
- Schaltplan und Erklärung
- Betrieb des Fingerabdrucksensors mit PIC-Mikrocontroller
- Programmiererklärung
Der Fingerabdrucksensor, den wir vor einigen Jahren in Science-Fiction-Filmen gesehen haben, ist mittlerweile weit verbreitet, um die Identität einer Person für verschiedene Zwecke zu überprüfen. In der heutigen Zeit können wir überall in unserem täglichen Leben Fingerabdruck-basierte Systeme sehen, z. B. für die Anwesenheit in Büros, die Überprüfung von Mitarbeitern in Banken, für Bargeldabhebungen oder Einzahlungen an Geldautomaten, für die Überprüfung der Identität in Regierungsbüros usw. Wir haben bereits eine Schnittstelle zu Arduino und Mit Raspberry Pi werden wir heute den Fingerabdrucksensor mit dem PIC-Mikrocontroller verbinden. Mit diesem PIC-Mikrocontroller PIC16f877A Fingerabdrucksystem können wir neue Fingerabdrücke im System registrieren und die bereits eingegebenen Fingerabdrücke löschen. Die vollständige Funktionsweise des Systems wurde im Video gezeigt am Ende des Artikels angegeben.
Erforderliche Komponenten
- PIC16f877A Mikrocontroller
- Fingerabdruckmodul
- Drucktasten oder Tastatur
- 16x2 LCD
- 10k Topf
- 18,432000 MHz Kristalloszillator
- Brotplatte oder Leiterplatte (bestellt bei JLCPCB)
- Überbrückungsdrähte
- LED (optional)
- Widerstand 150 Ohm -1 k Ohm (optional)
- 5V Stromversorgung
Schaltplan und Erklärung
In diesem PIC Microcontroller-Fingerabdrucksensor-Schnittstellenprojekt haben wir 4 Drucktasten verwendet: Diese Tasten werden für Multifunktionen verwendet. Schlüssel 1 wird verwendet, um den Fingerabdruck abzugleichen und die Fingerabdruck-ID zu erhöhen, während der Fingerabdruck im System gespeichert oder gelöscht wird. Schlüssel 2 wird zum Registrieren des neuen Fingerabdrucks und zum Verringern der Fingerabdruck-ID beim Speichern oder Löschen des Fingerabdrucks im System verwendet. Taste 3 wird zum Löschen des gespeicherten Fingers aus dem System verwendet und Taste 4 wird zum OK verwendet. Eine LED wird verwendet, um anzuzeigen, dass ein Fingerabdruck erkannt oder abgeglichen wurde. Hier haben wir ein Fingerabdruckmodul verwendet, das auf UART funktioniert. Hier haben wir dieses Fingerabdruckmodul mit dem PIC-Mikrocontroller mit einer Standard-Baudrate von 57600 verbunden.
Zunächst müssen wir also alle erforderlichen Verbindungen herstellen, wie im folgenden Schaltplan gezeigt. Die Verbindungen sind einfach. Wir haben gerade das Fingerabdruckmodul an den UART des PIC-Mikrocontrollers angeschlossen. Ein 16x2 LCD wird zur Anzeige aller Nachrichten verwendet. Ein 10k-Topf wird auch mit LCD verwendet, um den Kontrast desselben zu steuern. 16x2 LCD-Datenpins sind PORTA-Pins. Die LCD-Pins d4, d5, d6 und d7 sind mit Pin RA0, RA1, RA2 und RA3 des PIC-Mikrocontrollers verbunden. Vier Drucktasten (oder Tastatur) sind mit den PORTD-Pins RD0, RD1, RD2 und RD verbunden. Die LED ist auch an Pin RC3 von Port PORTC angeschlossen. Hier haben wir einen externen Quarzoszillator mit 18,432000 MHz verwendet, um den Mikrocontroller zu takten.
Betrieb des Fingerabdrucksensors mit PIC-Mikrocontroller
Die Bedienung dieses Projekts ist einfach. Laden Sie einfach die aus dem Quellcode generierte Hex-Datei mit Hilfe des PIC-Programmierers oder -Brenners (PIckit2 oder Pickit3 oder andere) in den PIC-Mikrocontroller hoch. Anschließend werden einige Intro-Meldungen über das LCD und dann vom Benutzer angezeigt wird aufgefordert, eine Auswahl für Operationen einzugeben. Um dem Fingerabdruck zu entsprechen, muss der Benutzer die Taste 1 drücken. Das LCD fragt dann nach dem Finger auf dem Fingerabdrucksensor. Jetzt können wir mit einem Finger über das Fingerabdruckmodul prüfen, ob unsere Fingerabdrücke bereits gespeichert sind oder nicht. Wenn Ihr Fingerabdruck gespeichert ist, zeigt das LCD die Nachricht mit der Speicher-ID der fingerabdruckähnlichen " ID: 2" an, andernfalls wird "Nicht gefunden" angezeigt .
Jetzt einen Finger einschreiben drucken, um die Bedürfnisse der Nutzer zu drücken einschreiben Taste oder die Taste 2 und folgen Sie den Anweisungen Meldungen auf dem LCD - Bildschirm.
Wenn der Benutzer einen Fingerabdruck löschen möchte , muss er die Löschtaste oder -taste 3 drücken. Danach fragt das LCD nach der ID des Fingerabdrucks, der gelöscht werden soll. Jetzt kann der Benutzer die ID des gespeicherten Fingerabdrucks auswählen und OK drücken, indem er den Inkrement-Druckknopf oder die Taste 1 (passender Druckknopf oder die Taste 1) und den Dekrement-Druckknopf oder die Taste 2 (Registrierungs-Druckknopf oder -Taste 2) zum Inkrementieren und Dekrementieren verwendet Schaltfläche, um diesen Fingerabdruck zu löschen. Weitere Informationen finden Sie in dem Video am Ende des Projekts.
FingerPrint-Schnittstelle Hinweis: Das Programm dieses Projekts ist für Anfänger etwas komplex. Aber sein einfacher Schnittstellencode, der durch Lesen des Datenblattes des r305-Fingerabdruckmoduls erstellt wurde. Alle Anweisungen zur Funktionsweise dieses Fingerabdruckmoduls finden Sie im Datenblatt.
Hier haben wir ein Rahmenformat verwendet, um mit dem Fingerabdruckmodul zu sprechen. Immer wenn wir einen Befehl oder einen Datenanforderungsrahmen an das Fingerabdruckmodul senden, antwortet er uns mit demselben Rahmenformat, das Daten oder Informationen enthält, die sich auf den angewendeten Befehl beziehen. Das gesamte Daten- und Befehlsrahmenformat wurde im Benutzerhandbuch oder im Datenblatt des R305-Fingerabdruckmoduls angegeben.
Programmiererklärung
Bei der Programmierung haben wir das folgende Rahmenformat verwendet.
Wir beginnen das Programm mit dem Setzen der Konfigurationsbits und dem Definieren von Makros und Pins für LCD, Tasten und LED, die Sie im vollständigen Code am Ende dieses Projekts überprüfen können. Wenn Sie PIC Microcontroller noch nicht kennen, beginnen Sie mit Erste Schritte mit PIC Microcontroller Project.
Dann haben wir eine Variable und ein Array deklariert und initialisiert und einen Frame erstellt, den wir in diesem Projekt verwenden müssen, um das Fingerabdruckmodul mit dem PIC-Mikrocontroller zu verbinden.
uchar buf; uchar buf1; flüchtiger uint Index = 0; volatile int flag = 0; uint msCount = 0; uint g_timerflag = 1; flüchtige uint count = 0; uchar Daten; uint id = 1; Aufzählung { 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};
Danach haben wir die LCD-Funktion zum Ansteuern des LCD eingerichtet.
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; für (i = 0; i <5; i ++) lcdwrite (lcdcmd, CMD); }}
Die angegebene Funktion wird zum Initialisieren von UART verwendet
void serialbegin (uint Baudrate) { SPBRG = (18432000UL / (lang) (64UL * Baudrate)) - 1; // Baudrate @ 18.432000Mhz Clock TXSTAbits.SYNC = 0; // Asynchronen Modus einstellen , dh UART RCSTAbits.SPEN = 1; // Aktiviert die serielle Schnittstelle TRISC7 = 1; // Wie im Datenblatt vorgeschrieben TRISC6 = 0; // Wie im Datenblatt vorgeschrieben RCSTAbits.CREN = 1; // Aktiviert den kontinuierlichen Empfang TXSTAbits.TXEN = 1; // Aktiviert die Übertragung GIE = 1; // ENABLE unterbricht INTCONbits.PEIE = 1; // Peripherie-Interrupts aktivieren. PIE1bits.RCIE = 1; // USART AKTIVIEREN Empfangsinterrupt PIE1bits.TXIE = 0; // USART TX Interrupt deaktivieren PIR1bits.RCIF = 0; }}
Die angegebenen Funktionen werden zum Übertragen von Befehlen an das Fingerabdruckmodul und zum Empfangen von Daten vom Fingerabdruckmodul verwendet.
void serialwrite (char ch) { while (TXIF == 0); // Warte bis das Senderregister leer wird TXIF = 0; // Senderflag löschen TXREG = ch; // lade das zu übertragende Zeichen in send 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; // RX-Flag löschen } } void serialFlush () { for (int i = 0; i
Danach müssen wir eine Funktion erstellen, die Daten vorbereitet, die an den Fingerabdruck übertragen werden sollen, und die vom Fingerabdruckmodul kommenden Daten dekodieren.
int sendcmd2fp (char * pack, int len) { uint res = ERROR; serialFlush (); Index = 0; __delay_ms (100); für (int i = 0; i
Jetzt stehen im Code vier Funktionen für vier verschiedene Aufgaben zur Verfügung:
- Funktion zur Eingabe der Fingerabdruck-ID - Einheit getId ()
- Funktion zum Abgleichen von finger - void matchFinger ()
- Funktion zum Registrieren eines neuen Fingers - void enrolFinger ()
- Funktion zum Löschen eines Fingers - void deleteFinger ()
Der vollständige Code mit allen vier Funktionen ist am Ende angegeben.
In der Hauptfunktion initialisieren wir nun GPIOs, LCD, UART und prüfen, ob das Fingerabdruckmodul mit einem Mikrocontroller verbunden ist oder nicht. Dann werden einige Intro-Meldungen über das LCD angezeigt. Schließlich lesen wir in der while- Schleife alle Tasten oder Drucktasten, um das Projekt zu bedienen.
int main () { void (* FP) (); ADCON1 = 0b00000110; LEDdir = 0; SWPORTdir = 0xF0; SWPORT = 0x0F; Serienbegin (57600); LCDPORTDIR = 0x00; TRISE = 0; lcdbegin (); lcdprint ("Fingerabdruck"); lcdwrite (192, CMD); lcdprint ("Interfacing"); __delay_ms (2000); lcdwrite (1, CMD); lcdprint ("Verwenden von PIC16F877A"); lcdwrite (192, CMD); lcdprint ("Circuit Digest"); __delay_ms (2000); Index = 0; while (sendcmd2fp (& passPack, sizeof (passPack))) { lcdwrite (1, CMD); lcdprint ("FP nicht gefunden"); __delay_ms (2000); Index = 0; }} lcdwrite (1, CMD); lcdprint ("FP gefunden"); __delay_ms (1000); lcdinst (); während (1) { FP = Übereinstimmung
Der vollständige PIC-Code und ein Arbeitsvideo sind unten angegeben. Überprüfen Sie auch unsere anderen Projekte mit dem Fingerabdrucksensormodul:
- Fingerabdruckbasierte biometrische Abstimmungsmaschine mit Arduino
- Biometrisches Sicherheitssystem mit Arduino und Fingerabdrucksensor
- Fingerabdruckbasiertes biometrisches Anwesenheitssystem mit Arduino
- Schnittstelle des Fingerabdrucksensors mit Raspberry Pi