Da sich so viele Leser für den Beitrag mit dem RFID-RC522 Modul interessieren, wollte ich euch heute einen weiteren RFID Kartenleser vorstellen. Genauer gesagt das RFID PN532 Mini Breakout Modul in der “blauen” Version. Es gibt noch eine nahezu identische “rote” Version, diese habe ich aber NOCH nicht ausprobiert.
Ein großer Vorteil vom RFID PN532 Mini Breakout Modul ist, dass im Vergleich zum RFID-RC522 Modul alle 3 Schnittstellen (SPI, I2C und Serial UART) genutzt werden können. Trotz der Größe von nur grob 42 x 42 mm ist eine Antenne auf der Platine integriert, eine größere externe Antenne kann aber nicht angeschlossen werden. Trotz der relativ kleinen Antenne wird eine RFID Karte aber noch aus einer Entfernung von 5 cm erfolgreich gelesen.
Aufgrund der einfachen Verkabelung zwischen Arduino und Kartenleser, habe ich mich für die I2C Schnittstelle entschieden. Es werden dafür nur 4 Kabel (+5V, GND, SDA und SCL) benötigt. Die I2C Adresse (0x24) ist fest eingestellt und kann auf der Platine nicht geändert werden.
Jumper
Damit das RFID PN532 Mini Breakout Modul auch über I2C kommuniziert, muss der “Jumper” auf der Platine geändert werden. Die beiden Jumper habe ich mit einer Entlötpumpe entfernt und dann entsprechend der Beschreibung neu gesetzt. Wie auf dem Foto zu sehen war bei mir SPI der Auslieferungszustand.
Mifare Transponder
Bei mir wurden 3 verschiedene Transponder Typen beigelegt. Soweit ich weiß, sind es Mifrare Classic 1K Transponder. Diese besitzen 1K Speicherkapazität und können zudem Daten verschlüsselt ablegen. Da der Crypto-1 Cipher als unsicher gilt, erschwert dies aber nur den Zugriff auf die Daten.
Sketch
Ich habe den Sketch erstmal einfach gehalten und “nur” einen Vergleich mehrerer RFID UIDs konzentriert. Die Rückmeldung läuft aktuell nur über den Serial Monitor. Der Sketch ist auf das wesentliche gekürzt. Zuerst werden ein paar Informationen über die Karte angezeigt und dann unter Card Status ob diese bereits bekannt ist.
Damit der Sketch auch funktioniert, muss die Elechouse PN532 Library installiert sein. Diese ähnelt den anderen bekannten Libraries zwar sehr, mit dieser hat es aber nach ein wenig Einarbeitung am besten geklappt.
#include <Wire.h> #include <PN532_I2C.h> #include <PN532.h> PN532_I2C pn532i2c(Wire); PN532 nfc(pn532i2c); #define TAG_LEN 4 // Transponder ID Length #define ARR_LEN 2 // Anzahl Transponder im Array char target_tag[ARR_LEN][TAG_LEN] = {{0x22, 0x9F, 0x8A, 0xE5}, {0x93, 0x6E, 0x5E, 0xEF}}; void setup() { Serial.begin(9600); Serial.println("Start Serial"); Serial.println(""); nfc.begin(); uint32_t versiondata = nfc.getFirmwareVersion(); if (! versiondata) { Serial.print("Didn't find PN53x board"); while (1); // halt } // configure board to read RFID tags nfc.SAMConfig(); } void loop() { uint8_t success; uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 }; // Buffer to store the returned UID uint8_t uidLength; // Length of the UID (4 or 7 bytes depending on ISO14443A card type) success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLength); if (success) { // Display some basic information about the card Serial.println("Found an ISO14443A card"); Serial.println("-----------------------"); Serial.print("UID Length : ");Serial.print(uidLength, DEC);Serial.println(" bytes"); Serial.print("UID Value HEX :"); nfc.PrintHex(uid, uidLength); Serial.print("UID Value DEC : "); for (uint8_t i=0; i < uidLength; i++) { Serial.print(uid[i], DEC); } Serial.println(""); Serial.print("Card Status : "); for(int i = 0; i < ARR_LEN; i++) { if (memcmp(uid, target_tag[i], TAG_LEN) == 0) { Serial.println("Card Accepted"); } else { Serial.println("Card Unknown"); } } delay(10000); Serial.println("Waiting for next ISO14443A Card ..."); Serial.println(""); } }
Die folgende Ausgabe ist nur ein Beispiel aus meinen Tests! Hier wird unter anderem der Block 4 entschlüsselt und ausgelesen. Diesen habe ich zuvor etwas mit Werbung beschrieben. 🙂
Wie gehts weiter?
Aufbau des Speichers einer Mifare Classic Karte, Zugriff auf die Datenblöcke, Daten auf der Karte lesen und schreiben, den Authentication Code der einzelnen Blöcke anpassen oder ein Netzwerk Kartenleser mit UDP Schnittstelle und vielleicht einem EEPROM zum flexiblen Speichern der Karten? Mal schauen wie das Feedback und Zeit dafür ist.
Guten Abend ,
Danke für das schöne Tutorial 😉
Allerdings habe ich noch Probleme mit dem NFC Modul wäre schön wenn du mir helfen könntest. Ich benutze einen wemos d1 Mini. Es funktioniert soweit alles gut solange ich ständig Auslese sobald ich 10-15 min nicht mehr Auslese gibt die Funktion nur noch ne 0 zurück succes =0
Als ob sich der ic schlafen legt… bin über jeden Tipp dankbar ! Grüsse