Schnelle Lieferung
Rabattkonditionen für Unternehmen
Bis zu 10% Rabatt für Schüler, Studenten und Bildungseinrichtungen
Europaweit: Versicherter Versand ab 4,90€
Filter schließen
Filtern nach:

Das PN532 NFC RFID Modul - Nahfeldkommunikation

RFID? NFC? Was ist das?

In diesem Beitrag möchten wir euch das Auslesen von ID-Tags nahelegen. Im Zentrum des Beitrags steht dabei das PN532 NFC RFID Modul. 

Das Modul basiert auf dem NXP PN532 Chip. Dieser Chipsatz ist vor allem in Bereich des NFC (engl. für "Near Field Communication") weit verbreitet. Dabei wird ein NFC-fähiges Objekt, häufig z.B. eine Scheckkarte mit NFC-Chip, an einen NFC-Reader gehalten. Dadurch findet in sekundenbruchteilen ein Informationsaustausch statt. 

Das klingt abstrakt? Wenn Ihr über eine neuere EC-Karte und diese zum kontaktlosen Zahlen verwendet, dann kennt Ihr NFC sogar aus dem Alltag. Durch das Auflegen der Karte am Kartenterminal wird die Transaktion angestoßen - ganz schnell und unkompliziert.

Genau diese dahinterstehenden technischen Abläufe möchten wir uns genauer ansehen. Das PN532 Modul ist hierfür bestens geeignet, da es sowohl I2C als auch SPI fähig ist. Die gewünschte Art der Kommunikation kann direkt auf der Platine des PN532 durch Umlegen der darauf befindlichen Schalter ausgewählt werden. Die hierfür benötigte Schalterposition der jeweiligen Schnittstellen sehr Ihr rechts neben der Schaltskizze, welche sich etwas weiter unten auf der Seite befindet.

 

Der Schaltplan:

Schaltplan PN532 NFC RFID Modul

Tipp: Eine hochauflösende Version dieses Bildes findet Ihr hier. Dort könnt Ihr die jeweilige Pinbelegung etwas besser erkennen.

Der Programmcode (I2C Version)

//*******************************************************************************************************
//**  Beispielsketch für das Auslesen von ID-Tags. Bei passender ID wird PIN 13 für 2 Sekunden         **
//**  eingeschaltet (LED). Bei falscher ID wird an Pin 12 ein Ton erzeugt. (PASSIVEN Buzzer / Piezzo)  **
//**  nutzen. Statt einer LED kann auch ein Türschloss geschaltet werden (über TIP120 Schaltverstärker **
//*******************************************************************************************************
#include <Wire.h>                            // Bibliothek fürs I2C Protokoll
#include <Adafruit_PN532.h>                  // Bibliothek für das NFC/RFID Modul  !!! Bitte mittels Arduino IDE laden !!!
#define PN532_IRQ   (2)                      // Definiere den IRQ Anschluss
#define PN532_RESET (3)                      // Definiere den Reset Anschluss
const int AlarmPin  =  12;                   // Pin 12 Ausgang für Piezo Lautsprecher
const int OutputPin =  13;                   // Pin 13 Ausgang für LED oder über TIP120 zu einem Magnetschloss
unsigned long cardid;                        // Variable für die ausgelesene TAG-ID
unsigned long TAGid1 = 1702536620;           // Hier können zu akzeptierende IDs eingetragen werden
unsigned long TAGid2 = 4070796058;           // Sonst frei lassen. Die ID einzelner TAGs können mit
unsigned long TAGid3 ;                       // dem seriellen Monitor ausgelesen werden (115200 Baud einstellen)
Adafruit_PN532 nfc(PN532_IRQ, PN532_RESET);  // Instanz erzeugen mit I2C Protokoll
void setup() {                                           // Beginn Setup Funktion
pinMode(AlarmPin, OUTPUT);                             // Definiere PIN als Ausgang
pinMode(OutputPin, OUTPUT);                           // Definiere PIN als Ausgang
Serial.begin(115200);                                  // Öffne serielle Übertragung mit 115200 Baud (ser Monitor gleiche Baud Einstellung!)
Serial.println("Hallo!");                              // Schicke Text "Hallo!" auf seriellen Monitor
nfc.begin();                                           // Beginne Kommunikation mit RFID Leser
unsigned long versiondata = nfc.getFirmwareVersion();  // Lese Versionsnummer der Firmware aus
if (! versiondata) {                                   // Wenn keine Antwort kommt
Serial.print("Kann kein Board finden !");            // Sende Text "Kann kein..." an seriellen Monitor
while (1);                                           // so lange Stopp
}
Serial.print("Chip PN5 gefunden"); Serial.println((versiondata >> 24) & 0xFF, HEX); // Sende Text und Versionsinfos an seriellen
Serial.print("Firmware ver. "); Serial.print((versiondata >> 16) & 0xFF, DEC);      // Monitor, wenn Antwort vom Board kommt
Serial.print('.'); Serial.println((versiondata >> 8) & 0xFF, DEC);                  // 
nfc.SAMConfig();                                         // Konfiguriere Board RFID Tags zu lesen
Serial.println("Warte auf einen ISO14443A Chip ...");     // Sende Text dass gewartet wird an seriellen Monitor
}
void loop() {                                              // Beginne Loop-Funktion
uint8_t success;                                         // Variable anlegen
uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };                 // Puffer um die UID zu speichern
uint8_t uidLength;                                       // Länge der UID (4 or 7 bytes je nach ISO14443A Card/Chip Type)
// Warte auf einen ISO14443A Chip. Wird ein solcher entdeckt, wird die Variable
// mit der UID gefüllt. Abhängig von der Länge (4 bytes (Mifare Classic) oder
// 7 bytes (Mifare Ultralight) wird der Kartentyp erkannt.
success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);
if (success) {                                           // Wenn erkannt wird, arbeite ab...
Serial.println("Found an ISO14443A card");
Serial.print("  UID Length: "); Serial.print(uidLength, DEC); Serial.println(" bytes");
Serial.print("  UID Value: ");
nfc.PrintHex(uid, uidLength);                          // gib Informationen auf seriellen Monitor aus
if (uidLength == 4) {                                  // Hat die Karte/der Chip 4 byte Länge...
// Mifare Classic Karte
cardid = uid[0];                                     //
cardid <<= 8;                                        // Setze die 4 byte Blöcke
cardid |= uid[1];                                    //
cardid <<= 8;                                        // zu einem einzigen Block
cardid |= uid[2];                                    //
cardid <<= 8;                                        // zusammen
cardid |= uid[3];                                    //
Serial.print("Scheint eine Mifare Classic zu sein #");  //
Serial.println(cardid);                                 // Gib die Informationen aus
Serial.println("");                                     // 
Serial.println("");                                     // 
}
if  ((cardid) == (TAGid1)||(cardid) == (TAGid2)||(cardid) == (TAGid3))  // Abfrage, ob die TAGs 1..2..3 mit der jeweiligen
{digitalWrite(OutputPin,HIGH);                                                // überein stimmt. Dann schalte je nach dem
delay(2000);
digitalWrite(OutputPin,LOW);}                                                 // Ein oder Aus
else
{tone(AlarmPin, 1000);                                                        // Und gib ggf. einen Ton/Frequenz aus
delay(4000);
noTone(AlarmPin);}
}                                                      // Ende der IF Abfrage/Schleife
}                                                        // Ende der Loop Schleife

Der Programmcode (SPI Version)

//*******************************************************************************************************
//**  Beispielsketch für das Auslesen von ID-Tags. Bei passender ID wird PIN 13 für 2 Sekunden         **
//**  eingeschaltet (LED). Bei falscher ID wird an Pin 12 ein Ton erzeugt. (PASSIVEN Buzzer / Piezzo)  **
//**  nutzen. Statt einer LED kann auch ein Türschloss geschaltet werden (über TIP120 Schaltverstärker **
//*******************************************************************************************************
#include <Wire.h>                            // Bibliothek fürs I2C Protokoll
#include <SPI.h>                             // Bibliothek fürs SPI Protokoll
#include <Adafruit_PN532.h>                  // Bibliothek für das NFC/RFID Modul !!! Bitte mittels Arduino IDE laden !!!
const byte PN532_SCK = 2;                    //
const byte PN532_MOSI =3;                    // Definiere die Anschlüsse für 
const byte PN532_SS  = 4;                    // die SPI Verbindung zum RFID 
const byte PN532_MISO =5;                    // Board
const int AlarmPin  =  12;                   // Definiere die Anschlüsse für 
const int OutputPin =  13;                   // die (Schalt)Ausgänge
unsigned long cardid;                        // Variable für die ausgelesene TAG-ID
unsigned long TAGid1 = 1702536620;           // Hier können zu akzeptierende IDs eingetragen werden
unsigned long TAGid2 = 4070796058;           // Sonst frei lassen. Die ID einzelner TAGs können mit
unsigned long TAGid3 ;                       // dem seriellen Monitor ausgelesen werden (115200 Baud einstellen)
Adafruit_PN532 nfc(PN532_SCK, PN532_MISO, PN532_MOSI, PN532_SS);   // Instanz erzeugen mit SPI Protokoll
void setup() {                               // Beginn Setup Funktion
pinMode(AlarmPin, OUTPUT);                 // Definiere PIN als Ausgang
pinMode(OutputPin, OUTPUT);               // Definiere PIN als Ausgang
Serial.begin(115200);                      // Öffne serielle Übertragung mit 115200 Baud (ser Monitor gleiche Baud Einstellung!)
Serial.println("Hallo!");                  // Schicke Text "Hallo!" auf seriellen Monitor
nfc.begin();                               // Beginne Kommunikation mit RFID Leser
unsigned long versiondata = nfc.getFirmwareVersion();  // Lese Versionsnummer der Firmware aus
if (! versiondata) {                                   // Wenn keine Antwort kommt
Serial.print("Kann kein Board finden !");            // Sende Text "Kann kein..." an seriellen Monitor
while (1);                                           // so lange Stopp
}
Serial.print("Found chip PN5"); Serial.println((versiondata >> 24) & 0xFF, HEX); // Sende Text und Versionsinfos an seriellen
Serial.print("Firmware ver. "); Serial.print((versiondata >> 16) & 0xFF, DEC);   // Monitor, wenn Antwort vom Board kommt
Serial.print('.'); Serial.println((versiondata >> 8) & 0xFF, DEC);               // 
nfc.SAMConfig();                                             // Konfiguriere Board RFID Tags zu lesen
Serial.println("Warte auf einen ISO14443A Chip ...");        // Sende Text dass gewartet wird an seriellen Monitor
}
void loop() {                                                // Beginne Loop-Funktion
uint8_t success;                                           // Variable anlegen
uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };                   // Puffer um die UID zu speichern
uint8_t uidLength;                                         // Länge der UID (4 or 7 bytes je nach ISO14443A Card/Chip Type)
// Warte auf einen ISO14443A Chip. Wird ein solcher entdeckt, wird die Variable
// mit der UID gefüllt. Abhängig von der Länge (4 bytes (Mifare Classic) oder
// 7 bytes (Mifare Ultralight) wird der Kartentyp erkannt.
success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);
if (success) {                                                    // Wenn erkannt wird, arbeite ab...
Serial.println("Found an ISO14443A card");
Serial.print("  UID Length: "); Serial.print(uidLength, DEC); Serial.println(" bytes");
Serial.print("  UID Value: ");
nfc.PrintHex(uid, uidLength);                          // gib Informationen auf seriellen Monitor aus
if (uidLength == 4) {                                  // Hat die Karte/der Chip 4 byte Länge...
// Mifare Classic Karte
cardid = uid[0];                                     //
cardid <<= 8;                                        // Setze die 4 byte Blöcke
cardid |= uid[1];                                    //
cardid <<= 8;                                        // zu einem einzigen Block
cardid |= uid[2];                                    //
cardid <<= 8;                                        // zusammen
cardid |= uid[3];                                    //
Serial.print("Scheint eine Mifare Classic zu sein #");  //
Serial.println(cardid);                                 // Gib die Informationen aus
Serial.println("");                                     // 
Serial.println("");                                     // 
}
if  ((cardid) == (TAGid1)||(cardid) == (TAGid2)||(cardid) == (TAGid3))  // Abfrage, ob die TAGs 1..2..3 mit der jeweiligen
{digitalWrite(OutputPin,HIGH);                                                // überein stimmt. Dann schalte je nach dem
delay(2000);
digitalWrite(OutputPin,LOW);}                                                 // Ein oder Aus
else
{tone(AlarmPin, 1000);                                                        // Und gib ggf. einen Ton/Frequenz aus
delay(4000);
noTone(AlarmPin);}
}                                                      // Ende der IF Abfrage/Schleife
}                                                        // Ende der Loop Schleife

 

Themen: #arduino, #rfid
Bitte gebe die Zeichenfolge in das nachfolgende Textfeld ein.

Die mit einem * markierten Felder sind Pflichtfelder.

  • Feedback 2 zum Sketch


    Funktioniert. Man muss die Baud-Rate bei serial Monitor richtig einstellen, hier 115200

Passende Artikel
- 20%
PN532 NFC RFID V3 Modul für Arduino und Co. PN532 NFC RFID V3 Modul für Arduino und Co.
Inhalt 1 Stück
5,67 € * 7,09 € *
Artikel-Nr.: F23107350
Hinzufügen