Компоненты · 4 мин чтения

RFID RC522: читаем карты с Arduino и делаем дверной замок по карте

Как работает RFID-модуль RC522? Карты и брелоки на 13,56 MHz, подключение по SPI с питанием 3,3 V, библиотека MFRC522, чтение UID, проверка разрешённых карт, дверной замок на сервоприводе, ESP32 и Pico.

RFID (Radio Frequency IDentification, радиочастотная идентификация) — технология, которая распознаёт карту или брелок по радиоволнам, не касаясь считывателя. На RFID работают транспортные карты, пропуска в офис, противокражные метки в магазинах и микрочипы домашних животных. RC522 — дешёвый модуль-считыватель на частоте 13,56 MHz, который обычно продаётся вместе с белой картой и синим брелоком. На нём строят множество проектов — от дверных замков по карте до систем учёта посещаемости.

RFID-считыватель RC522
RFID-модуль RC522: медная дорожка на плате — это антенна считывателя; рядом карта и брелок, которые он читает.

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

Медная антенна на плате считывателя создаёт магнитное поле частотой 13,56 MHz. Внутри карты или брелока есть тонкая катушка и крошечная микросхема, но нет батарейки. Когда карта приближается к полю, энергия, наведённая в катушке, питает микросхему, и та отправляет считывателю свой идентификатор и данные, очень слабо изменяя поле. Поэтому карты годами работают без подзарядки, но с RC522 расстояние чтения всего около 3–5 сантиметров.

Карты из наборов обычно MIFARE Classic 1K: её 1 КБ памяти разделён на 16 секторов, каждый из которых состоит из 4 блоков по 16 байт. У каждой карты есть записанный на заводе UID (уникальный идентификатор), обычно длиной 4 байта. Большинство простых проектов узнают карту, читая этот UID, а не записывая данные на карту.

Характеристики RC522

ПараметрЗначение
Рабочая частота13,56 MHz
Питание3,3 V (не 5 V)
Потребляемый ток13–26 mA
Расстояние чтенияОколо 3–5 см (зависит от карты)
Поддерживаемые картыMIFARE Classic 1K/4K, Ultralight, NTAG (ISO 14443A)
ИнтерфейсSPI (микросхема также поддерживает I2C и UART)

Подключение RC522 (SPI)

RC522 общается с платой по SPI. Пины SCK, MOSI и MISO нужно подключать к фиксированным SPI-пинам каждой платы, а SDA (SS) и RST — к любым цифровым пинам, лишь бы код им соответствовал. SPI-пины своей платы можно посмотреть в утилите Распиновка.

Пин RC522Arduino UnoArduino MegaESP32Raspberry Pi Pico
SDA (SS)D1053GPIO 5GP17
SCKD1352GPIO 18GP18
MOSID1151GPIO 23GP19
MISOD1250GPIO 19GP16
IRQНе подключаетсяНе подключаетсяНе подключаетсяНе подключается
GNDGNDGNDGNDGND
RSTD95GPIO 22GP20
3.3V3.3V3.3V3V33V3
Никогда не подключай RC522 к пину 5V: модуль работает от 3,3 V, и 5 V может навсегда его повредить. Многие подключают его прямо к цифровым пинам Uno с уровнем 5 V, и обычно это работает, но официально микросхема не рассчитана на 5 V. Для проектов, которые будут работать долго, надёжнее поставить преобразователь уровней; ESP32 и Pico и так работают на 3,3 V, поэтому у них такой проблемы нет.

Библиотека MFRC522 и чтение UID карты

В «Менеджере библиотек» (Library Manager) найди MFRC522 и установи библиотеку от GithubCommunity (miguelbalboa). Код ниже выводит в монитор порта UID каждой поднесённой карты в шестнадцатеричном виде (HEX):

