Как собрать DIY RFID-ридер на MFRC522: пошаговый опыт

Если ты зашёл сюда, скорее всего, хочешь научиться читать RFID-метки — карточки пропуска безопасности, брелоки от дверей, или просто смотреть UID с выданных брелоков. MFRC522 — это дешёвый чип (обычно доллар-полтора на алиэкспрессе), который работает на частоте 13,56 МГц и умеет общаться с карточками по протоколу ISO 14443A. В этой статье я расскажу, как превратить этот чип в рабочий ридер, который выводит номер карточки в монитор порта, и дам именно ту информацию, которая нужна, чтобы не наступать на чужие грабли.

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

Ничего сверхъестественного. Минимальный набор выглядит так:

  • Плата MFRC522 (модуль, не голая микросхема — с обвязкой и антенной на плате)
  • Arduino Uno или Nano (подойдёт любая совместимая плата с ATmega328P)
  • Соединительные провода — мама-мама или мама-папа, смотря какие у тебя колодки
  • USB-кабель для Ардуино
  • Компьютер с Arduino IDE или PlatformIO

По желанию: красный и зелёный светодиоды + резисторы 220 Ом для визуальной индикации результата считывания.

Подключение MFRC522 к Arduino без ошибок

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

Стандартная SPI-распиновка подключения к Arduino Uno:

MFRC522 Arduino Uno Примечание
SDA (SS) D10 Chip Select
SCK D13 SPI Clock
MOSI D11 Master Out Slave In
MISO D12 Master In Slave Out
IRQ не подключать прерывание, обычно не используется
GND GND обязательно!
RST D9 Reset модуля
3.3V 3.3V ни в коем случае не 5V!

Вот здесь уже первая боль новичков — модуль питается от 3,3 вольта. Если подать 5V на пин 3.3V, микросхема уходит в «отказ» или начинает работать нестабильно — считывание будет случайным (то работает, то нет). При подключении источника питания обязательно проверь, что на этом пине именно 3,3 В, иначе мысли о «бракованном модуле» будут напрасными.

Установка библиотеки и первый тест

В Arduino IDE идёшь в «Библиотеки» — «Управление библиотеками», вбиваешь MFRC522 и ставишь библиотеку от GitHubCommunity (или MFRC522 by GithubCommunity). Она заточена именно под этот чип и поддерживает большинство типов меток.

После установки открываешь пример: Файл → Примеры → MFRC522 → DumpInfo. Это скетч, который считывает полный дамп карточки и выводит его в монитор порта.

Перед загрузкой убедись, что в скетче правильно указаны пины:

#define RST_PIN  9
#define SS_PIN   10

Загружаешь скетч, открываешь монитор порта на скорости 9600 бод, подносишь карточку прямо к корпусу модуля – и видишь информацию о чипе. Если видишь UID в формате hex — поздравляю, ридер рабочий.

Что реально происходит при считывании

MFRC522 облучает антенну, в её поле попадает карточка (у карточки собственной батареи нет, именно поэтому она откликается только вблизи от катушки). Происходит инициализация: чтение типа метки (Tag Type), затем поиск (Request), получение серийного номера карты (Anti-collision loop) — это и есть UID, тот самый уникальный идентификатор в 4 или 7 байт. Именно его чаще всего мы видим в протоколе SPI.

Протокол ISO 14443-3 предполагает стандартную последовательность обмена кадрами: REQA → ATQA → SELECT → SAK. Пример DumpInfo делает эту последовательность «за тебя», без необходимости ручной отладки команд. Если хочешь посмотреть весь процесс обмена данными в текстовом виде, можно добавить в скетч PICC_DumpVersionToSerial(), но для начального знакомства достаточно и UID.

У бесконтактных карт MIFARE Classic 1K после считывания UID можно прочитать данные из секторов, если знаешь ключи доступа (Key A или Key B). Часто на заводе стоят стандартные ключи типа FF FF FF FF FF FF или A0 A1 A2 A3 A4 A5. Если видел упоминание утилиты для веба – знай, чуда не будет, ключи либо дефолтные, либо нужно восстанавливать их специальными методами. С точки зрения практических домашних опытов: достаточно заменить стандартные ключи на свои, и данные карты станут недоступны для перебора тупыми инструментами.

Расширяем базовый скетч: индикация и защита «пустых» пропусков

Допустим, ты не хочешь просто смотреть UID, а хочешь, чтобы ридер пищал или зажигал светодиод, когда поднесена «своя» карта. Тогда добавляем простую логику сравнения UID:

byte myCard[] = {0xDE, 0xAD, 0xBE, 0xEF}; // твой UID

if (mfrc522.uid.uidByte[i] == myCard[i]) {
  // совпали все байты – зажечь зелёный
} else {
  // хотя бы один байт другой – красный
}

Под «своей» картой можно хранить абсолютно любой байтовый массив – от простого UID до сложной структуры. Главное — помнить, что UID публично считывается, и если ты рассчитываешь на серьёзную защиту, то одной проверкой UID не обойтись (её легко скопировать).

Частые проблемы при сборке

  • «Модуль не отвечает» — в логах видна строка MFRC522 Init failed. Сначала проверь питание (3,3 В на соответствующем пине) и отсутствие коротких замыканий по SPI-линиям. Часто проблема в том, что модуль просто не отпаяется от предыдущей прошивки. Помогает перезаливка чистого скетча DumpInfo с перезагрузкой.
  • Карта не считывается с расстояния — антенна на плате не резонирует с частотой 13,56 МГц. Проверь визуально целостность катушки, отсутствие перетёртых витков и качество пайки согласующего контура. В 90% случаев проблема решается перепайкой конденсаторов на модуле.
  • Периодически зависает SPI-шина — слишком длинные провода (более 10–15 см) на линиях SCK/MOSI/MISO. Укороти их до минимальной длины, при необходимости добавь развязку чуть выше по коду (сделать CS высоким между передачами).
  • Читается только при нажатии карты вплотную — нормальное расстояние для MFRC522 — 1–3 см. Если у тебя получается только 0–1 см,ее всего, нет резонанса или помехи от металлического корпуса. Удалите металлические предметы вокруг антенны, проверьте экранирование.

Когда MFRC522 не подходит

У этого чипа есть ограничения, которые стоит проговорить:

  • Он не работает с Ultralight C или DESFire EV2 в полноценном режиме шифрования — будет только UID считываться. Если нужно взаимодействовать с DESFire EV2, берите PN532 или SRI512, но это уже другой уровень цены и сложности.
  • Нет аппаратного шифрования RSA или AES — все протоколы шифрования «ручные», либо используют только стандартное шифрование MIFARE Classic устаревшего алгоритра CRYPTO1, который несложно взломать.
  • Дальность считывания пассивных меток не превышает ~3 см. Хочешь 5–10 см — нужна другая частота (125 кГц) или активные метки с батарейкой.

Для домашних экспериментов, открытия двери по метке или идентификации принтерных филаментов этого хватит с головой. Для серьёзных access‑систем с контролем целостности данных — нет.

Какой Arduino и модуль брать

Проверено на практике: самый простой файл делается на Arduino Nano с пятачным питанием от USB 2.0. Arduino Mega лучше не брать — у неё аппаратный SPI на других пинах, и если не перенастроить библиотеку, то SCK/MOSI не работают. Также будьте осторожны с китайскими клонами модулей, где пины развёрнуты зеркально – всегда ориентируйтесь на реальную распечатку, а не на условные стандарты.

Нужные материалы для поиска: MFRC522 RFID module и Arduino Nano V3. Оба элемента широко доступны в розничных сетях электроники. Заказывать проще всего через маркетплейсы, где приходитный комплект – модуль + брелок + брелок‑карта. Обязательно проверьте, чтобы у модуля были выведены пины (SDA, SCK, MOSI, MISO, IRQ, GND, RST, 3.3V) – и при необходимости допаяйте колодки, если их нет.

Что дальше: три направления развития

  1. Визуальный сигнал открытия двери — скетч считывает UID, и если UID совпадает с записанным, замыкается реле, ведущее на электромагнитный замок. Добавляешь питание 12В на обмотку замка через транзистор и диод (обязательно диод!). Получаешь полноценный контроллер доступа. Но помни – это игрушечная защита, так как карту можно скопировать с помощью ПО типа mfcuk. Для реального доступа в помещение лучше использовать заводские решения с нымшифрованными метками.
  2. Логирование активности — подключаешь ESP8266 вместо Uno, заливаешь скетч с Wi-Fi, и при каждом считывании отправляешь GET-запрос на свой сервер. Логишь, кто и когда прикладывал метку. В результате получается дешёвая система учёта рабочего времени. Единственная проблема – при перезагрузке может некоторое время не быть связи, поэтому важно хранить последний UID в EEPROM и отправлять его позже.
  3. Клонирование для тестов — записываешь оригинальный UID на T5577-карточку на частоте 125 кГц (но! MFRC522 работает на 13,56 МГц, поэтому для полного эксперимента понадобится шилд на EM4095 или ATtiny). Цель – быстро проверить логику считывания и записи, не тратя на это оригинальную карту. На T5577 можно перезаписывать UID для тестов, но она не полноценный репликатор MFIRE, поэтому рассчитывайте только на этап отладки.

Практические советы, которые сэкономят нервы

  • При разработке нового скетча всегда вставляй в начало mfrc522.PCD_Init() и проверяй возвращаемое значение. Если инициализация не прошла, дальнейшая работа с модулем бессмысленна.
  • Если карточка иногда считывается, иногда нет — попробуй уменьшить время ожидания ответа (таймаут считывания) в библиотеке. Иногда помогает увеличить количество повторных попыток опроса метки.
  • Не используй металлический корпус для ридера. Металл глушит электромагнитное поле, и ты получишь дальность 0–2 мм вместо нормальных 1–3 см. Лучше всего пластик или дерево.
  • В скетчах с поиском UID добавляй сравнение по всем байтам (uid.size() возвращает количество байт в UID), даже если используешь только часть. Иначе разные карты могут ошибочно восприниматься как одна.

Что в итоге

Собрать RFID-ридер на MFRC522 — это 30 минут реального времени, если под руками есть Ардуино и провода. Ты получаешь стабильный инструмент для чтения бесконтактных карт на частоте 13,56 МГц, с которым можно строить свои системы учёта доступа, прототипировать устройства автоматизации, и самое главное — понять, как работает RFID вообще.

Главное, что стоит запомнить: UID — это не секрет, MFRC522 — не инструмент для серьёзной защиты, а питание платы должно быть только 3,3 В на соответствующем пине. Если нужна защищённая система — переходи на DESFire EV2 с PN532 и строй полноценную архитектуру. Если нужен дешёвый способ считывать метки, сигнализировать события и быстро отладить логику предохранителя двери — MFRC522 справится.

Radio-Blog.ru