Делаем RFID-замок с использованием Arduino. Чтение и запись RFID меток. Модуль RC522 для Arduino

Сегодня я расскажу про RFID модуль RC522 , на базе чипа MFRC522. Питание 3.3В, дальность обнаружения до 6см. Предназначен для чтения и записи RFID меток с частотой 13.56 МГц. Частота в данном случае очень важна, так как RFID метки существуют в трех частотных диапазонах:


  • Метки диапазона LF (125—134 кГц)

  • Метки диапазона HF (13,56 МГц)

  • Метки диапазона UHF (860—960 МГц)

Конкретно этот модуль работает с метками диапазона HF, в частности с протоколом MIFARE.

Для работы с модулем можно использовать стандартную библиотеку RFID входящую в Arduino IDE, однако есть и другая библиотека, написанная специально под данный модуль - MFRC522 (1 Мб) . Обе библиотеки вполне удобны, однако в MFRC522 больше специальных функций, позволяющих максимально сократить итоговый код программы.

Подключение

Некоторые столкнуться с проблемой - название пинов в большинстве уроков и руководств может не соответствовать распиновке на вашем модуле. Если в скетчах указан пин SS, а на вашем модуле его нет, то скорее всего он помечен как SDA. Ниже я приведу таблицу подключения модуля для самых распространенных плат.

MFRC522 Arduino Uno Arduino Mega Arduino Nano v3

Arduino Leonardo/ Micro

Arduino Pro Micro
RST 9 5 D9 RESET/ICSP-5 RST
SDA(SS) 10 53 D10 10 10
MOSI 11 (ICSP-4) 51 D11 ICSP-4 16
MISO 12 (ICSP-1 ) 50 D12 ICSP-1 14
SCK 13 (ICSP-3) 52 D13 ICSP-3 15
3.3V 3.3V 3.3V Стабилизатор 3,3В Стабилизатор 3,3В Стабилизатор 3,3В
GND GND GND GND GND GND

Пины управления SS(SDA) и RST задаются в скетче, так что если ваша плата отличается от той, что я буду использовать в своих примерах, а использую я UNO R3, указывайте пины из таблицы в начале скетча:


#define SS_PIN 10 #define RST_PIN 9

Пример №1: Считывание номера карты

Рассмотрим пример из библиотеки RFID - cardRead. Он не выдает данные из карты, а только ее номер, чего обычно бывает достаточно для многих задач.


#include #include #define SS_PIN 10 #define RST_PIN 9 RFID rfid(SS_PIN, RST_PIN); // Данные о номере карты храняться в 5 переменных, будем запоминать их, чтобы проверять, считывали ли мы уже такую карту int serNum0; int serNum1; int serNum2; int serNum3; int serNum4; void setup() { Serial.begin(9600); SPI.begin(); rfid.init(); } void loop() { if (rfid.isCard()) { if (rfid.readCardSerial()) { // Сравниваем номер карты с номером предыдущей карты if (rfid.serNum != serNum0 && rfid.serNum != serNum1 && rfid.serNum != serNum2 && rfid.serNum != serNum3 && rfid.serNum != serNum4) { /* Если карта - новая, то считываем*/ Serial.println(" "); Serial.println("Card found"); serNum0 = rfid.serNum; serNum1 = rfid.serNum; serNum2 = rfid.serNum; serNum3 = rfid.serNum; serNum4 = rfid.serNum; //Выводим номер карты Serial.println("Cardnumber:"); Serial.print("Dec: "); Serial.print(rfid.serNum,DEC); Serial.print(", "); Serial.print(rfid.serNum,DEC); Serial.print(", "); Serial.print(rfid.serNum,DEC); Serial.print(", "); Serial.print(rfid.serNum,DEC); Serial.print(", "); Serial.print(rfid.serNum,DEC); Serial.println(" "); Serial.print("Hex: "); Serial.print(rfid.serNum,HEX); Serial.print(", "); Serial.print(rfid.serNum,HEX); Serial.print(", "); Serial.print(rfid.serNum,HEX); Serial.print(", "); Serial.print(rfid.serNum,HEX); Serial.print(", "); Serial.print(rfid.serNum,HEX); Serial.println(" "); } else { /* Если это уже считанная карта, просто выводим точку */ Serial.print("."); } } } rfid.halt(); }

