Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Arduino RFID-Türschloss bauen – RFID-Technologie Schritt für Schritt meistern

In diesem Tutorial lernen Sie, was RFID ist, wie es funktioniert und wie Sie ein Arduino-basiertes RFID-Türschloss bauen. Sie können das folgende Video ansehen oder die schriftliche Anleitung unten lesen.

Überblick

RFID steht für Radio Frequency IDentification (Frequenzbasierte Identifikation) und ist eine berührungslose Technologie, die in vielen Branchen eingesetzt wird: Personentracking, Zutrittskontrolle, Lieferkettenmanagement, Bibliotheksbuchverfolgung, Mautsysteme u. v. m.

Arduino RFID-Türschloss bauen – RFID-Technologie Schritt für Schritt meistern

Wie RFID funktioniert


Ein RFID-System besteht aus zwei Hauptkomponenten: einem Transponder (Tag), der am zu identifizierenden Objekt angebracht ist, und einem Transceiver (Reader).

Arduino RFID-Türschloss bauen – RFID-Technologie Schritt für Schritt meistern

Der RFID-Reader besteht aus einem Funkmodul, einer Steuereinheit und einer Antennenspule, die ein hochfrequentes elektromagnetisches Feld erzeugt. Der Tag ist meist passiv und besteht nur aus einer Antenne und einem Mikrochip. Nähert sich der Tag dem elektromagnetischen Feld des Readers, wird in seiner Antennenspule durch Induktion eine Spannung erzeugt, die den Mikrochip mit Strom versorgt.

Arduino RFID-Türschloss bauen – RFID-Technologie Schritt für Schritt meistern

Sobald der Tag mit Strom versorgt ist, kann er die gesendete Nachricht des Readers auslesen. Zum Senden von Daten zurück an den Reader nutzt er Lastmodulation: Ein- und Ausschalten einer Last an der Tag-Antenne verändert den Stromverbrauch der Reader-Antenne, was als Spannungsabfall messbar ist. Diese Änderungen werden als Einsen und Nullen interpretiert – so erfolgt die Datenübertragung vom Tag zum Reader.

Eine weitere Methode ist die Rückstreukopplung: Der Tag nutzt einen Teil der empfangenen Energie, um ein eigenes elektromagnetisches Feld zu erzeugen, das von der Reader-Antenne empfangen wird.

RFID und Arduino

Das war das Grundprinzip. Nun sehen wir, wie wir RFID mit Arduino nutzen und unser eigenes RFID-Türschloss bauen. Wir verwenden Tags auf Basis des MIFARE-Protokolls und den MFRC522 RFID-Reader, der nur wenige Dollar kostet.

Arduino RFID-Türschloss bauen – RFID-Technologie Schritt für Schritt meistern

Diese Tags haben 1 kB Speicher und einen Mikrochip, der arithmetische Operationen ausführen kann. Ihre Betriebsfrequenz beträgt 13,56 MHz, die Lesereichweite bis zu 10 cm (abhängig von der Antennengeometrie). Hält man einen Tag vor eine Lichtquelle, erkennt man die Antenne und den Mikrochip.

Arduino RFID-Türschloss bauen – RFID-Technologie Schritt für Schritt meistern

Das RFID-Reader-Modul kommuniziert per SPI-Protokoll mit dem Arduino. Hier der Anschlussplan. Wichtig: VCC des Moduls muss an 3,3 V angeschlossen werden; die anderen Pins sind 5 V-tolerant.

Arduino RFID-Türschloss bauen – RFID-Technologie Schritt für Schritt meistern

Nach dem Anschließen laden Sie die MFRC522-Bibliothek von GitHub herunter. Sie enthält gute Beispiele, um den Umgang mit dem Modul zu lernen.

Laden Sie zuerst das Beispiel „DumpInfo“ hoch und testen Sie, ob das System funktioniert. Öffnen Sie den Serial Monitor und halten Sie den Tag an das Modul – der Reader liest den Tag und zeigt alle Informationen im Serial Monitor an.

Arduino RFID-Türschloss bauen – RFID-Technologie Schritt für Schritt meistern

Dabei fällt die UID des Tags auf sowie der 1 kB Speicher, der in 16 Sektoren à 4 Blöcke à 2 Bytes unterteilt ist. Für dieses Tutorial nutzen wir nur die UID des Tags.

Arduino RFID-Türschloss Zutrittskontroll-Projekt

Bevor wir den Code besprechen, schauen wir uns die Komponenten und den Schaltplan an.

