RFID mit dem RC522 am Arduino auslesen

FunduinoZuletzt aktualisiert am

Karten und Schlüsselanhänger erkennen und damit LEDs schalten

Der RFID-Empfänger („radio-frequency identification“) liest von RFID-Sendern – auch „RFID-Tags“ genannt – per Funk einen bestimmten Code aus. Jeder Sender hat dabei einen einmaligen, ganz individuellen Code. Damit kannst du mit dem Arduino Schließanlagen oder ähnliche Projekte verwirklichen, bei denen sich eine Person mit einem Sender identifizieren soll.

RFID-Tags können verschiedene Formen haben, zum Beispiel Schlüsselanhänger oder Karten im Kreditkartenformat. Auf dem Bild siehst du links zwei RFID-Tags und rechts den RFID-Empfänger.

Ein RFID-Empfänger enthält eine kleine Kupferspule, die ein magnetisches Feld erzeugt. Ein RFID-Sender enthält ebenfalls eine Kupferspule, die das magnetische Feld aufgreift und im Sender eine elektrische Spannung erzeugt. Diese Spannung bringt dann einen kleinen elektronischen Chip dazu, per Funk einen elektrischen Code auszusenden. Diesen Code kann der Mikrocontroller anschließend weiterverarbeiten.

Aufgabe: Mit einem Arduino-Mikrocontroller liest du einen RFID-Tag aus. Im nächsten Schritt schaltest du zwei LEDs mit zwei verschiedenen Karten ein und aus.

RFID-Kit mit Mifare RC522: links zwei RFID-Tags, rechts der RFID-Empfänger
Mifare RC522 RFID-Kit

Den RFID-Empfänger verkabeln

Der RFID-Empfänger RFID-RC522 hat eine bereits angelötete 90°-Stiftleiste. Es gibt auch Versionen, bei denen du die Stiftleiste selbst an den RFID-Empfänger löten musst.

So verkabelst du den RFID-Empfänger mit dem Arduino-Board:

  • SDA – Pin 10 am UNO, Pin 53 am Mega
  • SCK – Pin 13 am UNO, Pin 52 am Mega
  • MOSI – Pin 11 am UNO, Pin 51 am Mega
  • MISO – Pin 12 am UNO, Pin 50 am Mega
  • IRQ – bleibt unbelegt
  • RST – Pin 9 am UNO, Pin 5 am Mega
  • GND – GND
  • 3,3V – 3,3V

Die Sketche in dieser Anleitung sind für den UNO R3 vorgesehen. Beim MEGA2560 und bei anderen Controllern musst du die Pins entsprechend anpassen.

Schaltplan mit RFID-Empfänger RC522 am Arduino UNO sowie gelber LED an Pin 7 und grüner LED an Pin 6
Schaltplan: RC522 und zwei LEDs am Arduino UNO
Übersicht der Anschlüsse des RFID-Empfängers RC522 am Arduino UNO
Anschlüsse des RFID-Empfängers am Arduino UNO
1 / 2

Die Library MFRC522 installieren

Beim Auslesen und Verarbeiten der Daten eines RFID-Empfängers wären – wie auch bei anderen komplexen Aufgaben – sehr viele Zeilen Quellcode erforderlich. Deshalb bedienen wir uns einer vorgefertigten Library.

Die Library „MFRC522“ von GithubCommunity findest du im Bibliotheksverwalter über den Suchbegriff „MFRC522“ und installierst sie von dort. Wie das genau geht, liest du unter Bibliotheken zur Arduino-Software hinzufügen.

Bibliotheksverwalter der Arduino-Software mit dem Suchergebnis MFRC522 von GithubCommunity
Die Library MFRC522 im Bibliotheksverwalter

Die UID eines RFID-Tags auslesen

Zunächst liest du die UID („Unique Identification Number“) aus, also die individuelle Bezeichnung eines RFID-Tags. Dazu verwendest du das folgende Programm.

Wenn alles funktioniert hat, zeigt der Serielle Monitor den Dezimalwert der vorgehaltenen Karte an.

Das Programm funktioniert nur, wenn du die Library wie in Schritt 2 beschrieben zur Arduino-Software hinzugefügt hast.

