Suche

RFID Kit

Inhaltsverzeichnis

Für dieses Projekt benötigst du

Mifare RC522 mit einem Arduino Mikrocontroller ansteuern

Der RFID („radio-frequency identification“) Empfänger wird verwendet, um von RFID Sendern (auch „RFID Tags“ genannt) per Funk einen bestimmten Code auszulesen. Jeder Sender hat dabei nur einen einmaligen, ganz individuellen Code. Damit lassen sich 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, wie z.B. Schlüsselanhänger oder Karten im Kreditkartenformat.

Auf dem folgenden Bild sieht man links zwei RFID-TAGs und rechts den RFID-Empfänger.

https://www.high-endrolex.com/40

Der RFID-Empfänger RFID-RC522 hat eine bereits angelötete 90° Stiftleiste. Es gibt auch Versionen, bei denen die Stiftleiste selbst an den RFID-Empfänger gelötet werden muss.

Mifare RC522 RFID-Kit

Wie funktioniert ein RFID Empfänger am Arduino?

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 in dem Sender eine elektrische Spannung erzeugt. Diese Spannung wird dann verwendet, um einen kleinen elektronischen Chip dazu zu bringen, per Funk einen elektrischen Code auszusenden. Dieser empfangene Code kann dann vom Mikrocontroller weiter verarbeitet werden.

Hinweise zur Verkabelung am Arduino

Aufgabe: Mithilfe eines Arduino-Mikrocontrollers soll ein RFID-TAG ausgelesen werden. Im nächsten Schritt sollen zwei LEDs mit zwei verschiedenen Karten ein- und ausgeschaltet werden.

Verkabelung des Arduino-Boards mit dem RFD-Empfänger:

Board:

Arduino Uno

Arduino Mega

MFRC522-Empfänger

Pin:

10

53

SDA

Pin:

13

52

SCK

Pin:

11

51

MOSI

Pin:

12

50

MISO

Pin:

unbelegt

unbelegt

IRQ

Pin:

GND

GND

GND

Pin:

9

5

RST

Pin:

3,3V

3,3V

3,3V

Ein RFID-TAG mit Arduino auslesen

Der Schaltplan

Anschlüsse RFID-Empfönger am Arduino UNO

Beim Auslesen und Verarbeiten der Daten eines RFID-Empfängers wären wie auch bei anderen komplexen Aufgaben sehr viele Zeilen Quellcode erforderlich. Daher bedienen wir uns einer vorgefertigten Library. Die „MFRC522“ Library von GithubCommunity kann über den Bibliotheksverwalter mit dem Suchbegriff „MFRC522“ gefunden und installiert werden. Eine Anleitung zur Installation einer Bibliothek über den Bibliotheksverwalter findet sich unter  Bibliotheken zur Arduino Software hinzufügen.

Benötigte Bibliothek

Zunächst werden wir die UID („Unique Identification Number“), also die individuelle Bezeichnung eines RFID-TAGs auslesen. Dazu verwenden wir das folgende Programm (Achtung: Das Programm funktioniert nur, wenn die Library 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.

Der Programmcode

// RFID-Bibiothek 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);
}

Wenn alles funktioniert hat, sieht das Ergebnis im Serieller Monitor so aus:

Erweiterungen des Programmbeispiels

Das Programm soll nun erweitert werden:
Wird eine bestimmte Karte vorgehalten, soll entweder eine grüne oder eine gelbe LED leuchten.
Wir die jeweilige Karte erneut vor den RFID-Empfänger gehalten, wird die entsprechende LED ausgeschaltet.

Das Programm im Film

Der Programmcode

Erklärungen zur Erweiterung des Programmcodes

Die LEDs werden mit define an den Pins 6 und 7 (Zeilen 9 und 10) definiert. Der Zustand der LEDs (StatusgelbeLED und StatusgrueneLED, Zeilen 13 und 14) wird auf false gesetzt. Die LEDs sind beim Start ausgeschaltet.

Die Variable WertDez enthält die individuelle UID der Karte.

Wird die korrekte UID erkannt wird ab Zeile 63 die gelbe LED ein- oder ausgeschaltet. Die Variable StatusgelbeLED wird „umgedreht“, aus false wird true, die LED leuchtet. Beim erneuten Vorhalten der Karte wird aus true false, die gelbe LED wird ausgeschaltet.

Ab Zeile 71 passiert das gleiche mit der grünen LED.

Natürlich musst du die hier im Beispiel genannte UIDs durch die individuell ermittelten UIDs austauschen.

Der Programmcode

// RFID-Bibiothek 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);
  }

  // Wartezeit verhindert, dass die Karte nur einmal erkannt wird
  delay(1000);
}

Funduino - Dein Onlineshop für Mikroelektronik

  • Dauerhaft bis zu 10% Rabatt für Schüler, Studenten und Lehrkräfte
  • Mehr als 3.500 Artikel sofort verfügbar!
  • Über 8 Jahre Erfahrung mit Arduino, 3D-Druck und co.
SALE