1-Wire PN532 13,56MHz NFC/RFID Reader Adapter

Als ich kleine PN532 NFC/RFID Reader (Writer) Module gefunden hatte war schnell der Wunsch entstanden mit diesen Modulen ein Zugangssystem zur Nutzung mit dem Loxone Miniserver, über einen Loxberry inkl. 1-Wire Plugin, zu entwickeln.

Die Module welche ich nutze sehen so aus…

PN532-Modul 1-Wire PN532 13,56MHz NFC/RFID Reader AdapterDurch die kleinen Abmessungen passen die Platinen gut hinter Schaltersystem-Blindabdeckungen oder einfach in Unterputzdosen.

Als Adapter, um die IDs der aufgelegten Karten bzw. Tags, per 1-Wire nutzbar zu machen habe ich folgende Adapter-Platine entworfen (2. Version)…

1-Wire-PN532-RFID-Reader-Adapter-PCB-TOP-1 1-Wire PN532 13,56MHz NFC/RFID Reader AdapterUnd wie funktioniert das jetzt?

Ganz einfach 😉

Das PN532 Modul wird z.B. hinter eine Blindabdeckung (mit Heißkleber) geklebt, darauf wird dann der Adapter aufgesteckt welcher mit dem 1-Wire Bus am Loxberry verbunden wird.

Der ATMEGA328 Mikrocontroller ist per SPI-Bus mit dem PN532 Modul verbunden (man kann die beiden Platinen abgesetzt voneinander, per Kabel verbunden, installieren) und erkennt eine Karte oder einen Tag und liest die ID aus.

Über herausgeführte RX und TX Pins kann man per UART Statusmeldungen bei der Entwicklung mitlesen, über einen integrierten DS2413 können zur Signalisierung 2 LEDs vom Loxone Miniserver über den Loxberry angesteuert werden.

Eine weitere LED kann direkt vom Mikrocontroller aus geschaltet werden.

Bei mir werden die LEDs wie folgt genutzt werden:

Die LED direkt am Mikrocontrolller (bei mir blau) signalisiert das das System läuft.

Eine LED am DS2413 (rot) wird bei einer nicht authorisierten Karte/einem nicht authorisierten Tag aktiviert.

Zu guter letzt kann noch eine zweite LED (grün) am DS2413 signalisieren das die Erkennung korrekt abgelaufen ist und der Zugang gewährt wird.

Es wird mit dem ATMEGA328 Mikrocontroller ein DS2401 I-Button emuliert und auf den Bus gelegt, die ID dieses I-Button setzt sich aus der jeweiligen ID der erkannten Karte, bzw. des erkannten Tags, zusammen.

Da es für die Arduino IDE schon fertige Bibliotheken gibt um den PN532 zu nutzen habe ich mich dafür entschlossen die Software mit der Arduino IDE zu entwickeln.

Das Programm ist aktuell folgendes…

/*
 * 
 *  1-Wire PN532 NRF/RFID Adapter Reader Software
 * 
 *  Copyright 2019 by Th. Heldt, Karlsbad (Germany)
 * 
 *  Emuliert einen DS2401 (IButton) + zusätzlicher DS2401 als 
 *  Geräte ID + zusätzlicher DS2411 als Reader ID
 *  
 *  Frequenz 13,56 MHz
 * 
 */

#include <Adafruit_PN532.h> //https://github.com/adafruit/Adafruit-PN532
#include <Wire.h>
#include "OneWireHub.h"
#include "DS2401.h"

#define PN532_SCK  13
#define PN532_MISO 12
#define PN532_MOSI 11
#define PN532_SS   10
#define LED_PIN 8
#define DQ_PIN 7
#define DS2411_PIN 3

Adafruit_PN532 nfc(PN532_SCK, PN532_MISO, PN532_MOSI, PN532_SS);

OneWireHub hub = OneWireHub(DQ_PIN);

