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 Breakout.
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?!
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 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.