Скетч залился, светодиод питания на модуле загорелся, но модуль не реагирует на карту? Не стоит паниковать, или бежать искать "правильные" примеры работы. Скорее всего, на одном из пинов просто нет контакта - отверстия на плате немного больше чем толщина перемычки, так что стоит попробовать их переставить. На плате не горит светодиод? Попробуйте переставить перемычку, ведующую в 3.3В, и убедитесь, что на плате она подключена именно к 3.3В, подача питания в 5В может вашу плату запросто убить.

Допустим, все у вас заработало. Тогда, считывая модулем RFID метки, в мониторе последовательного порта увидим следующее:


Здесь я считывал 3 разных метки, и как видно все 3 он успешно считал.

Пример №2: Считывание данных с карты

Рассмотрим более проработанный вариант - будет считывать не только номер карты, но и все доступные для считывания данные. На этот раз возьмем пример из библиотеки MFRC522 - DumpInfo.


#include #include #define RST_PIN 9 // #define SS_PIN 10 // MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance void setup() { Serial.begin(9600); // Инициализируем монитор последовательного порта while (!Serial); // Ничего не делаем пока он не открыт (для Arduino на чипе ATMEGA32U4) SPI.begin(); // Инициализируем SPI шину mfrc522.PCD_Init(); // Инициализируем RFID модуль ShowReaderDetails(); // Выводим данные о модуле MFRC522 Serial.println(F("Scan PICC to see UID, type, and data blocks...")); } void loop() { // Ищем новую карту if (! mfrc522.PICC_IsNewCardPresent()) { return; } // Выбираем одну из карт if (! mfrc522.PICC_ReadCardSerial()) { return; } // Выводим данные с карты mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); } void ShowReaderDetails() { // Получаем номер версии модуля byte v = mfrc522.PCD_ReadRegister(mfrc522.VersionReg); Serial.print(F("MFRC522 Software Version: 0x")); Serial.print(v, HEX); if (v == 0x91) Serial.print(F(" = v1.0")); else if (v == 0x92) Serial.print(F(" = v2.0")); else Serial.print(F(" (unknown)")); Serial.println(""); // Когда получаем 0x00 или 0xFF, передача данных нарушена if ((v == 0x00) || (v == 0xFF)) { Serial.println(F("WARNING: Communication failure, is the MFRC522 properly connected?")); } }

Если предыдущий пример работал без ошибок, то и в этом проблем возникнуть не должно. Хотя, проездной на метро, без проблем выдававший номер карты в предыдущем примере, в этом оказался с неопределяемым типом данных, и модуль ничего кроме номера карты считать не смог.

Как результат, считав данные с карты, получим ее тип, идентификатор, и данные из 16 секторов памяти. Следует отметить, что карты стандарта MIFARE 1K состоят из 16 секторов, каждый сектор состоит из 4 блоков, а каждый блок содержит 16 байт данных.


Пример №3: Запись нового идентификатора на карту

В этом примере мы рассмотрим смену идентификатора карты (UID). Важно знать, что далеко не все карты поддерживают смену идентификатора. Карта может быть перезаписываемой, но это означает лишь перезаписываемость данных. К сожалению, те карты, которые были у меня на руках, перезапись UID не поддерживали, но код скетча я здесь на всякий случай приведу.


#include #include /* Задаем здесь новый UID */ #define NEW_UID {0xDE, 0xAD, 0xBE, 0xEF} #define SS_PIN 10 #define RST_PIN 9 MFRC522 mfrc522(SS_PIN, RST_PIN); MFRC522::MIFARE_Key key; void setup() { Serial.begin(9600); while (!Serial); SPI.begin(); mfrc522.PCD_Init(); Serial.println(F("Warning: this example overwrites the UID of your UID changeable card, use with care!")); for (byte i = 0; i < 6; i++) { key.keyByte[i] = 0xFF; } } void loop() { if (! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial()) { delay(50); return; } // Считываем текущий UID Serial.print(F("Card UID:")); for (byte i = 0; i < mfrc522.uid.size; i++) { Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(mfrc522.uid.uidByte[i], HEX); } Serial.println(); // Записываем новый UID byte newUid = NEW_UID; if (mfrc522.MIFARE_SetUid(newUid, (byte)4, true)) { Serial.println(F("Wrote new UID to card.")); } // Halt PICC and re-select it so DumpToSerial doesn"t get confused mfrc522.PICC_HaltA(); if (! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial()) { return; } // Считываем данные с карты Serial.println(F("New UID and contents:")); mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); delay(2000); }