Ausgabe im Seriellen Monitor: Karte entdeckt und der Dezimalwert der UID
So sieht das Ergebnis im Seriellen Monitor aus
Programmcode – UID eines RFID-Tags auslesen
// RFID-Bibliothek hinzufügen
#include "MFRC522.h"
// Anschlüsse definieren
#define SDA 10
#define RST 9
// RFID-Empfänger benennen, Pins zuordnen
MFRC522 mfrc522(SDA, RST);
void setup()
{
  Serial.begin(9600);
  SPI.begin();
  // Initialisierung des RFID-Empfängers
  mfrc522.PCD_Init();
}
void loop()
{
  String WertDEZ;
  // Wenn keine Karte in Reichweite ist ..
  if (!mfrc522.PICC_IsNewCardPresent())
  {
    // .. wird die Abfrage wiederholt.
    return;
  }
  // Wenn kein RFID-Sender ausgewählt wurde ..
  if (!mfrc522.PICC_ReadCardSerial())
  {
    // .. wird die Abfrage wiederholt.
    return;
  }
  Serial.println("Karte entdeckt!");
  // Dezimal-Wert in Strings schreiben
  for (byte i = 0; i < mfrc522.uid.size; i++)
  {
    // String zusammenbauen
    WertDEZ = WertDEZ + String(mfrc522.uid.uidByte[i], DEC) + " ";
  }
  // Kennung dezimal anzeigen
  Serial.println("Dezimalwert: " + WertDEZ);
  // kurze Pause, damit nur ein Wert gelesen wird
  delay(1000);
}

Erweiterung: Zwei LEDs mit zwei Karten schalten

Jetzt erweiterst du das Programm: Hältst du eine bestimmte Karte vor den Empfänger, soll entweder die grüne oder die gelbe LED leuchten. Hältst du dieselbe Karte erneut vor den RFID-Empfänger, geht die entsprechende LED wieder aus.

Erklärung zur Erweiterung: Die LEDs definierst du mit define an den Pins 6 und 7. Den Zustand der LEDs (StatusgelbeLED und StatusgrueneLED) setzt du auf false – die LEDs sind beim Start also ausgeschaltet. Die Variable WertDEZ enthält die individuelle UID der Karte.

Wird die korrekte UID erkannt, schaltet das Programm die gelbe LED ein oder aus: Die Variable StatusgelbeLED wird „umgedreht“, aus false wird true und die LED leuchtet. Hältst du die Karte erneut vor, wird aus true wieder false und die gelbe LED geht aus. Mit der grünen LED passiert danach das Gleiche.

Natürlich musst du die im Beispiel genannten UIDs durch die UIDs ersetzen, die du in Schritt 3 selbst ermittelt hast.

Programmcode – Zwei LEDs mit zwei Karten schalten
// RFID-Bibliothek hinzufügen
#include "MFRC522.h"
// Anschlüsse definieren
#define SDA 10
#define RST 9
// LEDs
#define grueneLED 6
#define gelbeLED 7
// Zustand der LEDs false = beim Start ausgeschaltet
bool StatusgelbeLED = false;
bool StatusgrueneLED = false;
// RFID-Empfänger benennen, Pins zuordnen
MFRC522 mfrc522(SDA, RST);
void setup()
{
  Serial.begin(9600);
  SPI.begin();
  // Initialisierung des RFID-Empfängers
  mfrc522.PCD_Init();
  pinMode(gelbeLED, OUTPUT);
  pinMode(grueneLED, OUTPUT);
}
void loop()
{
  String WertDEZ;
  // Wenn keine Karte in Reichweite ist ..
  if (!mfrc522.PICC_IsNewCardPresent())
  {
    // .. wird die Abfrage wiederholt.
    return;
  }
  // Wenn kein RFID-Sender ausgewählt wurde ..
  if (!mfrc522.PICC_ReadCardSerial())
  {
    // .. wird die Abfrage wiederholt.
    return;
  }
  Serial.println("Karte entdeckt!");
  // Dezimal-Wert in Strings schreiben
  for (byte i = 0; i < mfrc522.uid.size; i++)
  {
    WertDEZ = WertDEZ + String(mfrc522.uid.uidByte[i], DEC) + " ";
  }
  // trim() -> Leerzeichen am Ende des Strings entfernen
  WertDEZ.trim();
  // Kennung dezimal anzeigen
  Serial.println("Dezimalwert: " + WertDEZ);
  // gelbe LED schalten
  if (WertDEZ == "67 217 130 21")
  {
    // Status ändern an/aus
    StatusgelbeLED = !StatusgelbeLED;
    digitalWrite(gelbeLED, StatusgelbeLED);
  }
  // grüne LED schalten
  if (WertDEZ == "3 208 23 23")
  {
    // Status ändern
    StatusgrueneLED = !StatusgrueneLED;
    digitalWrite(grueneLED, StatusgrueneLED);
  }
  // Die Wartezeit verhindert, dass dieselbe Karte mehrfach hintereinander erkannt wird
  delay(1000);
}
Anleitung bewerten

Kommentare

Frage stellen oder Erfahrung teilen

Schreib uns, wenn etwas nicht funktioniert. Nenne dabei dein Board und die Fehlermeldung.

Wir prüfen jeden Kommentar vor der Veröffentlichung. Deine E-Mail-Adresse bleibt bei uns.