Bastian Raschke
Nils Tegetmeyer

Sicherheitskritisch

A blog about IT security and electronics

Fingerprint-Sensor für den Raspberry Pi und Debian Linux (Update 8)

Written by Bastian Raschke.
Published 2014-03-24 in the category Raspberry Pi.

This article is available in more than one language.
Available translations: en

Durch ein praxisnahes Hochschul-Projekt waren mein Team und ich gefordert eine günstige Lösung zu gestalten, einen Fingerabdruck-Sensor (engl. fingerprint sensor) nativ am Raspberry Pi nutzen zu können (und das in einem größerem Projekt zu integrieren). Nach einiger Recherche sind wir auf einen preisgünstigen Sensor gestoßen, der eher im Arduino-Umfeld bekannt war.

Ein kleines Demonstrationsvideo findet ihr nachfolgend:

Embedded Video - Click to view
► Eingebettetes Video (Klicken zum abspielen)

Adafruit, der Schöpfer dieses Videos, bietet neben des eigentlichen Sensors auch eine begrenzte Dokumentationssammlung und einen Arduino-Sketch auf Github an, welcher die Grundfunktionen des Gerätes demonstrieren soll und auch in dem Video genutzt wird. Wir wollten jedoch eine Möglichkeit schaffen, den Sensor sehr einfach auf dem Raspberry Pi und später generell auf Linux nutzbar zu machen. Da der bereitgestellte Arduino-Sketch in der Form nicht ohne weiteres auf dem Raspberry Pi nutzbar ist und zudem nur einen Bruchteil der Möglichkeiten verwendet, die die Hardware bietet, musste etwas Neues her.

Ich habe in unserem Team die Aufgabe übernommen, den Treiber bzw. die Bibliothek zu schreiben, damit wir den Sensor bequem nutzen konnten. Ich habe mich für die Sprache Python entschieden, da diese besonders geeignet für den Raspberry Pi ist und auch generell nahezu auf jeder Standard-Linux-Distribution verfügbar ist. Nachdem das geklärt war, habe ich mich an die Analyse des in C++ verfassten Arduino-Sketches gemacht. Eine große Hilfe war mir die Dokumentation des Herstellers ZhianTec, welche in der neusten Version 2.0 bedauerlicherweise nur in Chinesisch vorliegt. Eine Google-Translate-Version gab es jedoch, und wenn man sich erst einmal an die hoffnungslos massakrierte Formatierung und das ungenau übersetzte Englisch gewöhnt hat, konnte man damit arbeiten.

Übersicht Fingerprint-Sensor

Fingerprint-Sensor Bild 1

Hersteller: ZhianTec
Modell: ZFM-20 (auch bekannt als "Arduino fingerprint sensor")
Kommunikation via: UART
Protokoll: einfaches, vom Hersteller festgelegtes Anfrage-Antwort-Paket-Protokoll
Preis: 35-75€ je nach Bezugsquelle

Verbindung des Fingerprint-Sensors

Da der Raspberry Pi direkt 2 GPIO-Pins für UART bereitstellt, kann der Sensor direkt mit dem Raspberry Pi verbunden werden (der logische High-Pegel des Sensors ist mit 3,3V laut Datenblatt nicht zu hoch für den Mini-Computer). Alternativ kann man zu einer anderen, sehr bequemen Lösung greifen: Einen USB-TTL-Konverter (z.B. mit dem CP2102-Chip), welchen es für wenige Euro zu kaufen gibt. An diesen wird der Sensor direkt angeschlossen und verbindet ihn ohne weitere Sorgen mit dem Endgerät (z.B. auch mit einem normalen Computer).

USB-TTL-Konverter

Die Verbindung der beiden Geräte wird wie folgt vorgenommen:

Verbindung Fingerprint-Sensor zu Konverter

Die Stromversorgung des Sensors (rotes Kabel) wird an den 5V-Pin des Konverters angeschlossen, die Masse (schwarzes Kabel) an den Ground/GND-Pin. Die erste Transceiver-Datenleitung (grünes Kabel) des Sensors wird mit dem TX-Pin des Konverters verbunden und die Receiver-Datenleitung (weißes Kabel) des Sensors an den RX-Pin.

