RFID Kartenleser RC522 am Arduino betreiben (Update 29.07.2021)

In diesem Beitrag möchte ich dir zeigen wie du das RFID Modul vom Typ RC522 am Arduino per SPI programmieren kannst.

RFID Modul RC522 am Arduino programmieren (Update 29.07.2021)
RFID Modul RC522 am Arduino programmieren (Update 29.07.2021)

Das Modul RFID RC522 habe ich dir bereits im Beitrag vorgestellt. Jedoch ist die dort verlinkte Bibliothek nicht mehr verfügbar und somit wurde dieses Update fällig.

Bezug des RFID Moduls RC522

Das RFID Modul vom Typ RC522 bekommst du auf ebay.de für 3,99 € inkl. kostenlosem Versand aus Deutschland.

Solltest du neu in das Thema Arduino einsteigen so kann ich dir das ausführliche Set “Arduino RFID Kit” vorschlagen, in diesem Set sind diverse Sensoren & Aktoren enthalten welche du für die ersten kleinen Projekte benötigen wirst.

Technische Daten

  • Chip – MFRC522
  • Betriebsspannung – 3.3V
  • Stromaufnahme:
    • lesen – 13 mA bis 26 mA
    • idle – 10 mA bis 13 mA
  • Schnittstelle – SPI
  • Abstand zum Lesen / Schreiben – < 10 cm
  • Betriebsfrequenz – 13,56 MHz
  • Abmaße – 40 mm x 60 mm

Aufbau der Schaltung am Keyestudio UNO

Das Modul habe ich am Keyestudio UNO angeschlossen. Dieser Mikrocontroller ist com Chip her baugleich mit dem Arduino UNO R3 jedoch bietet dieser ein paar nette zusätzliche Features welche ich in bestimmten Fällen nicht missen möchte.

Schaltung – RFID RC522 am Keyestudio UNO

Anschluss des RFID RC522 Moduls an den Arduino

PinArduino UNO
  
SDAD10
SCKD19
MOSID17
MISOD18
IRQ-bleibt frei-
GNDGND
RSTReset
3.3V3.3V

Zusätzlich zum RFID Modul schließe ich noch 3 grüne, 5 mm LEDs an die digitalen Pins D5, D6, D7.

Aufbau der Schaltung - RFID Modul RC522 am Arduino UNO
Aufbau der Schaltung – RFID Modul RC522 am Arduino UNO

RFID RC522 am Arduino programmieren

Für das Programmieren dieses Modules benötigen wir eine zusätzliche Bibliothek, welche wir im Bibliotheksverwalter finden.

Die bereits in einem früheren Beitrag benannte einfachere Bibliothek von “electro-dragon” ist leider nicht mehr verfügbar.

Einbinden der Bibliothek von GithubCommunity

In diesem Beispiel möchte ich die Bibliothek von https://github.com/miguelbalboa/rfid verwenden. Die Weiterentwicklung ist jedoch eingestellt d.h. es gibt keine Fixes mehr oder neue Features.

installieren der Bibliothek MFR522 zur Programmierung des RFID Moduls RC522
Installieren der Bibliothek MFR522 zur Programmierung des RFID Moduls RC522

Beispiel mit 3 RFID Karten & LEDs

Als Grundlage für den folgenden Sketch habe ich das Beispiel “ReadNUID” vom GitHub Repository verwendet.

Für die Kommunikation mit dem RFID Modul benötigen wir zwei Bibliotheken.

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

Danach definieren wir die beiden Pins für SS & RESET.

#define SS_PIN 10
#define RST_PIN 9

Die 3 LEDs sind an den digitalen Pins D5, D6 und D7 angeschlossen.

#define led1 5
#define led2 6
#define led3 7

Für das Speichern des Status der LEDs legen wir uns 3 boolsche Variablen an (TRUE /FALSE).

bool led1_status = false;
bool led2_status = false;
bool led3_status = false;

Damit wir mit dem RFID Modul ansprechen können, müssen wir eine Instanz der Klasse MFRC522 erzeugen.

MFRC522 rfid(SS_PIN, RST_PIN);

