Как известно, во многих системах доступа используются карты 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 требует чтобы передача велась от младшего бита к старшему. Карта понимает, что с ней начинают обмен после выдачи ей комбинации импульсов:
- Отключаем поле на 48 мкс.
- Включаем поле на 96 мкс.
- Выключаем поле на 320 мкс.
- Включаем поле на 136 мкс.
- Отключаем поле до следующей команды.
Команда на запись блока карте передаётся так:
- Шлём вышеуказанную последовательность импульсов.
- Шлём 0b.
- Передаём CC0-CC1 и их чётность P. (0101b для записи, см. таблицы ниже).
- Передаём адрес блока (см. таблицу), два дополняющих нуля и чётность адреса.
- Передаём данные блока (32 бита).
Формат команды
Коды команд
Формат адреса блока
Таким образом задаётся конфигурация болванки EM4305 и её код.
Собственно, ничего большего простому копировщику и не требуется.
Я сделал несколько вариантов копировщика с разными дисплеями. Например, вот копировщик с дисплеем 1602:
А вот видео работы копировщика на дисплее LPH9157-02:
А вот причина, по которой я заинтересовался копировщиками таких ключей — нужно было сделать много копий ключа от домофона (ждать посылки из Китая при этом тоже было лень), но ценник вот какой:
В архиве все схемы, печатки, программы и документация на болванки. Есть версия для Arduino Nano (её нужно прошивать отдельно через программы для заливки сторонних прошивок).
Желающие могут открыть документацию на все эти болванки и реализовать поддержку паролей и иные режимы работы карт. Мне лично всё это было ненужно.
Отдельное большущее спасибо RECTO, BolshoyK и Shads — без вас я бы развлекался бы с разработкой довольно долго!
Спасибо за внимание.
P.S. Я не являюсь профессионалом в копировании ключей и в болванках, поэтому вполне мог в чём-то ошибиться. Однако, копировщик работает и в нём ошибок пока никто не нашёл.
Автор: da-nie