Симулятор RFID RC522: проверка скетча считывателя карт без модуля
RC522 — модуль, на котором новички теряют дни: SPI-подключение через пять проводов (SDA/SS, SCK, MOSI, MISO, плюс питание), библиотека MFRC522 с десятком вызовов, и в ответ от модуля — тишина. Проверить, в коде ли проблема или в проводах, без второго модуля под рукой невозможно. В браузере я бы сначала прогнал логику «прочитать UID и сравнить с эталоном» — это 80% рабочих скетчей, и она не требует живого RFID-чипа.
Встроенного устройства «RC522» в каталоге симулятора нет — лендинг текстовый с разбором API, рабочего скетча, который вы вставляете в основной симулятор, теста чтения UID и честной границы «что в коде, что в проводах». Ниже — скетч-проба, разбор библиотеки MFRC522 и грабли подключения.
С чего начать: что проверять в браузере
RC522 работает через SPI: SDA (Chip Select), SCK (такт), MOSI (выход к модулю), MISO (вход от модуля). На Uno SCK — D13, MOSI — D11, MISO — D12, SDA — любой цифровой, обычно D10. Библиотека MFRC522 прячет обмен в вызовы PCD_Init, PICC_ReadCardSerial и PICC_DumpToSerial. Логику скетча — чтение UID, сравнение с эталоном, реакция на свою карту — можно проверить без чипа: код компилируется, а монитор порта подсказывает, в каком вызове скетч «застрянет» без живой карты.
- PCD_Init(): инициализация модуля, как begin у датчиков — на плате возвращает true, в симуляторе как заглушка.
- PICC_ReadCardSerial(): «карта в поле?» — true, если поднесена карта; в браузере всегда false — нет RFID-чипа.
- PICC_GetType(byte *buffer): тип карты по ATQA — в симуляторе «неизвестно», на плате — MiFare Classic или Ultralight.
- mfrc522.uid.uidByte: массив 4 или 7 байт — UID карты, тот, что выдают стандартные «синие брелки».
- PICC_DumpToSerial(&mfrc522.uid): полный дамп карты в монитор — удобная диагностика, но на плате требует карты.
Скетч-проба: чтение UID и сравнение с эталоном
#include <SPI.h>#include <MFRC522.h> #define SS_PIN 10#define RST_PIN 9 MFRC522 mfrc522(SS_PIN, RST_PIN); byte ETALON_UID[4] = {0xDE, 0xAD, 0xBE, 0xEF}; // замените на свою карту void setup() { Serial.begin(9600); SPI.begin(); mfrc522.PCD_Init(); Serial.println("Gotov k chteniyu kart");} void loop() { if (!mfrc522.PICC_ReadCardSerial()) { return; // карты нет — выходим } bool svoj = true; for (byte i = 0; i < 4; i++) { if (mfrc522.uid.uidByte[i] != ETALON_UID[i]) { svoj = false; break; } } Serial.print("UID: "); for (byte i = 0; i < mfrc522.uid.size; i++) { Serial.print(mfrc522.uid.uidByte[i], HEX); Serial.print(" "); } Serial.println(svoj ? "-> SVOJA" : "-> CHUZHAJA"); mfrc522.PICC_HaltA(); // отпустить карту}Скетч вставьте в основной симулятор: компилятор поймёт вызовы MFRC522 и SPI, а без живой карты PICC_ReadCardSerial вернёт false — скетч выйдет из loop без печати UID. Это и есть тест: «логика до чтения» работает, дальше — на живой плате. Сценарий «свою-чужую карту различить» под ключи и брелки — половина RFID-проектов у новичков.
Честная граница: что в коде, что в проводах
| Проверка | Симулятор | Только железо |
|---|---|---|
| Логика: сравнение UID, реакция на свою/чужую | через Serial, без карты | то же, плюс реальное чтение |
| Вызовы MFRC522: PCD_Init, ReadCardSerial | компилируется, как заглушки | запускают модуль, читают карту |
| Чтение UID из реальной карты | нет: PICC_ReadCardSerial = false | да — 4 или 7 байт ATQA |
| Запись в сектор MIFARE Classic | нет: нет ключа A/B и аутентификации | да — после аутентификации по ключу |
| SPI-тайминги и подтяжки | не моделируются | да — SDA без подтяжки ловит помехи |
| Питание 3,3V на модуле | не учитывается | да — на 5V кристалл деградирует |
Браузер исполняет логику скетча, а RFID-чипа в нём нет: PICC_ReadCardSerial всегда false, и UID остаётся пустым. Это честная граница — модель проверяет код, а не радиочастотную часть. После того как скетч «открывает замок» по эталонному UID в браузере (вы проверяете через Serial), переходите на плату: поднесите синюю карту, и Monitor напечатает UID, который вы подставляете в ETALON_UID. Сдвиговый регистр как родня по SPI — урок про SPI-74HC595 показывает ту же шину в более простой задаче.
Грабли RC522
- Питание 3,3V, не 5V: модуль рассчитан на 3,3 вольта, на 5V кристалл живёт недолго. Ставьте согласователь уровня или подключайте к 3V3-пину ардуины.
- RST на D9: забытый RST-пин ломает инициализацию — модуль молчит, PCD_Init проходит, но PICC_ReadCardSerial вечно false.
- SDA/SS не на D10: на Uno D10 — стандартный SS для SPI-мастера, на другой пин надо SPI.begin() + pinMode(SS, OUTPUT).
- UID длиной 4 или 7 байт: новые карты MIFARE Ultralight дают 7-байтный UID, и mfrc522.uid.size равен 7, а не 4 — сверяйте размер в коде.
- Ключ A/B и аутентификация: чтение сектора без правильного ключа возвращает ошибку, и новички думают, что модуль «сломан» — проверьте ключ в примерах MFRC522.