RFID-RC522 Modul mit SPI Schnittstelle

Und wieder ein kleines Spielzeug aus China das diesmal weniger gekostet hat als ein Päckchen in Deutschland 😀 . Ein RFID Leser mit SPI Schnittstelle für 13.56 MHz Mifare Transponder.

RFID-RC522 Mifare Card Reader

Der Chip (externer Link: NXP Chip RC522) kann eigentlich auch I²C und UART aber es ist, soweit ich es richtig verstanden habe, nur die SPI (Serial Peripheral Interface) Schnittstelle auf den Pins (die man selber anlöten muss) verfügbar.

Praktischerweise sind dem Kartenleser Mifare Transponder für die ersten Versuche beigelegt. Der Schlüsselanhänger wird aus ca. 2-3 cm und die Scheckkarte bereits in ca. 5-6 cm Entfernung gelesen. Nachdem man weiß das alles funktioniert, kann man schnell weitere Transponder, vielleicht auch im eigenen Portemonnaie, finden.

Wer einen Raspberry Pi, den RFID-RC522 Karten Leser mit SPI Interface und die entsprechenden Verbindungskabel hat, kann das ganze sehr einfach mit der folgenden Anleitung nachbauen.

Erst mal muss der Raspberry Pi mit dem RFID-RC522 Karten Leser verbunden werden. Folgendes Anschlussschema sollte etwas dabei helfen die insgesamt sechs Verbindungen anzuschließen (vier SPI (MOSI, MISO, SDK und SDA) und zwei Spannungsversorgung (3,3V und GND)). Oft wird auch RST mit dem Raspberry Pi verbunden. Ich habe es nicht gemacht und keine Probleme festgestellt. Auf die Spannungsversorgung muss man diesmal nicht aufpassen da mit einer für den Raspberry ungefährlichen Spannung von 3,3 V gearbeitet wird.

Raspberry Pi und RC522 Pinbelegung

Zur Info: Der eigentliche Bus besteht aus MOSI, MISO und SCLK (SDK auf dem RC522). Der Pin SDA / CEx / SS (Slave Select) / CS (Chip Select) wird hingegen jeweils vom Master zum Slave verbunden da hierüber bestimmt wird, wer “sprechen” darf. Da der Raspberry Pi zwei Chip Select Ausgänge (CE0 und CE1) besitzt, können damit zwei SPI Module angesprochen werden.

Für den Zugriff auf die Raspberry Pi Schnittstellen wird die C Bibliothek für den Broadcom BCM 2835 Chip benötigt.

cd /usr/src
wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.36.tar.gz
tar -zxf bcm2835-1.36.tar.gz
cd bcm2835-1.36
./configure
make
sudo make install

Danach laden und installieren wir eines der viele Programme die es im Internet für den RFID-RC522 gibt.

cd /usr/src
sudo apt-get install subversion
svn checkout http://rpi-rc522.googlecode.com/svn/trunk/rpi-rc522-read-only
cd rpi-rc522-read-only/rc522
gcc config.c rfid.c rc522.c main.c -o rc522_reader -lbcm2835
sudo cp RC522.conf /etc/
sudo ./rc522_reader -d

Durch den letzten Befehl wird das Programm gestartet. Wenn alles richtig eingerichtet ist, erscheinen (bei diesem Programm) auf der Konsole die IDs als Hexwert in folgendem Format:

Type: 0400, Serial: 55193e65
New tag: type=0400 SNlen=4 SN=[55193e65]
Type: 0400, Serial: c48bbcab
New tag: type=0400 SNlen=4 SN=[c48bbcab]

Die IDs können dann in der /etc/RC522.conf mit einen Befehl hinterlegt werden. Dies habe ich aber noch nicht getestet.

Update 2016-03-07

