Получил я тут ключи от квартиры с одним брелоком от домофона. Желающие сделать копии - добро пожаловать на рынок. 250 р. за копию. Нет, мы так не играем. Заготовка ключа T5557 стоит 27 рублей в Чип и Дип. Осталось сделать копировщик. Поискал я по инету схемы и программы и собрал свою из различных кусочков.
Итак, что было использовано:
1) Аналоговая часть взята у RECTO ( http://kazus.ru/forums/showthread.php?t=67407 ). Как контроллер у него считывает сигнал модуля RFID пришлось догадаться (с помощью компаратора). Оказывается, этот метод дребезга сигнала не вызывает. А я сперва думал, что нужно как-то вычитать сигналы двух входов друг из друга. Оказалось, всё проще. 2) Код расшифровки кода карточки (да, мне лень было писать свой, так как ещё неизвестно, что вообще выдаёт аналоговая часть, я ,например, там девять единиц на осциллографе в упор не увидел, хотя они там были, да и вообще, методом проб и ошибок оказалось, у меня сигнал компаратора перевёрнут) я взял у ShadS ( http://forum.easyelectronics.ru/viewtop ... 5b#p352328 ). Там нет ничего сложного, если, конечно знать, что устройство работает. 3) Код записи ключа я взял у BolshoyK ( http://kazus.ru/forums/showthread.php?t=101565 ) - в английском языке я не силён (я учил немецкий), так что понять документацию на T5557 мне не так просто.
Всем вышеперечисленным большущее от меня спасибо! Они существенно ускорили процесс разработки (всё было сделано за 2 дня )
Итак, что у меня получилось. Устройство работает на Atmega8 и подключается к компьютеру по COM-порту, скорость 9600 бод. Протокол обмена с байтстаффингом (он описан в файлах для микроконтроллера). В интерфейсе программы две кнопки: считать ID и записать ID. Код карты выдаётся в шестнадцатеричном виде. Всего код карты состоит из 4 байт, но они снабжаются пятым (там сначала идёт какой-то идентификатор - не заморачивался с запоминанием его смысла). Протокол кодирования RFID весьма простой и описан в вышеприведённых ссылках. Контур с катушкой нужно настроить в резонанс на 125 кГц. Для этого нужно включить чтение ID карты и добиться максимального напряжения в точке "НАСТРОЙКА", изменяя количество витков катушки (что проще) или ёмкость конденсатора (что сложнее). У меня там вышло около 40 В.
Схема копировщика:
В архиве есть схема в хорошем качестве, печатка, прошивка, программа для работы с устройством и все исходники (для WinAVR и MS VisualStudio 6).
Ну вот, в принципе, и всё. Если найдёте какую-либо ошибку - сообщайте. Я вполне мог что-то пропустить или где-то ошибиться.
P.S. Вообще говоря, я добавил дисплей от Siemens C-75 (зелёный текстолит), но лень приводить схему. А программа (всё подключение дисплея в h-файле есть) для дисплея в комплекте. Вот как без компьютера работает: https://www.youtube.com/watch?v=ONqSsbdVCqM
А никто не знает протокол записи EM4305? В чём его отличие от T5557? По даташиту на EM4305 с моим знанием английского протокол записи я в упор не вижу, как реализован. И совместимы ли T5557 и T5577? В документации написано "compatible", но вот купил я в Китае брелоки с T5577/T5557 с чипом T5577 (тут: https://ru.aliexpress.com/item/10pcs-ba ... 109.TukoB3 ) и нифига брелок не прошивается. То ли брелоки дохлые, то ли T5577 не совместим с T5557, то ли продавец заблокировал запись или пароль поставил, то ли там EM4305, а не T5577.
Записал такой брелок. Делал протокол EM4305 до записи T5557, не работало. Бросил гроздью ключи на катушку и вдруг три штуки записались! Отключил протокол EM4305, оставив T5557 - тоже гроздью положил ключи и записались ещё несколько штук. Значит, в этих брелоках T5577 и он пишется, как T5557. В общем, экспериментами выяснил, что ключ пишется, но раза с десятого и если в разных частях катушки его записывать. Похоже, эти ключи "тугие" - не хватает им питания или ещё что. Один ключ так и не смог записать.
Доброго времени суток! А не пробовали записывать эти брелки другими копировщиками? Вроде бы на казусе была пара достаточно простых схем и на пике и на меге, которые можно собрать на макетке и проверить. Я это к тому, что если тем пишется, а вашим нет, то может быть проблема с таймингами?
Добрый день. Нет, не пробовал. Вряд ли там с таймингами проблема - ни с какими другими ключами и картами формата T5557 такой фигни не было - только вот с этими с aliexpress. Но у китайцев всё что угодно может быть внутри. Хоть катушка неверно намотанная.
VGA77, а вы правы! Я посмотрел даташит на T5577. Оказывается, у T5557 нормальный режим работы имеет на 10 тактов поля больше, чем у T5577. Уменьшил на 80 мкс и получил записываемость на всех брелоках.
Перенёс этот же копировщик на atmega328p. Почему именно на неё? Потому что она стоит в Arduino Nano. Если припаять аналоговую часть к этой самой Arduino Nano и прошить её (программа для прошивки в комплекте) нижеприведённой прошивкой, то можно будет копировать/считывать ключи через USB, а не через COM-порт, так как на Arduino Nano есть преобразователь. Правда, первые пакеты данных потеряются - их, как я понимаю, ловит загрузчик ардуины. Так что, первое считывание ключа завершится с ошибкой. И ещё, программа под виндовс будет немного другая (в части настройки COM-порта я кое-какие, критичные для преобразователя USB-COM Arduino Nano функции не отключил, хотя в комментарии написал "отключаем" - невнимательность. Для связи штатной платы через физический COM-порт это не важно, а вот для всяких FT232 это важно.) Так что, RFIDUnitControl для Arduino Nano нужно использовать из приложенного архива. С исходным устройством также можно использовать эту последнюю версию RFIDUnitControl.
Пришли брелоки em4305. Пробую реализовать протокол записи ключа. Я нашёл руководство по записи ключа (оно во вложении). Как я понял, ключ можно записать, например, в блок 5, а в блок 4 нужно записать конфигурационное слово (манчестер, RF/64, выдача слова 5). Согласно руководству (как я его понял), для записи блока нужно сделать следующее: 1 ) Включить поле на некоторое время. 2 ) Сформировать First Field Stop - отключить поле на 55 циклов (8 микросекунд один цикл = 1/125000) 3 ) Включить поле на 17 циклов. 4 ) Послать "0". 5 ) Послать команду с битом чётности в конце ("0101" - запись блока). Для всех блоков данных принят порядок "младший бит первый". 6 ) Послать адрес блока (4 бита). 7 ) Послать "00". 8 ) Послать бит чётности для адреса. 9 ) Послать блок данных (32 бита данных): после каждых 8 бит данных шлётся бит чётности этих переданных восьми бит. После передачи всех 32 бит данных шлётся 8 бит чётности этих бит данных по столбцам. 10 ) Послать "0". 11 ) Включить поле и подержать его ещё некоторое время, чтобы произошла запись и пришёл ответ. Ответ я не принимаю и не анализирую.
Чтобы послать "0" нужно: 1) На 15 циклов убрать поле. 2) На 17 циклов включить поле.
Чтобы послать "1" нужно на 32 цикла включить поле.
Я, собственно, так и сделал. Но брелок не записывается. Может, кто-нибудь знает, что я делаю не так?
//---------- //записать блок по адресу //---------- void WriteEM4305(unsigned char addr,char b0,char b1,char b2,char b3) { unsigned char n; //HIGHT - поле выключено unsigned char data[4]={b0,b1,b2,b3}; StartGap_4305();
SendZero_4305();//logic bit //шлём 0101 SendZero_4305();//CC0 SendOne_4305();//CC1 SendZero_4305();//CC2 SendOne_4305();//P //шлём адрес слова (младший бит первый) unsigned char p=0; for(n=0;n<4;n++) { if (addr&(1<<n)) { SendOne_4305(); p^=1; } else SendZero_4305(); } //дополняющие нули и чётность SendZero_4305(); SendZero_4305(); if (p==0) SendZero_4305(); else SendOne_4305(); //шлём данные p=0; for(n=0;n<4;n++) { unsigned char l_p=0; for(unsigned char m=0;m<8;m++) { unsigned char mask=(1<<m); if (data[n]&mask) { SendOne_4305(); l_p^=1; p^=mask; } else SendZero_4305(); } //шлём чётность по строкам if (l_p==0) SendZero_4305(); else SendOne_4305(); } //шлём чётность по столбцам for(n=0;n<8;n++) { unsigned char mask=(1<<n); if (p&mask) SendOne_4305(); else SendZero_4305(); } //шлём 0 SendZero_4305(); FieldOn(); _delay_ms(500); }
Что записывается:
Код:
FieldOn();//включаем электромагнитное поле _delay_ms(500); //запись конфигурации (манчестер, RF/64, выдача слова 5) WriteEM4305(4,0x5F,0x40,0x01,0x00); FieldOn();//включаем электромагнитное поле _delay_ms(500); //запись ID карты в слово 5 WriteEM4305(5,id[1],id[2],id[3],id[4]); FieldOn();//включаем электромагнитное поле _delay_ms(500); FieldOff();//отключаем электромагнитное поле _delay_ms(500);
Вложения:
Комментарий к файлу: Документация на EM4305 em4205-4305_ds.pdf [747.01 KiB]
Скачиваний: 965
Комментарий к файлу: Руководство an604010.pdf [294.52 KiB]
Скачиваний: 1094
Большая просьба модератору переименовать эту тему в Копировщик RFID-ключей T5557/T5577 и EM4305! Ну и в первом моём сообщений, если не трудно, дать ссылку на последнюю прошивку (или её саму). Спасибо!
Итак, я сделал EM4305! Исходники и прошивки ко всем проектам этой темы в архиве.
Код для записи em4305:
Код:
//---------- //записать ID карты //---------- void WriteCardID(unsigned char id[5]) {
static unsigned char RFID_Send_Buffer[8];//буфер записи RFID static unsigned char RFID_Config[4];//буфер конфигурации RFID unsigned char n;
//запись карты em4305 //в слова 5 и 6 карты EM4305 записываем UID (40 бит сначала конвертируем в 64 бита) //задаём номер карты RFIDBuffer[0]=id[0]; RFIDBuffer[1]=id[1]; RFIDBuffer[2]=id[2]; RFIDBuffer[3]=id[3]; RFIDBuffer[4]=id[4]; PrepareSendBuffer(RFIDBuffer,RFID_Send_Buffer); //функция WriteEM4305Word требует прямой порядок бит, а после перекодирования порядок обратный - переставляем for(n=0;n<8;n++) { unsigned char v=RFID_Send_Buffer[n]; RFID_Send_Buffer[n]=0; unsigned char m; for(m=0;m<8;m++) { unsigned char m1=(1<<m); unsigned char m2=(128>>m); if (v&m1) RFID_Send_Buffer[n]|=m2; } }
FieldOn();//включаем электромагнитное поле _delay_ms(500); //шлём логин SendEM4305Login(0xFF,0xFF,0xFF,0xFF); //запись конфигурации (манчестер, RF/64, выдача слова 6) WriteEM4305Word(4,0x5F,0x80,0x01,0x00); //запись ID карты в слова 5 и 6 WriteEM4305Word(5,RFID_Send_Buffer[0],RFID_Send_Buffer[1],RFID_Send_Buffer[2],RFID_Send_Buffer[3]); WriteEM4305Word(6,RFID_Send_Buffer[4],RFID_Send_Buffer[5],RFID_Send_Buffer[6],RFID_Send_Buffer[7]); FieldOff();//отключаем электромагнитное поле _delay_ms(500); }
//---------- //отправить единицу для em4305 //---------- void SendOne_4305(void) { FieldOn(); _delay_us(30*8); } //---------- //отправить ноль для em4305 //---------- void SendZero_4305(void) { FieldOff(); _delay_us(18*8); FieldOn(); _delay_us(17*8); } //---------- //передать карте Em4305 блок данных 32 бита //---------- void SendEM4305DataBlock(char b0,char b1,char b2,char b3) { unsigned char n; unsigned char data[4]={b0,b1,b2,b3}; //шлём данные unsigned char p=0; for(n=0;n<4;n++) { unsigned char l_p=0; p^=data[n]; for(unsigned char m=0;m<8;m++) { unsigned char mask=(1<<m); if (data[n]&mask) { SendOne_4305(); l_p^=1; } else SendZero_4305(); } //шлём чётность по строкам if (l_p==0) SendZero_4305(); else SendOne_4305(); } //шлём чётность по столбцам for(n=0;n<8;n++) { unsigned char mask=(1<<n); if (p&mask) SendOne_4305(); else SendZero_4305(); } //шлём 0 SendZero_4305(); FieldOn(); _delay_ms(500); } //---------- //передать карте Em4305 логин //---------- void SendEM4305Login(char b0,char b1,char b2,char b3) { FirstFieldStop_4305(); SendZero_4305();//'0' //шлём 0011 SendZero_4305();//CC0 SendZero_4305();//CC1 SendOne_4305();//CC2 SendOne_4305();//P //шлём данные SendEM4305DataBlock(b0,b1,b2,b3); } //---------- //записать слово в Em4305 //---------- void WriteEM4305Word(unsigned char addr,char b0,char b1,char b2,char b3) { //HIGHT - поле выключено FirstFieldStop_4305(); SendZero_4305();//'0' //шлём 0101 SendZero_4305();//CC0 SendOne_4305();//CC1 SendZero_4305();//CC2 SendOne_4305();//P //шлём адрес слова (младший бит первый) unsigned char p=0; for(unsigned char n=0;n<4;n++) { if (addr&(1<<n)) { SendOne_4305(); p^=1; } else SendZero_4305(); } //дополняющие нули и чётность SendZero_4305(); SendZero_4305(); if (p==0) SendZero_4305(); else SendOne_4305(); //шлём данные SendEM4305DataBlock(b0,b1,b2,b3); }
Из-за _delay_ms(500) которых я наставил для гарантии записи (хотя паузы можно сильно уменьшить), я поставил в RFIDUnitControl паузу до 10 секунд! Так что не удивляйтесь, что после записи ключа такая большая пауза.
P.S. Обновил ПО (исправил ошибочку в RFIDUnitControl из-за которой пауза после записи была больше, чем нужно) и добавил в архив схему для дисплея.
Карма: 2
Рейтинг сообщений: 21
Зарегистрирован: Пн май 04, 2009 14:39:47 Сообщений: 302 Откуда: Россия г. Москва
Рейтинг сообщения:0
Ув. da-nie. В исходниках не силен, но как я понял дисплей подключается к портам PC0-PC5. Подправте если не прав. А к каким портам подключаются кнопки чтения-записи. Спасибо!
Вот схема устройства с дисплеем. Только имейте в виду, что дисплей нужен на зелёном текстолите! Для жёлтого у меня есть блок для работы с ним, но он старый и я его давно не использовал, так как дисплей сломался. То есть, жёлтый дисплей придётся адаптировать вам самим - мне даже проверить будет не на чем.
В архиве схема в высоком разрешении. Печатку я не делал, так как просто навесил дисплей с обвязкой поверх стандартной платы. Диоды нужны НЕ Шоттки (!) - с падением напряжения 0.6 В.
Ускорил RFIDUnitControl (добавил пропущенный break в цикле ожидания ) и добавил в архив схему с дисплеем. Архив (в сообщении viewtopic.php?p=2923271#p2923271) обновлён.
А какой смысл скрывать, у кого что взято? Вот если бы у меня было бы заниженное ЧСВ, то да - тут надо его поднимать, постоянно самоутверждаясь:"Смотрите, это именно я сделал!", даже если это не совсем так. Но я таким не страдаю.
И ещё раз, большущее вам спасибо!
P.S. Прочёл я тут мнение, что протоколы записи ключей и их реализации скрывают (не показывают исходники и внятную документацию), чтобы фильтры домофонщики не делали. Но разве домофонщики не способны разобраться в документации на болванку и сделать самим весь протокол работы с любой болванкой ключа? Ведь это же довольно крупные фирмы с соответствующим штатом. Как такое может быть?
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения