In diesem längeren Youtube-Video zeige ich, wie man einen RFID Transponder (auch RFID Tag oder RFID Token genannt) mit einem MFRC-522 Modul als Lesegerät am Arduino auslesen und damit eine einfache Schaltung steuern kann.

Die meisten MFRC-522 Card Reader Module für den Arduino enthalten einen blauen Token und zusätzliche eine weiße RFID Karte mit unterschiedlichen UIDs. Diese lassen sich auslesen und damit kann man, wie im Video gezeigt, mit dem Arduino verschiedene Aktionen auslösen, z.B. LEDs ein- und ausschalten oder einen Servo für ein Schloss steuern.

Die beiden im Video verwendeten Arduino Sketches gibts am Ende der Seite:

Hier der Sketch zum Auslesen der UID.

Die eingebunden MFRC522-Library kann man über den Library Manager der Arduino IDE installieren („Sketch“->“Include library“->“Manage libraries“). Dort einfach „mfrc522“ ins Suchfeld eingeben und die angezeigte Library installieren.

Sketch 1 – RFID Transponder UID auslesen:

/*
 * Typical pin layout used:
 * -----------------------------------------------------------------------------------------
 *             MFRC522      Arduino       Arduino   Arduino    Arduino          Arduino
 *             Reader/PCD   Uno/101       Mega      Nano v3    Leonardo/Micro   Pro Micro
 * Signal      Pin          Pin           Pin       Pin        Pin              Pin
 * -----------------------------------------------------------------------------------------
 * RST/Reset   RST          9             5         D9         RESET/ICSP-5     RST
 * SPI SS      SDA(SS)      10            53        D10        10               10
 * SPI MOSI    MOSI         11 / ICSP-4   51        D11        ICSP-4           16
 * SPI MISO    MISO         12 / ICSP-1   50        D12        ICSP-1           14
 * SPI SCK     SCK          13 / ICSP-3   52        D13        ICSP-3           15
 */

#include <SPI.h>
#include <MFRC522.h>

#define RST_PIN   9     // SPI Reset Pin
#define SS_PIN    10    // SPI Slave Select Pin

MFRC522 mfrc522(SS_PIN, RST_PIN);   // Instanz des MFRC522 erzeugen

void setup() {
  // Diese Funktion wird einmalig beim Start ausgeführt
  Serial.begin(9600);  // Serielle Kommunikation mit dem PC initialisieren
  SPI.begin();         // Initialisiere SPI Kommunikation
  mfrc522.PCD_Init();  // Initialisiere MFRC522 Lesemodul
}

void loop() {
  // Diese Funktion wird in Endlosschleife ausgeführt

  // Nur wenn eine Karte gefunden wird und gelesen werden konnte, wird der Inhalt von IF ausgeführt
  // PICC = proximity integrated circuit card = kontaktlose Chipkarte
  if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial() ) {
    Serial.print("Gelesene UID:");
    for (byte i = 0; i < mfrc522.uid.size; i++) {
      // Abstand zwischen HEX-Zahlen und führende Null bei Byte < 16
      Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
      Serial.print(mfrc522.uid.uidByte[i], HEX);
    } 
    Serial.println(); 

    // Versetzt die gelesene Karte in einen Ruhemodus, um nach anderen Karten suchen zu können.
    mfrc522.PICC_HaltA();
    delay(1000);
  }
}

und der etwas längere 2. Sketch, mit dem 2 LEDs an Pin 3 & 5 gesteuert werden:

/*
 * Typical pin layout used:
 * -----------------------------------------------------------------------------------------
 *             MFRC522      Arduino       Arduino   Arduino    Arduino          Arduino
 *             Reader/PCD   Uno/101       Mega      Nano v3    Leonardo/Micro   Pro Micro
 * Signal      Pin          Pin           Pin       Pin        Pin              Pin
 * -----------------------------------------------------------------------------------------
 * RST/Reset   RST          9             5         D9         RESET/ICSP-5     RST
 * SPI SS      SDA(SS)      10            53        D10        10               10
 * SPI MOSI    MOSI         11 / ICSP-4   51        D11        ICSP-4           16
 * SPI MISO    MISO         12 / ICSP-1   50        D12        ICSP-1           14
 * SPI SCK     SCK          13 / ICSP-3   52        D13        ICSP-3           15
 */

