Как работает 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 MFRC522 …………………….
- Серводвигатель ………………………………………..
- ЖК-дисплей …………………………………………
- Плата Arduino …………………………………….
- Макет и соединительные провода……………..
- Датчик приближения 70 китайских юаней ……………………
Проект имеет следующий рабочий процесс:сначала мы должны установить мастер-тег, а затем система переходит в обычный режим. Если мы просканируем неизвестный тег, доступ будет запрещен, но если мы просканируем мастер, мы перейдем в программный режим, из которого мы можем добавить и авторизовать неизвестный тег. Итак, теперь, если мы просканируем метку еще раз, доступ будет предоставлен, и мы сможем открыть дверь.

Дверь автоматически заблокируется после того, как мы закроем дверь. Если мы хотим удалить тег из системы, нам просто нужно снова перейти в программный режим, отсканировать известный тег, и он будет удален.
Исходный код
Теперь давайте посмотрим на код. Итак, сначала нам нужно включить библиотеки для модуля 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
Code 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)
Надеюсь, вам понравился этот урок, и вы можете задать любой вопрос в разделе комментариев ниже.
Производственный процесс
- RFID-замок Arduino с RC522 - протокол MIFARE 13,56 МГц
- Учебное пособие по блокировке RFID для Arduino
- Как создать настраиваемую перфорированную кнопку клавиатуры
- Дверной замок на основе пароля
- Клеточные автоматы на основе Arduino и OLED
- eDOT - точные часы и метеостанция на базе Arduino
- Система посещаемости на основе Arduino и Google Spreadsheet
- Как создавать музыку с помощью Arduino
- Как сделать автоматическое открывание дверей на базе Arduino
- Как сделать компас с помощью Arduino и Processing IDE