C++ (Arduino IDE)
1#include <SPI.h>
2#include <MFRC522.h>
3
4const int SS_PIN = 10;
5const int RST_PIN = 9;
6
7MFRC522 rfid(SS_PIN, RST_PIN);
8
9void setup() {
10  Serial.begin(9600);
11  SPI.begin();
12  rfid.PCD_Init();
13  Serial.println("Kartı okutun / scan a card");
14}
15
16void loop() {
17  if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) return;  // kart yok / no card
18
19  Serial.print("UID:");
20  for (byte i = 0; i < rfid.uid.size; i++) {
21    Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " ");
22    Serial.print(rfid.uid.uidByte[i], HEX);
23  }
24  Serial.println();
25
26  rfid.PICC_HaltA();        // kartı beklemeye al / halt the card
27  rfid.PCD_StopCrypto1();
28}
Запиши UID своей карты и брелока: на следующем шаге они станут «разрешёнными картами». Если ни одна карта не читается, загрузи «Файл › Примеры › MFRC522 › DumpInfo»; если монитор порта показывает «Firmware Version: 0x0» или «0xFF», проблема в подключении.

Проверка разрешённой карты

Сравнивая прочитанный UID с сохранённым значением, можно решить, разрешена ли карта. Пример ниже проверяет одну разрешённую карту; для нескольких карт достаточно сделать массив двумерным и сравнивать в цикле:

C++ (Arduino IDE)
1// yukarıdaki tanımlar ve setup() aynen / definitions and setup() as above
2byte allowed[4] = {0xDE, 0xAD, 0xBE, 0xEF};   // kendi kartının UID'si / your card's UID
3
4bool isAllowed() {
5  if (rfid.uid.size != 4) return false;
6  for (byte i = 0; i < 4; i++) {
7    if (rfid.uid.uidByte[i] != allowed[i]) return false;
8  }
9  return true;
10}
11
12void loop() {
13  if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) return;
14  Serial.println(isAllowed() ? "İzin verildi / access granted" : "Reddedildi / access denied");
15  rfid.PICC_HaltA();
16  rfid.PCD_StopCrypto1();
17}

Дверной замок по карте на сервоприводе

Соберём замок, который при поднесении разрешённой карты поворачивает сервопривод на 90 градусов и открывается на 3 секунды, а на неразрешённую карту отвечает коротким предупреждающим сигналом зуммера. Про подключение сервопривода читай в статье Что такое сервопривод?, а про звуковой сигнал — Что такое зуммер? На Uno библиотека Servo использует Timer1, а tone() — Timer2, поэтому они спокойно работают вместе.

C++ (Arduino IDE)
1#include <SPI.h>
2#include <MFRC522.h>
3#include <Servo.h>
4
5MFRC522 rfid(10, 9);       // SS, RST
6Servo lock;
7const int BUZZER_PIN = 8;
8byte allowed[4] = {0xDE, 0xAD, 0xBE, 0xEF};
9
10void setup() {
11  SPI.begin();
12  rfid.PCD_Init();
13  lock.attach(6);
14  lock.write(0);                          // kilitli / locked
15}
16
17void loop() {
18  if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) return;
19  bool ok = rfid.uid.size == 4 && memcmp(rfid.uid.uidByte, allowed, 4) == 0;
20  if (ok) {
21    lock.write(90);                       // kilidi aç / unlock
22    delay(3000);
23    lock.write(0);                        // tekrar kilitle / lock again
24  } else {
25    tone(BUZZER_PIN, 400, 600);           // reddedildi sesi / denied beep
26  }
27  rfid.PICC_HaltA();
28  rfid.PCD_StopCrypto1();
29}
Замок, который проверяет только UID, подходит для учёбы и хобби-проектов, но это не настоящая защита: UID карт MIFARE Classic можно скопировать дешёвыми устройствами. Для настоящей двери запрашивай кроме карты ещё и PIN-код или проверяй данные, записанные в зашифрованных секторах.

RC522 с ESP32 и Raspberry Pi Pico

На ESP32 работает та же библиотека MFRC522; используй пины VSPI и объяви объект как MFRC522 rfid(5, 22);. ESP32 работает от 3,3 V, поэтому идеально подходит к RC522, а благодаря Wi-Fi поднесённые карты можно записывать в журнал в интернете. На Pico с MicroPython скопируй на Pico файл mfrc522.py (например, библиотеку danjperron) и используй его так:

