Raspberry Pi – NFC und RFID auslesen
In diesem Tutorial zeige ich euch wie man NFC und PFID Chips mit dem Raspberry Pi auslesen kann. Ich verwende dafür das RFID-RC522, welches man recht günstig mit zwei RFID Chips in Form eines Schlüsselanhängers und Scheckkarte bekommt. Mit dem Raspberry Pi kann man damit aus einiger Entfernung die eindeutige UID der beiden Tags auslesen.
Raspberry Pi – NFC und RFID auslesen
Es ist recht einfach über ein Python Skript und eines RFID Lesegeräts eindeutige IDs von RFID Chips oder NFC Karten auszulesen. Das geht auch über eine Entfernung einiger Zentimeter. Dieses Tutorial zeigt das Basissetup und basierend auf fertigen Scripts wie man an die UIDs kommt. In der weiteren Folge möchte ich damit ein Zeiterfassungssystem bauen.
Hardware
Wir benötigen folgende Hardware:
- RFID RC522 Board oder vergleichbares Lesegerät
- 7 female-female Jumper Kabel
- einen Raspberry Pi
Bevor man beginnt muss man am Raspberry Pi das SPI Interface aktivieren. Dieses ist standardmäßig (nach einer Installation von Raspbian Linux) deaktiviert. Aktiviert wird es über das raspi-config Konsolenprogramm oder über das grafische Tool am Desktop. In beiden Fällen ist ein Neustart nötig.
Nach dem Neustart kann man recht einfach prüfen ob SPI aktiviert ist. Dazu gibt man folgendes in die Konsole ein:
lsmod | grep spi
Ihr solltet eine ähnliche Ausgabe bekommen. In jedem Fall sollte dort die Zeile spi_bcm2835 zu finden sein:
Das Board muss an die GPIO Schnittstelle vom Raspberry Pi angeschlossen, wir schließen die folgenden Ausgänge des Boards an die folgenden Pins an:
- VCC: Pin 1 für 3.3 V Betriebsspannung
- RST: Pin 22
- GND: Pin 6 für Masse
- MISO: Pin 21
- MOSI: Pin 19
- SCK: Pin 23
- NSS: Pin 24
Das sieht dann wie folgt aus:
Software
Damit wir unter Python die SPI Schnittstelle verwenden können laden wir von GitHub eine fertige Bibliothek herunter. Warum alles selber entwickeln, wenn sich doch schon jemand die Arbeit gemacht hat und das freundlicherweise noch mit der Welt teilt:
git clone https://github.com/lthiery/SPI-Py.git cd SPI-Py sudo python setup.py install
SPI-Py ist eine in C entwickelte Erweiterung für Python, ähnlich wie WiringPi und zahlreiche andere solcher Plugins. Wir klonen uns das Projektverzeichnis mit Git, wechseln in den Ordner und führen die Installation aus.
Neben der Software für die SPI Schnittstelle können wir uns auch ein fertiges Skript laden, dass mit dem RC522 Board kommuniziert. Das geht wieder über ein GitHub Projekt:
git clone https://github.com/mxgxw/MFRC522-python.git cd MFRC522-python
Wir klonen das Projekt gleich in den SPI-Py Ordner und wechseln den Ordner erneut.
Test
Stunde der Wahrheit. Wenn ihr alles korrekt ausgeführt habt, dann könnt ihr über das Read.py Skript die RFID Tags bereits auslesen:
python Read.py
In meinem Fall werden für beide Tags unterschiedliche UIDs ausgegeben – genau wie erwartet:
NFC
NFC ist ein Anwendungsfall von RFID über das man ein Handy beispielsweise mit einem Wireless Radio (oder Soundbox) koppeln kann. Über NFC kann man auch Kontaktlos zahlen. Dabei wird ein standardisiertes Verfahren angewendet um ein NFC fähiges Gerät eindeutig zu identifizieren. Auch der RFID-RC522 Chip am Raspberry Pi kann ein Handy erkennen, wenn dieses NFC unterstützt und diese aktiviert ist. Im Versuch mit meinem Handy stellt sich heraus, dass dessen UID jedesmal anders ist. Das Read.py kann zwar die UID lesen, versteht aber das Kopplungsverfahren nicht. In einem folgenden Artikel werde ich mir das näher ansehen.
Fazit
Einem funktionierenden Zeiterfassungssystem mit dem Raspberry Pi und RFID beziehungsweise NFC bin ich einen Schritt weiter. Es ist möglich RFID UID Nummern zu lesen. Damit ist die schwierigste Aufgabe auch bereits erledigt. Es folgt die Implementierung der Logik. Ich habe gezeigt, dass NFC und RFID auslesen am Raspberry Pi sehr einfach funktioniert.
Welche Anwendungsfälle für RFID habt ihr? Warum verwendet ihr dabei den Raspberry Pi?
Hallo,
danke für das Tutorial. Aber bei mir gibt er keine Werte aus!
Kann mir jemand helfen?
Könnte an der Verkabelung liegen, ich würde diese zuerst prüfen.
Hatte das selbe Problem, Fehler: (verschiedene in div. Scripten) „Line XX, fehlende Anweisung“, „…Zwei Argumente notwendig nur eines gegeben…“ all sowas, geholfen hat mir dabei eine frühere Version des SPI-Py zu nutzen.
Selbst hab ich das Git genutzt von: lthiery
mit folgenden parametern
$ git clone https://github.com/lthiery/SPI-Py.git
$ cd SPI-PY
git checkout -b 8cce26b9ee6e69eb041e9d5665944b88688fca68
Ich nutze einen billigen RFID Reader, der über USB angeschlossen wird und der eine Tastatur emuliert. Damit kann man aber nur die UID auslesen, was aber für viele Anwendungen ausreicht.
Die Geräts sind billig (125kHz ab 7 Euro 13,5 MHz ab ca. 12 Euro) und die GPIO Pins bleiben frei. Außerdem ist es sehr einfach zu programmieren. Einfach als Benutzer automatisch in die nicht grafische Oberfläche einloggen und ein Pythinscript starten das per input auf eine Eingabe wartet. Die RFID Reader emulieren nach der UID eine Entertaste.
Bei mir funktioniert Read.py nur mit root privelegien. Ich wollte damit eine Anwendung mit tkinter programmieren und tkinter scheint bei mir nicht mit root zu funktionieren. Kann mir da jemand weiter helfen?
Aufwendig, aber sehr interessant!
File „Read.py“, line 41, in
MIFAREReader = MFRC522.MFRC522()
File „/home/pi/MFRC522-python/MFRC522.py“, line 135, in __init__
self.MFRC522_Init()
File „/home/pi/MFRC522-python/MFRC522.py“, line 406, in MFRC522_Init
self.MFRC522_Reset();
File „/home/pi/MFRC522-python/MFRC522.py“, line 138, in MFRC522_Reset
self.Write_MFRC522(self.CommandReg, self.PCD_RESETPHASE)
File „/home/pi/MFRC522-python/MFRC522.py“, line 141, in Write_MFRC522
spi.transfer(((addr<<1)&0x7E,val))
TypeError: function takes exactly 2 arguments (1 given)
Läuft so nicht.
Hallo Bernhard,
hast du eine Lösung für das Problem gefunden?
Gruß Nico
Ich habe hier genau das gleiche Problem.
Konnte schon jemand dazu eine Lösung finden?
Geht absolut nicht mit einem PI Zero WH unter Buster (lite). Auch die Lösung von Florian hat keine Abhilfe gebracht.
Das ist das traurige beim PI. Hatte bei vielen Projekten schon so häufig mit argen, teilweise unlösbaren, Problemen zu kämpfen weil sich irgendwas geändert hat und nicht richtig kommuniziert wird.
Momentan versuche ich ne Phoeniebox zu bauen und eine absolute Katastrophe. Man hält sich GENAU(!) an die Anleitungen und irgendwann. RUMS… wieder irgendwas anders geworden.
Die Tuts hier finde ich alle super und die können ja auch nichts dafür wenn es als Änderungen gibt… aber da soll man mal über Windows schimpfen. Momentan habe ich nen Hals wegen Linux und unzähligen Versionen.
Schade, dass dir mein Artikel nicht weiter geholfen hat. Ich kann leider nicht all meine Artikel immer aktuell halten. Für viele Projekte eignen sich auch noch die älteren Debian Systeme, die werde auch noch supported. Ansonsten muss man den mühsamen Weg gehen und herausfinden was sich geändert hat. Aber das ist in der IT sowieso immer nötig.
Ich arbeite seit vielen Jahren in der IT und es ist wichtig zB genutztes Betriebssystem zu nennen. Auch bei anderer Software ist die Versionierung mit unter wichtig. Pyton 3 schreibt print („Hallo Welt“) und nicht mehr print „Hallo Welt“.
Hallo Werner,
danke für Deine Anleitung.
Bei mir läuft es super. Kann Tags und Karten UID auslesen. Für eine einfachen Türöffner (nicht Sicherhetisrelevant) perfekt.
Würde jetzt gerne das Mobiltelefon anstelle eines Tags benutzen. Das Problem mit der wechselnden UID ist „das Problem“.
Hast Du vielleicht schon eine Lösung, wie man zumindest das Handy eindeutig identifizieren kann, damit man diese auch zum Öffnen verwenden kann? LG if
Hallo, danke für das Feedback. Nein leider habe ich dazu keine aktuellen Infos.