Ähnlich wie beim RFID-Modul gehen wir auch beim Fingerabdrucksensor vor. Zuerst gucken wir und die Verkabelung zwischen Raspberry Pi Zero W & Fingerabdrucksensor an. Der Fingerabdrucksensor kommuniziert über UART mit dem Pi, es werden also nur zwei Signalleitungen benötigt (Rx & Tx). Zusätzlich benötigt auch dieser Sensor eine 3,3 V Spannungsversorgung, die er auch vom Pi bekommt.
Pi Zero | Fingerabdruck Sensor |
---|---|
Pin 6 / GND | GND |
Pin 8 / GPIO14 | RX |
Pin 10 / GPIO15 | TX |
Pin 1 / 3V3 | 3V3 |
An meinem Sensor war ein Kabel, das auf beiden Seiten den gleichen Stecker hatte. Ich habe die Kabel in der Mitte durchgeschnitten und Pfostenstecker daran gecrimpt, sodass ich sie in eine entsprechende Leiste stecken kann.
Der dargestellte Sensor entspricht nicht dem, den ich verwende, er illustriert dennoch alle relevanten Anschlüsse.
Software
Als erstes müssen wir die UART Schnittstelle, über die der Raspberry Pi Zero W und der Fingerabdrucksensor kommunizieren, aktivieren. Diese ist standardmäßig deaktiviert, lässt sich aber leicht aktivieren.
UART aktivieren
Um die Schnittstelle zu aktivieren müssen wir eine Zeile in der boot config Datei hinzufügen. Dazu öffnen wir die config.txt mit einem beliebigen Text Editor, oder in VSCode, wenn ihr das gesamte Dateisystem eingebunden habt. Ich nutze nano dafür:
sudo nano /boot/config.txt
In der Datei gehe ich zum Ende und füge folgende Zeilen hinzu:
# Enable UART
enable_uart=1
Danach noch einen neustart mit sudo reboot
und es kann weiter gehen.
Bibliothek installieren
Auch bei diesem Sensor werden wir zuerst die Funktion mit einfachen Beispielen testen und alles notwendige installieren. Für den Raspberry Pi Zero Fingerabdrucksensor gibt es wieder verschiedene Bibliotheken und Möglichkeiten diese zu installieren. Die einfachste Variante ist die Installation über pip3.
sudo pip3 install pyfingerprint
Jetzt können wir die Bibliothek nutzen und die Beispiele ausprobieren.
Beispiele ausprobieren
Der Ersteller der Bibliothek hat einige Beispiele bereitgestellt, die wir nutzen, um die Funktion des Sensors zu prüfen. Den Beispiel Code nehme ich aus dem git Repository des Erstellers. Damit er funktioniert muss aber noch was getan werden, denn der Code geht davon aus, dass ein USB-TTL-Converter genutzt wird. Da wir den Sensor aber direkt an die Serielle Schnittstelle an den GPIOs angeschlossen haben müssen wir eine andere Schnittstelle nutzen.
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ PyFingerprint Copyright (C) 2015 Bastian Raschke <bastian.raschke@posteo.de> All rights reserved. """ import time from pyfingerprint.pyfingerprint import PyFingerprint from pyfingerprint.pyfingerprint import FINGERPRINT_CHARBUFFER1 from pyfingerprint.pyfingerprint import FINGERPRINT_CHARBUFFER2 ## Enrolls new finger ## ## Tries to initialize the sensor try: f = PyFingerprint('/dev/serial0', 57600, 0xFFFFFFFF, 0x00000000) if ( f.verifyPassword() == False ): raise ValueError('The given fingerprint sensor password is wrong!') except Exception as e: print('The fingerprint sensor could not be initialized!') print('Exception message: ' + str(e)) exit(1) ## Gets some sensor information print('Currently used templates: ' + str(f.getTemplateCount()) +'/'+ str(f.getStorageCapacity())) ## Tries to enroll new finger try: print('Waiting for finger...') ## Wait that finger is read while ( f.readImage() == False ): pass ## Converts read image to characteristics and stores it in charbuffer 1 f.convertImage(FINGERPRINT_CHARBUFFER1) ## Checks if finger is already enrolled result = f.searchTemplate() positionNumber = result[0] if ( positionNumber >= 0 ): print('Template already exists at position #' + str(positionNumber)) exit(0) print('Remove finger...') time.sleep(2) print('Waiting for same finger again...') ## Wait that finger is read again while ( f.readImage() == False ): pass ## Converts read image to characteristics and stores it in charbuffer 2 f.convertImage(FINGERPRINT_CHARBUFFER2) ## Compares the charbuffers if ( f.compareCharacteristics() == 0 ): raise Exception('Fingers do not match') ## Creates a template f.createTemplate() ## Saves template at new position number positionNumber = f.storeTemplate() print('Finger enrolled successfully!') print('New template position #' + str(positionNumber)) except Exception as e: print('Operation failed!') print('Exception message: ' + str(e)) exit(1)
Die wichtige Änderung ist, dass in Zeile 21 das „/dev/ttyUSB0“ durch „/dev/serial0“ ersetzt wird. „/dev/serial0“ ist ein alias und zeigt auf die UART Schnittstelle, die als primary gesetzt ist. Beim Pi Zero W ist mini UART („/dev/ttyS0“) als primary gesetzt, PL011 ist secondary. Damit ist es wie beim Pi3 aufwärts.
Den code kopiere ich in ein File, dass ich enroll.py nenne in einen neuen Ordner fingersprint_test im home Verzeichnis des Pi. Zum ausprobieren navigieren wir in den Ordner und starten das Skript mit:
python3 enroll.py
Achtung: Im Rest des Abschnitts habe ich mit einem Defekten Sensor gearbeitet. Wenn euch die Ergebnisse davon nicht interessieren, könnt ihr direkt weiter zum Abschnitt mit neuem Sensor.
Das Ergebnis ist etwas ernüchternd. Im Bild sehen wir, dass es eine Fehlermeldung gibt.
Es sieht so aus, als würde die UART Verbindung nicht richtig funktionieren. Ich erinnere mich, dass ich genau diesen Sensor schon mal verwendet habe und er vom einen Tag auf den anderen nicht mehr funktionierte, sondern eine Fehlermeldung zurück gab. Daraufhin habe ich einen neuen bestellt, den aber nie ausprobiert. Gute Zeit den neuen zu probieren und zu gucken, ob der alte tatsächlich einen weg hat.
Weitere Versuche
Der neue Sensor ist ein etwas anderes Modell mit 7 Pin Kabel. Modellbezeichnung kann ich nichts zu sagen, steht nichts drauf. Aus der Artikelbeschreibung bei ebay wird man auch nicht schlau, aber immerhin ist ein Bild mit der Pinbelegung zu finden. Sehr gut, denn der Stecker ist nicht beschriftet. Also schnell einen Stecker für den neuen Sensor gelötet und ausprobiert. Der neue Sensor macht leider gar keinen Mucks. Weder über 3,3 V, noch über 5 V, auch an verschiedenen Pi’s. Das Ding scheint noch wesentlich mehr Probleme zu haben, als der andere. Na gut, also den alten Sensor wieder dran und auf Ursachenforschung gehen.
Grund könnte die BaudRate sein. Ist aber eher unwahrscheinlich, da sich der Sensor initialisieren lässt, nur beim enroll Probleme mit der Antwort hat. Andere Baud Raten haben nur den Effekt, dass es schon bei der Initialisierung scheitert.
Das letzte was mir noch einfällt ist, dass der Sensor über mini UART angeschlossen ist und mini UART instabiler ist, als der „echte“ UART Port. Daher versuchen wir im nächsten Schritt mal die UART Ports umzumappen. Wie das geht habe ich in diesem Artikel erklärt.
Leider funktioniert der Sensor dennoch nicht. Ich habe noch verschiedene Pi’s mit verschiedenen OS-Versionen, sowie Arduinos ausprobiert. Alles ohne Erfolg. Das Problem scheint ein 8-Bit Shift in der Antwort zu sein. Bevor ich weitere Tage investiere, um das zu untersuchen, bestelle ich einen neuen Sensor. Wenn der neue Sensor das gleiche Verhalten aufweist, wird weiter untersucht, andernfalls der alte Sensor als defekt deklariert.
Weiter mit neuem Fingerbadruck Sensor
Der neue Sensor ist eingetroffen. Der hier bestellte Fingerabdruck Sensor hat es nach 10 Tagen zu mir geschafft, nicht schlecht. Sieht genau so aus, wie der alte Sensor.
Da ich für den alten Sensor schon ein Kabel habe, schließe ich das direkt an den Sensor und an den Pi Zero W an. Ich lasse das gleich enroll Skript laufen und schaue mal, was passiert.
Na also! Der alter Sensor hatte also einen weg und die Fehlersuche war nicht zielführend. Jetzt geht aber alles. Wie wir sehen bittet der Beispielcode mich den Finger aufzulegen, wieder weg zu nehmen, und noch mal aufzulegen. Danach ist der Abdruck eingespeichert und kann weiter verwendet werden.
Das nächste wichtige Beispiel ist das search
Beispiel. Auch das probiere ich direkt nach dem enroll
mal aus.
Funktioniert auch und erkennt meinen gerade gespeicherten Finger sogar wieder. Damit ist für den ersten Test alles getan. Der Fingerabdruck Sensor DY-50 und der Raspberry Pi Zero W können miteinander sprechen. Das kann Projekt kann also weiter gehen.
Pingback: Cloud Kaffeekasse - Eine digitale Kaffekasse/Kaffeeliste • devdrik.