Raspberry Pi RFID RC522 Tags auslesen (NFC)

RFID ist eine Technologie, wodurch Daten ohne Berührung übertragen werden, was in Chipkarten Anwendung findet. Mit einem Raspberry Pi RFID Modul (RC522) können Zugangskarten ausgelesen werden und somit z.B. Zugriff zu Türen oder Schlössern gegeben werden. Aktuelle Smartphones besitzen ähnliche

Wie man mit dem RC522 und dem Raspberry Pi RFID Tags ausließt und außerdem Chipkarten beschreibt, zeige ich in diesem Tutorial. Außerdem kann der vorgestellte Code für andere Projekte (Türöffner, Zugangskontrolle) verwendet werden.

NFC ist eine zugehörige Technologie, dessen Unterschiede hier nachgelesen werden können (Englisch). Sowohl RFID als auch NFC senden auf einer Frequenz von 13.56 MHz, weshalb die Module miteinander kompatibel sind.

 

 

Verwendetes Zubehör

Die folgenden (Bau-)Teile habe ich für dieses Tutorial verwendet:

Es gibt auch RFID USB Lesegeräte, allerdings habe ich diese nicht ausprobiert.

Falls man das Kartenlesegerät als Eingangskontrolle, etc. verwenden will, macht es Sinn jedem Nutzer eine Karte zu geben. Man kann diese Chipkarten in kleineren und größeren Mengen auch für kleines Geld zusätzlich erwerben und dann mit dem RC522 jede Karte individuell beschreiben (Anleitung dazu weiter unten).

 

 

Aufbau

Bei meinem Modul war die Pin Leiste noch nicht angelötet, daher musste ich sie erst löten, bevor ich die Pins verbinden konnte.
Die Verkabelung ist dabei wie folgt:

RF522 Modul Raspberry Pi
SDA Pin 24 / GPIO8 (CE0)
SCK Pin 23 / GPIO11 (SCKL)
MOSI Pin 19 / GPIO10 (MOSI)
MISO Pin 21 / GPIO9 (MISO)
IRQ
GND Pin6 (GND)
RST Pin22 / GPIO25
3.3V Pin 1 (3V3)

 

Schematisch sieht das ganze dann so aus:

Raspberry Pi RFID RC522 NFC_Steckplatine

Raspberry Pi RC522 Verbindung

 

 

SPI aktivieren und Software installieren

Um das RFID RC522 Shield verwenden zu können brauchen wir den SPI Bus. Damit der Kernel beim Starten geladen wird, bearbeiten wir die config Datei:

sudo nano /boot/config.txt

Folgender Inhalt wird an das Ende der Datei hinzugefügt:

device_tree_param=spi=on
dtoverlay=spi-bcm2708

Gespeichert und beendet wird mit STRG+O, STRG+X. Danach aktivieren wir SPI noch:

sudo raspi-config

Unter „Advanced Options“ > „SPI“ aktivieren und den Neustart bestätigen (alternativ sudo reboot now).

Danach kann mittels dmesg | grep spi überprüft werden, ob das Modul geladen wurde. Es sollte dann so einen Output ergeben:

pi@raspberrypi:~ $ dmesg | grep spi
[   10.784368] bcm2708_spi 20204000.spi: master is unqueued, this is deprecated
[   10.813403] bcm2708_spi 20204000.spi: SPI Controller at 0x20204000 (irq 80)

 

Nun müssen noch die Pakete installiert werden, sodass wir auf den SPI Bus zugreifen können und eine entsprechende Bibliothek aus GitHub laden können.

sudo apt-get install git python-dev --yes

Zu erst installieren wir also das Python SPI Modul

git clone https://github.com/lthiery/SPI-Py.git
cd SPI-Py
sudo python setup.py install
cd ..

und danach die Raspberry Pi RFID RC522 Bibliothek:

git clone https://github.com/mxgxw/MFRC522-python.git && cd MFRC522-python

 

 