Da Google Code nur noch als Archiv zur Verfügung steht, haben sich die Quellen geändert. Die nicht mehr veralteten Schritte sind durchgestrichen und müssen wie folgt ersetzt werden. Die Befehle und Pfade sind ungetestet und zur Unterstützung. Wenn jemand einen Fehler findet würde ich mich und sicherlich auch andere über eine kurze Info freuen.

wget https://storage.googleapis.com/google-code-archive-source/v2/code.google.com/rpi-rc522/source-archive.zip
unzip source-archive.zip
cd rpi-rc522/trunk/rc522

16 Gedanken zu „RFID-RC522 Modul mit SPI Schnittstelle“

  1. Hallo Stefan,

    du hast eine interessante Webseite! Ich habe aufmerksam deinen Artikel über den Raspberry Pi und das RFID-RC522 Modul gelesen. Mich würde interessieren ob du damit weitergekommen bist. Gerade im Hinblick auf die weitere Programmierung und Erkennung der IDs.

    Ich denke darüber nach die RFID Technologie für mich zu nutzen um meine Haustür zu öffnen. Später soll darüber eine Anwesenheitserkennung laufen. Die wiederum eine Alarmanlage steuert.

    Mich würde es freuen, wenn du mir ein Feedback gibst.
    Kai

    1. Hallo Kai,

      ich bin damit nicht weitergekommen bzw. habe das nicht weiter mit einem Raspberry Pi probiert. Seitdem ich mich mit Arduinos beschäftige, nutze ich lieber diese für solche Aufgaben. Mit einem Arduino lässt sich ein wartungsarmes System bauen, dass zudem nicht viel Strom benötigt.

      Ich habe am Arduino einen RFID-RC522 Kartenleser (13.56 MHz) und einen ID-20LA Kartenleser (125 kHz) getestet. Ich könnte je nach Anforderung einen HowTo Beitrag schreiben wie man z. B. mit Arduino, Ethernet Shield und einem ID-20LA Kartenleser ein fertiges Modul bauen kann. Lass uns am besten mal seperat über deine Umgebung und Anforderungen sprechen.

      Viele Grüße
      Stefan

  2. Hallo,

    in der RC522.conf kann angegeben werden, was gemacht werden soll (also welches Programm oder script ausgeführt werden soll), wenn ein bestimmter TAG erkannt wurde. Dazu wird die Seriennummer des Tags benötigt.

    Ich habe vor eine bestimmte Website zu CURLen wenn der Reader einen RFID-chip findet. Die Seriennummer soll dabei egal sein. in der aktuellen Version von dem von dir verwendeten rc522_reader ist das aber nicht so einfach möglich.
    Deshalb hab ich die main.c einfach angepasst:

    Zuerst hab ich eine neue Variable “doit” deklariert. Der Bereich sieht nun so aus (mit einem * beginnenden Zeilen bestanden schon vorher)
    * void usage(char *);
    *char *KeyA=”Test01″;
    *char *KeyB=”Test10″;
    *uint8_t debug=0;
    char doit[200];
    *
    *int main(int argc, char *argv[]) {
    * uid_t uid;

    In den Zeilen 151&152 hab ich doit gesagt, was es machen soll, wenn ein Tag erkannt wird. sprint() beschriebt die Variable. Hier wird das Programm angegeben, das ausgeführt werden soll. system() führt das Programm dann (mit dem Benutzer, der in der Config angegeben ist) aus.
    *if (debug) {fprintf(stderr,”New tag: type=%04x SNlen=%d SN=%sn”,CType,SN_len,sn_str);}
    * else{syslog(LOG_DAEMON|LOG_INFO,”New tag: type=%04x SNlen=%d SN=%sn”,CType,SN_len,sn_str);
    sprintf(doit, “./test.sh %s”, sn_str);
    system(doit);
    *}

    Wenn rc522_reader nicht mit -d gestartet wird (also nicht imd ebug-mode ist) wird hier des Befehl ./test.sh ausgeführt und der Parameter sn_str übergeben. sn_str ist in diesem Fall eine Variable mit der Seriennummer des Tags, der gerade ausgelesen wurde.

    Zum Schluss muss nochmal neu kompiliert werden:
    gcc config.c rfid.c rc522.c main.c -o rc522_reader -lbcm2835

    Um die Seriennummer in dem bash-script (hier test.sh) zu nutzen muss die variable $1 ausgelesen werden.
    Vielleicht hilft es ja dem einen oder anderen.

    Gruß Kafke

  3. Sollten die weissen S50-Karten nicht gelesen werden, dann einfach ein “usleep(200);” in die Funktion “PcdComMF522” der Datei “rc522.c” einbauen.

    Das sieht dann so aus:

    for (i=0; i<n; i++) {
    pOut[i] = ReadRawRC(FIFODataReg);
    usleep(200);
    }
    Greets
    Ex

  4. Alter, echt jetzt eine fette DANKE SCHÖN!!! Ich habe vielleicht 3-4 Tage im Internet geguckt, aber nichts hat funktioniert. Echt Klasse mit diesem Tutorial! Besonders die Verkabelung hat mir große Probleme gemacht (bin ein Einfänger bei solchen Dingen). Ich habe aus versehen mein SDA auf GPIO2 (SDA1 I2C) verbunden und habe mich gewundert wieso es nicht funktioniert. Alle Pinlayouts, die ich mir angeschaut haben, hatten nichts über SDA dabei (als Bezeichnung meine ich). Da habe ich mir überlägt: hmmmm, also ich habe MOSI und MISO für SPI aber den Sch@ßdreck SDA…Da steht doch I2C neben dem SDA. Ich habe dann weiter Recherchiert und tatsächlich die I2C Pins waren offensichtlich nicht für SPI Zeug gemeint. Jetzt anhand deiner Tabelle habe ich es kappiert wie die SDA da mit dem RPi2 verbunden werden kann. Pfui! Dankööööööööööööö! :)))

    1. Hallo Falko,

      da es bei mit dem RFID Leser schon etwas her ist und ich wenig Probleme hatte ihn in Betrieb zu nehmen, kann ich leider nicht viel zum Troubleshooting sagen. Habe kurz recherchiert und du solltest erst einmal mit ls -al /dev/spi* prüfen ob SPI auf deinem Raspberry Pi überhaupt aktiv ist. Wenn entsprechende SPI Devices vorhanden sind, wäre vielleicht noch das SPI testing utility spidev_test.c für dich interessant. Ich habe damit aber noch nicht gearbeitet.

      Viele Grüße
      Stefan

  5. Ich habe mich heute nachdem meine Tele endlich angekommen sind auch an diesen RFID Leser gemacht.
    Die bcm ist mittlerweile in der Version 1.48 und demnach ist der Link nun folgender:

    wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.48.tar.gz

    Übrigens wollte mein Raspian ein sudo für wget und tar. Für blutige anfänger im Linux wäre dass vielleicht noch ein Hinweis, dass man diese eventuell benötigt.

    Außerdem ist für den Raspberry Pi 2 noch ein Zusatz erforderlich:

    sudo raspi-config
    under Advanced Options – enable Device Tree
    Reboot.

    Mehr Info zu der Bibliothek und dem Chip findet man auch hier: http://airspayce.com/mikem/bcm2835/

    Vielen Dank für das hilfreiche Tutorial!

  6. Hallo Stefan,
    ich bin unweigerlich (wie wahrscheinlich jeder Newbie in Sachen Raspi 2 und Linux, der vor hat, SPI für einen Cardreader einzusetzen) über deine tolle Anleitung gestolpert und meine Kombination Raspberry Pi 2 + RFID-RC522 Modul lief auf Anhieb – leider nur auf der Kommandozeile, so wie von dir beschrieben. Um das ganze mit Pyhon auslesen zu können versuche ich seit Tagen mittels den vielen Hinweisen im Netz das hin zu kriegen, leider vergeblich – alle read.py-scripts starten korrekt, aber keines will mit den Transpondern reden, obwohl ich alles x-mal gecheckt habe und keinen Fehler finden kann (ich will ausschließlich die ID von unterschiedlichen RFID-Tags auslesen und in Python weiterverarbeiten).
    Du erwähnst, dass du die Sache mit Arduino fortgesetzt hast, ich wäre sofort bereit auch die Sache mit Arduino anzugehen, sofern du mir dabei helfen könntest. Bei diesem Ding bin ich noch viel mehr Neuling, also von Null weg.
    Hättest du da bitte etwas für mich?

    Vielen Dank,
    lG
    Christian

    1. Hallo Christian,

      ohne mich wieder in das Thema einzuarbeiten kann ich dir mit dem Python Skript leider nicht weiterhelfen. Am Arduino habe ich das vorgestellte RC522 Modul aufgrund unter anderem wegen der 3,3 Volt Problematik und SPI Schnittstelle nicht genutzt.

      Hast du den Beitrag über den RFID Reader ID-12LA gelesen? Dieser arbeitet aber im Gegensatz zum RC522 auf der 125 kHz Frequenz. Das ganze lässt sich natürlich noch um eine Netzwerkschnittstelle, LCD, Relais oder was auch immer du noch benötigst erweitern.

      Da das Thema scheinbar sehr beliebt ist, habe ich mir gerade zum probieren ein RFID Modul mit PN532 gekauft. Dieses arbeitet auf der 13,56 MHz Frequenz, hat eine Versorgungsspannung von 5V und unterstützt neben SPI auch I2C und UART. Ist also perfekt für einen Arduino. Die Größe der Platine ist unter 5x5cm und hat eine eingebaute Antenne. Dazu werde ich dann sicherlich noch einen Beitrag schreiben. Wenn es für dich interessant ist, schreibe mir doch bitte welche Schnittstelle du benötigst, dann schreibe ich dir wenn möglich gleich den passenden Sketch dazu.

      Ich hoffe das ich dir trotzdem ein wenig weiterhelfen konnte?!

      Viele Grüße
      Stefan

  7. MOin..

    Ich habe Dein Programm im Einsatz..
    Danke schmal für die Mühe…

    Nur fehlt mir in der Config einen Eintrag wie er mit neuen Tags umgeht.. bzw wäre es nicht schlecht wenn er einen Befehl ausführen könnte. Analog der erkannten Tags..

    Vllt könntest u noch was einbauen ..

    Danke !

    Gruß Michael

  8. Hallöchen,
    danke für die Anleitung und das Aktualisieren des google-code-links.
    eine kleine Korrektur:
    aus der letzten Zeile

    cd rpi-rc522trunkrc522

    solltest Du die Backslashe durch Slashe ersetzen:

    cd rpi-rc522/trunk/rc522

    aber yo… Kleinigkeit

    Danke nochmal!

    S.

    .

  9. genau so war es bei mir auch – hatte auch SDA vom RC522-Modul mit dem SDA auf meinem Raspberry-Pi Extension-Board verbunden – das war falsch. Nachdem ich SDA dann mit CE0 verbunden hatte, konnte ich auch Kartendaten lesen 🙂
    DANKE!!!

  10. Vielen Dank. Es läuft, wenn beachtet wird, dass bei aktueller Raspberry Version auch die aktuelle Bibliothek des RC522 Moduls verwendet wird. Derzeit 1.59 gut sichtbar oben auf der Seite auf http://airspayce.com/mikem/bcm2835/. In den oben aufgeführten Anweisungen also statt bcm2835-1.36 besser bcm2835-1.59 verwenden. Mit gpio readall kann überprüft werden, das der BUS richtig konfiguriert ist. Muss
    | 24 | 1 | ALT0 | CE0 | 10 | 8 | stehen. Wichtig ist das auf ALT0 konfiguriert ist.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert