Unser heutiger Blogpost ist der zweite Teil mit dem Thema "Lesen und Schreiben mit dem RFID-Kit" in der dreiteiligen Reihe zu unserem RFID-Kit:
Am Ende dieser 3 Teile wirst du wissen:
- Was unser RFID-Kit kann und wie du es einrichtest
- Wie du mit unserem RFID-Kit schreiben und lesen kannst
- Wie es mit unserem RFID-Kit möglich ist, eine Computerzugangsberechtigung zu installieren
Teil 1 der Blogreihe verpasst? Dann direkt hier zum Nachlesen.
RFID Lesen und Schreiben
Die grundlegenden Operationen bei der Verwendung eines RFID Moduls sind das Auslesen von Daten aus einem RFID Transponder und das Schreiben von ebendiesem.
In diesem Post werden wir beides Schritt für Schritt durchführen und erklären.
Die Grundlagen zur RFID Technik, das Anschließen des Moduls und die Installation der hier verwendeten Library erklärt der inhaltlich vorhergehende Blog Post RFID-Einführung.
Sowohl für das Lesen, als auch für das Schreiben wird ein RFID Transponder benötigt. Das bei uns erhältliche RFID Kit wird mit zweien geliefert, einem Chip und einer Schlüsselkarte. Welchen du verwendest spielt für die Programmierung keine Rolle.
Vor der Setup-Funktion des Lese-Sketches importieren wir die benötigten Libraries und definieren einige der angeschlossenen Pins (nämlich die, die frei gewählt werden können).
#include <SPI.h>
#include <MFRC522.h>
const uint8_t RST_PIN = 9; // reset pin
const uint8_t SS_PIN = 10; // serial data pin
Anschließend legen wir ein MFRC522 Objekt an. Dieses repräsentiert im Programm das angeschlossene RFID Modul.
MFRC522 mfrc522(SS_PIN, RST_PIN); // create MFRC522 instance
In der Setup Funktion wird die serielle Verbindung zum PC aufgebaut, das RFID Modul initialisiert und die SPI (Serial Peripheral Interface Bus) Verbindung hergestellt.
void setup() {
Serial.begin(9600); // start serial connection
SPI.begin(); // start SPI bus
mfrc522.PCD_Init(); // init RFID module
}
Card ID Lesen
Code: Simsso/Arduino-Examples/RFID/ReadUID
Die einfachste Operation ist das Auslesen des unique identifiers (UID) des RFID Transponders. Damit das RFID Modul überhaupt nach Transpondern sucht und deren UID liest, müssen in der Loop-Funktion die Aufrufe
mfrc522.PICC_IsNewCardPresent();
mfrc522.PICC_ReadCardSerial();
gemacht werden. Erst danach kann die UID verwendet werden. Bei der UID handelt es sich um ein Byte Array, das bei der Identifikation eines Transponders hilft. Das Array hat die Länge 4, sodass insgesamt über vier Milliarden unterschiedliche UIDs existieren können. Im Serial Monitor kann die ID des zuletzt detektierten Transponders mit den folgenden Codezeilen im Hex-Format ausgegeben werden.
for (int i = 0; i < mfrc522.uid.size; i++) {
Serial.print(mfrc522.uid.uidByte[i], HEX);
Serial.print(" ");
}
Die Ausgabe sieht zum Beispiel so aus: 14 86 6E 7B
Hauptspeicher Lesen
Code: Simsso/Arduino-Examples/RFID/ReadStorage
Der Hauptspeicher unserer Transponder besteht aus 16 Sektoren mit je 4 Blöcken. Jeder dieser Blöcke enthält 16 Byte Speicher. Der Gesamtspeicherplatz beträgt 16·4·16 = 1024 Byte (1 kByte). Ein Sektor lässt sich mit der Codezeile
mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
einfach formatiert ausgeben, wobei die Variable sector der Index des Sektors ist, also Ganzzahlenwerte von 0 bis 15 annehmen kann. Der Key wird vorher erzeugt (siehe Beispielcode im Link). Die (im SerialMonitor angezeigte) Ausgabe sieht zum Beispiel so aus:
0 3 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF [ 0 0 1 ]
2 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
1 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
0 B5 A3 2B 1B 26 08 04 00 62 63 64 65 66 67 68 69 [ 0 0 0 ]
Der Inhalt eines einzelnen Blockes kann mit der folgenden Codezeile ausgelesen werden.
mfrc522.MIFARE_Read(blockAddress, buffer, &size);
Die Block-Adresse ist dabei eine Zahl von 0 bis 63. Der Buffer ist ein Array mit 16+2 Byte Speicherkapazität, in das eine Zeile der obigen gespeichert wird. Der letzte Parameter size ist ein Pointer auf eine Variable die gleich der Größe des übergebenen buffer Arrays ist.
Daten Schreiben
Code: Simsso/Arduino-Examples/RFID/WriteFloat
Das Schreiben von Daten auf den Transponder ist dem Lesen sehr ähnlich. Der Funktionsaufruf
mfrc522.MIFARE_Write(blockAddress, dataBlock, 16);
schreibt das Byte Array dataBlock, das die Länge 16 hat, in den Block mit der Nummer blockAddress. Eine Sektornummer kommt hier deshalb nicht vor, weil die Block Adresse diese impliziert. Die Block Adresse wird nämlich kontinuierlich hochgezählt, liegt also zwischen 0 und 63. Vor dem Schreiben muss man sich analog zum Lesen authentifizieren, das sind weitere sechs Zeilen Code, die Sie dem Code Beispiel entnehmen können.
In diesem Absatz wird abschließend noch gezeigt, wie man -- etwas praxisnäher -- eine Float-Variable abspeichern kann. Sowohl Float-, als auch Double-Variablen bestehen beim Arduino aus 4 Byte (Referenz https://www.arduino.cc/en/Reference/Double). Im Code wird eine Float-Variable dazu mit einem beliebigen Wert initialisiert. Anschließend wird ein Byte Pointer angelegt, der auf die Adresse des Wertes (zum Beispiel von einem Sensor) zeigt. Die vier Bytes der Float Variable werden dann in ein Byte-Array der Länge 16 (Größe eines Blocks) kopiert. Dieses wird mit der oben genannten Funktion in den fünften Block des Transponderspeichers geschrieben.
float temperature = 15.09f;
byte *tempBytes = (byte *)&temperature;
byte dataBlock[16] = { 0 }; // initialize block buffer with zeros
for (uint8_t i = 0; i < sizeof(float); i++) {
dataBlock[i] = tempBytes[i]; // copy byte from float variable into buffer
}
status = (MFRC522::StatusCode) mfrc522.MIFARE_Write(5, dataBlock, 16);
Mit dem oben erwähnten ReadStorage Sketch kann jetzt ausgelesen werden, dass die ersten vier Byte im Block 5 gesetzt wurden. Diese Werte entsprechen im 32-bit IEEE 754 Format dem Wert 15,09.
5 A4 70 71 41 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
In unserem inhaltlich nachfolgenden Blog Post erklären wir, wie man mit unserem RFID-Kit eine Computerzugangsberechtigung bauen kann. Du findest Teil 3 auf unserem Blog, also am besten direkt reinschauen um spannende Tutorials und tolle Projekte zu finden!
Dein
Team AZ-Delivery
1 comment
Solderdot
Servus!
Welche Ereignisse kann das modul über die IRQ-Leitung mitteilen und wie kann ich dieses Signal nutzen? Gibt es eine Möglichkeit, dass das RC522-Modul einen IRQ auslöst, wenn ein Tag aufgelegt wurde, so dass das rechenhzeitintensive Pollen entfallen kann?
Prinzipiell nutze ich das Modul auf einem Raspberry Pi unter Python. Eine allgemeine Beschreibung sollte ich ohne weiteres dort umsetzen können.