Arduino RFID-Türschloss bauen – RFID-Technologie Schritt für Schritt meistern

Zusätzlich zum RFID-Modul verwenden wir einen Annäherungssensor zur Türstatuserkennung (offen/geschlossen), einen Servomotor als Schlossmechanismus und ein Zeichen-Display.

Benötigte Komponenten:

  • MFRC522 RFID-Modul
  • Servomotor
  • LCD-Display
  • Arduino Board
  • Steckbrett und Jumper-Kabel
  • Annäherungssensor CNY70

Projektablauf: Zuerst wird ein Master-Tag festgelegt, dann wechselt das System in den Normalmodus. Wird ein unbekannter Tag gescannt, wird der Zugang verweigert. Wird der Master-Tag gescannt, gelangt man in den Programmiermodus, von wo aus unbekannte Tags autorisiert oder bekannte Tags entfernt werden können. Nach Autorisierung gewährt der Tag Zutritt und die Tür öffnet sich.

Arduino RFID-Türschloss bauen – RFID-Technologie Schritt für Schritt meistern

Die Tür verriegelt automatisch beim Schließen. Zum Entfernen eines Tags geht man erneut in den Programmiermodus, scannt den bekannten Tag – er wird gelöscht.

Quellcode

Sehen wir uns den Code an. Zuerst binden wir die Bibliotheken für RFID-Modul, Display und Servo ein, definieren Variablen und erstellen die Bibliotheks-Instanzen.

#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;
// Instanzen erstellen
MFRC522 mfrc522(SS_PIN, RST_PIN);
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); // Parameter: (rs, enable, d4, d5, d6, d7)
Servo myServo; // ServomotorCode language: Arduino (arduino)

Im setup() initialisieren wir die Module und setzen den Servo in Schließposition. Dann geben wir die Startmeldung auf dem Display aus und warten in einer while-Schleife, bis ein Master-Tag gescannt wird. Die Funktion getID() liest die Tag-UID und speichert sie an erster Stelle im Array myTags[0].

void setup() {
  SPI.begin();
  mfrc522.PCD_Init();
  lcd.begin(16, 2);
  myServo.attach(8);
  myServo.write(10); // Initiale Schließposition
  lcd.print("-No Master Tag!-");
  lcd.setCursor(0, 1);
  lcd.print(" SCAN NOW");
  while (!successRead) {
    successRead = getID();
    if (successRead == true) {
      myTags[tagsCount] = strdup(tagID.c_str());
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Master Tag Set!");
      tagsCount++;
    }
  }
  successRead = false;
  printNormalModeMessage();
}Code language: Arduino (arduino)

Sehen wir uns die Funktion getID() an. Sie prüft, ob ein neuer Tag am Reader anliegt. Falls ja, liest eine for-Schleife die 4-Byte-UID (MIFARE Classic) und fügt die Bytes per concat() zu einem String zusammen. Am Ende werden alle Zeichen in Großbuchstaben umgewandelt und das Lesen gestoppt.

uint8_t getID() {
  if ( ! mfrc522.PICC_IsNewCardPresent()) return 0;
  if ( ! mfrc522.PICC_ReadCardSerial()) return 0;
  tagID = "";
  for ( uint8_t i = 0; i < 4; i++) {
    readCard[i] = mfrc522.uid.uidByte[i];
    tagID.concat(String(mfrc522.uid.uidByte[i], HEX));
  }
  tagID.toUpperCase();
  mfrc522.PICC_HaltA();
  return 1;
}Code language: Arduino (arduino)

Am Ende von setup() rufen wir printNormalModeMessage() auf, das „Access Control“ auf dem Display anzeigt.

void printNormalModeMessage() {
  delay(1500);
  lcd.clear();
  lcd.print("-Access Control-");
  lcd.setCursor(0, 1);
  lcd.print(" Scan Your Tag!");
}Code language: Arduino (arduino)

In der Hauptschleife loop() lesen wir zuerst den Annäherungssensor (Türstatus).

int proximitySensor = analogRead(A0);Code language: Arduino (arduino)

Ist die Tür geschlossen (proximitySensor > 200), scannen wir einen Tag (dieselben Zeilen wie in getID()). Der Code wartet hier, bis ein Tag gescannt wird (wegen der return-Anweisungen).