#include <SPI.h>
#include <MFRC522.h>

#define RST_PIN   9     // SPI Reset Pin
#define SS_PIN    10    // SPI Slave Select Pin

MFRC522 mfrc522(SS_PIN, RST_PIN);   // Instanz des MFRC522 erzeugen

byte blue_uid[] = {0x20, 0x89, 0x87, 0x15};
byte red_uid[] = {0xD2, 0xFB, 0x2C, 0x5B};

int blue_led = 5; // Pin der blauen LED
int red_led = 3; // Pin der roten LED

int blue_check = false;
int red_check = false;


void setup() {
  // Diese Funktion wird einmalig beim Start ausgeführt
  Serial.begin(9600);  // Serielle Kommunikation mit dem PC initialisieren
  SPI.begin();         // Initialisiere SPI Kommunikation
  mfrc522.PCD_Init();  // Initialisiere MFRC522 Lesemodul
  pinMode(blue_led, OUTPUT);
  pinMode(red_led, OUTPUT);
}

void loop() {
  // Diese Funktion wird in Endlosschleife ausgeführt

  // Nur wenn eine Karte gefunden wird und gelesen werden konnte, wird der Inhalt von IF ausgeführt
  // PICC = proximity integrated circuit card = kontaktlose Chipkarte
  if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial() ) {
    Serial.print("Gelesene UID:");
    for (byte i = 0; i < mfrc522.uid.size; i++) {
      // Abstand zwischen HEX-Zahlen und führende Null bei Byte < 16
      Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
      Serial.print(mfrc522.uid.uidByte[i], HEX);
    } 
    Serial.println();
  
    // UID Vergleichen mit blue_uid
    blue_check = true;
    for (int j=0; j<4; j++) {
      if (mfrc522.uid.uidByte[j] != blue_uid[j]) {
        blue_check = false;
      }
    }
  
    // UID Vergleichen mit red_uid
    red_check = true;
    for (int j=0; j<4; j++) {
      if (mfrc522.uid.uidByte[j] != red_uid[j]) {
        red_check = false;
      }
    }
  
    if (blue_check) {
      digitalWrite(blue_led, HIGH);
    }
    
    if (red_check) {
      digitalWrite(red_led, HIGH);
    }

    // Versetzt die gelesene Karte in einen Ruhemodus, um nach anderen Karten suchen zu können.
    mfrc522.PICC_HaltA();
    delay(1000);
    digitalWrite(blue_led, LOW);
    digitalWrite(red_led, LOW);
  }

}

Das vorgestellte MFRC-522 RFID Card Reader Modul kann man einzeln oder als Teil eines Arduino Starter Kits kaufen, z.B.:

 

