
Wenn Sie schon einmal an einer Selbstbedienungskasse im Supermarkt waren und gesehen haben, wie Ihre Artikel automatisch auf dem Bildschirm erscheinen, sobald Sie sie auf ein Tablett legen , haben Sie RFID bereits in Aktion erlebt. Es ist keine Magie oder technologische Telepathie: Es handelt sich um ein auf Funkfrequenzen basierendes System, mit dem sich Objekte berührungslos identifizieren lassen. Mit einem einfachen Arduino und einem günstigen Lesegerät wie dem RC522 können Sie das auch zu Hause nachbauen.
In dieser Anleitung lernen Sie Schritt für Schritt, wie Sie mit Arduino und einem RC522 RFID-Lesegerät Tags lesen und beschreiben. Sie erfahren, was RFID genau ist, welche Systemtypen es gibt, wie passive Karten mit Strom versorgt werden, wie der Speicher einer MIFARE Classic 1K-Karte organisiert ist und wie Sie praktische Projekte wie ein Zutrittskontrollsystem oder eine wiederaufladbare Fahrkarte realisieren. Machen Sie es sich bequem, denn wir werden das Thema gründlich, aber dennoch verständlich und anschaulich behandeln.
Was ist RFID-Technologie und wie funktioniert sie?
Die Radiofrequenzidentifikation (RFID) ist ein System, das die Identifizierung von Objekten mithilfe einer eindeutigen, per Funk übertragenen Kennung ermöglicht . Diese Kennung wird üblicherweise als UID (Unique ID) bezeichnet und kann als die ID des Tags betrachtet werden. Das vollständige System besteht aus zwei Hauptelementen: dem RFID-Tag (oder Transponder) und dem RFID-Lesegerät (Transceiver).
RFID-Tags gibt es in vielen verschiedenen Ausführungen: als kreditkartenähnliche Plastikkarten, Schlüsselanhänger, Aufkleber zur Diebstahlsicherung und sogar als Chips, die Tieren zur Identifizierung unter die Haut implantiert werden. Im Inneren verfügen sie alle über dieselben Komponenten: eine Antenne und einen kleinen Chip, der Informationen speichert und mit dem Lesegerät kommuniziert.
Es gibt schreibgeschützte Tags, deren UID werkseitig programmiert und nicht geändert werden kann, und lesbare/beschreibbare Tags, auf die ein geeignetes Lesegerät, wie beispielsweise das RC522-Modul, Daten sowohl lesen als auch schreiben kann . Dies ermöglicht Anwendungen wie wiederaufladbare Fahrkarten, Zutrittskontrollsysteme mit Prepaid-Guthaben, Zeiterfassungssysteme und vieles mehr.
Auf der anderen Seite gibt es den RFID-Leser bzw. -Transceiver. Dieses Gerät empfängt nicht nur Daten, sondern sendet auch ein elektromagnetisches Feld im Hochfrequenzbereich aus . Dieses Feld ist entscheidend, um zu verstehen, wie passive Tags mit Energie versorgt werden und wie der Informationsaustausch zwischen Karte und Leser stattfindet.
Stromversorgung und Funktionsprinzip von RFID-Tags
Eine häufig gestellte Frage lautet: Wenn die RFID-Etiketten auf Supermarktprodukten oder Zugangskarten keine Batterien enthalten, woher beziehen sie dann die Energie, um zu funktionieren? Die Antwort liegt darin, dass viele dieser Tags passiv sind und durch elektromagnetische Induktion des vom Lesegerät erzeugten Feldes mit Energie versorgt werden.
Wenn Sie einen passiven Tag in die Nähe eines Lesegeräts bringen, tritt seine Antenne in das vom Modul erzeugte elektromagnetische Feld ein (beispielsweise bei 13,56 MHz im Fall des RC522). Dieses Feld induziert einen Strom in der Antenne des Tags, der den internen Chip kurzzeitig mit Strom versorgt . Sobald der Chip „aktiv“ ist, moduliert er das Signal, das er an das Lesegerät zurücksendet (dieser Vorgang wird als Rückstreuung bezeichnet) und kodiert dabei die UID und gegebenenfalls weitere im Speicher abgelegte Daten.
Im Gegensatz zu Technologien wie Infrarot ist keine direkte Sichtverbindung zwischen Tag und Lesegerät erforderlich : Radiofrequenzen können bestimmte Materialien durchdringen, wobei ihr Verhalten von der Frequenz, dem Vorhandensein von Metall, Wasser usw. abhängt. Das Lesegerät erfasst das rückgestreute Signal, interpretiert es und sendet die Daten anschließend an einen Mikrocontroller (wie Arduino, ESP8266 oder ESP32) oder einen Computer.
Arten von RFID-Systemen nach Frequenz
Das Funkfrequenzspektrum ist sehr breit, und Funkwellen verhalten sich nicht bei allen Frequenzen gleich . Daher werden in der RFID-Technologie je nach Anwendung unterschiedliche Frequenzbänder verwendet. Lesegerät und Tag müssen so ausgelegt sein, dass sie auf derselben Frequenz arbeiten, genau wie ein Radio auf den richtigen Sender eingestellt werden muss.
Generell lassen sich RFID-Systeme anhand des verwendeten Frequenzbands in drei Hauptkategorien einteilen:
- Niederfrequenz (NF)etwa 125-134 kHz.
- Hochfrequenz (HF): etwa 13,56 MHz, wozu auch Technologien wie MIFARE und NFC gehören.
- Ultrahochfrequenz (UHF): zwischen ungefähr 433 MHz und 860-960 MHz.
Niederfrequenz-RFID-Systeme (LF)
Niederfrequente RFID-Systeme verfügen über eine relativ lange Wellenlänge, wodurch sie dünne Materialien und Objekte mit hohem Wassergehalt , wie beispielsweise Obst oder Getränke, besser durchdringen können. Auch in der Nähe dünner Metalle funktionieren sie recht gut.
Dieser Vorteil bringt jedoch erhebliche Einschränkungen mit sich: Die typische Reichweite beträgt nur wenige Zentimeter, und die Datenübertragungsrate ist gering, was zu einer reduzierten Speicherkapazität und höheren Kosten für die Tags führt . Solche Systeme werden häufig für einfache Zutrittskontrolle, ältere Proximity-Schlüssel und die Tierkennzeichnung eingesetzt.
Hochfrequenz-RFID- und NFC-Systeme (HF-RFID und NFC)
Das Hochfrequenzband bei 13,56 MHz ist wahrscheinlich das beliebteste auf der Ebene von Bastlern und Heimwerkerprojekten, denn dort befinden sich die MIFARE-Karten und die NFC-Technologie (Near Field Communication) , die viele Mobiltelefone für kontaktloses Bezahlen nutzen.
HF-Systeme funktionieren gut in der Nähe von Metall und bei mittlerem bis hohem Wassergehalt. Unter idealen Bedingungen bieten sie typischerweise eine Reichweite von wenigen Zentimetern bis zu etwa einem Meter . Die Datenraten sind zwar moderat, aber für Anwendungen zur Identifizierung, zum Zugriff und zur Übertragung kleiner Datenmengen ausreichend. Viele globale Standards basieren auf HF und ermöglichen so die Interoperabilität von Geräten und Karten.
Ultrahochfrequenz-RFID-Systeme (UHF)
Am anderen Ende des Spektrums befinden sich UHF-Systeme, die Reichweiten von wenigen Zentimetern bis über 20 Metern ermöglichen. Sie eignen sich ideal, wenn viele Tags schnell und aus der Ferne gelesen werden müssen , beispielsweise für die Bestandsverwaltung in Lagerhallen, die Personenzählung bei Veranstaltungen oder die Zeitmessung von Athleten beim Überqueren der Ziellinie.
Der Nachteil besteht darin, dass das Signal aufgrund der kürzeren Wellenlänge stärker gedämpft wird und Metall und Wasser weniger effektiv durchdringt . Trotzdem werden sie häufig in Mautsystemen, Parkraumbewirtschaftungsanlagen und der großflächigen Logistikverfolgung eingesetzt.
Das RC522 RFID-Modul: Funktionen und Pins
Für Arduino-Projekte ist der RC522, basierend auf dem NXP MFRC522-Chip, einer der beliebtesten Reader. Es handelt sich um ein sehr preiswertes und weit verbreitetes Modul, das mit einer hohen Frequenz (13,56 MHz) mit MIFARE-Karten arbeitet und sowohl das Lesen als auch das Schreiben kompatibler Tags ermöglicht.
Das Lesegerät wird üblicherweise als Set angeboten, bestehend aus dem Lesegerät selbst, einer Kreditkarte und einem RFID-Schlüsselanhänger. Bei diesen Karten handelt es sich typischerweise um 1K- oder 4K-MIFARE-Classic-Karten – ein weit verbreiteter Standard in den Bereichen Transport, Zutrittskontrolle und kostengünstige Lösungen. Das RC522 erzeugt ein elektromagnetisches HF-Feld, dessen praktische Reichweite bei etwa 3–5 cm liegt, theoretisch aber auch etwas größer sein kann.
Die Kommunikation des RC522 mit dem Mikrocontroller erfolgt primär über SPI (Serial Peripheral Interface) und unterstützt Geschwindigkeiten bis zu 10 Mbit/s. Er unterstützt auch I2C und UART, wobei in den meisten Arduino-Projekten aufgrund der höheren Geschwindigkeit und der einfacheren Handhabung SPI verwendet wird.
Das Modul arbeitet mit einer Versorgungsspannung zwischen 2,5 V und 3,3 V. Die Platine verfügt üblicherweise über einen deutlich gekennzeichneten VCC-Pin zum Anschluss an 3,3 V. Schließen Sie das Modul nicht direkt an 5 V an , da dies zu Beschädigungen führen kann. Positiv ist, dass die Logikpegel im Allgemeinen 5 V tolerieren. Daher kann das Modul für einfache Tests ohne Pegelwandler an die digitalen Pins eines Arduino UNO angeschlossen werden. In professionellen Anwendungen ist jedoch eine Pegelanpassung empfehlenswert.
Pinning des RC522-Moduls
Der typische RC522 verfügt über 8 Anschlusspins zum Mikrocontroller:
- VCC: Stromversorgung, zwischen 2,5 V und 3,3 V.
- RST: Reset-Pin; ermöglicht das Ausschalten und Neustarten des Moduls durch Einstellen des Pegels auf LOW/HIGH.
- GND: Masse oder Bezugspunkt der Erde.
- IRQ: Interrupt-Pin, der den Mikrocontroller alarmieren kann, wenn ein Tag in das Lesefeld gelangt.
- MISO / SCL / TX: Multifunktionspin; wie z. B. MISO bei SPI, SCL bei I2C oder TX bei UART.
- MOSI: Ausgabedatenleitung vom Master zum Slave im SPI-Interface.
- SCK: SPI-Schnittstellentakt.
- SS / SDA / RX: Slave-Auswahlpin bei SPI, SDA bei I2C oder RX bei UART.
Bei Arduino UNO und anderen ATmega328P-basierten Boards sind die SPI-Pins bereits hardwareseitig definiert, daher sieht das typische Anschlussdiagramm für die Verwendung von SPI wie folgt aus:
- VCC → 3,3 V vom Arduino.
- GND → Arduino GND.
- SCK → Pin 13 bei UNO/Nano.
- MOSI → Pin 11 bei UNO/Nano.
- MISO → Pin 12 bei UNO/Nano.
- SS (SDA) → Pin 10 (oder der von Ihnen als SS gewählte Pin, der jedoch im Code angegeben werden muss).
- RST → zum Beispiel Arduino Pin 9.
- IRQ → Optional, kann unverbunden bleiben, wenn kein Interrupt verwendet wird.
Bei Boards wie Arduino Mega, Leonardo oder Micro können sich die SPI-Leitungen an verschiedenen Pins oder am ICSP-Anschluss befinden. Daher ist es wichtig, vor dem Verdrahten die Äquivalenztabelle in der offiziellen Dokumentation zu überprüfen .
Installation der MFRC522-Bibliothek und grundlegendes Tag-Lesen
Obwohl der MFRC522 von Grund auf programmiert werden kann, ist seine interne Kommunikation recht komplex. Daher ist es üblich, die von Miguel Balboa entwickelte Bibliothek zu verwenden , die auf GitHub und im Bibliotheksmanager der Arduino IDE verfügbar ist. Diese Bibliothek kapselt alle notwendigen Operationen zum Initialisieren des Lesegeräts, Erkennen von Karten, Authentifizierung von Sektoren sowie zum Lesen und Schreiben von Blöcken.
Um die Bibliothek über die Arduino IDE zu installieren, öffnen Sie einfach den Bibliotheksverwalter, suchen Sie nach „MFRC522“ und wählen Sie die von der Community gepflegte Version (GitHub Community) aus . Sie benötigen außerdem die SPI-Bibliothek, die bereits in der IDE enthalten ist.
Nach der Installation sieht der typische Ablauf in einem einfachen Sketch zum Auslesen der UID eines Labels wie folgt aus:
- Buchhandlungen miteinbeziehen SPI.hy MFRC522.h.
- Definieren Sie die RST- und SS-Pins, die der Leser verwenden wird.
- Erstelle ein MFRC522-Objekt, indem du ihm diese Pins übergibst.
- Initialisieren Sie in setup() die serielle Schnittstelle, SPI und den Leser mit PCD_Init().
- In loop() verwenden PICC_IsNewCardPresent() um herauszufinden, ob sich eine Karte in der Nähe befindet und PICC_ReadCardSerial() um Ihre Basisdaten zu lesen.
- Greifen Sie auf die UID zu mit mfrc522.uid.uidByte und auf die Größe mit mfrc522.uid.size.
- Beenden Sie die Kommunikation mit dem Label durch einen Anruf. PICC_HaltA().
Diese Art von Skizze eignet sich perfekt, um die UID mehrerer Karten oder Schlüsselanhänger zu ermitteln und schnelle Tests durchzuführen, beispielsweise für einfache Zugangskontrollen, bei denen nur die gelesene UID mit einer Liste autorisierter UIDs verglichen wird.
Speicherstruktur in MIFARE Classic 1K-Karten
Die dem RC522 üblicherweise beiliegenden Speicherkarten sind typischerweise MIFARE Classic 1K . Diese Karten bieten 1 KB Speicher, der hierarchisch in Sektoren und Blöcke unterteilt ist, mit einem recht ungewöhnlichen Schlüssel- und Berechtigungssystem, das man verstehen sollte, bevor man etwas darauf schreibt.
Der Speicher ist in 16 Sektoren unterteilt, die von 0 bis 15 nummeriert sind. Jeder Sektor enthält 4 Blöcke, die innerhalb des Sektors von 0 bis 3 nummeriert sind. Jeder Block speichert 16 Byte Daten , d. h. 16 Speicherplätze, die von 0 bis 15 nummeriert sind. Somit bietet jeder Sektor 64 Byte Speicherkapazität.
Von den vier Blöcken pro Sektor sind nur drei für die Speicherung von Benutzerdaten vorgesehen: die Blöcke 0, 1 und 2 jedes Sektors (mit Ausnahme von Sektor 0, der besondere Eigenschaften aufweist). Der letzte Block jedes Sektors, Block 3, wird als Trailer-Block bezeichnet . Er speichert die Verschlüsselungsschlüssel und Zugriffsbits, die festlegen, welche Operationen in diesem Sektor zulässig sind.
Im Trailer sind die 16 Bytes wie folgt aufgeteilt:
- Schlüssel A: 6 Bytes.
- Zugangsbedingungen: 3 Bytes, die Lese-/Schreibberechtigungen, Authentifizierung und Schlüsselsichtbarkeit definieren.
- Unbenutztes Byte (U): 1 Byte, das nicht verwendet wird.
- Taste B: 6 Bytes.
Die werkseitig mit den Modulen gelieferten Karten haben üblicherweise die Schlüssel A und B mit dem Zeichensatz FF FF FF FF FF FF initialisiert . Dies ist extrem unsicher, da jeder, der den Standard kennt, die Karteninhalte authentifizieren und verändern kann. Bei DIY-Projekten ist es relativ üblich, für alle Sektoren dieselben Schlüssel zu verwenden. Für echte Sicherheit wäre jedoch eine Diversifizierung der Schlüssel ratsam.
Darüber hinaus ist Block 0 von Sektor 0 von besonderer Bedeutung: Er speichert die UID der Karte (üblicherweise 4 Byte bei diesen MIFARE Classic-Karten) und Herstellerdaten. Dieser Block ist in der Praxis schreibgeschützt; jeder Änderungsversuch kann die Karte irreparabel beschädigen.
Ändern Sie die Tasten A und B in einem Sektor
Wenn Sie eine MIFARE-Karte in einem Arduino- und RC522-Projekt sinnvoll nutzen möchten, sollten Sie als Erstes die Standardtasten ändern . Dadurch wird verhindert, dass jemand mit einem Lesegerät und der Standardbibliothek Ihre Karte ohne Autorisierung manipuliert.
Die Grundidee für die Aktualisierung der Schlüssel eines bestimmten Sektors (z. B. Sektor 15) ist folgende:
- Definieren Sie die aktuellen Schlüssel im Code (die Werkseinstellungen, sofern diese nicht geändert wurden).
- Definieren Sie die neuen Schlüsselwörter A und B, die Sie in diesem Sektor verwenden möchten.
- Berechnen Sie die Trailerblocknummer für diesen Sektor, die lautet: Sektor * 4 + 3 (für Sektor 15, Block 63).
- Authentifizieren Sie sich zuerst mit dem aktuellen Schlüssel A. PCD_Authenticate() zum Anhängerblock.
- Lesen Sie den Trailerblock mit MIFARE_Read() um Ihre Inhalte zu erhalten.
- Die den neuen Schlüsseln entsprechenden Bytes in einem Puffer werden verändert.
- Authentifizieren Sie sich gegebenenfalls erneut (zum Beispiel mit Schlüssel B).
- Schreiben Sie den aktualisierten Trailerblock mit MIFARE_Write().
Während dieses Vorgangs ist es entscheidend, die Karte nicht vom Lesegerät zu entfernen, bis die Operation abgeschlossen ist , da ein unterbrochener Schreibvorgang in den Trailerblock den Sektor unzugänglich machen könnte. Sobald die Schlüssel geändert wurden, müssen Sie außerdem den Arduino-Code aktualisieren, um diese neuen Schlüssel bei zukünftigen Operationen auf diesem Sektor zu verwenden.
Lese- und Schreibblöcke: Simulation einer Fahrkarte
Eine sehr anschauliche Anwendung des Lesens und Schreibens mit MIFARE Classic ist die Simulation des Verhaltens einer wiederaufladbaren Fahrkarte für den öffentlichen Nahverkehr . Die Idee ist einfach: Die Karte speichert eine Anzahl von Fahrten in einem bestimmten Block, und das System ermöglicht es, Fahrten aufzuladen (aufzuladen) oder sie zu nutzen (Validierung beim Einsteigen in Bus oder Straßenbahn).
Zu diesem Zweck könnte beispielsweise Sektor 15 für Benutzerdaten reserviert werden, und einer seiner Datenblöcke (z. B. Block 60) könnte zur Speicherung des Fahrtenzählers verwendet werden. Die Anzahl der verfügbaren Fahrten wird in Byte 0 des Blocks gespeichert. Die übrigen Bytes des Blocks könnten für andere Daten verwendet oder einfach auf Null gesetzt werden.
Der typische Codeablauf für den Reload-Teil wäre:
- Definieren Taste A und Taste B die geltenden Vorschriften, die den betreffenden Sektor schützen (zum Beispiel diejenigen, die wir im vorherigen Schritt geändert haben).
- Definiere die Sektornummer, den Datenblock (60) und den Trailerblock (63).
- Deklarieren Sie ein 16-Byte-Array (blockData), wobei das erste Byte die Anzahl der Fahrten darstellt.
- Jedes Mal, wenn eine Karte in die Nähe des Lesers gebracht wird, Lies Block 60 Mit MIFARE_Read() können die aktuellen Fahrten abgerufen werden.
- Addieren Sie die Anzahl der Fahrten zum Aufladen (zum Beispiel 10) zu dem abgelesenen Wert.
- Daten aktualisieren. Mit der neuen Anzahl an Fahrten blockieren.
- Authentifizieren Sie sich mit Schlüssel A gegenüber dem entsprechenden Trailerblock.
- Schreibe Block 60 mit MIFARE_Write().
- Lesen Sie den Wert erneut, um sicherzustellen, dass er korrekt aktualisiert wurde.
Für den Teil zur Abrechnung der Fahrten (Validierung im Bus) ist der Code praktisch identisch, nur dass statt einer Addition eins vom Zähler abgezogen wird. Vor der Subtraktion wird geprüft, ob der gelesene Wert null ist: Sind keine Fahrten mehr verfügbar, wird der Zugriff verweigert und der Benutzer zum Neuladen aufgefordert . Ist der Zähler größer als null, wird er dekrementiert, der Codeblock neu geschrieben und die Anzahl der verbleibenden Fahrten auf dem Bildschirm angezeigt.
In beiden Fällen ist es wichtig, die Rückgabewerte der MFRC522-Bibliotheksfunktionen (z. B. Authentifizierungs- oder Schreibfehler) korrekt zu behandeln und am Ende jedes Zyklus die verschlüsselte Kommunikation mit PCD_StopCrypto1() und die Karte selbst mit PICC_HaltA() zu beenden .
Einfache Zugriffskontrolle basierend auf UID
Ein weiteres klassisches Projekt mit dem RC522 und Arduino ist ein einfaches Zutrittskontrollsystem, bei dem der Zutritt anhand der UID der Platine gewährt oder verweigert wird. Dieser Ansatz nutzt nicht den internen Speicher der Platine, sondern nur deren eindeutige Kennung und ist daher in puncto Sicherheit recht eingeschränkt, dient aber als schnelles Beispiel.
Die übliche Vorgehensweise ist:
- Lesen Sie die Karten-UID mithilfe der grundlegenden Bibliotheksfunktionen (PICC_IsNewCardPresent, PICC_ReadCardSerial usw.).
- Kopiere die Bytes der gelesenen UID in ein temporäres Array (z. B. ActualUID).
- Definieren Sie im Code mehrere Arrays mit den UIDs der autorisierten Karten (zum Beispiel User1, User2).
- Erstellen Sie eine Byte-Array-Vergleichsfunktion, die Folgendes zurückgibt: wahr, wenn beide identisch sind.
- Vergleiche ActualUID mit jeder autorisierten UID und aktiviere im Falle einer Übereinstimmung einen digitalen Ausgang, zeige die Meldung „Zugriff gewährt“ an oder aktiviere ein elektrisches Schloss.
- Wenn es mit keinem der Einträge übereinstimmt, wird „Zugriff verweigert“ angezeigt und das System bleibt geschlossen.
In der Praxis ist ein solches System anfällig für Tag-Cloning, da viele kostengünstige Lesegeräte das Kopieren oder Emulieren von UIDs ermöglichen. Um die Sicherheit zu erhöhen, wären der interne Speicher der Karte, benutzerdefinierte Schlüssel und möglicherweise robustere kryptografische Mechanismen als die von MIFARE Classic erforderlich, deren Sicherheit derzeit stark infrage gestellt wird. Dennoch eignet es sich hervorragend als didaktisches Beispiel, um den Workflow des Kartenlesens und die Integration mit physischen Aktoren zu erlernen.
Nach all dem haben Sie nun die grundlegenden RFID-Konzepte sicher verstanden, kennen das Verhalten verschiedener Frequenzbänder, wissen, wie eine MIFARE Classic 1K-Karte funktioniert, beherrschen die grundlegende Verbindung und Verwendung des RC522-Moduls mit Arduino und haben detailliert gesehen, wie man Blöcke liest und beschreibt, um reale Systeme wie Zutrittskontroll- oder Fahrkarten zu erstellen . Der nächste logische Schritt ist nun, RFID mit anderen Modulen (LCD-Bildschirmen, Relais, WLAN, Cloud-Datenbanken) zu kombinieren und zu lernen, wie man intelligente Glühbirnen steuert , um umfassendere Lösungen zu entwickeln, die den professionellen Systemen, die Sie täglich in Geschäften, im öffentlichen Nahverkehr und bei kontaktlosen Zahlungsgeräten sehen, noch näher kommen.