Nach dem Scan prüfen wir, ob es der Master-Tag ist. Falls ja, betreten wir den Programmiermodus: Dort wird ein bereits autorisierter Tag beim erneuten Scan gelöscht, ein unbekannter Tag hinzugefügt.

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;
    }
  }
}Code language: Arduino (arduino)

Außerhalb des Programmiermodus prüft eine for-Schleife, ob der gescannte Tag einem registrierten Tag entspricht – dann wird die Tür entriegelt (myServo.write(170)), andernfalls bleibt der Zugang verweigert. Im else-Zweig (Tür offen) warten wir, bis die Tür geschlossen wird, verriegeln dann und zeigen wieder die Normalmodus-Meldung.

for (int i = 0; i < 100; i++) {
  if (tagID == myTags[i]) {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(" Access Granted!");
    myServo.write(170);
    printNormalModeMessage();
    correctTag = true;
  }
}
if (correctTag == false) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(" Access Denied!");
  printNormalModeMessage();
}
} // Ende Tür geschlossen
// Wenn Tür offen...
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); // Verriegeln
  printNormalModeMessage();
}Code language: Arduino (arduino)

Hier ist der vollständige Code des Projekts:

/* 
 * 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;
MFRC522 mfrc522(SS_PIN, RST_PIN);
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
Servo myServo;
void setup() {
  SPI.begin();
  mfrc522.PCD_Init();
  lcd.begin(16, 2);
  myServo.attach(8);
  myServo.write(10);
  lcd.print("-No Master Tag!-");
  lcd.setCursor(0, 1);
  lcd.print(" SCAN NOW");
  while (!successRead) {
    successRead = getID();
    if (successRead == true) {
      myTags[tagsCount] = strdup(tagID.c_str());
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Master Tag Set!");
      tagsCount++;
    }
  }
  successRead = false;
  printNormalModeMessage();
}
void loop() {
  int proximitySensor = analogRead(A0);
  if (proximitySensor > 200) {
    if ( ! mfrc522.PICC_IsNewCardPresent()) return;
    if ( ! mfrc522.PICC_ReadCardSerial()) return;
    tagID = "";
    for ( uint8_t i = 0; i < 4; i++) {
      tagID.concat(String(mfrc522.uid.uidByte[i], HEX));
    }
    tagID.toUpperCase();
    mfrc522.PICC_HaltA();
    correctTag = false;
    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;
    for (int i = 0; i < 100; i++) {
      if (tagID == myTags[i]) {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print(" Access Granted!");
        myServo.write(170);
        printNormalModeMessage();
        correctTag = true;
      }
    }
    if (correctTag == false) {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print(" Access Denied!");
      printNormalModeMessage();
    }
  } 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);
    printNormalModeMessage();
  }
}
uint8_t getID() {
  if ( ! mfrc522.PICC_IsNewCardPresent()) return 0;
  if ( ! mfrc522.PICC_ReadCardSerial()) return 0;
  tagID = "";
  for ( uint8_t i = 0; i < 4; i++) {
    readCard[i] = mfrc522.uid.uidByte[i];
    tagID.concat(String(mfrc522.uid.uidByte[i], HEX));
  }
  tagID.toUpperCase();
  mfrc522.PICC_HaltA();
  return 1;
}
void printNormalModeMessage() {
  delay(1500);
  lcd.clear();
  lcd.print("-Access Control-");
  lcd.setCursor(0, 1);
  lcd.print(" Scan Your Tag!");
}Code language: Arduino (arduino)

Ich hoffe, Ihnen hat dieses Tutorial gefallen. Fragen gerne in den Kommentaren!

Herstellungsprozess

  1. Sicheres RFID-Türschloss mit Arduino & RC522 (MIFARE 13,56 MHz)
  2. Sicheres Arduino RFID-Schloss bauen – Schritt-für-Schritt-Anleitung
  3. Selbstbau: Schlagbare, anpassbare Tasten mit Arduino und Piezo-Element
  4. Sicheres Passwort-Türschloss mit Arduino, Keypad & Linearaktuator
  5. Echtzeit-Zelluläre Automaten auf Arduino mit 128x64 OLED-Display
  6. eDOT: Präzise Arduino-Uhr & Wetterstation mit IR-Fernbedienung
  7. Echtzeit-RFID-Anwesenheitssystem mit Arduino & Google Tabellen
  8. Musikalische Töne mit Arduino erzeugen: Schritt-für-Schritt-Anleitung
  9. Automatische Tür mit Arduino & Ultraschallsensor bauen
  10. Digitaler Kompass in Echtzeit mit Arduino & Processing bauen