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.:
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
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.
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!
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.
Hallo, es funktioniert Super!!!
Vielen Dank!!!
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.
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.
/*
* 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);
}
}
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?
Hallo
Ich brauche Hilfe .
Ich möchte mit einer Karte beim ersten mal einlesen einen Ausgang einschalten und beim zweiten mal einlesen wider ausschalten.
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
Hallo, das würde mich auch interessieren. Vielleicht muss man ja unter das LED high ja noch mal low schreiben.
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
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
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
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
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
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
Hallo Adi Dax,
Komplimente!
Ein sehr deutliches Video met daneben noch alles was man braucht. Vielen Dank!
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