ELECTRONICS

Библиотека MFRC522

менеджер: MFRC522GithubCommunity (miguelbalboa)версия 1.4.12

Считыватель RC522: читает UID карт и брелоков Mifare, пишет в блоки памяти карты.

RC522 работает по SPI и читает карты Mifare Classic и Ultralight на частоте 13,56 МГц: проездные, брелоки домофонов, метки из набора. Библиотека находит карту в поле, читает её уникальный номер UID — по нему обычно и открывают замок — и умеет читать и писать блоки памяти карты с ключами доступа.

Для большинства проектов хватает трёх вызовов: карта появилась, карта прочитана, вот её UID. Работа с блоками нужна, когда на карту надо что-то записать.

Установка и подключение

В менеджере библиотек ищите MFRC522 автора GithubCommunity (miguelbalboa). Если менеджер предложит поставить зависимости — соглашайтесь. Как открыть менеджер и что делать, если библиотека не находится, — в общей статье про библиотеки.

#include <SPI.h>
#include <MFRC522.h>

Создание объекта — обычно до setup():

#define SS_PIN  10
#define RST_PIN 9
MFRC522 rfid(SS_PIN, RST_PIN);
SPI.begin();            // в setup()
rfid.PCD_Init();

Методы

Только то, что нужно в обычном скетче. Сигнатуры сверены с версией 1.4.12.

PCD_Init()
Инициализировать считыватель. После SPI.begin().
PICC_IsNewCardPresent()
true, если в поле появилась новая карта.
PICC_ReadCardSerial()
Прочитать UID карты в rfid.uid. Вызывать после IsNewCardPresent().
uid.uidByte[i], uid.size
Байты UID и их количество — 4 или 7.
PICC_GetType(uid.sak)
Тип карты: Mifare 1K, Ultralight и т. д.
PCD_Authenticate(cmd, block, &key, &uid)
Авторизоваться в секторе карты ключом (по умолчанию шесть байт 0xFF). Нужно перед чтением и записью блоков.
MIFARE_Read(byte block, byte* buf, byte* size)
Прочитать блок 16 байт; буфер — 18 байт.
MIFARE_Write(byte block, byte* buf, byte size)
Записать 16 байт в блок. Не трогайте блоки-трейлеры (3, 7, 11…): в них ключи.
PICC_HaltA()
Отпустить карту, чтобы она не читалась повторно, пока лежит на считывателе.
PCD_StopCrypto1()
Завершить шифрованную сессию после работы с блоками.
PICC_DumpToSerial(&uid)
Вывести всю память карты в монитор — для изучения.

Пример

#include <SPI.h>
#include <MFRC522.h>

MFRC522 rfid(10, 9);            // SS, RST
byte master[4] = {0xDE, 0xAD, 0xBE, 0xEF};   // UID «своей» карты

void setup() {
  Serial.begin(9600);
  SPI.begin();
  rfid.PCD_Init();
}

void loop() {
  if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) return;

  bool ok = rfid.uid.size == 4;
  for (byte i = 0; i < 4 && ok; i++) ok = rfid.uid.uidByte[i] == master[i];

  Serial.print("UID:");
  for (byte i = 0; i < rfid.uid.size; i++) {
    Serial.print(' '); Serial.print(rfid.uid.uidByte[i], HEX);
  }
  Serial.println(ok ? " — доступ разрешён" : " — чужая карта");

  rfid.PICC_HaltA();
}

Первый запуск — просто смотреть UID в мониторе и вписать свои в код. Так делают простейший замок.

На чём попадаются

Карта не читается вообще

Модуль питается от 3,3 В, не от 5. Провода SPI: SDA модуля — это SS. И проверьте, что RST подключён к указанному выводу.

Читается через раз

Длинные провода к SPI или помехи от питания. Держите провода короче 15 см и добавьте PICC_HaltA() после чтения.

Записал и карта «умерла»

Перезаписан трейлер сектора с ключами. Пишите только в блоки данных: в Mifare 1K это все, кроме каждого четвёртого.

На плате, где вывод 10 занят

SS можно назначить любой; RST тоже. Меняйте в конструкторе, но 11, 12, 13 остаются за шиной.

Где используется на сайте

Что дальше