Raspberry Pi Zero W Fingerabdrucksensor

  • Lesedauer:7 min Lesezeit

Ä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 ZeroFingerabdruck Sensor
Pin 6 / GNDGND
Pin 8 / GPIO14RX
Pin 10 / GPIO15TX
Pin 1 / 3V33V3

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.

Verkabelung Pi Zero und Fingerabdrucksensor
Verkabelung Pi Zero & Fingerabdruck Sensor

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.

Fehlermeldung der Fingerabdrucksensors
Fehlermeldung beim Versuch einen Fingerabdruck zu registrieren

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.

Fingerabdruck Sensor DY-50
Neuer Fingerabdruck Sensor DY-50

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.

Ausgaben vom Fingerabdruck Sensor beim enroll Beispiel
Ausgaben vom Fingerabdruck Sensor beim enroll Beispiel

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.

Ausgabe des search Beispiels des Fingerabdruck Sensors
Ausgabe des search Beispiels des Fingerabdruck Sensors

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.

Dieser Beitrag hat einen Kommentar

Schreibe einen Kommentar