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.
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.