Wie RFID funktioniert und wie man ein Arduino-basiertes RFID-Türschloss herstellt
In diesem Tutorial lernen wir, was RFID ist, wie es funktioniert und wie man ein Arduino-basiertes RFID-Türschloss herstellt. Sie können sich das folgende Video ansehen oder das schriftliche Tutorial unten lesen, um weitere Einzelheiten zu erfahren.
RFID steht für Radio Frequency IDentification und es ist eine berührungslose Technologie, die in vielen Branchen für Aufgaben wie Personalverfolgung, Zugangskontrolle, Lieferkettenmanagement, Bücherverfolgung in Bibliotheken, Mautstellensysteme usw. weit verbreitet ist.[/column]
Ein RFID-System besteht aus zwei Hauptkomponenten, einem Transponder oder Tag, der sich auf dem zu identifizierenden Objekt befindet, und einem Transceiver oder Lesegerät.
Das RFID-Lesegerät besteht aus einem Hochfrequenzmodul, einer Steuereinheit und einer Antennenspule, die ein hochfrequentes elektromagnetisches Feld erzeugt. Andererseits ist der Tag normalerweise ein passives Bauteil, das nur aus einer Antenne und einem elektronischen Mikrochip besteht, sodass, wenn er sich dem elektromagnetischen Feld des Transceivers nähert, aufgrund von Induktion eine Spannung in seiner Antennenspule erzeugt wird und diese Spannung dient als Strom für den Mikrochip.
Wenn das Tag jetzt mit Strom versorgt wird, kann es die übertragene Nachricht vom Lesegerät extrahieren, und zum Zurücksenden der Nachricht an das Lesegerät verwendet es eine Technik namens Lademanipulation. Das Ein- und Ausschalten einer Last an der Antenne des Tags beeinflusst den Stromverbrauch der Antenne des Lesegeräts, der als Spannungsabfall gemessen werden kann. Diese Spannungsänderungen werden als Einsen und Nullen erfasst und so werden die Daten vom Tag zum Lesegerät übertragen.
Es gibt auch eine andere Art der Datenübertragung zwischen dem Lesegerät und dem Tag, die als Backscattered Coupling bezeichnet wird. In diesem Fall verwendet der Tag einen Teil der empfangenen Leistung, um ein weiteres elektromagnetisches Feld zu erzeugen, das von der Antenne des Lesegeräts empfangen wird.
Das ist also das grundlegende Arbeitsprinzip und jetzt wollen wir sehen, wie wir RFID mit Arduino verwenden und unser eigenes RFID-Türschloss bauen können. Wir werden Tags verwenden, die auf dem MIFARE-Protokoll und dem MFRC522-RFID-Lesegerät basieren, die nur ein paar Dollar kosten.
Diese Tags haben 1 KB Speicher und einen Mikrochip, der arithmetische Operationen ausführen kann. Ihre Arbeitsfrequenz beträgt 13,56 MHz und der Arbeitsabstand je nach Antennengeometrie bis zu 10 cm. Wenn wir eines dieser Tags vor eine Lichtquelle bringen, können wir die Antenne und den Mikrochip erkennen, über die wir zuvor gesprochen haben.
Das RFID-Lesemodul verwendet das SPI-Protokoll für die Kommunikation mit dem Arduino-Board und so müssen wir es verbinden. Bitte beachten Sie, dass wir den VCC des Moduls an 3,3 V anschließen müssen und uns um die anderen Pins keine Sorgen machen müssen, da sie 5 V tolerant sind.
Sobald wir das Modul verbunden haben, müssen wir die MFRC522-Bibliothek von GitHub herunterladen. Die Bibliothek enthält mehrere gute Beispiele, anhand derer wir lernen können, wie man das Modul verwendet.
Zuerst können wir das Beispiel „DumpInfo“ hochladen und testen, ob unser System richtig funktioniert. Wenn wir nun den seriellen Monitor ausführen und das Tag in die Nähe des Moduls bringen, beginnt das Lesegerät mit dem Lesen des Tags und alle Informationen vom Tag werden auf dem seriellen Monitor angezeigt.
Hier sehen wir die UID-Nummer des Tags sowie die 1 KB Speicher, der tatsächlich in 16 Sektoren unterteilt ist, jeder Sektor in 4 Blöcke und jeder Block kann 2 Bytes Daten speichern. Für dieses Tutorial verwenden wir keinen Speicher des Tags, sondern nur die UID-Nummer des Tags.
Bevor wir den Code unseres RFID-Türschlossprojekts durchgehen, werfen wir einen Blick auf die Komponenten und die Schaltpläne dieses Projekts.
Neben dem RFID-Modul werden wir einen Näherungssensor verwenden, um zu prüfen, ob die Tür geschlossen oder geöffnet ist, einen Stellmotor für den Schließmechanismus und ein Zeichendisplay.
Die für dieses Arduino-Tutorial benötigten Komponenten erhalten Sie über die folgenden Links:
Das Projekt hat folgenden Workflow:Zuerst müssen wir einen Mastertag setzen und dann geht das System in den Normalmodus. Wenn wir ein unbekanntes Tag scannen, wird der Zugriff verweigert, aber wenn wir den Master scannen, gelangen wir in einen Programmiermodus, von wo aus wir das unbekannte Tag hinzufügen und autorisieren können. Wenn wir jetzt also das Etikett erneut scannen, wird der Zugang gewährt, sodass wir die Tür öffnen können.
Die Tür wird automatisch verriegelt, nachdem wir die Tür geschlossen haben. Wenn wir ein Tag aus dem System entfernen möchten, müssen wir nur wieder in den Programmiermodus gehen, das Know-Tag scannen und es wird entfernt.
Sehen wir uns nun den Code an. Also müssen wir zuerst die Bibliotheken für das RFID-Modul, das Display und den Servomotor einbinden, einige Variablen definieren, die für das Programm unten benötigt werden, sowie die Instanzen der Bibliotheken erstellen.
Im Setup-Abschnitt initialisieren wir zuerst die Module und setzen den Anfangswert des Servomotors in eine Verriegelungsposition. Dann geben wir die Anfangsnachricht auf dem Display aus und warten mit der folgenden „while“-Schleife, bis ein Master-Tag gescannt wird. Die benutzerdefinierte getID()-Funktion ruft die Tag-UID ab und fügt sie an die erste Position des myTags[0]-Arrays ein.
Werfen wir einen Blick auf die benutzerdefinierte Funktion getID(). Zuerst prüft es, ob ein neues Tag in der Nähe des Lesegeräts platziert ist, und wenn ja, fahren wir mit der „for“-Schleife fort, die die UID des Tags erhält. Die Tags, die wir verwenden, haben eine 4-Byte-UID-Nummer, deshalb müssen wir mit dieser Schleife 4 Iterationen durchführen, und mit der Funktion concat() fügen wir die 4 Bytes zu einer einzelnen String-Variablen hinzu. Wir setzen auch alle Zeichen des Strings auf Großbuchstaben und am Ende stoppen wir das Lesen.
Bevor wir in die Hauptschleife eintreten, rufen wir am Ende des Setup-Abschnitts auch die benutzerdefinierte Funktion printNormalModeMessage() auf, die die Nachricht „Access Control“ auf dem Display ausgibt.
In der Hauptschleife beginnen wir mit dem Lesen des Werts des Näherungssensors, der uns sagt, ob die Tür geschlossen ist oder nicht.
Wenn also die Tür geschlossen ist, verwenden wir die gleichen Zeilen wie in der benutzerdefinierten Funktion getID() beschrieben, um die UID des neuen Tags zu scannen und abzurufen. Wir können hier feststellen, dass der Code aufgrund der Zeilen „return“ in den „if“-Anweisungen nicht weitergeht, bis wir ein Tag scannen.
Sobald wir das Tag gescannt haben, prüfen wir, ob dieses Tag der Master ist, den wir zuvor registriert haben, und wenn das stimmt, gehen wir in den Programmiermodus. Wenn wir in diesem Modus ein bereits autorisiertes Tag scannen, wird es aus dem System entfernt, oder wenn das Tag unbekannt ist, wird es dem System als autorisiert hinzugefügt.
Außerhalb des Programmiermodus prüfen wir mit der nächsten „for“-Schleife, ob der gescannte Tag mit einem der registrierten Tags übereinstimmt, und entriegeln entweder die Tür oder halten den Zugang verweigert. Am Ende in der „else“-Anweisung warten wir, bis die Tür geschlossen ist, dann verriegeln wir die Tür und geben erneut die Normalmodus-Meldung aus.
Das war also so ziemlich alles und hier ist der vollständige Code des Projekts:
Ich hoffe, Ihnen hat dieses Tutorial gefallen und Sie können gerne Ihre Fragen im Kommentarbereich unten stellen.Übersicht
Wie RFID funktioniert
RFID und Arduino
Arduino RFID Door Lock Access Control Project
Quellcode
#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal.h>
#include <Servo.h>
#define RST_PIN 9
#define SS_PIN 10
byte readCard[4];
char* myTags[100] = {};
int tagsCount = 0;
String tagID = "";
boolean successRead = false;
boolean correctTag = false;
int proximitySensor;
boolean doorOpened = false;
// Create instances
MFRC522 mfrc522(SS_PIN, RST_PIN);
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Parameters: (rs, enable, d4, d5, d6, d7)
Servo myServo; // Servo motor
Codesprache:Arduino (arduino) void setup() {
// Initiating
SPI.begin(); // SPI bus
mfrc522.PCD_Init(); // MFRC522
lcd.begin(16, 2); // LCD screen
myServo.attach(8); // Servo motor
myServo.write(10); // Initial lock position of the servo motor
// Prints the initial message
lcd.print("-No Master Tag!-");
lcd.setCursor(0, 1);
lcd.print(" SCAN NOW");
// Waits until a master card is scanned
while (!successRead) {
successRead = getID();
if ( successRead == true) {
myTags[tagsCount] = strdup(tagID.c_str()); // Sets the master tag into position 0 in the array
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Master Tag Set!");
tagsCount++;
}
}
successRead = false;
printNormalModeMessage();
}
Codesprache:Arduino (arduino) uint8_t getID() {
// Getting ready for Reading PICCs
if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
return 0;
}
if ( ! mfrc522.PICC_ReadCardSerial()) { //Since a PICC placed get Serial and continue
return 0;
}
tagID = "";
for ( uint8_t i = 0; i < 4; i++) { // The MIFARE PICCs that we use have 4 byte UID
readCard[i] = mfrc522.uid.uidByte[i];
tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Adds the 4 bytes in a single String variable
}
tagID.toUpperCase();
mfrc522.PICC_HaltA(); // Stop reading
return 1;
}
Codesprache:Arduino (arduino) void printNormalModeMessage() {
delay(1500);
lcd.clear();
lcd.print("-Access Control-");
lcd.setCursor(0, 1);
lcd.print(" Scan Your Tag!");
}
Codesprache:Arduino (arduino) int proximitySensor = analogRead(A0);
Codesprache:Arduino (arduino) // Checks whether the scanned tag is the master tag
if (tagID == myTags[0]) {
lcd.clear();
lcd.print("Program mode:");
lcd.setCursor(0, 1);
lcd.print("Add/Remove Tag");
while (!successRead) {
successRead = getID();
if ( successRead == true) {
for (int i = 0; i < 100; i++) {
if (tagID == myTags[i]) {
myTags[i] = "";
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Tag Removed!");
printNormalModeMessage();
return;
}
}
myTags[tagsCount] = strdup(tagID.c_str());
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Tag Added!");
printNormalModeMessage();
tagsCount++;
return;
}
}
}
Codesprache:Arduino (arduino) // Checks whether the scanned tag is authorized
for (int i = 0; i < 100; i++) {
if (tagID == myTags[i]) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Access Granted!");
myServo.write(170); // Unlocks the door
printNormalModeMessage();
correctTag = true;
}
}
if (correctTag == false) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Access Denied!");
printNormalModeMessage();
}
}
// If door is open...
else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Door Opened!");
while (!doorOpened) {
proximitySensor = analogRead(A0);
if (proximitySensor > 200) {
doorOpened = true;
}
}
doorOpened = false;
delay(500);
myServo.write(10); // Locks the door
printNormalModeMessage();
}
Codesprache:Arduino (arduino) /*
* Arduino Door Lock Access Control Project
*
* by Dejan Nedelkovski, www.HowToMechatronics.com
*
* Library: MFRC522, https://github.com/miguelbalboa/rfid
*/
#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal.h>
#include <Servo.h>
#define RST_PIN 9
#define SS_PIN 10
byte readCard[4];
char* myTags[100] = {};
int tagsCount = 0;
String tagID = "";
boolean successRead = false;
boolean correctTag = false;
int proximitySensor;
boolean doorOpened = false;
// Create instances
MFRC522 mfrc522(SS_PIN, RST_PIN);
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Parameters: (rs, enable, d4, d5, d6, d7)
Servo myServo; // Servo motor
void setup() {
// Initiating
SPI.begin(); // SPI bus
mfrc522.PCD_Init(); // MFRC522
lcd.begin(16, 2); // LCD screen
myServo.attach(8); // Servo motor
myServo.write(10); // Initial lock position of the servo motor
// Prints the initial message
lcd.print("-No Master Tag!-");
lcd.setCursor(0, 1);
lcd.print(" SCAN NOW");
// Waits until a master card is scanned
while (!successRead) {
successRead = getID();
if ( successRead == true) {
myTags[tagsCount] = strdup(tagID.c_str()); // Sets the master tag into position 0 in the array
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Master Tag Set!");
tagsCount++;
}
}
successRead = false;
printNormalModeMessage();
}
void loop() {
int proximitySensor = analogRead(A0);
// If door is closed...
if (proximitySensor > 200) {
if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
return;
}
if ( ! mfrc522.PICC_ReadCardSerial()) { //Since a PICC placed get Serial and continue
return;
}
tagID = "";
// The MIFARE PICCs that we use have 4 byte UID
for ( uint8_t i = 0; i < 4; i++) { //
readCard[i] = mfrc522.uid.uidByte[i];
tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Adds the 4 bytes in a single String variable
}
tagID.toUpperCase();
mfrc522.PICC_HaltA(); // Stop reading
correctTag = false;
// Checks whether the scanned tag is the master tag
if (tagID == myTags[0]) {
lcd.clear();
lcd.print("Program mode:");
lcd.setCursor(0, 1);
lcd.print("Add/Remove Tag");
while (!successRead) {
successRead = getID();
if ( successRead == true) {
for (int i = 0; i < 100; i++) {
if (tagID == myTags[i]) {
myTags[i] = "";
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Tag Removed!");
printNormalModeMessage();
return;
}
}
myTags[tagsCount] = strdup(tagID.c_str());
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Tag Added!");
printNormalModeMessage();
tagsCount++;
return;
}
}
}
successRead = false;
// Checks whether the scanned tag is authorized
for (int i = 0; i < 100; i++) {
if (tagID == myTags[i]) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Access Granted!");
myServo.write(170); // Unlocks the door
printNormalModeMessage();
correctTag = true;
}
}
if (correctTag == false) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Access Denied!");
printNormalModeMessage();
}
}
// If door is open...
else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Door Opened!");
while (!doorOpened) {
proximitySensor = analogRead(A0);
if (proximitySensor > 200) {
doorOpened = true;
}
}
doorOpened = false;
delay(500);
myServo.write(10); // Locks the door
printNormalModeMessage();
}
}
uint8_t getID() {
// Getting ready for Reading PICCs
if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
return 0;
}
if ( ! mfrc522.PICC_ReadCardSerial()) { //Since a PICC placed get Serial and continue
return 0;
}
tagID = "";
for ( uint8_t i = 0; i < 4; i++) { // The MIFARE PICCs that we use have 4 byte UID
readCard[i] = mfrc522.uid.uidByte[i];
tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Adds the 4 bytes in a single String variable
}
tagID.toUpperCase();
mfrc522.PICC_HaltA(); // Stop reading
return 1;
}
void printNormalModeMessage() {
delay(1500);
lcd.clear();
lcd.print("-Access Control-");
lcd.setCursor(0, 1);
lcd.print(" Scan Your Tag!");
}
Codesprache:Arduino (arduino)
Herstellungsprozess
- Arduino RFID-Schloss mit RC522 - MIFARE-Protokoll 13,56 Mhz
- Anleitung zum Arduino-RFID-Schloss
- So erstellen Sie eine anpassbare stanzbare Tastaturtaste
- Passwortbasiertes Türschloss
- Arduino- und OLED-basierte zelluläre Automaten
- eDOT - Arduino-basierte Präzisionsuhr und Wetterstation
- Anwesenheitssystem basierend auf Arduino und Google Spreadsheet
- Wie man mit einem Arduino Musik macht
- Wie erstelle ich eine Arduino-basierte automatische Türöffnung
- So erstellen Sie einen Kompass mit Arduino und Processing IDE