Создание RFID-электрозамка на Arduino: пошаговое руководство по технологии RFID
В этом уроке мы узнаем, что такое RFID, как это работает и как сделать RFID-электрозамок на базе Arduino. Вы можете посмотреть следующее видео или прочитать письменное руководство ниже для получения более подробной информации. RFID расшифровывается как Radio Frequency IDentification (идентификация по радиочастоте) — это бесконтактная технология, широко используемая во многих отраслях для таких задач, как отслеживание персонала, контроль доступа, управление цепочками поставок, учет книг в библиотеках, системы проезда на платных дорогах и так далее. RFID-система состоит из двух основных компонентов: транспондера (метки), который размещается на объекте, который нужно идентифицировать, и трансивера (считывателя). Считыватель RFID состоит из радиочастотного модуля, блока управления и антенной катушки, которая генерирует высокочастотное электромагнитное поле. С другой стороны, метка обычно является пассивным компонентом, состоящим только из антенны и электронного микросхемы. Когда метка попадает в электромагнитное поле считывателя, благодаря индукции в её антенной катушке возникает напряжение, которое служит питанием для микросхемы. Теперь, когда метка запитана, она может извлечь переданное сообщение от считывателя. Для отправки сообщения обратно считывателю используется техника, называемая манипуляцией нагрузкой. Включение и выключение нагрузки на антенне метки влияет на потребление энергии антенной считывателя, что можно измерить как падение напряжения. Эти изменения напряжения фиксируются как единицы и нули — так передаются данные от метки к считывателю. Существует также другой способ передачи данных между считывателем и меткой, называемый обратным рассеянием. В этом случае метка использует часть полученной энергии для генерации другого электромагнитного поля, которое улавливается антенной считывателя. Это базовый принцип работы, теперь посмотрим, как использовать RFID с Arduino и построить свой RFID-электрозамок. Мы будем использовать метки на основе протокола MIFARE и считыватель MFRC522, который стоит всего пару долларов. Эти метки имеют 1 КБ памяти и микросхему, способную выполнять арифметические операции. Их рабочая частота составляет 13,56 МГц, а рабочее расстояние — до 10 см в зависимости от геометрии антенны. Если поднести одну из этих меток к источнику света, можно заметить антенну и микросхему, о которых мы говорили ранее. Что касается модуля считывателя RFID, он использует протокол SPI для связи с платой Arduino. Вот как их нужно подключить. Обратите внимание, что вывод VCC модуля необходимо подключать к 3,3 В, а остальные выводы толерантны к 5 В. После подключения модуля нужно скачать библиотеку MFRC522 с GitHub. Библиотека поставляется с несколькими хорошими примерами, из которых можно научиться использовать модуль. Сначала можно загрузить пример «DumpInfo» и проверить, работает ли наша система правильно. Если запустить монитор последовательного порта и поднести метку к модулю, считыватель начнет считывать метку, и вся информация с метки будет отображена на мониторе последовательного порта. Здесь можно заметить UID-номер метки, а также 1 КБ памяти, которая на самом деле разделена на 16 секторов, каждый сектор на 4 блока, и каждый блок может хранить 2 байта данных. Для этого урока мы не будем использовать память метки, а будем использовать только её UID-номер. Прежде чем перейти к коду нашего проекта RFID-электрозамка, давайте рассмотрим компоненты и схему этого проекта. Помимо RFID-модуля мы будем использовать датчик приближенности для проверки, закрыта или открыта дверь, сервопривод для механизма замка и символьный дисплей. Компоненты, необходимые для этого урока Arduino, можно найти по ссылкам ниже: Проект имеет следующий алгоритм работы: сначала нужно установить мастер-метку, затем система переходит в нормальный режим. Если мы считываем неизвестную метку, доступ будет запрещен, но если мы считываем мастер-метку, мы войдем в режим программирования, из которого можно добавить и авторизовать неизвестную метку. Теперь, если мы снова считываем метку, доступ будет разрешен, и мы сможем открыть дверь. Дверь автоматически запирается после того, как мы её закроем. Если мы хотим удалить метку из системы, просто снова входим в режим программирования, считываем известную метку, и она будет удалена. Теперь посмотрим на код. Сначала нужно подключить библиотеки для RFID-модуля, дисплея и сервопривода, определить некоторые переменные, необходимые для программы ниже, а также создать экземпляры библиотек. В разделе setup сначала инициализируем модули и устанавливаем начальное значение сервопривода в положение запор. Затем выводим начальное сообщение на дисплей и с помощью следующего цикла «while» ждем, пока будет отсканирована мастер-метка. Пользовательская функция getID() получает UID метки и помещает её в первое место массива myTags[0]. Посмотрим на пользовательскую функцию getID(). Сначала она проверяет, есть ли новая метка рядом со считывателем, и если да, переходит к циклу «for», который получает UID метки. Используемые нами метки имеют 4-байтовый UID-номер, поэтому нужно выполнить 4 итерации этого цикла, и с помощью функции concat() добавляем 4 байта в одну строковую переменную. Также приводим все символы строки к верхнему регистру и в конце останавливаем считывание. В конце раздела setup, перед входом в основной цикл, мы также вызываем пользовательскую функцию printNormalModeMessage(), которая выводит сообщение «Access Control» на дисплей. В основном цикле мы начинаем с чтения значения датчика приближенности, который сообщает, закрыта дверь или нет. Если дверь закрыта, используя те же строки, что и в функции getID(), мы сканируем и получаем UID новой метки. Можно заметить, что код не будет выполняться дальше, пока мы не отсканируем метку, из-за строк «return» в операторах «if». Как только метка отсканирована, проверяем, является ли она мастер-меткой, которую мы ранее зарегистрировали. Если это так, входим в режим программирования. В этом режиме, если мы отсканируем уже авторизованную метку, она будет удалена из системы, а если метка неизвестна — добавлена в систему как авторизованная. Вне режима программирования, с помощью следующего цикла «for» проверяем, равна ли отсканированная метка любой из зарегистрированных меток, и либо открываем дверь, либо оставляем доступ запрещенным. В конце в операторе «else» ждем, пока дверь закроется, затем запираем дверь и снова выводим сообщение нормального режима. Вот и весь код проекта: Надеюсь, вам понравился этот урок. Не стесняйтесь задавать любые вопросы в разделе комментариев ниже.Обзор

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


RFID и Arduino




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


Исходный код
#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)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)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)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)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 (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)
Производственный процесс
- Надёжный RFID-замок на Arduino с RC522 (MIFARE 13.56 МГц) и сервоприводом
- Создание надежного RFID-замка на Arduino — пошаговое руководство
- Создание настраиваемой «бьющейся» клавиши на Arduino: пошаговое руководство
- Электронный кодовый замок на Arduino с клавиатурой и линейным приводом
- Клеточный автомат «Жизнь» Конвея на Arduino Nano с OLED 128x64
- eDOT: точные Arduino-часы и метеостанция с встроенным ИК-пультом
- Система учёта рабочего времени на RFID, Arduino и Google Таблицах
- Генерация музыкальных тонов на Arduino: полный спектр 88 клавиш пианино
- Автоматическая дверь на Arduino с ультразвуковым датчиком HC-SR04
- Цифровой компас в реальном времени на Arduino и Processing