Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Как работает RFID и как сделать дверной RFID-замок на базе Arduino

<основной класс="главный сайт" id="главный">

В этом уроке мы узнаем, что такое RFID, как он работает и как сделать дверной замок RFID на базе Arduino. Вы можете посмотреть следующее видео или прочитать письменное руководство ниже для получения более подробной информации.

Обзор

RFID расшифровывается как Радиочастотная идентификация. и это бесконтактная технология, которая широко используется во многих отраслях для решения таких задач, как отслеживание персонала, контроль доступа, управление цепочками поставок, отслеживание книг в библиотеках, системы взимания платы за проезд и т. д.[/column]

Как работает RFID


Система RFID состоит из двух основных компонентов:транспондера или метки, расположенной на объекте, который мы хотим идентифицировать, и приемопередатчика или считывателя.

Считыватель RFID состоит из радиочастотного модуля, блока управления и антенной катушки, которая генерирует высокочастотное электромагнитное поле. С другой стороны, метка, как правило, является пассивным компонентом, состоящим только из антенны и электронной микросхемы, поэтому, когда она оказывается вблизи электромагнитного поля приемопередатчика, за счет индукции в ее антенной катушке генерируется напряжение, и это напряжение служит питанием для микросхемы.

Теперь, когда тег включен, он может извлекать переданное сообщение из считывателя, а для отправки сообщения обратно считывателю он использует метод, называемый манипулированием загрузкой. Включение и выключение нагрузки на антенне метки повлияет на потребляемую мощность антенны считывателя, которую можно измерить как падение напряжения. Эти изменения напряжения будут фиксироваться как единицы и нули, и таким образом данные передаются от метки к считывателю.

Существует также другой способ передачи данных между считывателем и меткой, называемый обратной связью. В этом случае метка использует часть полученной мощности для создания другого электромагнитного поля, которое будет улавливаться антенной считывателя.

RFID и Arduino

Итак, это основной принцип работы, а теперь давайте посмотрим, как мы можем использовать RFID с Arduino и создать собственный дверной замок RFID. Мы будем использовать метки, основанные на протоколе MIFARE и считывателе RFID MFRC522, которые стоят всего пару долларов.

Эти метки имеют 1 КБ памяти и имеют микрочип, который может выполнять арифметические операции. Их рабочая частота составляет 13,56 МГц, а рабочее расстояние до 10 см в зависимости от геометрии антенны. Если мы поднесем одну из этих меток к источнику света, мы сможем заметить антенну и микрочип, о которых мы говорили ранее.

Что касается модуля считывателя RFID, он использует протокол SPI для связи с платой Arduino, и вот как нам нужно их подключить. Обратите внимание, что мы должны подключить VCC модуля к 3,3 В, а что касается других контактов, нам не нужно беспокоиться, поскольку они терпимы к 5 В.

После подключения модуля нам нужно скачать библиотеку MFRC522 с GitHub. Библиотека поставляется с несколькими хорошими примерами, из которых мы можем научиться использовать модуль.

Сначала мы можем загрузить пример «DumpInfo» и проверить, правильно ли работает наша система. Теперь, если мы запустим Serial Monitor и поднесем тег к модулю, считыватель начнет читать тег, и вся информация из тега будет отображаться на последовательном мониторе.

Здесь мы можем заметить номер UID тега, а также 1 КБ памяти, которая фактически разделена на 16 секторов, каждый сектор на 4 блока, и каждый блок может хранить 2 байта данных. В этом руководстве мы не будем использовать память тега, мы будем использовать только номер UID тега.

Проект контроля доступа к дверным замкам Arduino RFID

Прежде чем мы перейдем к коду нашего проекта дверного замка RFID, давайте взглянем на компоненты и схемы этого проекта.

В дополнение к модулю RFID мы будем использовать датчик приближения для проверки того, закрыта или открыта дверь, серводвигатель для механизма замка и символьный дисплей.

Компоненты, необходимые для этого руководства по Arduino, можно получить по ссылкам ниже:

Проект имеет следующий рабочий процесс:сначала мы должны установить мастер-тег, а затем система переходит в обычный режим. Если мы просканируем неизвестный тег, доступ будет запрещен, но если мы просканируем мастер, мы перейдем в программный режим, из которого мы можем добавить и авторизовать неизвестный тег. Итак, теперь, если мы просканируем метку еще раз, доступ будет предоставлен, и мы сможем открыть дверь.

Дверь автоматически заблокируется после того, как мы закроем дверь. Если мы хотим удалить тег из системы, нам просто нужно снова перейти в программный режим, отсканировать известный тег, и он будет удален.

Исходный код

Теперь давайте посмотрим на код. Итак, сначала нам нужно включить библиотеки для модуля 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 motorCode language: Arduino (arduino)

В разделе настройки сначала мы инициализируем модули и устанавливаем начальное значение серводвигателя в положение блокировки. Затем мы выводим начальное сообщение на дисплей и с помощью следующего цикла «пока» ждем, пока мастер-тег не будет отсканирован. Пользовательская функция getID() получает UID тега, и мы помещаем его в первую позицию массива myTags[0].

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)

Давайте взглянем на пользовательскую функцию getID(). Сначала он проверяет, есть ли новая метка рядом со считывателем, и если да, то мы переходим к циклу for, который получает UID метки. Теги, которые мы используем, имеют 4-байтовый номер UID, поэтому нам нужно выполнить 4 итерации с этим циклом, и с помощью функции concat() мы добавляем 4 байта в одну переменную String. Мы также устанавливаем все символы строки в верхний регистр и в конце останавливаем чтение.

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)

Прежде чем мы войдем в основной цикл, в конце раздела настройки мы также вызываем пользовательскую функцию printNormalModeMessage(), которая печатает сообщение «Контроль доступа» на дисплее.

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

В основном цикле мы начинаем со считывания значения датчика приближения, который сообщает нам, закрыта дверь или нет.

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

Итак, если дверь закрыта, используя те же строки, которые мы описали в пользовательской функции getID(), мы просканируем и получим UID нового тега. Здесь мы можем заметить, что код не будет продолжаться дальше, пока мы не просканируем тег из-за строк «возврата» в операторах «если».

После сканирования тега мы проверяем, является ли этот тег мастером, который мы ранее зарегистрировали, и если это так, мы входим в программный режим. В этом режиме, если мы сканируем уже авторизованный тег, он будет удален из системы, или, если тег неизвестен, он будет добавлен в систему как авторизованный.

// 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)

Вне режима программы следующим циклом for мы проверяем, совпадает ли отсканированная метка с какой-либо из зарегистрированных меток, и либо отпираем дверь, либо оставляем доступ запрещенным. В конце оператора else мы ждем, пока дверь не закроется, затем запираем дверь и снова печатаем сообщение в обычном режиме.

// 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)

Вот почти все, и вот полный код проекта:

/*
* 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)

Надеюсь, вам понравился этот урок, и вы можете задать любой вопрос в разделе комментариев ниже.


Производственный процесс

  1. RFID-замок Arduino с RC522 - протокол MIFARE 13,56 МГц
  2. Учебное пособие по блокировке RFID для Arduino
  3. Как создать настраиваемую перфорированную кнопку клавиатуры
  4. Дверной замок на основе пароля
  5. Клеточные автоматы на основе Arduino и OLED
  6. eDOT - точные часы и метеостанция на базе Arduino
  7. Система посещаемости на основе Arduino и Google Spreadsheet
  8. Как создавать музыку с помощью Arduino
  9. Как сделать автоматическое открывание дверей на базе Arduino
  10. Как сделать компас с помощью Arduino и Processing IDE