Der MFRC522 RFID-Reader ist ein weit verbreitetes Modul für das Auslesen von RFID-Tags. Er ist kompatibel mit Plattformen wie dem Raspberry Pi, dem Arduino und auch dem ESP8266. In diesem Tutorial liegt der Fokus darauf, den MFRC522 mit einem ESP8266 D1 Mini zu verbinden und zu programmieren. Die Programmierung beschränkt sich dabei auf das Auslesen der UID des Tags – eine Speicherung oder das Auslesen weiterer Daten auf dem Tag ist nicht vorgesehen. Ziel ist es, die Unterscheidung zwischen verschiedenen Tags, etwa zwischen Tag A und Tag B, zu demonstrieren.
Produktempfehlungen und -suche in Verbindung mit dem Amazon Partnerprogramm:
- Preis aufsteigend
- Preis absteigend
- Reduzierte zuerst
¹ Angaben ohne Gewähr. Bei einem Kauf über den Link erhalten wir eine Provision.
Zum Kapitel springen Hardware
Um dieses Tutorial nachzubauen werden die in der folgenden Liste aufgeführten Hardwarekomponenten benötigt:
- Einen ESP8266 D1 Mini oder ein vergleichbares ESP8266 Board mit den notwendig herausgeführten Pins
- Einen MFRC522 RFID Reader
- Ein paar Jumper-Kabel
- Optional: ein Breadboard
Das Breadboard ist nicht unbedingt notwendig, erleichtert die Verdrahtung aber erheblich. Es ist perfekt dafür geeignet, Prototypen oder Schaltungen ohne Löten oder andere kompliziertere Methoden aufzubauen.
Zum Kapitel springen Bibliotheken installieren
Für die Nutzung des MFRC522 ist eine spezielle Bibliothek nötig. Diese enthält bereits vordefinierte Funktionen und Methoden, die den Umgang mit dem MFRC522 erheblich erleichtern. Mit der Installation hat man Zugriff auf diese Funktionen und muss die Implementierung der Grundfunktionen nicht mehr selbst vornehmen. Man kann somit also direkt damit beginnen, das eigene Projekt umzusetzen. Die Bibliothken kann direkt über die Arduino IDE installiert werden. Navigiert dazu auf folgendes Menü innerhlab der Arduino IDE:
Arduino IDE
└───Werkzeuge
└───Bibliotheken verwalten ...
Sucht nach dem Begriff MFRC522 und instaliert das Paket von der GithubCommunity.
Zum Kapitel springen Die Verdrahtung
Um den MFRC522 mit dem D1 Mini zu verwenden, greifen wir auf das sogenannte SPI-Interface zurück. SPI steht für Serial Peripheral Interface und ist ein Bus-System welches für den Betrieb des MFRC522 benötigt wird. Der SPI-Bus ist ein weit verbreiteter Standard, und auch der ESP8266 ist mit einem solchen Interface ausgestattet. Ein genauer Blick auf das Pinout des D1 Minis zeigt, an welchen Stellen sich die entsprechenden Pins für das Interface befinden.
Produktempfehlungen und -suche in Verbindung mit dem Amazon Partnerprogramm:
- Preis aufsteigend
- Preis absteigend
- Reduzierte zuerst
¹ Angaben ohne Gewähr. Bei einem Kauf über den Link erhalten wir eine Provision.
Die Bezeichnungen auf dem D1 Mini sowie dem MFRC522 erlauben schon fast eine intuitive Verdrahtung. Dennoch ist hier die Verbindung zwischen dem RFID Reader und dem ESP8266 D1 Mini nochmals aufgeführt.
MFRC522 RFID Reader | ESP8266 D1 Mini |
---|---|
RST | D3 |
SDA | D8 (SPI SS) |
MOSI | D7 (SPI MOSI) |
MISO | D6 (SPI MISO) |
SCK | D5 (SPI SCK) |
3.3V | 3V3 |
GND | G |
Nachdem die Verdrahtung abgeschlossen ist, können wir uns wieder der Arduino IDE widmen.
Wenn du mehr über das Thema SPI wissen möchtest kann ich dir die Einführung in das Serial Peripheral Interface von renax empfehlen.
Zum Kapitel springen Programmcode
Wie bei vielen anderen Modulen üblich, bietet auch der RFID-Reader eine Auswahl an Beispielprojekten, die einen ersten Einblick in die Nutzung ermöglichen. Diese Beispiele sind in der Arduino IDE unter dem folgenden Pfad zu finden:
Arduino IDE
└───Datei
└───Beispiele
└───MFRC522
Diese Beispiele könnt ihr gerne auf eigene Faust erkunden und durchstöbern. Unser aktuelles Ziel ist es allerdings, den RFID-Reader in seiner grundlegendsten Form funktionsfähig zu machen. Dazu habe ich einen Code vorbereitet, den ihr direkt übernehmen und als Basis für euer eigenes RFID-Projekt nutzen könnt.
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 15 // Pin: D8
#define RST_PIN 0 // Pin: D3
long chipID;
// MFRC522-Instanz erstellen
MFRC522 mfrc522(SS_PIN, RST_PIN);
void setup() {
Serial.begin(115200);
// SPI-Bus initialisieren
SPI.begin();
// MFRC522 initialisieren
mfrc522.PCD_Init();
//Kurze Pause nach dem Initialisieren
delay(10);
Serial.println("");
// Details vom MFRC522 RFID READER / WRITER ausgeben
mfrc522.PCD_DumpVersionToSerial();
Serial.println("RFID-Chip auflegen, um UID anzuzeigen...");
}
void loop() {
// Sobald ein Chip aufgelegt wird startet diese Abfrage
if ( mfrc522.PICC_IsNewCardPresent() ){
// CardID resetten
chipID = 0;
mfrc522.PICC_ReadCardSerial();
// Hier wird die ID des Chips in die Variable chipID geladen
for ( byte i = 0; i < mfrc522.uid.size; i++ ){
chipID=( ( chipID+mfrc522.uid.uidByte[i] ) * 10 );
}
//... und anschließend ausgegeben
Serial.println( chipID );
// Danach 5 Sekunden pausieren um mehrfaches Lesen / Ausführen zu verhindern
delay( 5000 );
}
}
Nachdem das Programm hochgeladen wurde, erscheint im seriellen Monitor folgende Ausgabe:
Firmware Version: 0x88 = (clone)
RFID-Chip auflegen, um UID anzuzeigen...
Ich lege halte nun mal drei verschiedene Chips an den Reader. Die Ausgabe sieht wie folgt aus:
Firmware Version: 0x88 = (clone)
RFID-Chip auflegen, um UID anzuzeigen...
2384830
2680600
1799100
Jeder Chip hat seine eigene ID und kann entsprechend zu anderen Chips unterschieden werden.
if(chipID == 2680600){
Serial.println("Hallo cooper!");
}
if(chipID == 2384830){
Serial.println("Hallo Fremder!");
}
if(chipID == 1799100){
Serial.println("Für Erzfeinde ist der Zugriff gesperrt!");
}
2384830
Hallo Fremder!
1799100
Für Erzfeinde ist der Zugriff gesperrt!
2680600
Hallo cooper!