Arduino mit MFRC522-Reader

Arduino mit MFRC522-Reader

Aktivieren der Karte

Wir wollen nun die Karte vom Zustand "READY" in den Zustand "ACTIVE" bringen. Dazu gibt es mehrere Möglichkeiten, wir könnten dies z. B. mit einem Lesebefehl erreichen, in diesem ersten Versuch wollen wir aber die spezielle Methode mfrc522.PICC_Select()wählen.

Wir ändern unser Programm wie folgt ab:


Über mfrc522.PICC_Select(&(mfrc522.uid), 0); selektieren wir die Karte. Dabei wird die Adresse einer Struktur "uid" übergeben, die in der Klasse MFRC522 deklariert ist. Wäre uns die Seriennummer bekannt, so könnten wir diese in der Struktur angeben und damit gezielt eine Karte auswählen. Aber das wäre nur interessant, wenn sich mehrere Karten im Empfangsbereich befinden und so weit sind wir noch nicht.

In die leere Struktur werden beim Aufruf der PICC_Select-Methode dann die folgenden Daten geschrieben:

typedef struct {

byte size; //Hier finden wir die Länge der Seriennummer, aktuell 4 oder 7 Byte
byte uidByte[10]; //In diesem Array befindet sich die Seriennummer
byte sak; //steht für "select acknowledge"

} Uid;

Mit dem 2. Parameter in der Select-Methode können wir die Anzahl der gültigen Bits in der Seriennummer angeben. Hier wird für gewöhnlich 0 angegeben und damit wird der Wert ignoriert.

Wir selektieren die Karte aber lediglich zu dem einzigen Zweck, um sie mit der Methode PICC_HaltA() am Ende der Schleife wieder in den HALT-Zustand zu schalten und damit zu deaktivieren. Um zu prüfen, ob das funktoniert, legen wir einen Tag auf den Reader und wir erhalten nur eine Ausgabe. Probieren wir einen anderen Tag, erhalten wir wieder nur eine einmalig Ausgabe.



Wir haben die Karte also zuerst in den READY- und dann in den HALT-Zustand gebracht.

Das Programm ruft aber am Anfang der Schleife ständig die die Request-Methode auf und trotzdem bleibt der Chip nach der ersten Ausgabe inaktiv. Also reagiert der Chip im Haltezustand nicht mehr auf einen Request. Um den Chip auch aus dem HALT-Status erneut anzusprechen, würden wir den Befehl "WUPA" (Wake Up Typ A) benötigen.

Tauschen Sie doch einfach einmal den Befehl:
mfrc522.PICC_RequestA(atqa, &atqaLen);

gegen den folgenden:
mfrc522.PICC_WakeupA(atqa, &atqaLen);

Jetzt wird der ATQA-Block wiederholt ausgegeben, so lange der Tag auf dem Reader liegt.