ELECTRONICS

RFID RC522 и Arduino: схема подключения по SPI, чтение карты, библиотека MFRC522 и замок

RFID и NFCСкетч проверен компиляцией

RC522 — считыватель меток 13,56 МГц, в комплекте с которым идут белая карта и брелок. Он читает уникальный номер метки на расстоянии двух-трёх сантиметров, а с библиотекой MFRC522 — ещё и пишет в её память.

Подключается по SPI: пять сигнальных проводов плюс питание. Важно одно — питание строго 3,3 В. На 5 В модуль работает недолго.

Схема подключения

103103RC52258 07TS04360NXP103103103103RFID-RC522SDASCLMOSIMISOIRQGNDRST3.3V
Наведите на провод или нажмите на него — расскажу, зачем он нужен.

Распиновка

ПроводКуда и зачем
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. Дальше — только антенна побольше или считыватель другого класса.

Что понадобится