Hinweis: Bei manchen USB-TTL-Konvertern (gerade die USB-Kabel-Versionen; siehe unten im Anhang) werden die beiden Datenleitungen nicht wie gerade beschrieben verbunden, sondern genau anders herum. Generell muss die Transceiver-Datenleitung des ersten Gerätes ja verständlicherweise an die Receiver-Datenleitung des zweiten Gerätes angeschlossen werden und die Receiver-Datenleitung des ersten Gerätes an die Transceiver-Datenleitung des zweiten Gerätes. Da manche Konverterhersteller es dem Nutzer aber "einfach" machen wollen, werden die Pins "falsch" beschriftet, was zu einiger Verwirrung führen kann. Also wenn keine Kommunikation erfolgt, einfach mal die Kabel tauschen (dabei kann meines Wissens kein Schaden entstehen).

Installation

Nun müssen ein paar Vorbereitungen auf der Softwareseite vorgenommen werden. Zuallererst wird, falls noch nicht geschehen, das PM Codeworks-Repository hinzugefügt:

~$ echo "deb http://apt.pm-codeworks.de wheezy main" | sudo tee -a /etc/apt/sources.list

Dann wird der dazugehörige GPG-Schlüssel installiert, der sicherstellt, dass die Pakete wie gewünscht ankommen und nicht etwa von einer der diversen Zwischenstationen im Internet manipuliert wurden:

~$ wget -O - http://apt.pm-codeworks.de/pm-codeworks.de.gpg | sudo apt-key add -

Nach einem Update der lokalen Paketquellen, könnt ihr das Paket installieren:

~$ sudo apt-get update
~$ sudo apt-get install python-fingerprint

Wenn ihr den Sensor via Konverter mit eurem Raspberry Pi oder Computer verbindet, sollte das Gerät unter dem Pfad "/dev/ttyUSB0" verfügbar sein. Damit jedoch auch der normale Benutzer (hier: "pi") ohne Root-Rechte diese Schnittstelle verwenden darf, muss dieser der Gruppe "dialout" angehören. Dies ist mit folgendem Befehl möglich:

~$ sudo usermod -a -G dialout pi

Jetzt muss das System einmal neugestartet werden, und dann kann es losgehen.

Der erste Test

Und nun kann der erste Test auch schon beginnen: Schließt den Fingerprint-Sensor via Konverter an euren Pi oder Computer an und wechselt mit dem folgenden Befehl in das Beispiel-Verzeichnis von PyFingerprint:

~$ cd /usr/share/doc/python-fingerprint/examples/

Und nun führt z.B. das Beispielskript aus, um euch den Template-Index des Sensors ausgeben zu lassen:

~$ python2 ./example_index.py

Sollte die Ausgabe wie folgt sein, funktioniert alles nach Plan:

Currently stored templates: 0
Please enter the index page (0, 1, 2, 3) you want to see:

Nun kann eine Seitenzahl zwischen 0 und 3 gewählt werden, welche das Inhaltsverzeichnis des Sensors ausgibt.

Kommt z.B. die Meldung:

The fingerprint sensor could not be initialized!
Exception message: The fingerprint sensor port "/dev/ttyUSB0" was not found!

Dann wurde euer Sensor nicht erkannt und ist endweder nicht korrekt angeschlossen oder unter einem anderen Geräte-Pfad als "/dev/ttyUSB0" verfügbar.

Bei Erfolg könnt ihr nun alle Features nutzen, die der Sensor bietet. Um einen Finger auf dem Sensor einzulesen und zu speichern, kann das Beispielskript "example_enroll.py" genutzt werden, zum Überprüfen eines Fingers "example_search.py" und zum Löschen eines Fingerabdrucks "example_delete.py".

Anhang

Hier nochmal in einer Zusammenfassung alle relevanten Informationen und Ressourcen.

Bezugsmöglichkeiten Fingerprint-Sensor

Ebay

Suche nach "Arduino fingerprint sensor".

Vorteil: Günstig (ca. 35€)
Nachteil: lange Lieferzeit aus Asien (ca. 3-4 Wochen)

Adafruit Industries

Vorteil: generell viel gutes Zubehör im Shop
Nachteil: teuer; langer Versandweg aus Amerika

Weitere Distributoren

Vorteil: kurze Lieferzeit je nach Land
Nachteil: Meist vergleichsweise teuer (>60€)