Python
1from mfrc522 import MFRC522      # mfrc522.py Pico'da olmalı / mfrc522.py must be on the Pico
2import time
3
4reader = MFRC522(spi_id=0, sck=18, miso=16, mosi=19, cs=17, rst=20)
5
6while True:
7    reader.init()
8    stat, tag_type = reader.request(reader.REQIDL)
9    if stat == reader.OK:
10        stat, uid = reader.SelectTagSN()
11        if stat == reader.OK:
12            print("UID:", "".join("{:02X}".format(b) for b in uid))
13    time.sleep_ms(200)

Виды RFID: какие карты читает RC522?

ТипЧастотаРасстояние чтенияТипичное применение
LF RFID125 kHzОколо 10 смСтарые пропуска, микрочипы животных (EM4100)
HF RFID / NFC13,56 MHz1–10 смТранспортные карты, MIFARE, NFC в телефонах
UHF RFID860–960 MHzНесколько метровМетки на складах, в логистике и рознице

RC522 читает только HF-карты на 13,56 MHz. Карты на 125 kHz, которые стоят на входе во многие здания (часто с пометкой «EM»), RC522 не читает; для них нужен считыватель на 125 kHz, например RDM6300. NFC — разновидность RFID на 13,56 MHz, которую умеют читать телефоны; RC522 может прочитать UID у NFC-наклеек NTAG.

Идеи проектов с RFID

  • Замок на дверь или ящик по карте: замок, который открывается разрешённой картой и предупреждает о неразрешённой.
  • Учёт посещаемости: сопоставь каждую карту с именем и записывай время прихода на SD-карту или в интернет.
  • Экран приветствия: при поднесении карты показывай на LCD «Welcome» и имя человека; про дисплей читай в статье I2C LCD-дисплей.
  • Коробка сказок: назначь каждой карте свой звуковой файл и сделай звуковую игрушку для детей с DFPlayer.
  • Умная кормушка для питомца: выдавай корм, когда считывается метка на ошейнике.
  • Карточная игра: сделай викторину или игру на память с картами.

Частые ошибки и как их исправить

  • Карты не читаются, а версия показывает 0x0: провода SPI на неправильных пинах; особенно проверь MOSI и MISO.
  • Модуль подключён к 5V: RC522 работает от 3,3 V; 5 V может его сжечь.
  • Попытка прочитать карту на 125 kHz: RC522 такие карты не видит; используй карту на 13,56 MHz.
  • Карта слишком далеко или лежит на металле: поднеси карту на 1–3 см; металлические поверхности искажают поле.
  • Одна и та же карта читается снова и снова: не вызывается PICC_HaltA(); останавливай карту после чтения.
  • Длинные провода: на длинных проводах сигналы SPI портятся; делай их короче 20 см.

RFID отвечает на вопрос «кто ты?» одним касанием, а это очень много даёт проектам безопасности и автоматизации. В приложении BlueGrays есть пошаговые проекты со схемами подключения и кодом: чтение RFID-меток, считыватель карт с LCD и дверной RFID-замок на сервоприводе.

Частые вопросы

На каком расстоянии RC522 читает карту?

С картами и брелоками из наборов обычно с 3–5 см. На расстояние влияют тип карты, размер антенны и металл поблизости. Для большей дальности нужны UHF-считыватели, которые работают на других частотах.

Какие карты читает RC522? Читает ли он карты на 125 kHz?

RC522 читает только карты ISO 14443A на 13,56 MHz, например MIFARE Classic 1K/4K, Ultralight и метки NTAG. Карты EM на 125 kHz, распространённые на входе в здания, он не читает; для них используют считыватель на 125 kHz, например RDM6300.

Работает ли RC522 от 5V?

Нет, RC522 нужно питать от 3,3 V. Подключение к пину 5V может повредить модуль. Его пины данных обычно выдерживают сигналы 5 V от Uno, но поскольку официально микросхема не рассчитана на 5 V, для постоянных проектов рекомендуется преобразователь уровней.

Может ли UID карты измениться или быть скопирован?

UID обычной карты записывается на заводе и не меняется. Однако бывают «магические» карты с изменяемым UID, и на них можно скопировать UID карт MIFARE Classic. Поэтому система, которая доверяет только UID, настоящей защиты не даёт.

Можно ли записывать данные на карту с помощью RC522?

