Обзор: RFID-модуль RC522 — карты и метки в самоделке
Что это такое
MFRC522 — микросхема NXP, законченный считыватель-писатель для бесконтактных карт на частоте 13,56 МГц. Поддерживает стандарт ISO/IEC 14443 A: MIFARE Classic 1K/4K, Mini, Ultralight, NTAG. На плате модуля уже стоит антенна — четыре витка дорожек, настроенные в резонанс, поэтому никаких внешних цепей не требуется. Именно такой модуль продаётся за копейки и приходит в наборах «стартовый комплект Arduino».
Карта пассивная: собственного аккумулятора у неё нет, она берёт энергию из поля считывателя и отвечает изменением нагрузки на антенне. Поэтому «приложить и подержать» — правильный жест, а расстояние считывания небольшое.
Характеристики по datasheet NXP (MFRC522 Rev. 3.9)
| Параметр | Значение |
|---|---|
| Несущая частота | 13,56 МГц (кварц 27,12 МГц) |
| Стандарт | ISO/IEC 14443 A / MIFARE, NTAG |
| Питание VDD (VDDA=VDDD=VDD(TVDD)) | 2,5–3,6 В, типовое 3,3 В |
| Интерфейсы хоста | SPI до 10 Мбит/с; I²C до 3,4 Мбит/с (High-speed); UART до 1228,8 кБод |
| FIFO-буфер | 64 байта |
| Дальность чтения | до 50 мм (зависит от антенны) |
| Общий ток в типовой работе | менее 100 мА (все цепи суммарно) |
| Внутренние режимы экономии | hard power-down, soft power-down, программируемый таймер |
Честное ограничение — секретность
Для контроля доступа «свой/чужой» по UID модуль подходит отлично. Для защиты данных — нет: у MIFARE Classic защита построена на шифре Crypto-1, который взломан ещё в 2008 году. Если метка нужна «ключ-карта во дворе» — нормально; хранить в секторах что-то настоящее — не стоит. DESFire с AES читается этим чипом аппаратно, но библиотеки Arduino с ней работают плохо.
Подключение
Основной интерфейс — SPI: SDA (это SS), SCK, MOSI, MISO, плюс RST. Вывод IRQ не обязателен. Внимание на питание: у модуля нет своего стабилизатора, питать нужно строго 3,3 В.
Arduino Uno
| RC522 | Uno |
|---|---|
| SDA (SS) | D10 |
| SCK | D13 |
| MOSI | D11 |
| MISO | D12 |
| RST | D9 |
| 3.3V | 3V3 |
| GND | GND |
| IRQ | не подключается |
У платы Uno логика 5-вольтовая, а входы модуля — нет. Линии SCK и MOSI, приходящие с Uno, стоит занизить делителями (например 1 кОм сверху / 2 кОм снизу, даст около 3,3 В); на практике многие подключают напрямую и модуль переживает, но это за пределами паспорта. 3,3 В и MISO соединять напрямую можно: 3,3 В Uno воспринимает как HIGH.
ESP32
Логика ESP32 — 3,3 В, поэтому подключение прямое, без делителей: SDA→GPIO5 (SS), SCK→GPIO18, MOSI→GPIO23, MISO→GPIO19, RST→GPIO4. Выводы 3V3 и GND — по питанию.
Рабочий код (чтение UID)
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 rfid(SS_PIN, RST_PIN);
void setup() {
Serial.begin(9600);
SPI.begin();
rfid.PCD_Init();
Serial.println("Приложите карту...");
}
void loop() {
if (!rfid.PICC_IsNewCardPresent()) return;
if (!rfid.PICC_ReadCardSerial()) return;
Serial.print("UID: ");
for (byte i = 0; i < rfid.uid.size; i++) {
Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(rfid.uid.uidByte[i], HEX);
}
Serial.println();
rfid.PICC_HaltA();
}
Библиотека — MFRC522 (в менеджере библиотек Arduino IDE ищется по этому имени). Для записи блоков памяти метки используются Authenticate и MIFARE_Write; ключ по умолчанию для новых меток — шесть байт 0xFF.
Частые ошибки
- Питание 5 В вместо 3,3 В. Без стабилизатора на плате модуль выгорает быстро и молча. Диагноз такой ошибки — перестал отвечать навсегда, при этом PCD_Init возвращает ok, а чтения нет.
- Читают один и тот же UID, потом «не работает». UID считывается второй раз, а потом — больше никогда. Причина: после первого чтения нужно вызвать rfid.PICC_HaltA(), иначе библиотека считает, что это та же карта, и не отдаёт её как новую.
- Запись в блок 0. Нулевой блок первого сектора хранит UID метки и защищён от записи. Попытки MIFARE_Write туда дают отказ, «библиотека не работает» — а она честно говорит, что так нельзя.
- Перепутан порядок пинов SPI. На разных платах модуля SDA/MISO/SCK лежат в разном порядке — сверяйтесь с шелкографией на своей конкретной плате, не по чужой схеме.
- Слишком тонкое питание. В момент излучения модуль тянет заметный ток (суммарно до 100 мА); от тонких макетных дорожек 3,3 В просядет — дальность считывания падает, а модуль «перезагружается». Ставьте конденсатор 100 мкФ рядом с питанием.
Что дальше с этим делать
- Схема «своя карта открывает что-то» отлично сочетается с реле-модулем на 1, 2 и 4 канала: метка приложилась — реле щёлкнуло.
- Если нужно передавать событие на расстояние — посмотрите Bluetooth-модули HC-05 и HC-06 или связка с ESP32 по Wi-Fi.
Информация собрана из открытых источников и паспортов производителей и не является истиной в последней инстанции. Характеристики, распиновку и совместимость проверяйте по документации конкретной партии модуля перед покупкой и подключением.