1.Einführung 

Steuerung eines Mifare RC522 mit einem Arduino Mikrocontroller

Der RFID-Leser (Radio-Frequency Identification) wird verwendet, um bestimmte Codes drahtlos von RFID-Sendern (auch als RFID-Tags bezeichnet) auszulesen. Jeder Sender hat einen eindeutigen und individuellen Code. Mit dem Arduino können Schließanlagen oder ähnliche Projekte realisiert werden, bei denen eine Person sich mit einem Sender identifizieren soll.

RFID-Tags können verschiedene Formen haben, wie zum Beispiel Schlüsselanhänger oder Karten im Kreditkartenformat.

Auf dem folgenden Bild sind links oben und unten rechts zwei RFID-Tags zu sehen, und in der Mitte befindet sich der RFID-Empfänger RFID-RC522, der bereits mit einer 90° Stiftleiste gelötet wurde. Es gibt auch Versionen, bei denen die Stiftleiste selbst an den RFID-Empfänger gelötet werden muss.

Wie funktioniert ein RFID-Empfänger am Arduino?

Ein RFID-Empfänger beinhaltet eine kleine Kupferspule, die ein magnetisches Feld erzeugt. Ein RFID-Sender besitzt ebenfalls eine Kupferspule, die das magnetische Feld aufnimmt und in dem Sender eine elektrische Spannung erzeugt. Diese Spannung wird genutzt, um einen kleinen elektronischen Chip dazu zu bringen, drahtlos einen elektrischen Code zu senden. Dieser Code wird direkt vom Sender empfangen und so verarbeitet, dass der Arduino-Mikrocontroller ihn weiterverarbeiten kann.

Es ist auch möglich, RFID-Tags mit einem Code zu beschreiben. Aufgrund der Komplexität wird dies in dieser Anleitung jedoch nicht behandelt. Es gibt jedoch ausreichend weiterführende Tutorials im Netz.

Aufgabe: Ein RFID-Tag soll mithilfe eines Arduino-Mikrocontrollers ausgelesen werden. Wenn es sich um den richtigen Tag handelt, soll eine oder zwei LEDs für 5 Sekunden leuchten.

 

2.Der Schaltplan



Ein RFID-TAG mit Arduino auslesen und die Daten verarbeiten

Ein RFID-TAG soll mit einem Arduino ausgelesen und die Daten verarbeitet werden. Für das Auslesen und Verarbeiten der Daten eines RFID-Empfängers benötigt man, wie auch bei anderen komplexen Aufgaben, viele Zeilen Quellcode. Daher nutzen wir eine vorgefertigte Bibliothek. Die "MFRC522" Bibliothek von GithubCommunity kann über den Bibliotheksverwalter mit dem Suchbegriff "RFID" gefunden und installiert werden. Eine Anleitung zur Installation einer Bibliothek über den Bibliotheksverwalter findet sich unter 2.2.2 Bibliotheken zur Arduino Software hinzufügen.

Vorbereitung: Der erste Sketch mit dem RFID-Reader

Zuerst lesen wir die UID („Unique Identification Number“), also die individuelle Bezeichnung eines RFID-TAGs, aus. Dazu verwenden wir das folgende Programm (Achtung: Das Programm funktioniert nur, wenn die Bibliothek wie oben beschrieben zur Arduino-Software hinzugefügt wurde). Das Programm ist für den UNO R3 Mikrocontroller vorgesehen. Bei MEGA2560 und anderen Controllern müssen die Pins entsprechend angepasst werden.

 

3.Der Programmcode


#include  // SPI-Bibliothek hinzufügen
#include  // RFID-Bibliothek hinzufügen

#define SS_PIN 10 // SDA an Pin 10 (bei MEGA anders)
#define RST_PIN 9 // RST an Pin 9 (bei MEGA anders)

MFRC522 mfrc522(SS_PIN, RST_PIN); // RFID-Empfänger benennen

void setup() // Beginn des Setups
{
  Serial.begin(9600); // Serielle Verbindung starten (Monitor)
  SPI.begin(); // SPI-Verbindung aufbauen
  mfrc522.PCD_Init(); // Initialisierung des RFID-Empfängers
}

void loop() // Hier beginnt der Loop-Teil
{
  if (!mfrc522.PICC_IsNewCardPresent()) // Wenn keine Karte in Reichweite ist...
  {
    return; // ...springt das Programm zurück vor die if-Schleife, womit sich die Abfrage wiederholt.
  }

  if (!mfrc522.PICC_ReadCardSerial()) // Wenn kein RFID-Sender ausgewählt wurde
  {
    return; // ...springt das Programm zurück vor die if-Schleife, womit sich die Abfrage wiederholt.
  }

  Serial.print("Die ID des RFID-TAGS lautet: "); // "Die ID des RFID-TAGS lautet:" wird auf den Serial Monitor geschrieben.

  for (byte i = 0; i < mfrc522.uid.size; i++)
  {
    Serial.print(mfrc522.uid.uidByte[i], HEX); // Dann wird die UID ausgelesen, die aus vier einzelnen Blöcken besteht und der Reihe nach an den Serial Monitor gesendet. Die Endung Hex bedeutet, dass die vier Blöcke der UID als HEX-Zahl (also auch mit Buchstaben) ausgegeben wird
    Serial.print(" "); // Der Befehl „Serial.print(" ");“ sorgt dafür, dass zwischen den einzelnen ausgelesenen Blöcken ein Leerzeichen steht.
  }

  Serial.println(); // Mit dieser Zeile wird auf dem Serial Monitor nur ein Zeilenumbruch gemacht.
}

