Raspberry Pi: RFID Tags auslesen

Diese Anleitung funktioniert mit einem RFID Reader von Seeedstudio.
In Deutschland einfach zu kaufen bei Amazon.

Update 06.03.14:
Da bei Amazon die Reader immer wieder ausverkauft sind, gibt`s hier verfügbare und günstigere Angebote des gleichen Modells bei eBay.

Edit 04.09.13: Der ursprünglich verlinkte Reader, scheint wohl nicht mehr verfügbar zu sein. Eine Alternative ist dieses Modell, das genauso funktioniert und auch das UART Protokoll nutzt.

Es handelt sich hierbei um ein fertiges RFID Modul, welches die Karten einliest und per UART oder “Wiegand” weitersendet.

Ich verwende für die Kommunikation mit dem Pi die UART Methode.
Dies lässt sich einfach per Jumper auf dem Modul einstellen.

Los gehts:

Als erstes wird das Modul mit dem RPi wie folgt verdrahtet.

Pin RFID Modul Pin Raspberry Pi
GND  6 (GND)
VCC  2 (5V)
TX  10 (RX) über Spannungsteiler!!!

Sehr wichtig:
Der TX Ausgang des Moduls liefert einen 5V Pegel.

Dieser MUSS UNBEDINGT durch einen Spannungsteiler reduziert werden! Anderenfalls kann der Pi zerstört werden.

Hierzu habe ich einen Spannungsteiler aus 2x 10kOhm Widerständen gebaut.
Hierdurch wird die Spannung auf 2,5V halbiert.
Dies genügt damit der Pi am Rx Eingang einen High Pegel erkennt.

Nun wird der UART Eingang freigeschaltet.
Dies passiert in der etc/inittab.

Die letzte Zeile der Datei wird auskommentiert.
Das sollte dann wie folgt aussehen:

#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

Das nachfolgende Python-Script, liest die RFID-Karten ein und gibt die Seriennummer als Hex-Wert aus:

#!/usr/bin/python
# coding=utf-8

import serial

# Auslesen der RFID-Transponder

def read_rfid():
    ser = serial.Serial("/dev/ttyAMA0")
    ser.baudrate = 9600
    daten = ser.read(14)
    ser.close()    
    daten = daten.replace("\x02", "" )
    daten = daten.replace("\x03", "" )
    return daten

id = read_rfid()
print id

Die Karten / Tags:

Es gibt verschiedene RIFD Tags und Karten. Jede Karte hat eine eigene ID.

Ein Profi bin ich darin auch nicht, was ich aber sagen kann, dass für das o.g. System die Karten mit den folgenden Standards funktioniert:

  • 125 kHz
  • EM 4100 oder EM4102

Bei den meisten Elektronikshops kostet eine Karte oder Tag ca. 1€ /Stk.
Bei eBay bekommt man teilweise Pakete von 50-60 für umgerechnet ca 25cent /Stk.

Nun sind im wahrsten Sinne alle Türen geöffnet um jegliche Anwendung mit RFID-Tags zu bauen.

Zwei Beispiele finden sich hier:

Weitere denkbare Projekte:

  • Türöffner per RIFD Tag
  • Generelles Schalten von Relais nach einscannen der entsprechenden Karte.
  • Personenbezogenes Licht
  • Elektronischer Kalender, der durch Einlesen von personenbezogenen Karten jeweils die aktuellen Termine der Person zeigt.
  • Etc, etc…

 

39 Gedanken zu “Raspberry Pi: RFID Tags auslesen

  1. Hallo Christoph,
    Du hast eine sehr schöne website.
    Ich bin sehr interessiert im Rfid und Ich mache mit mit Karl auf SBF und jetz das neue Forum GartenbahnTechnik. Ich habe dort eine Frage hin gelegt ob es möglich ist um mit ein Kartleser von Rfid das nummer mit FFernsteurung zu senden nach die Zentrale (comp, tab oder RasPi)
    und ein mitglied hast dieser link nacht deine website gegeben.
    Weil meine Schwellen von aluminum gemacht werde habe Ich kürzschluss, also kein DCC oder solch etwas für Mich, deshalb FF für die Rfid.
    Grüßt Dich,
    Cornelius aus Indonesien.

  2. Pingback: Anleitung: RFID Tags auslesen per UART | ElektronXElektronX

  3. ok jetzt in Englische sprache:

    Hallo Christoph,

    You have a nice website.

    I'm very interested in Rfid and I'm working with Karl on the Spass Bahn Forum and now the new Gartenbahn Technik Forum. I'm asking them if it is possible to send the information from a Rfid-reader by AIR to a command station for instance a computer, tablet or RasPi.

    One of the members overthere given this link to your website/blog.

    My situation:

    My tracks are made from aluminium (Micro Engineering Compagny-USA)

    and also my ties so I have a short circuit that's why I can't use DCC or something else. Thats why I want to try a Rfid-reader under- or near the tracks and in the train Rfid-tags. With kind regards,

    Cor from Indonesia.

    • Hey Cornelius,

      of course this is possible,

      with the reader from seeedstudio, you need a minimal distance of about 5cm to the card.

      You could read in the RFID Tag´s specific number and print it on a website, send it via mail, or save it in a file or database. You need some skills in python for this, but I think it won't be a big problem.

      Christoph

  4. Hallo Christoph,

    I think you don't understand me.

    Situation:

    in the garden is a Rfid-reader with a battery (power supply) then a tag is above the reader and then I want to send this information wireless to a computer for instance in the house. There is nothing else, so reader, battery and tag.

    Question:

    What kind of equipment do I nead to send the information wireless to the computer?

    Cor.

  5. Hallo,

    Wäre sehr interessiert wie es weiter geht. Würde gerne mit bestimmten Karten ein relais schalten oder generell ein Shell Befehl ausführen lassen. Kannst du mir da weiter helfen ? Habe nirgends etwas in der Art finden können .

    • Hey Florian,
      danke für den Hinweis. Ich habe mit den RFID Tags nur mein "Kartenspiel" programmiert.
      Wenn Du mir noch ein paar Tage Tage Zeit lässt, schreibe ich was zum Schalten von Relais, etc durch's Einscannen der Karten.

      Gruß
      Christoph

    • Hallo Florian,

      Ich habe deine Problem gestern auf Ebay gesehen.

      Dort gibt es ein Ding was mit Rfid ein Relais schaltet. Kuck mahl auf Ebay dot COM und nicht auf DE.

      Ich habe dort ein Rfid reader gekauft nur für 5 euro mit usb gleich am computer ohne software und geprüft mit LGB. Tags lesen bis 6 cm.

      LG,

      Cor.

  6. Pingback: RFID Türöffner mit LCD Display - ElektronX

  7. Hallo,

    Für unser Schulprojekt basteln wir auch gerade einen Raspberry Pi mit RFID zusammen. Das Tutoial ist dabei wirklich eine große Hilfe – Danke. Kann ich da eigentlich dann alle Transponder mit einer Frequenz von 125khz auslesen oder nur die angeführten Karten.

    lg

    • Hey, entschuldige die späte Antwort.
      Ich weiß es nicht genau, aber ich denke Du kannst Karten mit 125kHz, sowie dem Standard EM4100 und EM4102 nutzen.
      Bin auf dem Gebiet aber auch kein Experte.
      Meine Karten habe ich auch unabhängig vom dem Reader gekauft und die funktionieren :)

      Gruß
      Christoph

  8. Hi Christoph,

    vielen Dank für das nette Beispiel. Ich hab nachgebaut hab aber das Problem, dass es zu mehreren ausgaben kommt, wenn ich die RFID-Karten am Empfänger halte. Wie würdest du das Problem umgehen ? Also ein debounce wäre das glaube ich, mit einem time.sleep(5.5) bin ich nicht weitergekommen. Vielleicht hast du eine Idee ?

    thanx

    • Hey, ja ich habe das so gelöst:

      "for i in range (1)
      var=rfid()"

      Fertig 😉

      So wird die Abfrage nur genau einmal ausgeführt.

      Die Funktion rfid() muss natürlich mit der Auslesesyntax:" UART…." definiert sein.

      Ich hoffe du verstehst was ich meine.

      Schau ansonsten mal in meinem Beitrag zu RFID und dem LCD Display nach, dort habe ich die Datei "funktionen.py" verlinkt, in der ich die Funktion definiert habe.

      Gruß
      Christoph

      • Vielen Dank für die schnelle Antwort:

        Eine for-Schleife die nur einmal ausgeführt wird macht doch normalerweise keinen Sinn ? Und wiederrum ist diese in einer While-Schleife also wird doch endlos durchläuft? Kommt es vielleicht nur durch die Verzögerungen nach dem Code ?

        Ist das eine getestete sichere Variante ?

        Bin da nämlich etwas skeptisch.

        • Hey,
          hatte damals das selbe Problem wie du und konnte es so lösen.
          Es ist sicher nicht die eleganteste, aber es hat geklappt.
          Das Programm lief erst weiter, als er eine Nummer über UART eingelesen hatte.
          Hast Du dein Problem denn schon gelöst? Auf einem anderen Weg vielleicht?

  9. Hallo!

    Vielen Dank für deine ausführlichen Tutorials!

    Habe mir die Teile nach deinen Links bestellt, jedoch kommt es teilweise nach dem auslesen zu einem Programmabbruch.

    Folgender Fehler wird ausgegeben:

    Traceback (most recent call last):

    File "rfid.py", line 18, in

    user = rfid()

    File "/home/pi/rfid/funktionen.py", line 150, in rfid

    Zeichen = UART.read()

    File "/usr/lib/python2.7/dist-packages/serial/serialposix.py", line 449, in read

    buf = os.read(self.fd, size-len(read))

    OSError: [Errno 11] Resource temporarily unavailable

    Ich hoffe du kannst mir weiterhelfen!

    Vielen Dank

    Stefan

  10. Hallo,
    super Tutorial. Vielen Dank dafür. Weist du zufälligerweise wie lange das Verbindungskabel zwischen PI und RFID Leser sein darf? Ich würde das ganze gern etwas getrennt voneinander aufstellen (Pi mit Kamera auf der einen Seite… RFID Leser zum deaktivieren / scharf schalten auf der anderen).
    Viele Grüße

    • Hey,
      sorry für die späte Antwort.
      Ich habe die Empfängerspule allerdings nie wirklich verlängert. Ich denke hier musst Du einfach mal schauen ob im Datenblatt des Moduls dazu was angegeben ist, ansonsten ausprobieren ;.)
      An welche Länge dachtest Du denn? Also so 20-30cm sollten problemlos machbar sein.
      Gruß
      Christoph

  11. Hey,

    du sagst, man muss einen Spannungsteiler aus 2x 10kOhm Widerständen bauen. Wie genau baut man sowas bzw. wo muss ich was anschliessen?

    Hast du dazu eventuell auch eine kleine Skizze..? Habe von Elektrotechnik leider gar keine Ahnung 😀

    Vielen Dank und viele Gruesse :)

  12. Wie sieht es denn mit mehreren Metern aus?

    Muss man da noch eine Art Verstaerker einbauen?

    Gerade bei dem Tueroeffner per RFID ist es ja so, dass man den RPI nicht direkt an der Haustuer stehen hat.

    • Hey,
      kann dir da wirklich nichts genaues zu sagen. Habs leider nie ausprobiert.
      Würde sagen, probier's einfach 😉
      Wenn Du dann Erfahrung hast, würde ich mich freuen, wenn du davon berichtest.
      Gruß
      Christoph

  13. Guten Tag,

    ich habe folgendes Problem:

    File "RFID.py", line 16, in

    Zeichen = UART.read()

    File "/usr/lib/python2.7/dist-packages/serial/serialposix.py", line 442, in read

    ready,_,_ = select.select([self.fd],[],[], self._timeout)

    Mehr passiert leider nicht.

    Ich würde mich sehr über eine Antwort freuen.

    Mit freundlichen Grüßen Jochen

    • Hallo Jochen.
      Mit der Fehlermeldung kann ich gerade nicht viel anfangen.
      Hilfreich wären ein paar Infos:
      Wann kommt die Meldung? Beim Einlesen des RFID-Transponders? Direkt nach Programmstart?

      Es war ohnehin an der Zeit, den Programmtext zu überarbeiten.
      Ich habe ihn nun etwas eleganter gestaltet.
      Probier es mal damit und spiel mal etwas mit der Länge der zu lesenden Daten.
      Also "daten = ser.read(14)" auf 13 oder 15 anpassen.
      Nutzt Du Transponder des EM410X-Standards?

      Gruß
      Christoph

  14. Ich hatte das gleiche Problem (auch wenn eures schon etwas her ist).

    Der Fehler kam bei mir durch zu wenig "Saft" auf der Leitung.

    Mein Netzteil am PI lieferte 1,2A. Durch WLAN/Lesegerät/Spannungswandler/Tastatur stieg mir der kleine dauernd mit dem Fehler aus. Zum Testen nahm ich jetzt ein 5A 5V Netzteil das zusätzlich auf die GPIO Stromversorgung über das Breadboard gesteckt wurde und siehe da! Jede Eingabe läuft so wie sie soll. Später wird ein 12V 5-10A Netzteil mit Wandler auf 5V zum Einsatz kommen und genug Energie für den PI bereit stellen.

    Vermutlich fehlt dann Rechenpower bzw. kann der PI dann nicht genug Energie während des lesen für evtl. Schreibzugriffe bereit stellen.

    Grüße aus Oberfranken

  15. Servus Cristoph,

    hast du mit der Schaltung schon mal die Tierchips auslesen können? 134,2 khz, ISO 17854/17855. Vielen Dank!

    Gruß, Marco

  16. Hi Christoph & all die anderen,

    Hat von euch schon mal jemand mit dieser schaltung den RFID mit 134,2 khz zum laufen gebracht? Oder evtl auch mit dem IC u2270b?

    Gruß, Marco

  17. Geniales Projekt. Genau das was ich für unseren Kaffeautomat suche. Dankeschön. Werden die 5V für RFID Leser und LCD direkt vom Raspberry's GPIO Leiste genommen oder hast Du dafür nochmal ein zusätzliche Stromversorgung?

  18. Python3 Probleme

    Hallo, ich versuche aktuell die Abfrage in ein Python3 Script einzubringen.

    Wenn ich das Script hier als mit python rfid.py starte, funktioniert es soweit.

    Wenn ich es aber mit python3 rfid.py starte kommen Fehler.

    Als erstes musste ich diese beiden Zeilen auskommentieren:

    daten = daten.replace("x02", "" )

    daten = daten.replace("x03", "" )

    Danach wurde aus – print id – print (id) –

    damit erfolgen diese Kartennummern:

    Script normal mit Python: A9005AEFB9A5

    Script angepasst Python3: b'x02A9005AEFB9A5x03'

    Fehler bei Python3 und daten = daten.replace….:

    Traceback (most recent call last):

    File "rfid.py", line 17, in

    id = read_rfid()

    File "rfid.py", line 13, in read_rfid

    daten = daten.replace("x02", "" )

    TypeError: expected an object with the buffer interface

    Kartennummer ist übrigens 0005959609.

    Hat jemand eine Idee wie ich es ganz in Python3 umsetzen kann und

    gibt es irgendwie die Möglichkeit die Hexwerte gleich in Dezimal zu schreiben?

    Schönes Wochende und Grüße aus Oberfranken

    Christian

    • Hey, in Python 3 ganz einfach

      daten = daten.replace(b’x02′, b” ) daten = daten.replace(b’x03′, b” )

      Schau mal nach der Leseprobe, die ich im Beitrag verlinkt habe. Dort findest du das Kapitel aus dem überarbeiteten Handbuch. Dies ist komplett an Python 3 angepasst.

      Gruß

      Christoph

Kommentar verfassen