Bezugsmöglichkeiten USB-TTL-Konverter

Ebay

  1. Suche nach "USB TTL CP2102":
    Kleiner und günstiger USB-Konverter direkt als Platine (gut zum testen).
    Kosten: ca. 2-5€
  2. Suche nach "USB TTL Kabel":
    Praktisches, alltagstauglicheres USB-Kabel mit integriertem Konverter.
    Kosten: ca. 5-10€

Wenn ihr euch für Möglichkeit 1 entscheidet, sind sogenannte Male-Male-Jumper-Kabel zu empfehlen, um ein modulares Trennen der Komponenten zu ermöglichen. Diese könnt ihr diese im 40er-Pack auch bei dem Händler eures Vertrauens für unter 10€ erwerben. Aber ich empfehle das Recycling aus alten Computern (die Jumper-Kabel werden bei LEDs und Power-/Reset-Schaltern eingesetzt).

Allgemeiner Tipp: Wenn möglich, keinen Versandort aus Asien wählen, um lange Lieferzeiten zu vermeiden.

Dokumentation Fingerprint-Sensor

Manueller Download der Bibliothek

Quellcode auf Github verfügbar

Die Bibliothek kann auch auf Github bezogen werden:

PyFingerprint auf Github

Häufige Fragen (FAQ)

Wir werden oft zu immer den gleichen Dingen gefragt. Deswegen haben wir uns entschlossen, eine FAQ-Sektion mit den häufigsten Fragen anzulegen, die im Zusammenhang mit der Bibliotek aufkommen:

#1 Der Sensor wird nicht erkannt

Wenn du die Meldung The fingerprint sensor could not be initialized! von der Bibliothek erhältst, kann das an unterschiedlichen Dingen liegen:

  1. Der Sensor ist nicht an dem angegebenen Port angeschlossen
  2. Der USB-TTL-Konverter funktioniert nicht korrekt
  3. Die Datenleitungen (TX, RX) zwischen dem Sensor und dem USB-TTL-Konverter sind vertauscht
  4. Der Sensor ist nicht kompatibel mit der Bibliothek (kein ZhianTec-Sensor?)

Bei den beschriebenen Problemen können entsprechende Tipps helfen:

  1. Ändere den angegebenen Port in den Skripten von /dev/ttyUSB0 zum korrekten Port
  2. Teste mit einem anderen USB-TTL-Konverter (Konverter mit dem CP2102-Chip funktionieren meist gut)
  3. Tausche beide Datenleitungen und verwende andere Kabel
  4. Sorry vielleicht hast du ein kaputtes oder falsches Modell erwischt. Teste mit einem anderen Sensor

#2 Ich möchte die Fingerprint-Templates außerhalb des Sensors speichern (z.B. in einer Datenbank oder auf dem Raspberry Pi). Ist das möglich mit der Bibliothek?

Es ist möglich, Fingerprint-Templates herunterzuladen (exportieren) und wieder auf den Sensor hochzuladen (importieren). Für die eigentliche Erkennung müssen die gewünschten Fingerprint-Templates allerdings auf dem Sensor vorhanden sein. Wenn du beispielsweise in der Nacht Fingerprint-Templates zwischen verschiedenen Sensoren synchronisieren möchtest, ist das möglich. Aber wie bereits gesagt, Fingerprint-Daten außerhalb des Sensors zu speichern und dort für die Erkennung zu nutzen geht nicht.

#3 Ich bin ein absoluter Anfänger. Kannst du mit bitte einen Skript schreiben? Es ist sehr dringend!!!

Oftmals erhalte ich unverschämte Anfragen von Leuten, die mit absolut gar nichts ankommen (teilweise nicht mal ausreichend Informationen) und dann möchten, dass ich ihr Wunschprojekt für sie umsetzte. Ich stelle die Bibliothek gerne zur Verfügung und wenn eine unerfahrene Person konkrete Fragen hat, die hier nicht beantwortet wurden, ist das natürlich kein Problem. Aber ich bin nicht die Wohlfahrt, die bei unterwürfigen oder dreist-frechen E-Mails einfach die gewünschte Software ohne Bezahlung anfertigt.

#4 Ich habe ein Problem mit der Bibliothek. Kannst du mir helfen?