Пример №4: Запись данных на карту

Вот и наконец то, до чего мы так долго добирались - запись данных на карту. Самая "сладкая" часть работы с модулем - возможность сделать копию уже существующей карты, что то добавить или изменить, это гораздо интереснее, чем простое считывание.

Изменим один из блоков данных на карте:


#include #include #define RST_PIN 9 #define SS_PIN 10 MFRC522 mfrc522(SS_PIN, RST_PIN); MFRC522::MIFARE_Key key; void setup() { Serial.begin(9600); while (!Serial); SPI.begin(); mfrc522.PCD_Init(); // Подготовим ключ // используем ключ FFFFFFFFFFFFh который является стандартом для пустых карт for (byte i = 0; i < 6; i++) { key.keyByte[i] = 0xFF; } Serial.println(F("Scan a MIFARE Classic PICC to demonstrate read and write.")); Serial.print(F("Using key (for A and B):")); dump_byte_array(key.keyByte, MFRC522::MF_KEY_SIZE); Serial.println(); Serial.println(F("BEWARE: Data will be written to the PICC, in sector #1")); } void loop() { // Ждем новую карту if (! mfrc522.PICC_IsNewCardPresent()) return; // Выбираем одну из карт if (! mfrc522.PICC_ReadCardSerial()) return; // Показываем подробности карты Serial.print(F("Card UID:")); dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size); Serial.println(); Serial.print(F("PICC type: ")); byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak); Serial.println(mfrc522.PICC_GetTypeName(piccType)); // Проверяем совместимость if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI && piccType != MFRC522::PICC_TYPE_MIFARE_1K && piccType != MFRC522::PICC_TYPE_MIFARE_4K) { Serial.println(F("This sample only works with MIFARE Classic cards.")); return; } // В этом примере мы используем первый сектор данных карты, блок 4 byte sector = 1; byte blockAddr = 4; byte dataBlock = { // Данные, которые мы запишем на карту 0x01, 0x02, 0x03, 0x04, // 1, 2, 3, 4, 0x05, 0x06, 0x07, 0x08, // 5, 6, 7, 8, 0x08, 0x09, 0xff, 0x0b, // 9, 10, 255, 12, 0x0c, 0x0d, 0x0e, 0x0f // 13, 14, 15, 16 }; byte trailerBlock = 7; byte status; byte buffer; byte size = sizeof(buffer); // Аутентификация Serial.println(F("Authenticating using key A...")); status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print(F("PCD_Authenticate() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); return; } // Показываем текущие данные сектора Serial.println(F("Current data in sector:")); mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector); Serial.println(); // Читаем данные из блока Serial.print(F("Reading data from block ")); Serial.print(blockAddr); Serial.println(F(" ...")); status = mfrc522.MIFARE_Read(blockAddr, buffer, &size); if (status != MFRC522::STATUS_OK) { Serial.print(F("MIFARE_Read() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); } Serial.print(F("Data in block ")); Serial.print(blockAddr); Serial.println(F(":")); dump_byte_array(buffer, 16); Serial.println(); Serial.println(); // Аутентификация Serial.println(F("Authenticating again using key B...")); status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_B, trailerBlock, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print(F("PCD_Authenticate() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); return; } // Записываем данные в блок Serial.print(F("Writing data into block ")); Serial.print(blockAddr); Serial.println(F(" ...")); dump_byte_array(dataBlock, 16); Serial.println(); status = mfrc522.MIFARE_Write(blockAddr, dataBlock, 16); if (status != MFRC522::STATUS_OK) { Serial.print(F("MIFARE_Write() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); } Serial.println(); // Читаем данные снова, чтобы проверить, что запись прошла успешно Serial.print(F("Reading data from block ")); Serial.print(blockAddr); Serial.println(F(" ...")); status = mfrc522.MIFARE_Read(blockAddr, buffer, &size); if (status != MFRC522::STATUS_OK) { Serial.print(F("MIFARE_Read() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); } Serial.print(F("Data in block ")); Serial.print(blockAddr); Serial.println(F(":")); dump_byte_array(buffer, 16); Serial.println(); Serial.println(F("Checking result...")); byte count = 0; for (byte i = 0; i < 16; i++) { if (buffer[i] == dataBlock[i]) count++; } Serial.print(F("Number of bytes that match = ")); Serial.println(count); if (count == 16) { Serial.println(F("Success:-)")); } else { Serial.println(F("Failure, no match:-(")); Serial.println(F(" perhaps the write didn"t work properly...")); } Serial.println(); // Выводим данные Serial.println(F("Current data in sector:")); mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector); Serial.println(); mfrc522.PICC_HaltA(); mfrc522.PCD_StopCrypto1(); } void dump_byte_array(byte *buffer, byte bufferSize) { for (byte i = 0; i < bufferSize; i++) { Serial.print(buffer[i] < 0x10 ? " 0" : " "); Serial.print(buffer[i], HEX); } }