Да. На картах MIFARE Classic каждый сектор защищён ключом; у новых карт ключ по умолчанию FF FF FF FF FF FF. С примером ReadAndWrite из библиотеки MFRC522 можно записывать данные в блоки и читать их обратно. В последнем блоке каждого сектора хранятся ключи, поэтому не пиши туда случайные данные.

Можно ли использовать телефон как карту для RC522?

Обычно надёжно не получится. iPhone не открывает NFC для эмуляции карт, а телефоны на Android отправляют случайный UID, который меняется при каждом касании. Для системы на основе телефона лучше читать телефоном NFC-метку и отправлять результат на плату по Wi-Fi или Bluetooth.

Все проекты
Чтение значения RFID
#53Новичок
Premium

Чтение значения RFID

В брелоке от подъезда или карте доступа спрятан секретный идентификационный номер, и этот проект его читает. Поднеси карту к считывателю RFID, и Arduino выведет номер карты на экран компьютера. Первый

4.7(47)
61
Считыватель карт RFID RC522 на ESP32 (с LCD)
#123Средний

Считыватель карт RFID RC522 на ESP32 (с LCD)

В этом проекте модуль RFID RC522 на базе MFRC522 подключается к ESP32 по SPI и читает UID карты или метки. Это основа для дверных замков, клубных систем и контроля доступа. Прочитанный UID выводится на LCD-экран; эта версия не сравнивает его со списком разрешённых карт. ВНИМАНИЕ: RC522 работает только от 3.3V; подача 5V сожжёт модуль!

4.8(21)
39
Дверной замок с RFID на ESP32 (RC522 + сервопривод + OLED + зуммер + светодиод)
#137Продвинутый
Premium

Дверной замок с RFID на ESP32 (RC522 + сервопривод + OLED + зуммер + светодиод)

Собираем умный дверной замок на ESP32, модуле RFID RC522, сервоприводе SG90, OLED-дисплее SSD1306, активном зуммере и 2 светодиодах. При поднесении карты её UID сравнивается со списком разрешённых карт в коде: если доступ разрешён, сервопривод поворачивается и открывает дверь (зелёный светодиод + 2 коротких сигнала), а через 5 секунд дверь снова запирается сама. При чужой карте загорается красный светодиод, звучат 3 быстрых сигнала, а прочитанный UID показывается на экране.

4.8(9)
15
Умный электронный сейф
#92Продвинутый
Premium

Умный электронный сейф

Маленький сейф для ценных вещей, который открывается кодом. Ты вводишь на клавиатуре свой четырёхзначный код; если он верный, сервопривод открывает замок, загорается зелёный свет, а экран показывает с

4.7(42)
63
Кодовый замок с клавиатурой 4x4 и LCD
#64Продвинутый
Premium

Кодовый замок с клавиатурой 4x4 и LCD

Маленький электронный дверной замок, который не пускает тех, кто не знает кода. Ты нажимаешь клавишу решётки и вводишь код на клавиатуре; если он верный, экран сообщает, что доступ разрешён, загораетс

4.8(59)
75
Сигнализация движения на ESP32 (PIR + зуммер + светодиод + Telegram)
#145Продвинутый
Premium

Сигнализация движения на ESP32 (PIR + зуммер + светодиод + Telegram)

Умная охранная сигнализация, которая при обнаружении движения PIR-датчиком включает зуммер и светодиод и одновременно сразу отправляет владельцу уведомление в Telegram. В ней есть 30-секундная пауза, ограничивающая частоту повторных тревог; этот механизм не проверяет срабатывания PIR и не устраняет ложные тревоги. Подходит для дома, гаража, склада или мастерской. С ESP32-CAM можно добавить уведомления с фото, а с обычной ESP32 DevKit V1 приходят текстовые.

0.0(0)
9
I2C LCD-дисплей (16x2) на ESP32
#119Средний
Premium

I2C LCD-дисплей (16x2) на ESP32

В этом проекте символьный LCD-экран 16x2 подключается к ESP32 по протоколу I2C и выводит текст. Благодаря I2C экраном можно управлять всего двумя пинами данных (SDA и SCL), не тратя 6+ пинов, как при классическом параллельном подключении. Код печатает постоянное сообщение в первой строке и счётчик, растущий каждую секунду, во второй. Кроме того, при запуске работает сканер I2C, который выводит адрес дисплея в монитор порта.

4.9(23)
40