Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Hoe RFID werkt en hoe u een op Arduino gebaseerd RFID-deurslot maakt

In deze tutorial leren we wat RFID is, hoe het werkt en hoe je een op Arduino gebaseerd RFID-deurslot kunt maken. Je kunt de volgende video bekijken of de schriftelijke tutorial hieronder lezen voor meer details.

Overzicht

RFID staat voor Radio Frequency IDentification en het is een contactloze technologie die in veel bedrijfstakken algemeen wordt gebruikt voor taken zoals personeelsregistratie, toegangscontrole, supply chain management, het volgen van boeken in bibliotheken, tolpoortsystemen, enzovoort.[/column]

Hoe RFID werkt


Een RFID-systeem bestaat uit twee hoofdcomponenten, een transponder of een tag die zich op het object bevindt dat we willen identificeren, en een transceiver of een lezer.

De RFID-lezer bestaat uit een radiofrequentiemodule, een besturingseenheid en een antennespoel die een hoogfrequent elektromagnetisch veld genereert. Aan de andere kant is de tag meestal een passieve component, die bestaat uit slechts een antenne en een elektronische microchip, dus wanneer deze door inductie in de buurt van het elektromagnetische veld van de transceiver komt, wordt er een spanning gegenereerd in de antennespoel en dit spanning dient als voeding voor de microchip.

Nu de tag wordt gevoed, kan deze het verzonden bericht uit de lezer halen en voor het terugsturen van het bericht naar de lezer gebruikt het een techniek die belastingmanipulatie wordt genoemd. Het in- en uitschakelen van een belasting bij de antenne van de tag heeft invloed op het stroomverbruik van de antenne van de lezer, wat kan worden gemeten als spanningsval. Deze veranderingen in de spanning worden vastgelegd als enen en nullen en dat is de manier waarop de gegevens worden overgedragen van de tag naar de lezer.

Er is ook een andere manier van gegevensoverdracht tussen de lezer en de tag, backscattered koppeling genoemd. In dit geval gebruikt de tag een deel van het ontvangen vermogen om een ​​ander elektromagnetisch veld op te wekken dat door de antenne van de lezer wordt opgevangen.

RFID en Arduino

Dus dat is het basiswerkingsprincipe en laten we nu eens kijken hoe we RFID met Arduino kunnen gebruiken en ons eigen RFID-deurslot kunnen bouwen. We zullen tags gebruiken die zijn gebaseerd op het MIFARE-protocol en de MFRC522 RFID-lezer, die slechts een paar dollar kosten.

Deze tags hebben 1 kb geheugen en een microchip die rekenkundige bewerkingen kan uitvoeren. Hun werkfrequentie is 13,56 MHz en de werkafstand is maximaal 10 cm, afhankelijk van de geometrie van de antenne. Als we een van deze tags voor een lichtbron brengen, kunnen we de antenne en de microchip opmerken waar we het eerder over hadden.

Wat betreft de RFID-leesmodule, deze gebruikt het SPI-protocol voor communicatie met het Arduino-bord en hier is hoe we ze moeten aansluiten. Houd er rekening mee dat we de VCC van de module op 3,3V moeten aansluiten en wat de andere pinnen betreft, hoeven we ons geen zorgen te maken omdat ze 5V-tolerant zijn.

Nadat we de module hebben aangesloten, moeten we de MFRC522-bibliotheek downloaden van GitHub. De bibliotheek wordt geleverd met verschillende goede voorbeelden waaruit we kunnen leren hoe we de module kunnen gebruiken.

Eerst kunnen we het voorbeeld “DumpInfo” uploaden en testen of ons systeem goed werkt. Als we nu de seriële monitor gebruiken en de tag in de buurt van de module brengen, begint de lezer de tag te lezen en wordt alle informatie van de tag op de seriële monitor weergegeven.

Hier kunnen we het UID-nummer van de tag zien, evenals de 1 KB geheugen die feitelijk is verdeeld in 16 sectoren, elke sector in 4 blokken en elk blok kan 2 bytes aan gegevens opslaan. Voor deze tutorial gebruiken we geen geheugen van de tag, we gebruiken alleen het UID-nummer van de tag.

Arduino RFID-deurslot toegangscontroleproject

Laten we, voordat we de code van ons RFID-deurslotproject doornemen, eens kijken naar de componenten en de circuitschema's van dit project.

Naast de RFID-module gebruiken we een naderingssensor om te controleren of de deur gesloten of geopend is, een servomotor voor het slotmechanisme en een karakterweergave.