И как результат, получаем карту с измененным блоком данных:


Теперь, научившись считывать и записывать блоки данных карты, вы можете поэксперементировать с метками, которые скорее всего есть у вас - пропуски, проездные общественного транспорта. Попробуйте считывать и записывать данные с этих карт, пара дубликатов пропуска никогда не помешает, так ведь?)

На этом все, подписывайтесь, и следите за публикациями. В следующий раз я расскажу и покажу, как на стандартный символьный дисплей 1602 добавлять пользовательские символы, фактически добавляя на дисплей графику.

RFID (радиочастотная идентификация) использует электромагнитные поля для автоматической идентификации и отслеживания тегов, прикрепленных к объектам. Теги содержат электронно сохраненную информацию. Пассивные метки собирают энергию от радиосигналов соседнего RFID-считывателя. Активные теги имеют локальный источник питания (например, аккумулятор) и могут работать в сотнях метров от считывающего устройства. В отличие от штрих-кода, тег не должен находиться в пределах видимости прибора, поэтому он может быть встроен в отслеживаемый объект. RFID - это один из методов автоматической идентификации и сбора данных.

Применение

RFID-метки используются во многих отраслях промышленности. Например, считыватель RFID, прикрепленный к автомобилю во время производства, может использоваться для отслеживания прогресса по конвейерной линии. Фармацевтические препараты с маркировкой можно отслеживать через склады. Имплантация RFID-микрочипов в домашний скот позволяет идентифицировать животных.

Поскольку метки RFID могут быть прикреплены к деньгам, одежде и имуществу или имплантированы в животных и людей, возможность читать личную информацию без согласия пользователя вызывает серьезную проблему конфиденциальности. Эти риски привели к разработке стандартных спецификаций, касающихся вопросов безопасности личных данных. Теги также могут использоваться в магазинах для ускорения оформления заказа и предотвращения краж.

История

В 1945 году Леон Термен изобрел прослушивающее устройство для Советского Союза, которое повторно передавало радиоволны с добавленной аудиоинформацией. Звуковые колебания при вибрации влияли на диафрагму, которая слегка меняла форму резонатора, модулировавшего отраженную радиочастоту. Несмотря на то что это устройство было скрытым прибором для прослушивания, а не идентификационным тегом, оно считается предшественником USB RFID-считывателя, поскольку активировалось аудиоволнами из внешнего источника. Транспондеры по-прежнему используются большинством работающих самолетов. А раньше подобная технология, такая как считыватель RFID-меток, регулярно использовалась союзниками и Германией во Второй мировой войне для идентификации самолетов.

Устройство Марио Кардулло, запатентованное 23 января 1973 года, было первым истинным предшественником современной RFID, поскольку это был пассивный радиоприемник с памятью. Первоначальное устройство было пассивным, с питанием от опросного сигнала. Оно было продемонстрировано в 1971 году администрации Нью-Йорка и другим потенциальным пользователям и состояло из транспондера с 16-разрядной памятью для использования в качестве платного устройства. Основной патент Cardullo охватывает использование радиочастот, звука и света в качестве среды передачи.

Область использования

Первоначальный бизнес-план, представленный инвесторам в 1969 году, демонстрировал следующие сферы применения считывателя RFID:

  • использование в транспорте (идентификация автомобильных транспортных средств, автоматическая система оплаты, электронный номерной знак, электронный манифест, маршрутизация транспортного средства, мониторинг эффективности транспортных средств);
  • банковское дело (электронная чековая книжка, электронная кредитная карта);
  • персонала, автоматические ворота, наблюдение); медицинская отрасль (идентификация, история пациентов).

