Arduino RFID Reader mit ID-12LA

Ich habe mich ein wenig mit dem Aufbau eines Arduino RFID Readers beschäftigt. Da ich anfangs leichte Schwierigkeiten mit dem Sketch hatte, habe ich dazu ein HowTo als Hilfe für eigene Projekte mit dem ID-12LA RFID Reader geschrieben.

Beschreibung Arduino RFID Reader mit ID-12LA

Der Versuchsaufbau besteht aus einem Arduino Uno und dem ID-12LA RFID Reader mit SparkFun RFID Reader BreakoutArduino RFID Reader ID-12LA

Der ID-xxLA RFID Reader

Das RFID Reader Module arbeitet mit EM 4001 oder kompatiblen Karten die mit der 125 kHz Frequenz arbeiten zusammen. Die drei verschiedenen Modelle unterscheiden sich nur durch die Antenne und damit auch in der Größe und Reichweite.

Der ID-3LA hat keine integrierte Antenne. Die beiden anderen Modelle ID-12LA und ID-20LA haben eine integrierte Antenne. Der ID-12LA soll eine Reichweite von bis zu 12 cm erreichen wobei der größere ID-20LA bis zu 18 cm schaffen soll.

Als kleines Hindernis kann man den unüblichen 2mm Abstand der Pins bezeichnen. Hier hilft aber eine Breakout Platine.

Die Pin Belegung

In diesem Aufbau werden nur VIN Pin 11 und GND Pin 1 für die Stromversorgung und D0 Pin 9 für die Datenübertragung (TTL Data) benötigt.

In verschiedenen Skripts habe ich gesehen das mit dem RESET Pin 2 gearbeitet wird. Dies bewirkt das die Karte sofort nach dem Reset wieder eingelesen wird. Der normale Zustand ist, dass die Karte einmal gelesen wird und erst nachdem sie außerhalb der Reichweite war, erneut gelesen werden kann. Soll die Karte wiederholt gelesen werden, muss nachdem die Karte gelesen wurde der Reset Pin kurz auf GND gezogen werden.

Der TAG Pin 6 (Tag in Range) gibt VIN aus wenn eine Karte im Lesebereich ist. Durch den integrierten 3K3 Widerstand könnte auch direkt eine passende LED angeschlossen werden.

Der FORMAT Pin 7 (Format) ist für die Auswahl der verschiedenen Formate (ASCII / Magnet Emulation / Wiegand26) und sollte für ASCII normalerweise auf GND gelegt werden. Ich habe im Datasheet leider nichts gefunden aber es scheint so als wäre ASCII Standard?!
Arduino RFID Reader ID-12LA Pin Out

Die Verkabelung

Es sollte aufgrund der seriellen Datenübertragung möglich sein die oben genannten RFID Reader auch abgesetzt vom Arduino über längere Kabel zu betreiben.

Ich habe auf eine Darstellung auf dem Steckbrett verzichtet. Ohne Breakout Platine kann der RFID Reader eh nicht auf dem Steckbrett verwendet werden. Auf dem Schaltplan sieht man aber sehr gut was wie angeschlossen werden muss.
Arduino RFID Reader ID-12LA Schaltplan

Arduino Sketch File

Ich habe wirklich lange probiert bis ich dann einen relativ einfachen aufgebauten Sketch gefunden habe der mit recht wenig Zeilen jetzt genau das macht was er soll, Tag ID einlesen und mit vorgegebenen IDs vergleichen. Das ganze ist natürlich noch um weitere Tags erweiterbar!

//////////////////////
// Tags definieren
char tag1[13] = "710024DA901F";
String tag1_name = "RFID Card 1";

char tag2[13] = "710025404552";
String tag2_name = "RFID Card 2";

//////////////////////
// Libraries
#include <SoftwareSerial.h>

//////////////////////
// Pins definieren
#define rxPin 4  // Receive
#define txPin 5  // Transmit (wird nicht benötigt muss aber definiert werden) 

#define RelaisPin 2

//////////////////////
// Variablen

String myTag, myTagClean;

//////////////////////
// Setup

SoftwareSerial rfid = SoftwareSerial( rxPin, txPin );

void setup()
{
// Start Serial (Debug Only)
 Serial.begin(9600);
 Serial.println("Starte Kartenleser");

// Start Software Serial
 rfid.begin(9600);

// Relais Pin
  pinMode(RelaisPin, OUTPUT);
}

void loop()
{
  // read serial if available
  if (rfid.available())
  {
    // read and cast to char incoming data
    char incoming = (char)rfid.read(); 
 
    // if I read the final delimiter
    if(incoming == 3)
    {
      Serial.println("###########################"); 
      Serial.println("Lese Tag");

       // clean up String => we skip the first char, and take the following 12 chars
      myTagClean = myTag.substring(1, 13);
 
      // reset myTag
      myTag = "";

      // Write tag ID
      Serial.println(myTagClean);

      // test and compare
      if(myTagClean == tag1)
      {
        Serial.println(tag1_name);
        OpenDoor();
      }
 
      else if(myTagClean == tag2)
      {
        Serial.println(tag2_name);
        OpenDoor();
      }

      else
      {
        Serial.println("Tag unbekannt!");
      }
    }
    else
    {
      myTag = String (myTag + incoming);
    }
  }
}

//////////////////////
// Function

void OpenDoor()
{
    Serial.println("Zutritt");
    digitalWrite(RelaisPin, HIGH);
    delay(3000);
    digitalWrite(RelaisPin, LOW);
}

Schnittstellen

Als kleine Hilfe habe ich im Sketch erst mal die einfachste Variante, die Ansteuerung eines Koppelrelais, eingebaut. Mit Hilfe des Beitrages über die Arduino UDP Kommunikation könnte man den Arduino RFID Reader auch netzwerkfähig machen. Damit wäre dann auch eine Anbindung an den Loxone Miniserver möglich. Auch eine Kommunikation über ein RS485 Modul wäre denkbar.

Erweiterungen

Mit relativ wenig Aufwand könnte man den Arduino RFID Reader noch um weitere Funktionen erweitern.

  • Der Arduino RFID Reader könnte mit einem Piezo Buzzer oder mit LEDs erweitert werden um eine falsche bzw. richtige Karte zu signalisieren.
  • Ein 16×2 oder 20×4 Zeichen I2C LCDisplay könnte dazu verwendet werden um z. B. die letzte Karte, Fehlversuche oder auch Öffnungen Gesamt (Seit Start) abzulesen.
  • Zusätzlich zur Karte könnte über ein KeyPad eine Pin Eingabe gefordert werden.
  • Über ein Netzwerk Shield könnte per NTP Datum und Uhrzeit abgerufen werden um so Zeitpläne zu realisieren.

Schreibe einen Kommentar

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