struct RFIDCard {
  uint8_t idLength;                 
  uint8_t id[7]; 
};

void setup(void) {
  pinMode(LED_PIN, OUTPUT);
  pinMode(DS2411_PIN, OUTPUT);
  
  digitalWrite(LED_PIN, LOW);
  digitalWrite(DS2411_PIN, LOW);
  
  Serial.begin(115200);
  Serial.println("1-Wire NFC/RFID Reader startet...");
  Serial.flush();

  nfc.begin();
  
  uint32_t VersionData = nfc.getFirmwareVersion();
  
  if (!VersionData) {
    Serial.print("Kein PN532 Board angeschlossen!");
    Serial.flush();
    while (1);
  }
  
  Serial.println("1-Wire NFC/RFID Reader betriebsbereit...");
  Serial.flush();
  
  Serial.print("Chip: PN5"); 
  Serial.println((VersionData >> 24) & 0xFF, HEX); 
  Serial.print("Firmware: "); 
  Serial.print((VersionData >> 16) & 0xFF, DEC); 
  Serial.print('.'); 
  Serial.println((VersionData >> 8) & 0xFF, DEC);
  Serial.flush();
  
  nfc.SAMConfig();
  
  digitalWrite(LED_PIN, HIGH);

  Serial.println("Warte auf NFC/RFID Karte/Tag ...");
  Serial.flush();
}

void loop(void) {
  RFIDCard RFIDCard;

  RFIDCard.idLength = 0;
  
  for (byte i = 0; i < 7; i++) {
    RFIDCard.id[i] = 0;
  }
  
  if (nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &RFIDCard.id[0], &RFIDCard.idLength, 250)) {
    Serial.print("Erkannte Karte/Erkannter Tag:");
  
    for (byte i = 0; i < RFIDCard.idLength; i++) {
      Serial.print(" 0x"); 
      Serial.print(RFIDCard.id[i] < 16 ? "0":""); 
      Serial.print(RFIDCard.id[i], HEX); 
    } 
   
    Serial.println(""); 
    Serial.flush(); 

    DS2401 *ds2401; 

    if (RFIDCard.idLength == 4) { 
      ds2401 = new DS2401(DS2401::family_code, 0x00, 0x00, RFIDCard.id[0], RFIDCard.id[1], RFIDCard.id[2], RFIDCard.id[3]); 
    } 

    if (RFIDCard.idLength == 7) { 
      ds2401 = new DS2401(DS2401::family_code, RFIDCard.id[1], RFIDCard.id[2], RFIDCard.id[3], RFIDCard.id[4], RFIDCard.id[5], RFIDCard.id[6]); 
    } 

    digitalWrite(DS2411_PIN, HIGH); 
 
    hub.attach(*ds2401); 

    unsigned long endTime = millis() + 3000; 

    while (endTime > millis()){
      hub.poll();
    }
    
    hub.detach(*ds2401);
    
    digitalWrite(DS2411_PIN, LOW);

    delete ds2401;
  } else {
    RFIDCard.idLength = 0;
    
    for (byte i = 0; i < 7; i++) {
      RFIDCard.id[i] = 0;
    }
  }
}

Um zu  erkennen an welchem Reader der Tag/die Karte aufgelegt wurde wird zusätzlich, gleichzeitig, noch ein DS2411 auf den Bus gelegt. Mit einer UND Verknüpfung in der Loxone Config kann man dann erkennen wo der Tag/die Karte aufgelegt wurde.

Weil noch Platz war habe ich gleich noch einen DS18B20 Temperatursensor integriert, diesen kann man dann direkt nutzen um z.B. die Raumtemperatur zu messen 😉

Sobald die Musterplatinen da sind geht es hier weiter….

Verlinke diesen Beitrag:

<a href="https://blog.thomasheldt.de/1-wire-pn532-1356mhz-nfc-rfid-reader-adapter/">1-Wire PN532 13,56MHz NFC/RFID Reader Adapter</a>

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.