Ранняя демонстрация отраженной мощности (модулированного обратного рассеяния) RFID-меток, как пассивных, так и полупассивных, была выполнена Стивеном Деппом, Альфредом Коелле и Робертом Фрайманом в Национальной лаборатории Лос-Аламоса в 1973 году. Портативная система работала на частоте 915 МГц и использовала 12-битные теги. Этот метод применяется большинством современных UHFID и микроволновых RFID-считывателей. В современной жизни такие устройства очень востребованы.

Спецификация

Система радиочастотной идентификации использует метки, прикрепленные к идентифицируемым объектам. При изготовлении RFID-считывателя своими руками следует учитывать, что двусторонние радиопередатчики-приемники, называемые запросчиками или считывателями, посылают сигнал тегу и считывают его ответ. Метки RFID могут быть пассивными, активными или пассивными. Активный тег имеет встроенный аккумулятор и периодически передает его ID-сигнал. Пассивный аккумулятор (BAP) имеет небольшую батарею на борту и активируется при наличии считывателя RFID. Пассивная бирка дешевле и меньше, потому что у нее нет батареи. Вместо этого тег использует радиоволну, переданную считывателем. Однако для работы пассивного тега он должен быть освещен уровнем мощности примерно в тысячу раз сильнее, чем для передачи сигнала. Это влияет на интерференцию и облучение.

  • Программирование микроконтроллеров
  • Как известно, во многих системах доступа используются карты RFID стандарта EM-Marin с частотой 125 КГц. Не исключением стал и домофон моего дома. Одна проблема – неплохо бы научиться копировать такие карты, ибо ценники на их копирование не радуют. В сети, конечно, существует довольно много схем копировщиков (да и китайцы продают свои копировщики за копейки - правда, они часто при копировании ставят свой пароль на болванки), но почему бы не собрать свой собственный копировщик? Вот об этом и нижеприведённая статья.

    Начинать разработку копировщика стоит с выяснения, а на что вообще можно скопировать такие метки? Почитав форумы, можно узнать, что наиболее распространёнными болванками для копирования являются T5577, T5557, EM4305.

    Теперь нужна схема. Возьмём аналоговую часть такого копировщика у RECTO и подключим её к микроконтроллеру atmega8. Дополним преобразователем уровней для подключения к COM-порту на базе max232 (желающие могут использовать ST232 или ещё что, чтобы подключится по USB, но у меня на компьютере COM-порт есть, как есть и переходник USB-COM, так что у меня такой задачи не стояло).

    Получится вот такая схема:

    Что она из себя представляет? Сдвоенный эмиттерный повторитель, колебательный контур, детектор и RC-фильтры. За счёт того, что RC-фильтры имеют разные постоянные времени, сравнивая между собой уровни напряжения между каскадами можно выделять изменение сигнала RFID-метки. Данной задачей у нас будет заниматься встроенный в atmega8 компаратор. Генерацию 125 КГц сигнала у нас будет обеспечивать встроенный в atmega8 ШИМ-контроллер.

    Комбинация RFID-метка – считыватель образуют трансформатор, где метка является вторичной обмоткой. Передача информации меткой производится путём изменения нагрузки вторичной обмотки. В результате в катушке считывателя (первичной обмотке) изменяется ток. Выделением этих импульсов тока и занимается приведённая выше аналоговая часть схемы. Колебательный контур нужно настроить на максимальное напряжение в контрольной точке, например, сматывая/наматывая витки катушки. Правда, говорят, лучше всё же напряжение немного меньше максимума - стабильнее работает. У меня в контрольной точке около 40 В.

    Копируемая метка использует кодирование типа манчестер . Для того чтобы расшифровать данный код, достаточно по любому изменению фронта сигнала пропускать три четверти периода слота бита и по следующему за ним перепаду сигнала фиксировать значение бита, которое будет соответствовать значению сигнала после перепада. При декодировании стоит задать окно, в которое должен произойти перепад сигнала – не более половины периода слота бита.

    Метод расшифровки манчестерского кодирования и код для этого я взял у Shads . Можно, конечно, было написать свой собственный, но я торопился запустить копировщик - хотелось убедиться, что схема рабочая и приём меток производится. Так этот фрагмент и остался в коде копировщика. Также оказалось, что у меня компаратор настроен инверсно, чем нужно коду декодирования. Изменил в коде. Итак, мы получили последовательности нулей и единиц. Как из них получить код карты?

    А очень просто. Примем, что номер карты по нибблам имеет вид AB CD EF GH IJ . Карта выдаёт вот что:

    1) Девять единиц в начале;
    2) Ниббл A;
    3) Чётность ниббла A (1 бит);
    4) Ниббл B;
    5) Чётность ниббла B (1 бит);

    16) Ниббл I;
    17) Чётность ниббла I (1 бит);
    18) Ниббл J;
    19) Чётность ниббла J (1 бит);
    20) Ниббл чётности колонок для нибблов A B C D E F G H I J;
    21) Бит 0.

    Считываем все 64 бита, расшифровываем и получаем 40 бит кода карты. Логично, что если самому выдать такой код, замыкая катушку карты приложенной к считывателю, мы получим эмулятор карты. Но сейчас нас интересует не он.

    Карту мы читать научились, а вот как передать данные карте? Для этого нужно просто включать или выключать частоту 125 КГц в соответствии с протоколом обмена с картой. На время “молчания” считывателя карта питается запасённой энергией.

    Болванки T5557/T5577 полностью совместимы между собой по протоколам записи, однако, имеют немного разные минимальные и максимальные времена импульсов (к счастью, времена T5557 перекрываются с T5577). У EM4305 протокол записи иной.

    Чтобы записать T5557 я воспользовался кодом BolshoyK . В таблице ниже указаны параметры сигналов для брелока T5557.

    Запись начинается с сигнала StartGape – требуется отключить сигнал 125 КГц примерно на 300 мкс. Это сигнал карте, что сейчас ей начнут передавать данные. Дальше следует передать болванке информацию. Кодирование передаваемых данных – тот же манчестер.

    Болванки T5557/T5577 и EM4305 многофункциональные и умеют разные виды модуляций, поддерживают пароли и ещё много чего. В каждой болванке на борту имеется набор блоков по 32 бита. Назначение этих блоков разное. В некоторых – выдаваемый код ключа (он занимает два блока). В других – конфигурация. В третьих – идентификатор производителя. Мы будем использовать ограниченный функционал, поэтому желающие разобраться, что значат все эти биты, могут заглянуть в документацию к болванкам (я приложил её к архиву).

    Блоки собраны в две страницы (0 и 1).

    В нулевой странице есть блок конфигурации с индексом 0. Его мы и будем задавать. Для T5557/T5577 у нас будут следующие конфигурационные байты: 0x00,0x14,0x80,0x40 в соответствии с таблицей из документации (красным я отметил выбранные единичными битами режимы):

    Таким образом, у нас выбрано: частота передачи данных RF/64 (125 КГц/64), кодирование типа манчестер, выдача блоков до второго (в блоках 1 и 2 у нас будет располагаться код, выдаваемый картой). Перед записью следует отправить код операции (2 бита opcode) и один бит защёлки (lockbit). Коды операции 10b и 11b предшествуют записи данных для страниц 0 и 1 (младший бит задаёт номер страницы, старший - код записи страницы). У нас выдаётся 10b для кода операции (вся работа идёт с нулевой страницей) и 0b для бита защёлки. После передачи всех этих данных необходимо передать трёхбитный адрес записываемой страницы. Все передачи данных для T5557/T5577 ведутся от старшего бита к младшему.

    Задав код карты в блоках 1 и 2 и конфигурацию в блоке 0 можно получить дубликат RFID-метки. Как видите, всё просто.

    Следующий тип болванок – это EM4305. Вот разбираться с записью этой болванки мне пришлось самому. Она также состоит из блоков по 32 бита, но назначение их иное.

    Кодирование передаваемых карте данных – по перепадам за интервал времени. Если перепад за интервал времени был, то это ноль, а если не было - единица. Конфигурационное слово хранится в 4 байте и для себя я определил его так: 0x5F,0x80,0x01,0x00 (кодирование манчестер, RF/64, выдача слова 6). В слова 5 и 6 я записываю код карты (те самые 64 бита, что выдаёт карта). EM4305 требует чтобы передача велась от младшего бита к старшему. Карта понимает, что с ней начинают обмен после выдачи ей комбинации импульсов:

    1. Отключаем поле на 48 мкс.
    2. Включаем поле на 96 мкс.
    3. Выключаем поле на 320 мкс.
    4. Включаем поле на 136 мкс.
    5. Отключаем поле до следующей команды.
    Команда на запись блока карте передаётся так:
    1. Шлём вышеуказанную последовательность импульсов.
    2. Шлём 0b.
    3. Передаём CC0-CC1 и их чётность P. (0101b для записи, см. таблицы ниже).
    4. Передаём адрес блока (см. таблицу), два дополняющих нуля и чётность адреса.
    5. Передаём данные блока (32 бита).

    Формат команды


    Коды команд

    Формат адреса блока

    Таким образом задаётся конфигурация болванки EM4305 и её код.

    Собственно, ничего большего простому копировщику и не требуется.

    Я сделал несколько вариантов копировщика с разными дисплеями. Например, вот копировщик с дисплеем 1602:

    А вот видео работы копировщика на дисплее LPH9157-02.

    Данный проект был сделан по просьбе друга для установки на дверь в складское помещение. В дальнейшем было изготовлено ещё несколько по просьбе друзей и знакомых. Конструкция оказалась простой и надёжной. Работает данное устройство так: пропускает только те RFID-карты, которые были заранее занесены в память устройства.

    Основные характеристики контроллера доступа:

    RFID-карты формат EMmarin 125кгц

    Микроконтроллер ATtiny13

    Количество карт/брелков - 10.
    Кнопка "OPEN" нормально разомкнутая, защищена от залипания.
    Выход управления замком, сильноточный полевой транзистор, режим работы на защёлку (включается на время).

    Питание - 12в.
    Потребление в дежурном режиме - 35 мА.
    Количество карт/брелков доступа - 10 шт.
    Длина связи с кнопкой "OPEN" - 10 метров.
    Тип выхода управления замком - открытый сток (мощный полевой транзистор, ток до 2А).

    Принципиальная схема контроллера ограничения доступа на RFID-картах 125КГц (Em-Marin) на 10 карт (на микроконтроллере ATtiny13):

    Если надо управлять электромагнитным замком, требуется установка выходного реле с требуемой контактной группой.

    Внешний вид собранного RFID-валидатора:

    Установка Fuse-битов в PonyProg:

    Работа устройства, скачать видеоролик , записанный автором.
    Также один из читателей опубликовал видео работы собранного устройства:

    Инструкция по программированию

    Рабочий режим - при подачи 12В на контроллер светодиод мигает 1Гц.
    Режим программирования - светодиод мигает 2Гц.
    При нажатии на кнопку "OPEN" серия коротких звуковых сигналов во временя открытия замка.

    Звуковые сигналы

    1 короткий сигнал - карта или брелок записан в память контроллера.
    2 коротких сигнала - карта или брелок уже записан в памяти контроллера.
    5 коротких сигнала - выход из режима программирования.
    1 длинный сигнал - память карт-ключей стерта из контроллера.
    Непрерывные короткие сигналы - память карт/ключей заполнена, максимально 10шт. (требуется отключение питания контроллера).

    Запись МАСТЕР-КАРТЫ и времени открывания замка

    1 - Выключить питание контроллера.
    2 - Нажать кнопку "OPEN"
    3 - Удерживая кнопку подключить питание к контроллеру, через 5 сек. контроллер "ПИСКНЕТ", светодиод будет мигать с частотой 2 Гц.
    4 - Отпустить кнопку.
    5 - Поднести в зону считывания карту или брелок, раздастся одиночный звуковой сигнал, Мастер-карта или брелок ЗАПИСАН, при этом запишется время открытия замка 1 сек.

    6 - Удерживая карту или брелок в зоне считывания - считаем звуковые сигналы. Кол-во определяет требуемое время отрывания замка, приращение 1 сек., но не более 32 сек.
    7 - Отключаем питание контроллера или выдерживаем паузу 30 сек.

    Стирание всей памяти карт-брелков

    1 - Рабочий режим.
    2 - Нажимаем кнопку "OPEN" и удерживая подносим к считывателю МАСТЕР-карту или брелок и держим, через 5 сек раздастся продолжительный звуковой сигнал - память карт/брелков стёрта.
    3 - Отпускаем кнопку отнимаем карту или брелок.