RFID RC522 и Arduino: схема подключения по SPI, чтение карты, библиотека MFRC522 и замок
RC522 — считыватель меток 13,56 МГц, в комплекте с которым идут белая карта и брелок. Он читает уникальный номер метки на расстоянии двух-трёх сантиметров, а с библиотекой MFRC522 — ещё и пишет в её память.
Подключается по SPI: пять сигнальных проводов плюс питание. Важно одно — питание строго 3,3 В. На 5 В модуль работает недолго.
Схема подключения
Распиновка
| Провод | Куда и зачем |
|---|---|
| SDA (SS) | Выбор устройства SPI, вывод 10. |
| SCK | Такт SPI, вывод 13. |
| MOSI | Вывод 11. |
| MISO | Вывод 12. |
| IRQ | Прерывание. Не подключается в базовом варианте. |
| RST | Сброс, любой цифровой вывод, в примере 9. |
| 3.3V | Питание только 3,3 В. |
| GND | Земля. |
Характеристики
- Частота
- 13,56 МГц
- Стандарт
- ISO 14443A: Mifare Classic, Ultralight, NTAG
- Дальность
- 2–4 см
- Интерфейс
- SPI до 10 Мбит/с
- Питание
- 3,3 В, 13–26 мА
- Размер
- 60 × 40 мм
UID и память карты
UID — заводской номер метки, четыре байта у старых Mifare Classic и семь у новых. Его читают за одно обращение, и на нём строят простые замки. Но UID передаётся открыто и клонируется устройством за пятьсот рублей, так что для двери в квартиру это не защита, а удобство.
У Mifare Classic есть килобайт памяти в шестнадцати секторах, каждый под своим ключом. Туда можно записать баланс, имя, что угодно — библиотека умеет и это. Ключ по умолчанию FF FF FF FF FF FF, и его стоит сменить, если пишете что-то важное.
Библиотека
MFRC522— Ставится из менеджера библиотек по имени. Пример DumpInfo показывает всё содержимое карты.
Готовый скетч
#include <SPI.h>
#include <MFRC522.h>
const int SS_PIN = 10;
const int RST_PIN = 9;
MFRC522 rfid(SS_PIN, RST_PIN);
// UID разрешённой карты — подставьте свой из монитора порта
byte allowed[4] = {0xDE, 0xAD, 0xBE, 0xEF};
void setup() {
Serial.begin(9600);
SPI.begin();
rfid.PCD_Init();
Serial.println("Поднесите карту");
}
void loop() {
if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) return;
Serial.print("UID:");
bool match = (rfid.uid.size == 4);
for (byte i = 0; i < rfid.uid.size; i++) {
Serial.print(' ');
if (rfid.uid.uidByte[i] < 0x10) Serial.print('0');
Serial.print(rfid.uid.uidByte[i], HEX);
if (i < 4 && rfid.uid.uidByte[i] != allowed[i]) match = false;
}
Serial.println(match ? " — доступ разрешён" : " — чужая карта");
rfid.PICC_HaltA(); // усыпить карту, пока её не уберут
delay(500);
}Скетч собирается arduino-cli под Arduino UNO
Первый запуск — просто читаете UID своей карты из монитора и вписываете его в массив allowed.
Частые ошибки
Не видит карту вообще
Питание 5 В вместо 3,3 или перепутаны MOSI и MISO. Проверьте оба. Ещё частая причина — плохая пайка гребёнки: модуль идёт с гребёнкой в пакетике, и её надо припаять.
Видит карту, но не брелок
Брелок из комплекта иногда на 125 кГц, а не на 13,56. RC522 его не прочитает никогда. Проверьте другим брелоком или картой.
Читает одну карту много раз подряд
Нет вызова PICC_HaltA после чтения. Карта остаётся активной и отвечает в каждом цикле.
Работает на UNO, не работает на ESP32
Другие выводы SPI: на ESP32 это 23, 19, 18 и 5. И библиотека должна быть последней версии — старые не собираются под ESP.
Дальность два сантиметра
Это норма для RC522. Дальше — только антенна побольше или считыватель другого класса.
Что понадобится
- Модуль RFID RC522 с картой и брелоком
- Гребёнка (в комплекте, припаять)
- Arduino UNO
- Провода «папа-мама»