Освой Arduino играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Библиотека MFRC522
Вход по пропускам
Запись и чтение пользовательских данных
Подключение к плате ESP32
Радиочастотная идентификация (RFID) — это технология бесконтактной идентификации объектов при помощи радиочастотного канала связи. Идентификация объектов производится по уникальному идентификатору, который имеет каждая электронная метка. Считыватель излучает электромагнитные волны определенной частоты. Метки отправляют в ответ информацию – идентификационный номер, данные памяти и пр.
Метки бывают двух типов: активные и пассивные (без встроенного источника энергии, питаются от тока, индуцированного в антенне сигналом от ридера). Метки работают на разной частоте: LF (125 - 134 кГц), HF (13.56 МГц), UHF (860 - 960 МГц). Метки бывают только для чтения или на них можно заносить информацию (изменять существующие данные). В Arduino в качестве считывателя используют популярный модуль RFID-RC522. Модуль выполнен на микросхеме MFRC522 фирмы NXP, которая обеспечивает работу с метками HF (на частоте 13,56 МГц). В комплекте с модулем RFID-RC522 идут две метки, одна в виде карты, другая в виде брелока.
Купить модуль RC-522 на AliExpress
Карточки и брелоки можно купить отдельно. Также можно использовать для опытов обычные билеты московского транспорта (наземный транспорт и метро), которые также используют технологию RFID.
Микросхема MFRC522 поддерживает интерфейсы SPI, UART и I2C. Выбор интерфейса осуществляется установкой логических уровней на определенных выводах микросхемы. В Arduino принято использовать SPI.
Назначение выводов интерфейса SPI:
Выводы модуля подключаются к цифровым пинам Arduino
RC-522 | Arduino
----------------
SDA | D
SCK | D
MOSI | D
MISO | D
IRQ | N/A
GND | GND
RST | D
3.3V | 3.3V
На платах Arduino есть разъём ICSP, который можно использовать для работы с интерфейсом SPI.
Установим через менеджер библиотек вариант MFRC522 (домашняя страница).
В состав библиотеки входят несколько примеров, а также компонент для Fritzing. Для первого знакомства запустите скетч DumpInfo. В комментариях указаны варианты подключения для разных плат. Стандартный вариант для Arduino Uno/Nano.
-------------------------------------
MFRC522 Arduino
Reader/PCD Uno/101/Nano
Signal Pin Pin
-------------------------------------
RST/Reset RST 9
SPI SS SDA(SS) 10
SPI MOSI MOSI 11
SPI MISO MISO 12
SPI SCK SCK 13
При поднесении карточки в мониторе порта увидите большую таблицу данных. Дождитесь полной загрузки данных и обратите внимание на данные в блоке 0 - там можно увидеть идентификатор.
Но у вас нет необходимости вручную считывать информацию из массива данных, идентификатор можно получить через вызов функции. В начале есть отдельная строка Card UID: 77 E7 BC 3A.
Рассмотрим упрощённый пример. Суть в следующем. Инициализируем объект класса MFRC522 и проверяем различные условия. Если к ридеру не поднесли карточку, то выходим из функции loop(), если прочитать карточку не можем, то также выходим из функции. Если оба условия всё же выполнились (есть карта и данные с неё), то выполняем уже нужный код.
#include <SPI.h>
#include <MFRC522.h>
// контакты
#define SS_PIN 10
#define RST_PIN 9
// Создание экземпляра объекта MFRC522
MFRC522 mfrc522(SS_PIN, RST_PIN); // Создание экземпляра MFRC522
void setup() {
Serial.begin(9600);
SPI.begin();
// инициализация MFRC522
mfrc522.PCD_Init();
// выводим номер версии прошивки ридера
mfrc522.PCD_DumpVersionToSerial();
}
void loop() {
// Ожидание
if ( ! mfrc522.PICC_IsNewCardPresent())
return;
// чтение
if ( !mfrc522.PICC_ReadCardSerial())
return;
// вывод данных
Serial.print("UID = ");
view_data(mfrc522.uid.uidByte, mfrc522.uid.size);
Serial.println();
Serial.print("type = ");
byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
Serial.print(mfrc522.PICC_GetTypeName(piccType));
Serial.println();
delay(1000);
}
// преобразование в HEX
void view_data (byte *buf, byte size) {
for (byte j = 0; j < size; j++) {
Serial.print(buf [j]);
Serial.print(buf [j], HEX);
}
}
Подносим карточку и брелок из комплекта (MIFARE 1 KB), а также карточки московского транспорта (MIFARE Ultralight or Ultralight C). Идентификатор карточки выводится в десятичном формате.
Каждая карточка имеет свой идентификатор, который можно узнать после запуска скетча библиотеки DumpInfo. Запомним идентификатор и напишем свой скетч для проверки. Если идентификатор совпадает, то выводим сообщение (включаем светодиод, открываем ворота и т.д.). Если идентификатор не совпадает, то выводим сообщение о запрете. Карточку с правом доступа отдаём коту (вешаем на шею) и проверяем.
#include <SPI.h>
#include <MFRC522.h>
// контакты
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);
// Разрешённый идентификатор Card UID
byte uidCard[4] = {0x77, 0xE7, 0xBC, 0x3A};
void setup() {
Serial.begin(9600);
SPI.begin();
mfrc522.PCD_Init();
}
void loop() {
// Ожидание
if ( ! mfrc522.PICC_IsNewCardPresent())
return;
// чтение
if ( !mfrc522.PICC_ReadCardSerial())
return;
for (byte i = 0; i < 4; i++) {
// Если идентификатор не совпадает с заданным номером
if (uidCard[i] != mfrc522.uid.uidByte[i]) {
Serial.println("У вас нет доступа");
return;
}else{
Serial.println("Проходите, Мурзик");
}
}
}
Меня программа не пустила на порог собственного дома, а кота пустили. "Умный дом" - угроза человечеству.
Рассмотрим два примера, которые входят в состав библиотеки - rfid_write_personal_data и rfid_read_personal_data. Они позволяют записать, а потом считать данные с карточки.
Сначала загрузим скетч для записи данных. После прошивки подносим карточку к ридеру, в мониторе порта просят ввести фамилию, которую нужно завершить символом решётки. После успешной записи нужно ввести имя и опять с завершающим символом решётки.
Затем прошиваем плату вторым примером и снова подносим карточку. Ридер считает данные и выведет их в монитор порта.
У платы ESP32 расположение выводов отличается от Arduino Uno, поэтому схема подключения будет следующей.
-----------------
MFRC522 | ESP32
-----------------
SDA | 21
SCK | 18
MOSI | 23
MISO | 19
IRQ | N/A
GND | GND
RST | 22
3.3V | 3.3V
Библиотека MFRC522 должна работать без проблем.
PCD_DumpVersionToSerial() - выводит версию прошивки ридера в монитор порта
PICC_IsNewCardPresent() - проверяет наличие поднесённой метки
PICC_ReadCardSerial() - считывает данные с метки
PICC_DumpToSerial() - выводит данные метки в монитор порта
PICC_GetType() - тип карты
PICC_GetTypeName - имя карты
Купить модуль RC-522 на AliExpress
Чтение данных транспортных карточек (RFID)