Ich besitze 3 RFID Karten welche jeweils eine eindeutige ID haben. Dieses Array musst du auf deine RFID-UIDs anpassen.

String rfid_nuids[] = {"37fc943b", "cb72c5ae", "f73f9339"};

In der Funktion “setup” starten wir zunächst die serielle Kommunikation mit 9600 baud. Sowie starten wir auch die kommunikation mit dem RFID Modul über SPI.

Die gewählten Pins der LEDs werden als Ausgang definiert und initial deaktiviert.

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

  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);

  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  digitalWrite(led3, LOW);
}

Die Funktion “readHex” liest aus einem byte Arry mit der Größe “bufferSize” eine RFID-UID und liefert diese als String zurück.

String readHex(byte *buffer, byte bufferSize) {
  String result = "";
  for (byte i = 0; i < bufferSize; i++) {
    String* hex[] = {};
    result = result + String(buffer[i] < 0x10 ? " 0" : "");
    result = result + String(buffer[i], HEX);
  }
  return result;
}

In der Funktion “loop” prüfen wir zunächst, ob eine Karte vor das Lesegerät gehalten wurde. Wenn dieses nicht so ist, dann verlassen wir diese Funktion an der stelle. (Es wird kein weiterer Code ausgeführt.)

void loop() {
  if ( !rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) {
    return;
  }

Wenn eine Karte erkannt wurde, dann soll die RFID-UID mit der Funktion “readHex” gelesen werden. Diesen Hex Wert geben wir zusätzlich auf der seriellen Schnittstelle aus.

 String nuid = readHex(rfid.uid.uidByte, rfid.uid.size);
  Serial.println(nuid);

Wenn die gelesene RFID-UID der an der Position 1 aus dem Array der bekannten UIDs ist, dann soll der Status der LED1 umgekehrt werden und die LED entweder aktiviert oder deaktiviert werden.

Dieses machen wir für alle 3 bekannten RFID-UIDs.

 if (nuid == rfid_nuids[0]) {
    led1_status = !led1_status;
    digitalWrite(led1, led1_status ? HIGH : LOW);
  } else if (nuid == rfid_nuids[1]) {
    led2_status = !led2_status;
    digitalWrite(led2, led2_status ? HIGH : LOW);
  } else if (nuid == rfid_nuids[2]) {
    led3_status = !led3_status;
    digitalWrite(led3, led3_status ? HIGH : LOW);
  }

Wenn dieser Vorgang abgeschlossen ist dann beenden wir den Lesevorgang und die Funktion “loop” startet von vorne.

rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();

Hier nun der komplette Sketch zum Lesen einer RFID Karte und steuern von 3 LEDs am Arduino.

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

#define SS_PIN 10
#define RST_PIN 9

#define led1 5
#define led2 6
#define led3 7

bool led1_status = false;
bool led2_status = false;
bool led3_status = false;

MFRC522 rfid(SS_PIN, RST_PIN);

String rfid_nuids[] = {"37fc943b", "cb72c5ae", "f73f9339"};

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

  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);

  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  digitalWrite(led3, LOW);
}

void loop() {
  if ( !rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) {
    return;
  }

  String nuid = readHex(rfid.uid.uidByte, rfid.uid.size);
  Serial.println(nuid);

  if (nuid == rfid_nuids[0]) {
    led1_status = !led1_status;
    digitalWrite(led1, led1_status ? HIGH : LOW);
  } else if (nuid == rfid_nuids[1]) {
    led2_status = !led2_status;
    digitalWrite(led2, led2_status ? HIGH : LOW);
  } else if (nuid == rfid_nuids[2]) {
    led3_status = !led3_status;
    digitalWrite(led3, led3_status ? HIGH : LOW);
  }

  rfid.PICC_HaltA();
  rfid.PCD_StopCrypto1();
}

String readHex(byte *buffer, byte bufferSize) {
  String result = "";
  for (byte i = 0; i < bufferSize; i++) {
    String* hex[] = {};
    result = result + String(buffer[i] < 0x10 ? " 0" : "");
    result = result + String(buffer[i], HEX);
  }
  return result;
}

Video

Kommentar hinterlassen

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