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

Создание RFID-электрозамка на Arduino: пошаговое руководство по технологии RFID

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

Обзор

RFID расшифровывается как Radio Frequency IDentification (идентификация по радиочастоте) — это бесконтактная технология, широко используемая во многих отраслях для таких задач, как отслеживание персонала, контроль доступа, управление цепочками поставок, учет книг в библиотеках, системы проезда на платных дорогах и так далее.

Создание RFID-электрозамка на Arduino: пошаговое руководство по технологии RFID

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


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

Создание RFID-электрозамка на Arduino: пошаговое руководство по технологии RFID

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

Создание RFID-электрозамка на Arduino: пошаговое руководство по технологии RFID

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

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

RFID и Arduino

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

Создание RFID-электрозамка на Arduino: пошаговое руководство по технологии RFID

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

Создание RFID-электрозамка на Arduino: пошаговое руководство по технологии RFID

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

Создание RFID-электрозамка на Arduino: пошаговое руководство по технологии RFID

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

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

Создание RFID-электрозамка на Arduino: пошаговое руководство по технологии RFID

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

Проект RFID-электрозамка на Arduino: контроль доступа

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

Создание RFID-электрозамка на Arduino: пошаговое руководство по технологии RFID

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

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

  • RFID-модуль MFRC522 …………………….
  • Сервопривод ……………………………………..
  • LCD-дисплей ………………………………………
  • Плата Arduino ………………………………….
  • Безпаечная макетная плата и перемычки ……………..
  • Датчик приближенности CNY70 ……………………

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

Создание RFID-электрозамка на Arduino: пошаговое руководство по технологии RFID

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

Исходный код

Теперь посмотрим на код. Сначала нужно подключить библиотеки для 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;Язык кода: Arduino (arduino)

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

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();
}Язык кода: Arduino (arduino)

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

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;
}Язык кода: Arduino (arduino)

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

void printNormalModeMessage() {
  delay(1500);
  lcd.clear();
  lcd.print("-Access Control-");
  lcd.setCursor(0, 1);
  lcd.print(" Scan Your Tag!");
}Язык кода: Arduino (arduino)

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

int proximitySensor = analogRead(A0);Язык кода: Arduino (arduino)

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

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

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;
    }
  }
}Язык кода: Arduino (arduino)

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

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();
}Язык кода: 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;
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!");
}Язык кода: Arduino (arduino)

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


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

  1. Надёжный RFID-замок на Arduino с RC522 (MIFARE 13.56 МГц) и сервоприводом
  2. Создание надежного RFID-замка на Arduino — пошаговое руководство
  3. Создание настраиваемой «бьющейся» клавиши на Arduino: пошаговое руководство
  4. Электронный кодовый замок на Arduino с клавиатурой и линейным приводом
  5. Клеточный автомат «Жизнь» Конвея на Arduino Nano с OLED 128x64
  6. eDOT: точные Arduino-часы и метеостанция с встроенным ИК-пультом
  7. Система учёта рабочего времени на RFID, Arduino и Google Таблицах
  8. Генерация музыкальных тонов на Arduino: полный спектр 88 клавиш пианино
  9. Автоматическая дверь на Arduino с ультразвуковым датчиком HC-SR04
  10. Цифровой компас в реальном времени на Arduino и Processing