20 thoughts on “RFID Transponder am Arduino auslesen – MFRC-522 Card Reader

  • 15. April 2019 at 14:08
    Permalink

    Hi,
    das Video hat mir sehr gut gefallen. Mich würde jetzt aber brennend interressieren bis zu welchem Abstand die Transponder gelesen werden.
    Normalerweise liegt die Elektronik ja nicht unverbaut auf dem Tisch. :-)
    Danke und Gruß, Klaus

    Reply
    • 30. April 2019 at 9:23
      Permalink

      Hallo Klaus, der Abstand kann schon 3-4 Zentimeter betragen, durch eine 2cm Holzplatte zum Beispiel funktioniert es aber bei mir nicht. Eine 3mm Acrylplatte ist zum Beispiel aber kein Problem, Metallabdeckungen habe ich nicht probiert.

      Reply
      • 1. September 2020 at 23:15
        Permalink

        Hallo, wie müsste ich den Sketch verändern, wenn ich mehrere Tags benutzen möchte?
        Wenn ihr mir dabei helfen könntet, wäre ich euch sehr dankbar!

        Reply
        • 2. September 2020 at 9:55
          Permalink

          Hallo Thomas,
          im oben angeführten Sketch 2 siehst du das bereits. Da sind 2 UIDs für verschiedene Tokens hinterlegt (blue_uid, red_uid) und im Sketch weiter unten die beiden Blöcke, in denen die UIDs verglichen werden (beginnend mit dem Kommentar // UID Vergleichen mit blue_uid). Diesen Block kannst du beliebig duplizieren und damit auf beliebig viele verschiedene UIDs überprüfen.

          Reply
          • 2. September 2020 at 22:56
            Permalink

            Hallo, es funktioniert Super!!!
            Vielen Dank!!!

  • 15. Mai 2019 at 16:17
    Permalink

    du versuchst also

    ((10µs + binäroperation*2) / 2) / 29.1 zu rechnen.
    Dieser Code wird niemals funktionieren, hier deine Rückmeldung.
    Das Echo muss einen Interrupt auslösen, du sperrst Interrupts aber.

    Reply
  • 22. Juni 2019 at 22:57
    Permalink

    Hallo Adi Dax,
    ich habe deinen Code genutzt um mir eine Phonie- Box zu bauen.
    Mit Hilfe eines RFID wird eine mp3 auf einem dfPlayer mini wiedergegeben.

    Ich würde ihn gerne der ganzen Welt zur Verfügung stellen und veröffentliche ihn unter deinem Beitrag. Vielen Dank.

    Reply
    • 22. Juni 2019 at 22:57
      Permalink

      /*
      * Typical pin layout used:
      * —————————————————————————————–
      * MFRC522 Arduino Arduino Arduino Arduino Arduino
      * Reader/PCD Uno/101 Mega Nano v3 Leonardo/Micro Pro Micro
      * Signal Pin Pin Pin Pin Pin Pin
      * —————————————————————————————–
      * RST/Reset RST 9 5 D9 RESET/ICSP-5 RST
      * SPI SS SDA(SS) 10 53 D10 10 10
      * SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16
      * SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14
      * SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15

      */

      #include
      #include
      #include „Arduino.h“
      #include „SoftwareSerial.h“
      #include „DFRobotDFPlayerMini.h“

      #define RST_PIN 9 // SPI Reset Pin
      #define SS_PIN 10 // SPI Slave Select Pin

      SoftwareSerial mySoftwareSerial(6, 4); // RX, TX
      DFRobotDFPlayerMini myDFPlayer;
      void printDetail(uint8_t type, int value);

      MFRC522 mfrc522(SS_PIN, RST_PIN); // Instanz des MFRC522 erzeugen

      bool helfer = 0;

      byte daten [][11] = {
      /*
      * [*] [0] = zugehörige Liednummer
      * [*] [1-11] = UID
      */

      {1, 0x04, 0xE0, 0x2A, 0xDA, 0xAB, 0x5C, 0x80}, // Michelin
      {2, 0x04, 0xDC, 0x2A, 0xDA, 0xAB, 0x5C, 0x80}, // Eule
      {3, 0x04, 0xD8, 0x2A, 0xDA, 0xAB, 0x5C, 0x80}, // Spongebob
      {0} // Zum Beenden der While
      };

      void setup() {

      Serial.begin(115200); // Serielle Kommunikation mit dem PC initialisieren
      SPI.begin(); // Initialisiere SPI Kommunikation
      mfrc522.PCD_Init(); // Initialisiere MFRC522 Lesemodul
      mySoftwareSerial.begin(9600); //Kommunikation mit DFPlayer

      Serial.println();
      Serial.println(F(„PhonieBox startet“));
      Serial.println(F(„Initializing DFPlayer … (May take 3~5 seconds)“));

      if (!myDFPlayer.begin(mySoftwareSerial)) { //Use softwareSerial to communicate with mp3.
      Serial.println(F(„Unable to begin:“));
      Serial.println(F(„1.Die Verbindung nochmals prüfen“));
      Serial.println(F(„2.Bitte SD- Karte einlegen“));
      while(true){
      delay(0); // Code to compatible with ESP8266 watch dog.
      }
      }
      Serial.println(F(„DFPlayer Mini ist startbereit.“));

      myDFPlayer.volume(2); //Lautstärke einstellen

      }
      void loop() {

      // Nur wenn eine Karte gefunden wird und gelesen werden konnte, wird der Inhalt von IF ausgeführt
      // PICC = proximity integrated circuit card = kontaktlose Chipkarte
      if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial() ) {
      Serial.print(„Gelesene UID:“);
      for (byte i = 0; i < mfrc522.uid.size; i++) {
      // Abstand zwischen HEX-Zahlen und führende Null bei Byte < 16
      Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
      Serial.print(mfrc522.uid.uidByte[i], HEX);
      }
      Serial.println();

      // UID Vergleichen
      int h = 0;
      do {
      helfer = true;
      Serial.print ("h = ");
      Serial.print(h);
      Serial.println();
      for (int j=1; j<10; j++) {

      if (mfrc522.uid.uidByte[j-1] != daten [h] [j]) {
      helfer = false;
      Serial.print("Abweichung bei j = ");
      Serial.print(j);
      Serial.println();
      break;
      }
      else {
      Serial.print("Else");
      Serial.println();
      Serial.print ("j = ");
      Serial.print(j);
      Serial.println();
      Serial.print("Gelesen: ");
      Serial.print(mfrc522.uid.uidByte[j-1]);
      Serial.println();
      Serial.print("Vergleichskarte: ");
      Serial.print (daten[h][j]);
      Serial.println();
      }
      }
      if (helfer) {
      Serial.print(h);
      Serial.print(" erkannt");
      Serial.println();
      for (byte i = 0; i < mfrc522.uid.size; i++) {
      // Abstand zwischen HEX-Zahlen und führende Null bei Byte < 16
      Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
      Serial.print(mfrc522.uid.uidByte[i], HEX);
      }
      if (daten [h][0] == 0 ) break;
      myDFPlayer.play(daten [h] [0]);
      Serial.println();
      Serial.print ("Spielt Lied Nummer ");
      Serial.print (daten [h] [0]);
      Serial.println() ;
      break ; //Schleife verlassen wenn er etwas gefunden hat
      }
      h = h +1;
      } while ( daten [h][0] != 0);

      /* // Vorlage Sonderkarten
      // Visa lauter
      byte visa [] = { 0x04, 0xDC, 0x2A, 0xDA, 0xAB, 0x5C, 0x80};

      // UID Vergleichen
      helfer = true;
      for (int j=1; j<7; j++) {
      if (mfrc522.uid.uidByte[j] != visa [j]) {
      helfer = false;
      }
      }
      if (helfer) {
      Serial.print("Visa erkannt");
      Serial.println();
      myDFPlayer.volumeUp(); // Lauter / Leiser / Ordner abspielen / Zufallslieder / …..was einem so einfällt
      delay(500);
      }
      */

      // Visa lauter
      byte visa [] = { 0x04, 0xDC, 0x2A, 0xD4, 0xAB, 0x5C, 0x80};

      // UID Vergleichen
      helfer = true;
      for (int j=1; j<7; j++) {
      if (mfrc522.uid.uidByte[j] != visa [j]) {
      helfer = false;
      }
      }
      if (helfer) {
      Serial.print("Visa erkannt");
      Serial.println();
      myDFPlayer.volumeUp();
      delay(500);
      }

      // Versetzt die gelesene Karte in einen Ruhemodus, um nach anderen Karten suchen zu können.
      mfrc522.PICC_HaltA();
      delay(1000);
      }

      }

      Reply
  • 20. August 2019 at 19:52
    Permalink

    Danke für den Code.

    ich würde mir gerne damit eine wegfahsperre bauen und auch mehrer Karten benutzen (z.B. 2 Fahrer)
    Wie kann ich denn 2 Karten einspeichern?

    Reply
  • 14. Oktober 2019 at 23:10
    Permalink

    Hallo

    Ich brauche Hilfe .
    Ich möchte mit einer Karte beim ersten mal einlesen einen Ausgang einschalten und beim zweiten mal einlesen wider ausschalten.

    Reply
  • 7. November 2019 at 17:44
    Permalink

    Bei zeigt er folgende Fehlermeldung:
    Arduino: 1.8.8 (Windows 7), Board: „Arduino/Genuino Uno“

    RFID_Code:16:21: error: MFRC522.h: No such file or directory

    compilation terminated.

    exit status 1
    MFRC522.h: No such file or directory

    Reply
  • 7. November 2019 at 21:19
    Permalink

    Hallo, das würde mich auch interessieren. Vielleicht muss man ja unter das LED high ja noch mal low schreiben.

    Reply
  • 29. Mai 2021 at 14:07
    Permalink

    Hallo Adi,
    ich habe mir kürzlich den ‚ ELEGOO UNO R3 Ultimate Starter Kit‘ zugelegt. (..war eine seht gute Entscheidung!). Derzeitig beschäftige ich mich mit dem Thema „RFID-Transponder“.
    Der entsprechende Versuchsaufbau und Programmierung auf der Grundlage der beiliegenden CD klappt.
    Der Code der Karte/des Chips lässt sich auslesen.
    Bei der weiteren Beschäftigung mit diesem Thema bin ich auch auf deinen Beitrag vom Nov, 2017 gestoßen. Hier hatte mich die Programmierung der Ausgabe über die LED interessiert.
    Ich hatte erstmal den Sketch ohne LED eingegeben. Leider klappt es nicht, wie es eigentlich sein sollte. Bei Kontakt der Karte/des Chips erscheint jes Mal auf dem ser. Monitor lediglich nur eine Reihe von spiegelverkehrten Fragezeichen (39 Stück).
    Kannst du mir da helfen, worin die Ursache liegen könnte. Bei der Eingabe des Sketch dürfte kein Fehler vorliegen. Kann es sein, dass ich bei der Auswahl der MFRC522-Libery eine ältere Version nehmen muss ?
    Es wäre schön, wenn du mir evtl. weiterhelfen könntest.
    Gruß Hardy

    Reply
    • 1. Juni 2021 at 13:00
      Permalink

      Hallo Hardy, kann es sein, dass die Übertragungsgeschwindigkeit im seriellen Monitor nicht richtig eingestellt ist? Sollte für den Testsketch auf 9600 sein. Das könnte die Sonderzeichen erklären.
      lg, Adi

      Reply
  • 2. Juni 2021 at 14:45
    Permalink

    Hallo Adi,
    Danke für die schnelle Antwort. Mein Fehler war eine falsche Eingabe in der Zeile „Serial.beginn“. Das Argument (9600) war zwar richtig, nur habe versehentlich (9.600) geschrieben.
    Was doch so ein kleiner Punkt bewirken kann …
    Also-nochmals vielen Dank. Jetzt läuft alles.
    Gruß Hardy

    Reply
  • 4. Juli 2021 at 15:02
    Permalink

    Schönes Video – sehr informativ.
    Was mir fehlt ist eine Schaltplan aus dem ich die Verdrahtung der Komponenten ersehen kann.
    Hat einer einen Plan oder kann mir jemand schreiben wo ich den vielleicht finden kann.
    Danke
    EWdG

    Reply
  • 17. November 2021 at 18:10
    Permalink

    Hallo, ist es den möglich, dass ich mit diesem Lesegerät mehrere RFID Chips „gleichzeitig“ lesen kann. Also wenn ich ein Stapel an RFID Karten drauflege alle ID’s ausgelesen werden, oder muss man die Chips alle einzeln drauf legen. Ist das überhaupt generell mit der RFID Technologie möglich?
    LG Nico

    Reply
  • 12. Dezember 2021 at 16:10
    Permalink

    Hallo Freunde, kann mir einer sagen bzw. ein Programm zeigen das die RFID
    Karten auf einem I2C Display zusätzlich Anzeigt.
    Habe versucht seit zwei Stunden etwas zu laufen zu bringen musste aber
    passen.
    Habe aber vom Programmieren wenig Ahnung.

    Vielen Dank für euere Hilfe
    Gruß Helmut

    Reply
  • 2. April 2022 at 16:52
    Permalink

    Hallo Adi Dax,
    Komplimente!
    Ein sehr deutliches Video met daneben noch alles was man braucht. Vielen Dank!

    Reply
  • 20. August 2022 at 16:04
    Permalink

    Hallo,

    ich finde das Video super hilfreich und bin damit sehr gut weit gekommen. Ich bin leider sehr neu bei Arduino und verstehe nicht genau alles. Daher wollte ich eine kurze Frage stellen. Ich würde mich sehr freuen, wenn ich dafür eine Antwort bekomme. Ich habe zwar alle Schritte gemacht und kann ganz norml die ID von der Karte lesen. Ich möchte es aber ohne LED machen und möchte nur im Serial Monitor lesen können, wenn die richtige Karte eingehalten wird, dass es Open oder Access denied schreibt. Wie soll ich den Code genau umformulieren?

    Viele Grüße
    Deniz

    Reply

Schreibe einen Kommentar zu Adi Dax Antworten abbrechen

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

Time limit is exhausted. Please reload the CAPTCHA.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.