Radio Frequency Identification (RFID) ist eine aufregende Technologie, die in den letzten Jahren an Popularität gewonnen hat. Dadurch wird die Möglichkeit geschaffen, etwas mit einem sehr kleinen passiven Chip zu kennzeichnen, der dann das Fernlesen der Informationen auf diesem Chip ermöglicht. RFID-Tags werden häufig für Sicherheitstürkarten, zur Identifizierung verlorener Haustiere und in letzter Zeit für Nahfeldkommunikation in Smartphones verwendet.
In diesem Lernprogramm werde ich einige Grundlagen zur Funktionsweise von RFID erläutern, einige verschiedene Arten von RFID beschreiben und zeigen, wie Sie einen RFID-Garagentoröffner bauen können.
RFID ist eine wirklich coole Technologie, die die Energie des RFID-Lesersignals zur Stromversorgung des Tags oder Transponders verwendet. Dies gibt dann ein Signal zurück, das den Inhalt des Speicherchips des Tags enthält.
Es gibt eine Reihe von RFID-Typen. Bei einigen Tags kann eine kleine Datenmenge geschrieben werden, die später gelesen werden kann. Andere sind so ausgereift, dass der Leser einen Verschlüsselungsschlüssel signalisieren muss, bevor der Tag den Inhalt decodieren und zurückgeben kann. Die meisten Tags enthalten jedoch lediglich permanente eindeutige ID-Nummern. Weitere Informationen zu RFID finden Sie in Wikipedia.
RFID-Chipformate und -frequenzen variieren erheblich. Es gibt eine ganze Buchstabensuppe von Typen. Viele Smartphones lesen NFC- und MIFARE-Formate.
Für dieses Projekt werde ich jedoch den Chip des Typs EM4100 125K Wiegand verwenden. Diese Art von RFID verwendet kostengünstige Lesegeräte und Tags, was der Hauptgrund für diesen Chip in meinem Kit ist. Solange Sie über kompatible Lesegeräte und Tags verfügen, ist die RFID-Art für dieses Projekt ohne Bedeutung.
In diesem Projekt werde ich ein RFID-Tag und ein Arduino verwenden, um ein Garagentor zu öffnen, wenn ein autorisiertes Tag erkannt wird. Die Verwendung einer Low-Level-RFID-Komponente ist eine ziemlich komplizierte Aufgabe. Daher verwenden wir eine Breakout-Platine, die das Low-Level-Lesen vornimmt und den Tag-Code über serielle Pins überträgt. So funktionieren die meisten RFID-Breakout-Boards. Dieses Tutorial verwendet ein solches Breakout-Board.
Für dieses Tutorial werde ich den Entwurf für den Garagentoröffner ausarbeiten und einen funktionalen Proof-of-Concept erstellen.
Der Prozess ist ziemlich einfach.
Zunächst liest das RFID-Lesegerät den Tag und überträgt den Code an den Arduino. Der Arduino liest dann den Code von der seriellen Verbindung und vergleicht ihn mit einer Liste autorisierter RFID-Codes. Wenn sich das Tag auf der autorisierten Liste befindet, zieht der Arduino einen Pin hoch, um 5 V bereitzustellen, um ein Relais zu schließen. Wenn das Relais schließt, verbindet es die Klemmen der Signalkontakte des Garagentors. Das Garagentor öffnet sich dann.
Verwenden Sie das Datenblatt oder die Anweisungen auf dem RFID-Lesegerät, um die Stromversorgungs-, Erdungs-, Serien- und Antennenstifte zu verbinden. Unten ist das Pin-Out-Diagramm des Lesers, den ich habe. Wir verwenden die Arduino-Pins 2 und 3 für die serielle Kommunikation mit der RFID-Platine, sodass wir die Pins 0 und 1 für die Konsolenausgabe belassen können.
Befolgen Sie diese Schritte, um die RFID-Leserkarte anzuschließen.
Mein Steckbrett-Setup wird unten gezeigt.
Fügen Sie das Relais dem Steckbrett hinzu. Die beiden internen Pins führen den Elektromagneten, der das Relais schließt. In der folgenden Abbildung können Sie sehen, wie sich der Strom durch die Pins 3 bis 7 auf das Relais auswirkt.
Dies ist mein Steckbrett mit dem Relais verdrahtet.
Breadboard mit RFID- und Relais-SetupKonfiguration()
Funktion. In diesem Beispiel: 38400
. Sie sollten so etwas sehen:
RFID-GDO V0.1
Tag gelesen: 3D00CFBB80
Prüfsumme: C9 - bestanden.
3D00CFBB80
Bad-Tag Geh weg.
Kopieren Sie Ihre ID und fügen Sie sie ein (3D00CFBB80
in diesem Beispiel) in den Code in die Liste goodTags. Beachten Sie, dass sich ein anderer Code in einer neuen Zeile befinden kann, solange er von Anführungszeichen umgeben ist und nach ihm ein Komma steht. Eine einzelne Codeliste kann ungefähr so aussehen:
char * goodTags [] =
"3D00CFBB80",
;
Klicken Sie in der Arduino IDE auf Hochladen, und öffnen Sie den seriellen Monitor der Arduino IDE, indem Sie auf drücken STRG-UMSCHALTTASTE M oder Menü auswählen Extras> Serienmonitor.
Wenn Sie jetzt den Code ausführen, sehen Sie Folgendes:
RFID-GDO V0.1
Tag gelesen: 3D00CFBB80
Prüfsumme: C9 - bestanden.
3D00CFBB80
Tür öffnen!
Unten ist ein Foto von mir, das den RFID-Tag mit dem Relais testet. Das Multimeter ist an den Pins 1 und 9 des Relais angeschlossen, so dass beim Schließen des Relais der Durchgang erkannt wird.
Wenn ein Multimeter angeschlossen ist, können Sie den Piepton des Multimeters hören, um die Kontinuität anzuzeigen, und dann ein sehr schwaches Klingeln, und das Relais schnappt zurück.
Die meisten Garagentoröffner funktionieren sehr einfach durch Öffnen, wenn ein Kontakt geschlossen ist. Wenn Sie die Taste an der Wand drücken, schließen Sie den Kontakt. An meinem Garagentoröffner habe ich Terminals, an denen die Drähte der Taste angeschlossen sind. Sie können die hier hervorgehobenen Terminals sehen:
Sie haben jetzt den grundlegenden Proof-of-Concept für das Öffnen der Tür mit einer Handbewegung.
/ * RFID Garagentoröffner-Beispielcode von Ben Miller @VMfoo Die ReadKey-Funktion wurde zum Teil vom Arduino-Spielplatzbeispiel inspiriert und entlehnt: http://playground.arduino.cc/Code/ID12 * / // Sie können die SoftwareSerial-Bibliothek hinzufügen Verwenden Sie die folgenden Funktionen: #include // Verlassen der seriellen Hardwareanschlüsse für das Debuggen #define rxPin 2 // Pin zum Empfangen von Daten vom RFID-Lesegerät #define txPin 3 // Sende-Pin für Softserial-Initialisierung #define doorPin 4 // Pin zum Auslösen des Relais / / neue serielle Schnittstelle einrichten NewSoftSerial RFIDPort = NewSoftSerial (rxPin, txPin); Byte PinState = 0; // für eingehende serielle Daten int incomingByte = 0; // Zeichenfeld für den Wert des RFID-Tags char tagValue [10]; // Welche Tag-Werte sind autorisiert? * GoodTags [] = "3D00CFBB80", // "######", // fügen Sie ein weiteres Tag hinzu, indem Sie die # durch Ihren Code ersetzen und diese Zeile auskommentieren. // Berechne die Anzahl der Tags im obigen Array int intCount = sizeof (goodTags) / sizeof (goodTags [0]); void setup () // Pinmodi für das Öffnerrelais definieren pinMode (doorPin, OUTPUT); // Setze die Datenrate für den SoftwareSerial Port RFIDPort.begin (9600); Serienbeginn (38400); // serielle Überwachungsrate Serial.println ("RFID GDO V0.1"); // Hallo Welt void loop () // Schleife und lese if (RFIDPort.available ()) if (readKey ()) // Tagwert prüfen if (goodTag ()) // wenn dies openDoor erlaubt ist (); else Serial.println ("Ungültiger Tag. Gehen Sie weg."); int goodTag () für (int i = 0; i < tagCount; i++) //walk through the tag list if(strcmp(tagValue, goodTags[i]) == 0) return 1; return 0; void openDoor() Serial.println("Opening Door!"); digitalWrite(doorPin, HIGH); delay(500); // half a second is plenty of time to let trigger the contact digitalWrite(doorPin, LOW); //to prevent "bounce" or secondary reads if the tag is still close to the reader //we delay 3 seconds delay(3000); int readKey() byte i = 0; byte val = 0; byte checksum = 0; byte bytesRead = 0; byte tempByte = 0; byte tagBytes[6]; // "Unique" tags are only 5 bytes but we need an extra byte for the checksum // char tagValue[10]; this is defined globaly to simplify code if((val = RFIDPort.read()) == 2) // Check for header bytesRead = 0; while (bytesRead < 12) // Read 10 digit code + 2 digit checksum if (RFIDPort.available()) val = RFIDPort.read(); // Append the first 10 bytes (0 to 9) to the raw tag value // Check if this is a header or stop byte before the 10 digit reading is complete if (bytesRead < 10) tagValue[bytesRead] = val; if((val == 0x0D)||(val == 0x0A)||(val == 0x03)||(val == 0x02)) break; // Stop reading // Ascii/Hex conversion: if ((val >= '0') && (val <= '9')) val = val - '0'; else if ((val >= 'A') && (val <= 'F')) val = 10 + val - 'A'; // Every two hex-digits, add a byte to the code: if (bytesRead & 1 == 1) // Make space for this hex-digit by shifting the previous digit 4 bits to the left tagBytes[bytesRead >> 1] = (val | (tempByte << 4)); if (bytesRead >> 1! = 5) // Wenn wir uns im Prüfsummen-Byte befinden, gilt die Prüfsumme ^ = tagBytes [bytesRead >> 1]; // Berechne die Prüfsumme… (XOR); else tempByte = val; // Die erste Hex-Ziffer zuerst speichern; bytesRead ++; // Bereit zum Lesen der nächsten Ziffer // Das Ergebnis wird an den über USB angeschlossenen Host gesendet, wenn (bytesRead == 12) // 12-stellige Lesung abgeschlossen ist tagValue [10] = '\ 0'; // null-terminate den String Serial.print ("Tag read:"); für (i = 0; i<5; i++) // Add a leading 0 to pad out values below 16 if (tagBytes[i] < 16) Serial.print("0"); Serial.print(tagBytes[i], HEX); Serial.println(); Serial.print("Checksum: "); Serial.print(tagBytes[5], HEX); Serial.println(tagBytes[5] == checksum ? " -- passed." : " -- error."); Serial.println(tagValue); Serial.println(); return 1; //return value to indicate that we read something bytesRead=0; return 0;
In diesem Tutorial habe ich die Grundlagen der RFID-Technologie beschrieben und erläutert, wie Sie diese für Ihre eigenen Projekte nutzen können. Während die Low-Level-Komponenten, die RFID lesen, für Hobbyisten möglicherweise schwierig zu verwenden sind, ermöglichen RFID-Breakout-Boards die Verwendung von RFID in Projekten mit Arduino oder sogar einem Raspberry Pi über einen seriellen Anschluss. Sobald eine ID aus einem Tag gelesen wurde, kann auf die Informationen einfach reagiert werden. In diesem Beispiel haben wir ein Relais betätigt, um ein Garagentor zu öffnen.
In Ergänzung: