RFID-модуль RC522: подключение к Arduino, чтение и запись меток

RC522 — считыватель RFID-меток на 13,56 МГц с интерфейсом SPI. Разбираем выводы, подключение к Arduino и работу с библиотекой MFRC522: UID, дамп памяти, запись.
Коротко о технологии RFID
RFID — это бесконтактная идентификация объектов по радиоканалу. У каждой электронной метки есть уникальный идентификатор. Считыватель (ридер) излучает электромагнитные волны определённой частоты, а метка в ответ передаёт свой номер, содержимое памяти и другие данные. Ридеры умеют не только читать метки, но и записывать в них информацию.
К достоинствам технологии относят отсутствие контакта, высокую скорость считывания, возможность скрытой установки меток и работы во вредных средах, а также защищённость от подделки. Метки бывают активными и пассивными; у пассивных нет собственного источника энергии, они питаются током, который наводит в антенне сигнал ридера. Рабочие частоты делятся на диапазоны LF (125–134 кГц), HF (13,56 МГц) и UHF (860–960 МГц).
Модуль RFID-RC522
В проектах на Arduino роль считывателя чаще всего выполняет модуль RFID-RC522. Он построен на микросхеме MFRC522 компании NXP и работает с метками диапазона HF. В комплекте с модулем идут две метки: карта и брелок.

| Напряжение питания | 3,3 В |
| Потребляемый ток | 13–26 мА |
| Рабочая частота | 13,56 МГц |
| Дальность считывания | 0–60 мм |
| Интерфейс | SPI |
| Максимальная скорость передачи | 10 Мбит/с |
| Размер | 40 × 60 мм |
Интерфейс и выводы
Сама микросхема MFRC522 поддерживает SPI, UART и I2C; интерфейс выбирается логическими уровнями на определённых её выводах. На модуле RC522 выбран SPI.

- SDA — выбор ведомого устройства
- SCK — сигнал синхронизации
- MOSI — данные от ведущего к ведомому
- MISO — данные от ведомого к ведущему
- RST — сброс
- IRQ — прерывание
- GND — земля
- Vcc — питание 3,3 В
Сигнал RST приходит с цифрового выхода контроллера: низкий уровень перезагружает считыватель. Низкий уровень на этом выводе означает также режим сна; чтобы вывести модуль из него, на RST подают HIGH.
Подключение к Arduino
Для сборки потребуются Arduino Uno, макетная плата, модуль RFID-RC522, метки на 13,56 МГц и провода. Линии SPI можно брать не только с цифровых выводов платы, но и с разъёма ICSP, на который выведен тот же интерфейс. В примерах вывод сброса модуля подключён к выводу 9, а выбор ведомого — к выводу 10.


Чтение UID и типа метки
Для работы с модулем применяется Arduino-библиотека MFRC522, вместе с ней подключается стандартная SPI. Первый скетч запускает последовательный порт на 9600, шину SPI и инициализирует считыватель вызовом PCD_Init(). В цикле программа ждёт появления новой метки, считывает её и выводит в монитор порта UID в шестнадцатеричном виде и название типа метки, после чего делает паузу в одну секунду. Проверять можно на карте и брелоке из комплекта, а также на наклеиваемых метках Ultralight C.
Дамп памяти и запись данных
Содержимое памяти метки выводит второй скетч: после обнаружения и чтения карты достаточно одного вызова rider.PICC_DumpToSerial(&(rider.uid)), где rider — созданный в программе объект MFRC522. Объём памяти у разных меток различается; у Ultralight C он составляет всего 64 байта.
Чтение и запись ведутся поблочно, и размер блока зависит от типа метки: у Ultralight C блок занимает 4 байта. Третий скетч принимает через последовательный порт номер страницы и число, раскладывает число на старший и младший байты и записывает их в первые два байта выбранного блока функцией MIFARE_Ultralight_Write. Команда в порт должна начинаться символом * и содержать поля, разделённые точкой с запятой, а завершается ввод символом #. Номер страницы программа ограничивает диапазоном от 7 до 15, значение — не более 1000. После записи в порт выводятся статус операции и свежий дамп памяти, по которому видно, что данные сохранились.
Если метка не читается
Причин обычно две: ошибка в подключении модуля либо метка, которую этот считыватель не поддерживает.