DIY NFC Türschloss / Kontaktloses Steuern per RFID und NFC

Hier die Details zum Video, wie ein kontaktloses Schrankschloss, das über
eine RFID-Karte (radio-frequency identification) verschlossen und geöffnet werden kann, mit einen Arduino gebaut werden kann.
Eine direkt einsatzbare Lösung eines RFID Möbelschlosses wird geöffnet und näher betrachtet.

Als RFID/NFC Schreib/Lese-Modul hatte ich zwei Versionen zu auswahl. Denn PN532 und einem RC522. Beide Module arbeiten mit einer Frequenz von 13,56 MHz und verwenden beide einen Chip von NXP.
Da der RC522 hauptsächlich das ISO/IEC 14443 A Protokoll unterstützt, der PN532 aber weitere Protokolle wie FeliCa und NFCIP-1 (NFC) habe ich mich um auch weitere Experimente damit ausführen zu können, für dieses multifunktionale Nahfeldkommunikationsleser-Modul entschieden. Ausreichend und günstiger wäre aber der RC522.

Die Datenübertragung und meist auch Energieversorgung bei RFID erfolgen über das magnetische Nahfeld, für die induktive Kopplung oder Nahfeldkopplung (NFC) der Spulen im Lesegerät und im Tag.
Quelle: RFID – Wikipedia

Einige passive RFID-Transponder und Karten werden vorgestellt.

Das Magnetfeld des aktiven Gerätes, induziert hier eine Spannung, die mit einer einfachen Kupferdrahtspule (an der eine LED angebracht wurde), leicht auf Funktion getestet werden konnte.
Details zum NFC Test Tool siehe NFC Test Tool – Prilchen tüftelt

Verdrahtung:

Hardware:

Arduino Uno
PN532 Nahfeldkommunikationsleser-Modul optional RC522
Relaymodul 5V
Elektronisches Türschloss
Breadboard

PN532 Reader unterstützt laut Hersteller diese Karten/Tags und Normen:


Quellcode:

// Librarys: https://github.com/adafruit/Adafruit-PN532
// https://github.com/elechouse/PN532

  // RFID Reader PN532:
  // GND ----- GND
  // VCC ----- 5V
  // SDA ----- A4
  // SCL ----- A5
  // IRQ ----- 2
  // RST0 ---- 3
  //
  // Buzzer - 11
  // Relay -- 4

#include <Wire.h>
#include <PN532_I2C.h>
#include <PN532.h>
#include <NfcAdapter.h>

PN532_I2C pn532i2c(Wire);
PN532 nfc(pn532i2c);

void setup(void) {
  
  pinMode(4, OUTPUT);     // Relay an Pin 4
  pinMode(11,OUTPUT);      // Piezo an Pin 11 
  digitalWrite(4, HIGH);  // Startzustand Tuerschloss
  
  Serial.begin(115200);
  Serial.println("Hallo!");
  nfc.begin();

  uint32_t versiondata = nfc.getFirmwareVersion();

  if (! versiondata) {
    Serial.print("Kein PN53x board gefunden");
    while (10); 
  }

  Serial.print("Gefundener Chip PN5"); Serial.println((versiondata>>24) & 0xFF, HEX); 
  Serial.print("Firmware ver. "); Serial.print((versiondata>>16) & 0xFF, DEC); 
  Serial.print('.'); Serial.println((versiondata>>8) & 0xFF, DEC);

  // Festlegen der maximalen Anzahl von Wiederholungsversuchen zum Lesen von einer Karte
  // Dies verhindert, dass ewig auf eine Karte gewartet wird
  nfc.setPassiveActivationRetries(0xFF);

  // Konfigurieren der Platine zum Lesen von RFID-Transpondern
  nfc.SAMConfig();
  Serial.println("Warte auf einen ISO14443A Transponder");
}

void loop(void) {

  boolean success;

  uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };  // Puffer zum Speichern der zurückgegebenen UID
  uint8_t uidLength;                        // Länge der UID (4 oder 7 Bytes je nach ISO14443A-Kartentyp)
 
  // Warten Sie auf Karten vom Typ ISO14443A (zB. Mifare,...)
  // Wenn eine "UID" gefunden wird, kommt diese in den "uid"-Puffer
  // uidLength zeigt an, wenn die UID 4 Bytes (Mifare Classic) oder 7 Bytes (Mifare Ultralight) ist

  success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLength);

  if (success) {

    Serial.println("Karte gefunden!");
    Serial.print("UID Length: ");Serial.print(uidLength, DEC);Serial.println(" bytes");
    Serial.print("UID: ");
    nfc.PrintHex(uid, uidLength);
    
    String hex_wert = "";
    for (uint8_t i=0; i < uidLength; i++) 
    {
      hex_wert += (String)uid[i];
    }
    Serial.println("UID Hex_als_String: "+hex_wert);

// Auswertung:
//hier die UID als String der Karten / Transponder eintragen die berechtigt sind
    if(hex_wert == "54239204161") {
      Serial.println("Gueltige Karte 1");
      Serial.println("");
      
      digitalWrite(4, LOW);   // schloss auf
      delay(3000);                       // wait for a second
      digitalWrite(4, HIGH);    // schloss zu
      delay(1000);
    }

    else if(hex_wert == "50202244239") {
      Serial.println("Gueltige Karte 2");
      Serial.println("");

      //tuhe was anders ...
    }

    else
      Serial.println("Transponder unbekannt");
      Serial.println("");
      tone(11, 500, 1000); // Der Lautsprecher an Pin 11 wird mit der Tonhöhe „500“ aktiviert
      delay(1000);                       // wait for a second
      noTone(11); //   // Warnton aus
      delay(1000);    // Sekunde warten
  }

  else

  {
    // PN532 wahrscheinlich Zeitüberschreitung beim Warten auf eine Karte
    Serial.println("Warte auf Transponder...");
  }
}

, ,