Oft bekomme ich E-Mails ohne konkrete Beschreibung, Fehlermeldung oder Kontext. Sorry, aber ohne Infos kann ich recht schlecht helfen ;-) Also immer entsprechende Informationen mitliefern.

Update 1: Neue Version 1.1

Ich habe bei dem Treiber die noch fehlende Methode implementiert, das Bild des gescannten Fingerabdruck auf den angeschlossenen Rechner herunterzuladen. Es ist dafür ein Beispiel "example_downloadimage.py" vorhanden. Das Bild wird als graustufiges Bitmap-Bild gespeichert. Weiterhin wird die Bibliothek nun automatisiert via Debian-Paket über das PM Codeworks-Repository eingerichtet.

Update 2: Neue Version 1.2

Wir haben die Bibliothek an die Python-Modul-Konventionen von Debian angepasst. Weiterhin wurde der Code-Stil an unsere neusten Kenntnisse und Erfahrungen angepasst.

Update 3

Wir haben die Bibliothek an unsere neusten Programmierkonventionen angepasst und eine Lizenz-Datei hinzugefügt.

Update 4

Vielen Dank an Danylo Esterman (siehe Kommentare) für den Hinweis, dass der Sensor laut Datenblatt mit der für den Raspberry Pi zulässigen maximalen Pegelspannung von 3,3V arbeitet (und nicht mit 5V). Ein USB-TTL-Konverter ist also nicht unbedingt nötig für die Nutzung des Sensors am Raspberry Pi.

Update 5: Neue Version 1.3

Vielen Dank an David Gilson (siehe Kommentar zu englischsprachigem Artikel) für seine Implementierung der Methode "uploadCharacteristics" mit der es nun endlich möglich ist, heruntergeladene Fingerabdruck-Charakteristika auch wieder auf den Sensor hochzuladen. Ebenfalls vielen Dank an Danylo Esterman für seine Verbesserungsidee der Methode "downloadImage", durch die nun eine wesentlich bessere Bild-Datei erzeugt wird.

Update 6: Quellcode auf Github verfügbar

Das Projekt wird fortwährend nicht mehr auf meinem privaten Mercurial-Server verwaltet, sondern vollständig offen und transparent über Github. Änderungswünsche können direkt dort eingeflegt werden.

Update 7: Neue Version 1.4 und Kompatibilität mit Raspberry Pi B+ und Raspberry Pi 3

In dieser neuen Version wurde die falsche Anzahl von maximal ablegbaren Templates auf dem ZFM-20 korrigiert (das A-Modell speichert maximal 162 Templates). Der vormals falsche Wert hat bei dem neueren Modell ZFM-60 zu Problemen geführt (danke an Florian Scharf für den Hinweis).

Weiterhin hat Florian den Sensor ZFM-60 mit ein paar Anpassungen in der Datei /boot/cmdline.txt auf dem Raspberry Pi B+ sowie dem Raspberry Pi 3 zum Laufen gebracht.

Für den Raspberry Pi B+ reicht es aus, folgende Zeile:

dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

minimal zu verändern (der Teil console=serial0,115200 muss entfernt werden):

dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

Für den Raspberry Pi 3 muss zusätzlich noch folgende Zeile hinzugefügt werden (dadurch wird der angebundene Onboard-Bluetooth-Chip angeklemmt, sodass die UART-Schnittstelle UART0/ttyAMA0 auf GPIO 14 und 15 wieder zur Verfügung steht. Die Bluetooth-Funktionalität ist dann aber nicht mehr gegeben):

dtoverlay=pi3-miniuart-bt

Nach dem Abspeichern und einem Neustart sollte der Sensor funktionsfähig sein.

Nachfolgend noch ein zwei Bilder des ZFM-60 von Florian:

ZhianTec ZFM-60 Ansicht von der Seite

ZhianTec ZFM-60 Ansicht von unten

Viel Spaß beim Basteln mit dem neuen Sensor :-)

Update 8: FAQ hinzugefügt

Ich habe eine FAQ für häufige Probleme mit der Bibliothek hinzugefügt.


Tags: Raspberry Pi, Debian, Fingerprint, Sicherheit

Proudly generated with Pelican - without PHP, Perl, MySQL & Co. Jump to top