U kunt de benodigde componenten voor deze Arduino-zelfstudie verkrijgen via de onderstaande links:

  • MFRC522 RFID-module ………………….
  • Servomotor …………………………………..
  • LCD-scherm ……………………………………
  • Arduino-bord ……………………………….
  • Broodplank en springdraden …………….. 
  • Nabijheidssensor CNY70 ……………………

Het project heeft de volgende workflow:Eerst moeten we een mastertag instellen en dan gaat het systeem in de normale modus. Als we een onbekende tag scannen, wordt de toegang geweigerd, maar als we de master scannen, gaan we naar een programmamodus van waaruit we de onbekende tag kunnen toevoegen en autoriseren. Dus als we nu de tag opnieuw scannen, wordt de toegang verleend, zodat we de deur kunnen openen.

De deur wordt automatisch vergrendeld nadat we de deur hebben gesloten. Als we een tag uit het systeem willen verwijderen, hoeven we alleen maar weer naar de programmeermodus te gaan, de bekende tag te scannen en deze wordt verwijderd.

Broncode

Laten we nu eens naar de code kijken.  Dus eerst moeten we de bibliotheken voor de RFID-module, het display en de servomotor opnemen, enkele variabelen definiëren die nodig zijn voor het onderstaande programma en de instanties van de bibliotheken maken.

#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 motorCode language: Arduino (arduino)

In de setup-sectie initialiseren we eerst de modules en stellen we de initiële waarde van de servomotor in op een vergrendelde positie. Vervolgens printen we het eerste bericht naar het display en met de volgende "while"-lus wachten we tot een mastertag is gescand. De aangepaste functie getID() haalt de tag-UID op en we plaatsen deze op de eerste locatie van de myTags[0]-array.

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

Laten we eens kijken naar de aangepaste functie getID(). Eerst wordt gecontroleerd of er een nieuwe tag in de buurt van de lezer is geplaatst en zo ja, dan gaan we door naar de "for"-lus die de UID van de tag krijgt. De tags die we gebruiken hebben een UID-nummer van 4 bytes, daarom moeten we 4 iteraties doen met deze lus, en met de functie concat() voegen we de 4 bytes toe aan een enkele String-variabele. We zetten ook alle karakters van de string op hoofdletters en aan het einde stoppen we met lezen.

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

Voordat we de hoofdlus binnengaan, aan het einde van de setup-sectie, roepen we ook de aangepaste functie printNormalModeMessage() aan die het bericht "Toegangscontrole" op het display afdrukt.

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

In de hoofdlus beginnen we met het lezen van de waarde van de naderingssensor, die ons vertelt of de deur gesloten is of niet.

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

Dus als de deur gesloten is, zullen we met dezelfde regels als beschreven in de getID() aangepaste functie scannen en de UID van de nieuwe tag verkrijgen. We kunnen hier zien dat de code niet verder gaat totdat we een tag scannen vanwege de "return" -regels in de "if" -instructies.

Zodra we de tag hebben gescand, controleren we of die tag de master is die we eerder hebben geregistreerd, en als dat waar is, gaan we naar de programmeermodus. Als we in deze modus een reeds geautoriseerde tag scannen, wordt deze uit het systeem verwijderd, of als de tag onbekend is, wordt deze als geautoriseerd aan het systeem toegevoegd.

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

Buiten de programmeermodus controleren we met de volgende "for"-lus of de gescande tag gelijk is aan een van de geregistreerde tags en ontgrendelen we de deur of houden we de toegang geweigerd. Aan het einde van de "else"-verklaring wachten we tot de deur gesloten is, dan doen we de deur op slot en printen we het bericht in de normale modus opnieuw.

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

Dus dat is zo ongeveer alles en hier is de volledige code van het project:

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

Ik hoop dat je deze tutorial leuk vond en stel gerust een vraag in de comments hieronder.


Productieproces

  1. Arduino RFID-slot met RC522 - MIFARE-protocol 13,56 Mhz
  2. Arduino RFID Lock-zelfstudie
  3. Een aanpasbare ponsbare toetsenbordknop maken
  4. Op wachtwoord gebaseerd deurslot
  5. Arduino en OLED-gebaseerde mobiele automaten
  6. eDOT - op Arduino gebaseerde precisieklok en weerstation
  7. Aanwezigheidssysteem op basis van Arduino en Google Spreadsheet
  8. Muziek maken met een Arduino
  9. Hoe maak je op Arduino gebaseerde automatische deuropening
  10. Arduino en Android-gebaseerd wachtwoordbeveiligd deurslot
  11. Hoe maak je een kompas met Arduino en Processing IDE?