Симулятор SD-карты и RFID RC522 Arduino онлайн
В нашем симуляторе Arduino есть виртуальные SD-карта и RFID-ридер RC522, и работают они без паяльника. Пишете скетч с SD.begin(4) и SD.open("log.txt", FILE_WRITE), и файл появляется в живом логе прямо на стенде. Ридер создаётся как MFRC522 rfid(10), а в карточке RFID есть три виртуальные карты с разными UID.
Это удобно тем, что обе периферии хранят данные. SD-карта учит файловому API: создание папок, запись, чтение, листинг через openNextFile. RC522 учит RFID-протоколу: поиск карты, чтение UID, аутентификация сектора ключом A или B и чтение и запись блоков MIFARE Classic.
Откройте симулятор, выберите пример «SD: Логгер данных» или «RFID: Считыватель карт» в меню Examples, нажмите «Загрузить». Всё, что нужно для проверки логики, у вас в браузере.
SD: запись лога в виртуальный FAT
#include <SD.h>File logfile;void setup() { Serial.begin(9600); SD.begin(4); logfile = SD.open("datalog.txt", 1); logfile.println("t=0 temp=23.5 hum=45"); logfile.println("t=1 temp=23.7 hum=46"); logfile.close(); Serial.print("Файлов: "); Serial.println(SD.exists("datalog.txt"));}void loop() {}Виртуальный FAT хранит файлы как строки в памяти браузера. Вызов SD.open с флагом FILE_WRITE создаёт файл, println добавляет в него строку, close закрывает. Проверка наличия это SD.exists, удаление это SD.remove. Для чтения файл открывают без флага записи, а потом разбирают: read() возвращает код символа, available() сообщает, сколько байт ещё осталось. Файл в этом случае читается побайтно, поэтому в реальном проекте удобнее открывать его и сразу слать в Serial через write(), а не конкатенировать строки в памяти.
Чтобы посмотреть полное содержимое файла, кликните на имя файла в карточке SD-карты. Откроется модальное окно с полным текстом, кнопкой «Копировать» и «Закрыть». Это самый быстрый способ убедиться, что скетч пишет именно то, что задумано, а не то, что показывает Serial.
RFID: циклический перебор 3 карт
#include <MFRC522.h>MFRC522 rfid(10);void setup() { Serial.begin(9600); rfid.PCD_Init();}void loop() { if (rfid.PICC_IsNewCardPresent()) { if (rfid.PICC_ReadCardSerial()) { Serial.print("UID: "); for (byte i = 0; i < 4; i++) { Serial.print(rfid.uidByte[i], HEX); Serial.print(" "); } Serial.println(); } } delay(300);}Три виртуальные карты: 0xDEADBEEF (синяя карта №1), 0xCAFEBABE (красная карта №2) и 0x01020304 (чёрный брелок). Вызов PICC_IsNewCardPresent сообщает, что карта в поле, а PICC_ReadCardSerial читает UID в rfid.uidByte[0..3]. Карты выдаются по кругу: каждый следующий вызов IsNewCardPresent переключает на следующую карту из стопки.
В ручном режиме, когда карточка RFID вынесена в палитру, есть кнопка «След. карта», которая перебирает карты, и список всех трёх с их UID внизу. Клик по конкретной карте выбирает именно её, и следующий вызов в скетче отдаст её UID. Так удобно проверять ветвление: например, код, который открывает замок только для одного значения UID.
MIFARE Classic: аутентификация и работа с блоками
В симуляторе реализован полный MIFARE Classic 1K: 16 секторов, по 4 блока в каждом, по 16 байт на блок, итого 1024 байта. Все ключи A и B по умолчанию заводские, то есть FFFFFFFFFFFF. Читать и писать блок можно только после аутентификации сектора: вызов PICC_Authenticate с ключом A (0x60) или ключом B (0x61) открывает сектор, после чего работают MIFARE_Read и MIFARE_Write.
Если ключ не передан или передан нулевой, берётся заводской FFFFFFFFFFFF, поэтому учебный скетч работает без настройки. Аутентификация снимается вызовом PICC_HaltA или PICC_StopCrypto1, а также автоматически при чтении следующей карты. Запись в блок 3 сектора переписывает sector trailer, то есть сами ключи A и B: на этом можно построить учебный пример, где ученик ставит свой ключ, а затем читает сектор уже с ним.
| Метод | Возвращает | Когда вызывать |
|---|---|---|
| PCD_Init() | 1 (успех) | В setup() |
| PICC_IsNewCardPresent() | 1 если карта в поле | В loop() |
| PICC_ReadCardSerial() | 1 если UID считан | После IsNewCardPresent |
| uidByte[i] | i-й байт UID (0-3) | После ReadCardSerial |
| PICC_HaltA() | 1 (сброс аутентификации) | После обработки |
Что сначала не получилось
С первой попытки логгер не записал ничего, и файл в карточке SD не появился. Я подумал, что виртуальная карта не создаётся, и начал проверять пути. Причина была в другом: я открывал файл в режиме чтения, а потом пытался в него писать. В реальной библиотеке это тоже не работает, файл нужно открывать с флагом FILE_WRITE.
С RFID вышло сложнее. Скетч печатал UID, но он всегда был одинаковым, и я не мог понять, какая именно карта выдаётся. Оказалось, что PICC_IsNewCardPresent в симуляторе всегда возвращает единицу, пока в стопке есть карты, и переключение происходит по кругу. Пришлось добавить в скетч счётчик подходов и печатать его рядом с UID, и только тогда стало видно, что карты чередуются.
Личный опыт: стенд для домашнего задания
Я собрал на симуляторе стенд для домашнего задания по RFID: ученик пишет в карту свой номер, а потом «прикладывает» карту к считывателю, и система сверяет номер с таблицей в SD-файле. Всё, что для этого нужно, есть в браузере: запись в блок MIFARE, чтение по UID, список допустимых номеров из файла и вывод в Serial.
Проверял я это по цифрам: в сектор 0 записывались 16 байт с номером ученика, потом этот же блок читался обратно и сверялся с исходным массивом. Первый заход дал расхождение, потому что sector trailer лежит в блоке 3, а данные я клал в блок 1, и при аутентификации по ключу A блок 3 не трогается. После того как ключ для чтения передавался явно, аутентификация проходила и данные совпали байт в байт. Отдельно проверил, что после PICC_HaltA повторное чтение блока возвращает отказ, пока сектор не открыт заново.
Авторская позиция: что взять новичку
Начинайте с SD-карты: у неё простой API и нет аутентификации, поэтому первый файл пишется за пять минут и сразу показывает результат в интерфейсе. RFID оставьте на второй шаг, там сначала нужно понять, что карта вообще считывается, и только потом добавлять секторы и ключи. И не забывайте про ограничение виртуальной FAT: она живёт в памяти вкладки и сбрасывается при перезагрузке страницы. Для проверки логики этого достаточно, но для реального логгера нужна настоящая карта.
Порядок работы в симуляторе
- Откройте /simulator/ и выберите пример из меню Examples
- Нажмите «Загрузить» и дождитесь статуса Done в логе
- Добавьте SD-карту или RFID RC522 в палитру, если их нет на стенде
- Откройте карточку SD-карты и проверьте, что появился файл
- В карточке RFID выберите карту из списка и запустите скетч заново
- Сверьте напечатанный UID с выбранной картой