Raspberry Pi RFID Reader/Writer testen

Zusätzlich zum RC522 Modul werden meist eine weiße Karte sowie ein NFC fähiger Schlüsselanhänger geliefert. Diese Teile können als Authentifizierung benutzt werden, da sie beschreibbar und lesbar sind. Ebenfalls könnte ein NFC fähiges (Android/iOS) Smartphone verwendet werden (was die meisten neueren Handys ja sind).

Um einen ersten Test der Karte/Schlüsselanhängers durchzuführen, lassen wir das Skript laufen:

sudo python Read.py

Sobald die Chipkarte daran gehalten wird und erkannt wird, sieht man eine Ausgabe wie diese:

pi@raspberrypi:~/MFRC522-python $ sudo python Read.py
Welcome to the MFRC522 data read example
Press Ctrl-C to stop.
Card detected
Card read UID: 69,245,238,117
Size: 8
Sector 8 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

Um nun die gespeicherten Daten (Zahlen) auf dem Chip zu ändern, bearbeiten wir die „Write.py“ Datei (sudo nano Write.py). Dazu bearbeitest du den Code ab Zeile 55 folgendermaßen (die 16 Zahlen von data kannst du dabei frei zwischen 0 und 255 wählen. Ich habe dabei ein Wort mit ASCII Zeichen dargestellt):

 

 

NFC / RFID Reader in Raspberry Pi Projekten verwenden (Türschloss, etc.)

Die beiden Python Dateien „Read.py“ und „Write.py“ enthalten einigen Beispielcode zum Lesen und beschreiben eines Chips, der in anderen Projekten zum Einsatz kommen kann. Die wichtigste Datei ist dabei „MFRC522.py“, welche in ein anderes Projekt mit kopiert werden kann.

Der folgende Ausschnitt kann in anderen Projekten verwendet werden, wie z.B. als Überprüfung eines Codeschloss bzw. Türschloss. Ich verwende eine Authentifizierungsstufe (man könnte auch mehrere einstellen) mit einem bestimmten Anfangs-Code. Die letzten Ziffern geben Auskunft über den Inhaber der Karte (sofern irgendwo dazu Daten gespeichert sind). Man könnte den User auch nur anhand der UID identifizieren, allerdings gehe ich vom Fall aus, dass auch mehrere Karten einem Nutzer gehören können. Wem diese Lösung nicht gefällt, kann es natürlich umändern.

Ich habe in der Datei „MFRC522.py“ eine kleine Änderung vorgenommen, sodass die Funktion MIFAREReader.MFRC522_Read einen Rückgabewert hat:

 

Der Beispielcode sieht dann folgendermaßen aus (die vorherigen Änderungen sind wichtig, da sonst kein Vergleich stattfinden kann):

Wie man sieht ist der Code sehr simpel und soll, wie gesagt, nur als Anstoß dienen um eigene ausgefeiltere Anwendungen damit zu starten. Der Code in Zeile ist natürlich anzupassen

 

Welche Projekte setzt ihr damit um? Ich überlege ein Türschloss bzw. ein Schubladenschloss/kleinen Tresor mit dem Raspberry Pi RFID Reader zu bauen.