Erklärungen von Programmcode:

Wenn alles funktioniert hat, sieht das Ergebnis am Serial-Monitor so aus:

Die HEX-Zahl, die hintereinander geschrieben wurde, ist nicht sehr benutzerfreundlich. Daher ändern wir die Zeile "Serial.print(mfrc522.uid.uidByte[i], HEX);" in "Serial.print(mfrc522.uid.uidByte[i], DEC);" um. Dadurch werden die einzelnen Blöcke des UID-Codes als Dezimalzahl ausgegeben.

 

4.Erweiterungen des Programmbeispiels

Nun wird der UID-Code als Dezimalzahl ausgegeben, jedoch ist er immer noch in vier Blöcke aufgeteilt. Wir ändern den Code nun so ab, dass wir für die UID eine einzige zusammenhängende normale Zahl erhalten (Dezimalzahl).

Warum machen wir das? Wenn wir später den Sketch verwenden möchten, um etwas in Abhängigkeit eines richtig ausgelesenen RFID-TAGs auszulösen (z.B. eine LED soll leuchten oder ein Servomotor sich um 90 Grad drehen…), können wir mit einer zusammenhängenden Zahl besser einen IF-Befehl verwenden.

Zum Beispiel:

"Wenn der RFID-Code=1031720 ist, dann soll eine LED für 5 Sekunden leuchten".

Es wäre schwieriger dagegen mit dem Befehl "Wenn der erste Block 195 lautet und der zweite Block 765 lautet und der dritte Block 770 lautet und der vierte Block 233 lautet…", dann schalte eine LED für 5 Sekunden an.

Ein Nachteil ist jedoch, dass der Sketch dadurch etwas unsicherer wird, weil nicht alle Zahlen der vier Blöcke (maximal 12 Ziffern) in einer zusammenhängenden Zahl dargestellt werden können. Wenn es sicherer sein soll, müsste man jeden einzelnen Block separat abfragen.

 

4.1.Der Programmcode


#include 
#include 
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);

void setup()
{
Serial.begin(9600);
SPI.begin();
mfrc522.PCD_Init();
}

void loop()
{
  
if ( ! mfrc522.PICC_IsNewCardPresent())
{
return;
}

if ( ! mfrc522.PICC_ReadCardSerial())
{
return;
}

long code=0; // Als neue Variable fügen wir „code“ hinzu, unter welcher später die UID als zusammenhängende Zahl ausgegeben wird. Statt int benutzen wir jetzt den Zahlenbereich „long“, weil sich dann eine größere Zahl speichern lässt.

for (byte i = 0; i < mfrc522.uid.size; i++)
{
code=((code+mfrc522.uid.uidByte[i])*10); // Nun werden wie auch vorher die vier Blöcke ausgelesen und in jedem Durchlauf wird der Code mit dem Faktor 10 „gestreckt“. (Eigentlich müsste man hier den Wert 1000 verwenden, jedoch würde die Zahl dann zu groß werden.
}

Serial.print("Die Kartennummer lautet:"); // Zum Schluss wird der Zahlencode (Man kann ihn nicht mehr als UID bezeichnen) ausgegeben.
Serial.println(code);
}

Hervorragend, nun sind wir in der Lage, eine einzigartige Identifikationsnummer von einem RFID-Tag auszulesen (Die Nummer wird im Seriellen Monitor angezeigt). In diesem Fall lautet die Identifikationsnummer dieses spezifischen RFID-Tags 1031720.

4.2. Erweiterung: LED-Rückmeldung durch Datenabgleich

Was ist als nächstes zu tun? Wir möchten nun eine LED oder zwei LEDs für 5 Sekunden einschalten, falls der gewünschte RFID-Tag vor den RFID-Leser gehalten wird.

 

4.2.1. Der Programmcode


 

#include 
#include 
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);

void setup()
{
Serial.begin(9600);
SPI.begin();
mfrc522.PCD_Init();
pinMode (2, OUTPUT); // Der Pin 2 ist jetzt ein Ausgang (Hier wird eine LED angeschlossen)
}

void loop()
{
if ( ! mfrc522.PICC_IsNewCardPresent())
{
return;
}

if ( ! mfrc522.PICC_ReadCardSerial())
{
return;
}

long code=0;

for (byte i = 0; i < mfrc522.uid.size; i++)
{
code=((code+mfrc522.uid.uidByte[i])*10);
}

Serial.print("Die Kartennummer lautet:");

Serial.println(code);

// Ab hier erfolgt die erweiterung des Programms.

if (code==1031720) // Wenn der Zahlencode 1031720 lautet...

{ // Programmabschniss öffnen

digitalWrite (2, HIGH); // ...dann soll die LED an Pin 2 leuchten...

delay (5000); // für 5 Sekunden

digitalWrite (2, LOW); // … und danach wieder aus gehen.

} // Programmabschnitt schließen

} // Sketch abschließen