Библиотека MFRC522
Считыватель 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 остаются за шиной.