107 Kommentare

  1. Es sind 13,56MHz (nicht 15,56MHz).

    Schöne Beschreibung, die ich gerne schon gehabt hätte, als ich meinen RC522 installierte. Ob man es allerdings als Türöffner einbauen sollte?

    Antworten
    • Hallo Uli,
      danke für den Hinweis, ich habe den Tippfehler ausgebessert 🙂
      Nunja, ob man das in einen Türöffner einbauen sollte, muss jeder selbst wissen. Ich würde es allerdings nicht empfehlen ohne genügend Sicherheitsvorkehrungen die eigene Haustür damit zu sichern. Allerdings innerhalb des Hauses oder z.B. für Schubladen ist es eine nette Spielerei.

      Antworten
  2. hallo, ich komme leider nicht weiter. ich hänge an dem „dmesg | grep spi“ da wird mir schon was anderes angezeigt:
    [15.370071] spi spi0.0: setting up native-CS0 as GIPO 8
    [15.373953] spi spi0.1: setting up native-CS1 as GIPO 7
    wenn ich dann das „sudo python Read.py“ starte, erkennt er keine Karte/Chip.
    kann mir jemand helfen?

    Antworten
      • Das ist kein Problem. Bei mir (Pi 3 mit offiziellem Kernel) zeigt dmgs auch nichts vom SPI an.

        Aber wenn du das Device /dev/spidev0.0 siehst ist alles ok!

  3. Hi,

    schöne übersichtliche Anleitung, aber leider funktioniert sie nicht mit dem neuen Pi 3 🙁 . Habe meinen älteren Pi 2 rausgekramt und damit ging es ohne Probleme. Habe lange gesucht wo das Problem liegen könnte, aber nach 2 Tagen aufgegeben und lasse es jetzt einfach auf dem Pi 2 laufen. Wäre aber cool, wenn es für das neuere Pi angepasst werden könnte, bzw. ergänzt.

    Beste Grüße und danke noch einmal für das schöne Tutorial 🙂

    Antworten
    • Ich denke das liegt daran, dass einige Pakete noch nicht aktualisiert wurden. War beim Release des Pi2 genauso aber hat sich nach einer Weile selbst gelöst 🙂

      Antworten
    • Auch von mir vielen Dank für das hilfreiche Tutorial. Dafür, dass ich keine Ahnung von Linux und Raspberry habe, bin ich weit gekommen.

      Ich hänge jetzt ebenfalls an „dmesg | grep spi“ -> Es wird nix angzeigt.
      Dabei verwende ich auf einem Pi 3 das folgende Image:
      2016-05-10-raspbian-jessie.img (Kernel 4.4.9-v7+)

      Allerdings klappt es mit einer Speicherkarte auf Basis des Image „2016-03-18-raspbian-jessie.img“ (Kernal 4.1.19-v7+). Im Unterschied zum neuen Image erscheint hier nach „sudo raspi-config“ > „Advanced Options“ > „SPI“ noch die Frage „Would you like the SPI kernel module to be loaded by default?“.
      Wenn ich hier mit Yes bestätige, werden nach „dmesg | grep spi“ die gewünschten Einträge angezeigt und letzlich zeigt Read.py die UID der Karten an.

      Wie gesagt, ich habe keine Ahnung von Linux und Raspberry, nehme aber an, dass die Verwendung nicht die Option ist, sondern die Lösung eher darin liegt, den Pi dahin zu bringen, das SPI kernel module als default zu laden.

      Nun freue ich mich auf hilfreiche Hinweise!

      Vielen Dank und allen weiterhin viel Spaß

      Antworten
      • Bei jedem Update werden Kleinigkeiten geändert – so wie es wahrscheinlich hier auch der Fall war. Wichtig ist aber nur, dass der SPI Bus aktiviert wird. Früher musste man das noch händisch machen indem man Dateien verändert, heute geht das alles über raspi-config 🙂

  4. Erstmal, guter Guide;)
    Aber ich habe ein Problem.. Es fing damit an, dass wenn ich „dmesg | grep spi“ eingebe, dass nichts passiert. Ich habe mir alles neu gekauft, also schätze ich dass nichts kaputt ist. Wenn ich nun eine Karte oder Chip drauf lege, während ich Read.py geöffnet habe, passiert ebenfalls nichts.
    Bitte helft mir 😀

    Antworten
  5. Nun ist der vorgegebene Key also [0xFF,0xFF,0xFF,0xFF,0xFF,0xFF] kann ich den auch irgendwie ändern? Ich habe versucht in in der Write.py datei und in der Read.py datei zu verändern z.B in 0xAE, doch leider ohne erfolg..
    LG und vielen dank, für diese tolle Erklärung.

    Antworten