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?
Медная антенна на плате считывателя создаёт магнитное поле частотой 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-пины своей платы можно посмотреть в утилите Распиновка.
| Пин RC522 | Arduino Uno | Arduino Mega | ESP32 | Raspberry Pi Pico |
|---|---|---|---|---|
| SDA (SS) | D10 | 53 | GPIO 5 | GP17 |
| SCK | D13 | 52 | GPIO 18 | GP18 |
| MOSI | D11 | 51 | GPIO 23 | GP19 |
| MISO | D12 | 50 | GPIO 19 | GP16 |
| IRQ | Не подключается | Не подключается | Не подключается | Не подключается |
| GND | GND | GND | GND | GND |
| RST | D9 | 5 | GPIO 22 | GP20 |
| 3.3V | 3.3V | 3.3V | 3V3 | 3V3 |
Библиотека MFRC522 и чтение UID карты
В «Менеджере библиотек» (Library Manager) найди MFRC522 и установи библиотеку от GithubCommunity (miguelbalboa). Код ниже выводит в монитор порта UID каждой поднесённой карты в шестнадцатеричном виде (HEX):
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 с сохранённым значением, можно решить, разрешена ли карта. Пример ниже проверяет одну разрешённую карту; для нескольких карт достаточно сделать массив двумерным и сравнивать в цикле:
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, поэтому они спокойно работают вместе.
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}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) и используй его так:
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 RFID | 125 kHz | Около 10 см | Старые пропуска, микрочипы животных (EM4100) |
| HF RFID / NFC | 13,56 MHz | 1–10 см | Транспортные карты, MIFARE, NFC в телефонах |
| UHF RFID | 860–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
В брелоке от подъезда или карте доступа спрятан секретный идентификационный номер, и этот проект его читает. Поднеси карту к считывателю RFID, и Arduino выведет номер карты на экран компьютера. Первый

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

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

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

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

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

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

