Принцип работы магнитного ключа. Электронный замок с ключом iButton (DS1990A) на микроконтроллере

Сейчас очень популярны различные электронные замки, с электронными ключами в виде «таблетки» или «флэшки». Ключ, в них является запоминающим устройством, в котором хранится некий цифровой код. А основу замка составляет микрокомпьютер, этот код считывающий и анализирующий.

Не стану спорить о достоинствах и недостатках таких замков, просто предлагаю вниманию читателей свою разработку аналогичного устройства, работающего на аналоговом принципе.

Суть дела в том, что в моем замке ключом служит стабилитрон на определенное напряжение стабилизации. Если стабилитрон в ключе совпадает по напряжению стабилизации со стабилитроном в замке - дверь открывается.

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

Схема первого варианта замка показана на рисунке 1. Ключом служит разъем Х1.1, подключающийся в ответный разъем Х1.2. В идеале, нужно использовать корпус от ключа-таблетки, типа iButton и соответ ствующий разъем для её подключения. Но можно сделать и любую имитацию, либо использовать любую двухконтактную разъемную пару, например, от аудиоаппаратуры.

Рис.1. Принципиальная схема кодового замка для работы с аналоговой таблеткой.

В ключе расположен стабилитрон, в данном случае, на 8,2V и последовательно ему включенный диод 1N4148. При подключении к разъему Х1.2 они с резистором R1 образуют стабилизированный источник постоянного напряжение, равного сумме напряжения стабилитрона и прямого напряжения диода.

На компараторах микросхемы А1 LM339 сделан двухпороговый компаратор. Опорное напряжение на его входах задается цепью из резистора R2, двух диодов VD4, VD5 и стабилитрона, такого же как в ключе.

При подключении своего ключа на выводах 4 и 7 А1 устанавливается напряжение, которое на величину прямого напряжения на диоде 1N4148 больше напряжения на выв. 6 А1.2 и на ту же величину меньше напряжения на выв. 5 А1.1.

Таким образом, напряжение на соединенных вместе выводах 4 и 7 А1 находится между напряжениями на выводах 6 и 5. В результате на прямом входе А1.1 напряжение будет меньше чем на инверсном, а на выходе, -единица. Точно так же и на А1.2, - на выходе единица. Ключ на транзисторе VТ1 открывается и подает ток на реле К1.

Если в ключе стабилитрон будет не на такое же напряжение, как в замке, то хотя бы один из компараторов будет в состоянии нуля на выходе, и напряжение на базе VT1 будет недостаточно для его открывания.

Особенность микросхемы LM339 в том, что её выходы сделаны по схемам открытых ключей, поэтому их можно соединять вместе, но необходимо подтянуть к плюсу питания резистором (R3). Конечно же, стабилитроны не обязательно должны быть на 8,2V, они могут быть на любое напряжение от нуля до 10V, но обязательно одинаковые.

Конденсатор С1 служит для замедления реакции на правильное напряжение, чтобы не произошло случайное открывание если на вход будут поступать импульсы или какое-то переменное напряжение. Так сказать, защита от случайности.

Рис.2. Схема более сложного замка с двойным аналоговым ключом.

Схема более сложного замка показана на рисунке 2. Здесь используется ключ в виде флэшки. Он очень похож на флэшку, у него такой же USB-разъем, но внутри вместо запоминающей микросхемы всего два стабилитрона и два диода. Теперь «секретность» замка вдвое больше.

И используются все компараторы микросхемы LM339. В ключе два стабилитрона, можно одинаковые, можно разные, но важно чтобы VD2 был таким же, как VD3, а VD7 -таким как VD11.

Реле К1 типа КУЦ-1М, от старого советского телевизора. У этого реле высокоомная обмотка на 12V, и две замыкающие контактные пары, на ток до 2А каждая при напряжении 220V. Но можно подобрать импортный аналог, обмотка должна быть на напряжение 12V и ток не более 30mA.

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

Вашему вниманию представлена схема электронного замка с ключом таблеткой iButton модели DS1990A (Touch Memory). Ключ представляет собой устройство, которое имеет в своей памяти уникальный серийный номер. Уникальность состоит в том, что серийный номер состоит из 48 бит и как следствие этому, количество возможных вариантов составляет 281474976710656.

Описание электронного замка

Замок собран на микроконтроллере фирмы Microchip PIC16F628A (627A, 648A). После подачи питания, микроконтроллер посылает импульс сброса длительностью 500 мкс и через 70 мкс проверяет ответ от DS1990A. Если ответа нет, то микроконтроллер ждёт еще примерно 80 мс и снова передаёт импульс сброса. По такому алгоритму проверяется подключение ключа к замку.

Если ответ есть, значит DS1990A подключен к замку. Затем посылается команда «читать ROM» (33h), после чего микроконтроллер переходит на приём и записывает в ОЗУ переданный таблеткой DS1990A номер, где сравнивает его с записанным номером в EEPROM. Если он совпадает с одним из них, то подается звуковой сигнал, и устанавливается высокий уровень на выводе RA1 в течение 1,5 секунд. Оптопара DA1 (АОТ122А) откроет VT1 (КТ972, BD677, BD679, BD681), который управляет электромагнитным на 12 вольт.

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

Для очистки всех номеров из EEPROM необходимо при выключенном питании нажать кнопку SA1, подать питание и удерживать кнопку в течение 5 секунд. После очищения памяти EEPROM замок подаст звуковой сигнал. Общее количество серийных номеров, которые можно записать в память не более 21.

Чтобы микроконтроллер не пострадал от статического разряда, в схеме применен стабилитрон VD1 (КС156А, 1N4733A, BZX55C5V1) на 5В. В данном замке можно использовать любой из микроконтроллеров PIC16F627A, PIC16F628A, PIC16F648A. Для микроконтроллера PIC12F629/PIC12F675 имеется своя прошивка. Запитать схему можно от .

При программировании , следует выставить следующие биты.

Существует достаточно распространенное дилетантское мнение, что внутри домофона располагается магнит, который и открывает дверь при контакте с замком. Однако это далеко не так! Устройство ключа домофона намного сложнее – ключ представляет собой постоянно запоминающее устройствос находящимся внутри него кодом (серийным номером). Когда ключ подноситься к месту считывания на домофоне, происходит считывание информации с энергонезависимого устройства памяти ключа и домофон отпирает замок.

Принцип работы ключа домофона в подробностях

Принцип работы ключа домофона следующий. Постоянно запоминающее устройство представляет собой энергонезависимую память TouchMemory определенной марки, которая «обменивается» информацией с домофоном при помощи так называемой шины One-Wire. При этом, особенности данной шины таковы, что она позволяет не только общаться с несколькими устройствами, но и передавать питание для них при помощи одного единственного «провода». Для этого в ключе домофона встроен конденсатор (емкостью около 60 пкф), который и обеспечивает кратковременное питание постоянно запоминающего устройства в момент его «общения» с основным блоком домофона. С этой целью основное устройство генерирует сигнал логической единицы не реже, чем каждые 120 мкс, для обеспечения оптимального заряда конденсатора и питания микросхемы памяти ключа.

Принцип работы шины One-Wire

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

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

Механизм передачи логического «нуля» и «единицы»

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

Взаимодействие ключа и домофона

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

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

Ответы на ваши вопросы!

Вы также можете узнать о том, — его принцип взаимодействия со всеми устройствами. Если вам интересна данная тема, то не упустите о том, как же выбрать подходящий именно вам домофон.

Заключение

Учитывая всю сложность взаимодействия ключа и основного блока домофона, изготовление дубликата такого ключа – задача непростая. При утере ключа следует обратиться в фирму, которая производила установку домофона, или в специализированную компанию, которая занимается изготовлением дубликатов. При этом, с собой следует иметь ключ, дубликат которого необходимо изготовить. Если же злоумышленники подобрали код к домофону подъезда, незамедлительно необходимо провести перекодирование ключей. Следует помнить, что безопасность жилища лежит на плечах проживающих в нем жильцов!

Ты потерял ключи от домофона и не можешь сделать дубликат. Хочешь ходить в гости к подруге, но у тебя нет ключей от её подъезда. Либо просто тебе нужно подосрать твоему недругу, но ты не можешь попасть к нему в дом, тогда эта статья для тебя.

Пара слов о принципе работы…
Бытует мнение, что в таблетках от домофона находится магнит, и он открывает дверь. Нет, это не так. Таблетка представляет собой ПЗУ, с жёстко зашитым в ней ключом. Называется это ПЗУ — Touch Memory, марки DS1990A. DS1990A — это и есть марка домофонных ключей. Общается с домофоном по шине one-wire (однопроводной интерфейс). Эта шина разработана фирмой Dallas и позволяет общаться двум устройствам всего по одному проводу. Если устройство пассивное (как в нашем случае), то оно ещё и передаёт ему питание по этому проводу. Надо ещё заметить, что необходим ещё общий провод (чтобы цепь замыкалась), но, как правило, все земли устройств подключённых к этой шине соединены воедино. В ключе находится конденсатор на 60 пикофарад, который обеспечивает кратковременное питание ключа на момент ответа. Но ведущее устройство должно постоянно (не реже чем в раз 120 микросекунд) генерировать сигнал единицы, для зарядки этого конденсатора, чтобы ПЗУ в таблетке продолжало питаться.

Внутреннее устройство таблетки

Организация шины One-wire
Шина One-wire работает следующим образом. Есть ведущее устройство Мастер, и ведомое устройство, в нашем случае пассивный ключик. Основные сигналы генерирует мастер, сигналы логической единицы и нуля. Ведомое устройство может только принудительно генерировать сигналы нуля (т.е. просто просаживать шину на землю через транзистор). Упрощённая схема ведущего и ведомого устройства показана на картинках.

Схема мастера

Если взглянуть на схему, нетрудно заметить, что по умолчанию у мастера стоит всегда +5 вольт, а ля логическая единица. Для передачи логического нуля мастер через транзистор замыкает шину на землю, а для передачи единицы — просто размыкает. Это сделано для того, чтобы обеспечить питание ведомого устройства. Ведомое устройство сделано аналогично, только оно не генерирует +5 вольт. Оно может только просаживать шину на землю, тем самым, передавая логический ноль. Логическая единица передаётся просто «молчанием» устройства.

Протокол работы
Сразу можно однозначно заметить, что парадом правит только Мастер, сам ключик DS1990A либо удерживает землю (мастер её сам выставляет шину в ноль), либо просто отмалчивается, в случае, если он хочет передать единицу, то он просто молчит. Смотрим рисунок.

Пример чтения домофоном ключа.

После генерации ключом импульса PREFERENCE, мастер девайс выжидает некоторое время и выдаёт команду на чтение ПЗУ, обычно это код семейства, в нашем случае 33H. Обрати внимание, как сделана передача нуля и единицы. В любом случае импульс «роняется» на землю, но если передаётся единица, то он быстро восстанавливается (около 1 микросекунды), если же должен быть ноль, то импульс некоторое время «висит» на земле, затем возвращается опять в единицу. Возвращение в единицу нужно для того, чтобы пассивное устройство постоянно пополняло энергию конденсатора, и на ней было питание. Далее домофон выдерживает некоторое время и начинает генерировать импульсы приёма информации, всего 64 импульса (т.е. принимает 64 бита инфы). Ключ лишь должен правильно сопоставить длительности. Если он хочет вывести ноль, то он удерживает шину некоторое время в нуле, если же нет, то просто молчит. Всё остальное за него делает домофон.

Содержимое ключа DS1990A.
В домофонах, и просто устройствах, где для открытия дверей используется подобные устройства, применяется ключ стандарта DS1990A. Это устройство представляет собой 8-ми байтовое ПЗУ, с информацией записанной лазером.


Схема дампа ключа.

В младшем байте содержится код семейства. Для DS1990A он всегда будет равен 01h. В шести последующих байтах содержится серийный номер ключа. То самое сокровенное, что идентифицирует ключик. Последний байт называется CRC, это контроль чётности, обеспечивающий подлинность переданных данных. Он вычисляется из семи предыдущих байт. К слову заметить, что это не единственный стандарт. Существуют перезаписываемые ПЗУ, на которых можно носить информацию, также есть ключи шифрования. Но всё многообразие таблеток Dallas просто нереально рассмотреть в рамках одной статьи, о них можно почитать на диске.

Физическое устройства ключа.
Наверное, всё вышесказанное отбило всякое желание заниматься эмуляторами ключей, ведь ключ надо прочитать, а это такой геморрр. Оказывается нет! Производители Dallas позаботились о нас и всю необходимую для нас информацию разместил непосредственно на ключе, при том в шестнадцатеричной системе! Она выгравирована на нём и её вполне можно прочитать, а потом в дальнейшем зашить в наш замечательный эмулятор.

Морда ключа

Нас интересует из всей этой информации следующее:

CC = CRC — это байт контроля чётности 7-й байт в прошивке
SSSSSSSSSSSS = двенадцать ниблов //нибл = 1/2 байта// серийного номера, т.е. самого ключа в хекс кодах.
FF = код семейства, в нашем случае равен 01h — нулевой байт нашего ключа.

Получается, что мы можем просто написать программу, забить в неё ключ весь, переписав ручками визуально с настоящего ключа дамп, и получим готовый эмулятор. Достаточно просто взять у недруга ключик в руки и переписать то, что на нём написано. Что я в общем-то с успехом и сделал. :)

Эмулятор.
Вот и дошли мы до самого вкусного — эмулятора ключей от домофона. Сначала я нашёл на каком-то сайте готовый эмулятор, зашил его в свой АТ89С51 и он не заработал (что не удивительно). Но это не спортивно юзать чужие прошивки и отлавливать чужие, специально оставленные, баги в коде. По сему я начал делать свои эмуляторы и писать под них свои программы. В общем, я попробовал сделать эмулятор на 6 различных микроконтроллерах, разных архитектур, принадлежащих двум семействам AVR и i8051, все производства Atmel. Заработал не на всех, и программ было написано уйма. По началу ставились вообще наполеоновские задачи сделать универсальный эмулятор с возможностью подборки ключа, но потом я оставил эту затею в силу её геморойности и бессмысленности, пусть ей займутся другие люди, кого заинтересует данная статья. Но себестоимость эмулятора, не считая затраченных трудов меньше 70-80 ре, можно даже уложиться в 30 ре, если делать, например на ATtiny12.

Принцип действия эмулятора.
Мы достаточно подробно рассмотрели принцип работы домофона, и соответственно не составит большой проблемы описать алгоритм программы эмулятора DS1990A. Смотрим внимательно диаграмму, и думаем, что надо сделать. А делать надо следующее. Висящая в воздухе нога микроконтроллера (пока не присоединена к земле, импульс ресета) будет считаться контроллером логической единицей. Значится так, мы после подачи питания на котроллер должны ждать того пока наша ножка не уйдёт на землю, а ля в ноль. Как мы услышали ноль, радуемся, ждём некоторое время и переводим порт из режима чтения в режим записи. Затем роняем шину в ноль, и держим её некоторое время — генерим импульс PRESENCE (длительности импульсов смотри в даташите). Дальше снова переводим шину в режим чтения, и ждём что же нам скажет мастер — домофон. Он нам скажет команду чтения, состоящую из 8-ми бит. Декодировать её не будем, т.к. в 99,999% случаев он нам скажет команду дать свой дамп, а ля 33H, просто отсчитываем 8-мь импульсов и не паримся. Дальше ждём. И начинается самое сложное и интересное — надо быстро смотреть, что нам говорит домофон и отвечать ему тоже быстро. Нам нужно побитно выдать серийный номер, состоящий из 8-ми байт, о которых я говорил выше. Я это делал следующим образом (не важно, какой микроконтроллер, принцип везде один будет), загружал байт в какой-нибудь свободный регистр, и сдвигал его вправо, и смотрел бит переноса. Как только домофон роняет шину в ноль, то если у меня флаг переноса установлен в еденицу, то я просто отмалчиваюсь на этот импульс, и жду генерации следующего импульса чтения бита от мастера. Если же у меня во флаге переноса находиться ноль, то после того как домофон уронит шину на ноль, я перевожу порт микроконтроллера в режим вывода и принудительно удерживаю шину в нуле некоторое время, потом отпускаю и обратно перевожу порт контроллера в режим чтения. По длительности импульса в земле устройство мастер понимает, передана была ли ему единица или нуль. В принципе всё, дальше домофон должен радостно запипикать и открыть дверь.

Практика.

Плата тестер. Видня надпись dallas.

После небольшого гемороя и войны с отладчиком получился код. Вот пример кода вывода данных домофону на AT89C2051. (Вообще AT89C2051 это хоть и популярный, но устаревший контроллер. Один из первых которые я программировал. Периферии минимум, памяти тоже всего ничего. Шьется только высоковольтным программатором. Хотя есть его новая замена AT89S2051 его уже можно прошить внутрисхемно через какой нибудь AVR ISP, а может и через AVRDUDE — не проверял. Самое любопытное в том, что он совместим по ногам с ATTiny2313 так что код можно портировать и на Тиньку. прим. DI HALT)

DI HALT:
Этот адов код мы писали в с Длиным в далеком 2006 у него в квартире. Уржались до икоты над своими тупняками. Я тогда еще впервые пощупал AVR. Сидел фигачил на совершенно незнакомом мне ассемблере процедуры чтения из EEPROM, Длиный же ковырял демоплатку для своего будущего эмулятора. Особо запомнился мой прикол с вачдогом, когда у меня МК сбрасывался во время записи в ЕЕПРОМ и выпиливание микросхемы i2c памяти из платы с помощью отрезного круга. Эх… ничо, сгоняю в Москву мы снова отожгем!

;======================================== ; Выдача в линию серийника; in: R0- адресс где лежит серийник с типом таблетки и CRC8 ; USES: A,B,R0,R1,R2 ;======================================================== DEMUL_SendSer: mov R2,#8 SS3: mov ACC,@R0 mov R1,#8 SS2: JB TouchFuck,$ ;ожидаем, когда шину уронят в ноль 1->0 RRC A ;C:=A.0; shift A; mov TouchFuck,C ;TouchFuck:=C; MOV B,#9 DJNZ B,$ ;Delay 20 us setb TouchFuck JNB TouchFuck,$ ;цикл пока 0 DJNZ R1,SS2 inc R0 DJNZ R2,SS3 ret ;=======================================================

Результаты.
В результате я получил множество эмуляторов. Правда, некоторые ещё из них надо доводить до ума. Хотя несколько 100% рабочие. Примеры эмуляторов ты можешь поглядеть на фотках.



Фотографии эмуляторов

Наиболее интересна проверка CRC, которая осуществляется домофоном. Тебе понадобится это, если ты захочешь поставить Dallas замок например на свой комп. Пример рассчёта CRC на A89C2051 (хотя данный код будет работать на всех микроконтрерах семейства i8051.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 DO_CRC: PUSH ACC ;save accumulator PUSH B ;save the B register PUSH ACC ;save bits to be shifted MOV B,#8 ;set shift = 8 bits ; CRC_LOOP: XRL A,CRC ;calculate CRC RRC A ;move it to the carry MOV A,CRC ;get the last CRC value JNC ZERO ;skip if data = 0 XRL A,#18H ;update the CRC value ; ZERO: RRC A ;position the new CRC MOV CRC,A ;store the new CRC POP ACC ;get the remaining bits RR A ;position the next bit PUSH ACC ;save the remaining bits DJNZ B,CRC_LOOP ;repeat for eight bits POP ACC ;clean up the stack POP B ;restore the B register POP ACC ;restore the accumulator RET

DO_CRC: PUSH ACC ;save accumulator PUSH B ;save the B register PUSH ACC ;save bits to be shifted MOV B,#8 ;set shift = 8 bits ; CRC_LOOP: XRL A,CRC ;calculate CRC RRC A ;move it to the carry MOV A,CRC ;get the last CRC value JNC ZERO ;skip if data = 0 XRL A,#18H ;update the CRC value ; ZERO: RRC A ;position the new CRC MOV CRC,A ;store the new CRC POP ACC ;get the remaining bits RR A ;position the next bit PUSH ACC ;save the remaining bits DJNZ B,CRC_LOOP ;repeat for eight bits POP ACC ;clean up the stack POP B ;restore the B register POP ACC ;restore the accumulator RET

Заключение.
Как видишь домофоные ключи устроенны не так просто, как кажется. Однако, съэмулировать их доступно каждому кто владеет программированием и паяльником.

DI HALT:
Дела давно минувших дней, преданья старины глубокой… Длиный — WDR! (понятно будет только посвященным;)))))

Доредакционная версия статьи из журнала Хакер

Да, это жутко избитая тема. Универсальный домофонный ключ «таблетку» делал наверное каждый второй, кто начинал изучать микроконтроллеры. В Интернете очень много и статей на эту тему, и готовых решений. Однако, интерес к этому угасать не перестаёт даже с массовым переходом на RFID. Это не удивительно, ведь многим хочется собрать такое устройство, которое выполняет не только весьма интересную задачу, но ещё и всегда с собой. К тому же оно не такое уж сложное в изготовлении.

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

Внимание! Этот ключ не позволяет нелегально проникать куда-либо. Это устройство лишь для того, чтобы носить один ключ вместо нескольких.

Хотя ничто не мешает вам записать в него универсальные коды открытия домофонов.

Типы домофонных ключей «таблеток»

iButton
Самый популярный тип домофонных ключей - это iButton, а именно DS1990A от компании Dallas, работает по протоколу 1-Wire. Протокол весьма хитрый, подразумевает двустороннее взаимодействие - на ключ можно отправлять различные команды, на которые он по-разному реагирует. Серийный номер имеет размер в шесть байт, что даёт 2 8*6 = 281474976710656 различных комбинаций и подразумевает, что все выпущенные ключи должны быть уникальны. Если вам повезло, и у вас оригинальный iButton, то этот номер в шестнадцатеричном виде должен быть выгравирован на нём лазером:

То есть теоретически чужой такой ключ можно подделать, если просто записать куда-то или сфотографировать эти цифы!

Для взаимодействия с iButton достаточно подключить его к микроконтроллеру и подтянуть линию данных к питанию (2.8-5 вольт) через резистор:

Скорее всего для многих это всё уже старо как мир, но всё-таки расскажу кратко принцип работы 1-Wire. Обмен данными происходит за счёт поочерёдного прижимания линии к земле, информация при этом кодируется длительностью таких сигналов. Происходит это примерно так:

  • Reset - мастер прижимает линию к земле как минимум на 480 микросекунд, это говорит о начале передачи данных.
  • Presence - через некоторое время ключ отвечает импульсом около 120 микросекунд, что подтверждает его наличие на линии.
  • Команда - мастер посылает команду из восьми бит, при этом логическая единица - это 1-15 микросекунд, а ноль - 60-120.

Далее всё зависит от посланной команды. Обычно это 33h - "READ ROM ", чтение серийного номера, после которого мастер читает 64 бита (1 байт - тип устройства, 6 байт - сам номер, 1 байт - CRC). Чтение каждого бита инициализируется мастером, для этого он посылает импульс в 1-15 микросекунд. Если после этого линия прижата к земле со стороны ключа на 60-120 микросекунд, то прочитан ноль, иначе - единица.

  • Нужно всегда реагировать на reset , даже если он послан во время передачи данных. Импульс длиннее 480 микросекунд говорит о том, что надо начать всё сначала.
  • Момент прикладывания ключа с его точки зрения - это тоже reset , ведь до этого питания не было. Поэтому теоретически домофон может и не посылать reset , и следует периодически отвечать сигналом presence по своей инициативе.
  • Ключи могут реагировать и на другие команды: 0Fh как альтернатива 33h, SKIP ROM (CCh), MATCH ROM (55h) и самое хитрое, о чём я расскажу отдельно ниже, - SEARCH ROM (F0h). Некоторые домофоны могут послать самые разные комбинации таких команд, чтобы убедиться в том, что ключ настоящий.
  • Бывает и обратная ситуация - домофон посылает команду, на которую ключ реагировать не должен. Дело в том, что некоторые программируемые ключи на них всё-таки реагируют, и так происходит ещё одна проверка. Необходимо полностью игнорировать всё, что идёт за этими командами, пока не будет послан reset .
  • Для отсчёта времени лучше использовать асинхронный таймер в микроконтроллере, т.к. счёт идёт на микросекунды. Однако, установка кварца при этом будет излишней.

Про SEARCH ROM (F0h) - это команда поиска всех 1-Wire устройств на шине. Дело в том, что теоретически можно подключить параллельно много ключей и получить список всех серийных номеров. В реальности для iButton такое не используется, ведь к домофону всегда прикладывается один ключ. Однако, некоторые домофоны посылают эту команду, ожидая найти один единственный серийный номер. Алгоритм весьма интересный. Каждое из устройств на шине одновременно посылает бит своего серийного номера, при чём два раза (т.е. мастер должен прочитать два бита). Сначала обычным образом, а затем инвертированным. Что же получается в итоге? Если у устройства в серийном номере стоит единица, то посылается «10». Если ноль, то «01». И всё отлично, пока у всех устройств эти биты совпадают. А если нет… Выше я написал, что при чтении наличие длинного сигнала - это 0, а отсутствие - это 1, т.е. 0 является доминантным. Таким образом, при возникновении конфликтов читаются два нуля. После получения «10», «01» или «00» мастер должен послать в линию только что прочитанный бит. В случае с «00» он таким образом выбирает, с какой группой устройств работать далее. В результате после N итераций получается бинарное дерево из N серийных номеров.
Ответить на такую команду получается несколько сложнее, чем на обычный READ ROM . Нужно посылать каждый бит дважды - обычный и инвертированный, а затем проверять - совпадает ли с ним полученный от мастера ответ, и если не совпадает, то игнорировать дальнейшие команды.

Cyfral
Ключ «Цифрал DC-2000А» - это отечественная разработка. Взаимодействовать с ними гораздо проще, т.к. они весьма глупые - не принимают никакие команды. Достаточно просто подать на ключ питание, и он сразу начнёт бесконечно посылать код, изменяя своё сопротивление. Если дать ему 5 вольт, подключив через резистор в 1 кОм, то на осциллографе можно увидеть примерно такую картину:

Ключ меняет своё сопротивление примерно между 800 Ом и 400 Ом, если я не ошибаюсь, а следовательно и потребление тока. Можно сказать, что сигнал аналоговый, а это всё немного усложняет с аппаратной точки зрения. Хотя иногда может и упростить. Например, ключ можно прочитать, просто подключив его к микрофонному входу компьютера и записав аудиофайл.

И да, домофон после этого можно открыть самым обычным MP3 плеером. Но нас же интересуют более цивилизованные методы, верно?

Кодирование немного странное. Ключ циклически посылает девять нибблов (четыре бита), меняя своё сопротивление. Если оно сохраняется низким около 50 микросекунд, то это логический ноль, а если 100 микросекунд - это единица. Но данные кодируется не логическими нулями и единицами, а положением единиц среди нулей! То есть ключ при посылке кода может выдать только одну из четырёх комбинаций: «1000», «0100», «0010» и «0001». Однако, используется ещё и комбинация «0111» как стартовая последовательность. В итоге данные от ключа могут выглядеть как-то так: «0111 1000 0100 0010 0001 1000 0100 0010 0001 », где «0111» указывает на начало. Никакой контрольной суммы нет - код просто читается несколько раз для уверенности.

Итого восемь последовательностей, в которых возможны четыре комбинации. Не сложно посчитать, что это даёт нам 65536 вариантов ключей. Не так уж и много, они явно часто повторяются. Теоретически если в подъезде 50 квартир, каждой из которых выдано три ключа, можно подобрать один из них перебрав всего 436 комбинаций. Но я таким не занимался.

Как же лучше читать ключи от Cyfral? Как я уже говорил, уровни аналоговые. Варианта два: аналого-цифровой преобразователь и компаратор. Последний мне кажется надёжнее. Всё отлично работает, если к одному из входов компаратора подключить линию данных подтянутую к Vdd резистором в 650 Ом, а ко второму - ровно половину Vdd, для чего можно использовать делитель напряжения из двух одинаковых резисторов. После этого результат вывода компаратора можно с уверенностью воспринимать как высокое и низкое сопротивление ключа.

Как же имитировать такой ключ? С первого взгляда кажется, что тоже нужно менять сопротивление, но результаты показали, что домофонам не нужна такая точность - можно смело замыкать линию на землю вместо низкого сопротивления и полностью отпускать её, когда нужно высокое.

Метаком
Ещё одна отечественная разработка - домофоны Метаком и ключи К1233КТ2. Как и Cyfral он просто бесконечно посылает код, меняя своё сопротивление/потребляемый ток. К счастью в Интернете доступна официальная документация:

Это всё, что нужно знать для работы с этим ключом. Он посылает четыре байта данных, но в каждом из них один бит уходит на проверку чётности. Итого выходит 28 полезных бит, а 2 28 = 268435456 комбинаций.

Увы, я так и не смог найти ни один такой ключ, чтобы поэкспериментировать с ним. Однако, в Интернете легко найти универсальный код, который открывает 99% домофонов Метаком. Один из них как раз в соседнем от меня подъезде. Я написал программу, посылающую этот код, основываясь только на технической документации. Соседний подъезд открылся с первой попытки. Похоже, что этому домофону тоже не так уж важно точное сопротивление. На этом я оставил Метаком в покое и решил, что чтение их ключей не так уж и нужно.

Универсальные коды ключей

На самом деле универсальные ключи от домофонов - это скорее миф. Разработчики почти никогда не делают для себя какой-то специальный код для всех дверей, исключение составляют только Vizit.

Но есть легенда, которая гласит, что после чтения кода ключа многие домофоны сверяют его со всеми кодами, которые записаны в ячейках памяти. Однако, в ячейках, где ещё ничего не было записано, лежат FFки или нули. Таким образом домофон можно открыть, послав ключ только из нулей или только из FFок.

Звучит как полнейший бред. Каким надо быть программистом, чтобы допустить такой баг? Но… это действительно часто работает. Да, в свежих прошивках это обычно исправлено, но многие домофоны стоят без изменений годами. Невероятно, но факт.

Любые другие коды ключей выдаваемые за универсальные - это обычно всего лишь служебные ключи для сотрудников почты, ЖКО или самой домофонной компании, и они работают только в отдельных населённых пунктах.

Создание мультиключа

Перейдём уже к практике! Да, я пытался совместить в одном устройстве и имитацию ключей, и их считывание (кроме Метаком), и синхронизацию с компьютером по USB. Вот схема того, что получилось (кликабельно):

Компоненты и их предназначение:

  • IC1 - микроконтроллер ATMEGA8/ATMEGA8A/ATMEGA8L;
  • U1 - USB-контроллер FT232RL, нужен для подключения устройства к компьютеру;
  • CON1 - miniUSB разъём;
  • BT1 - батарейки, дающие 3-5 вольт;
  • D1 и D2 - диоды (желательно шоттки), которые изолируют питание от батареи от питания от USB;
  • P1 - «таблетка» iButton, используется для подключения к домофонам;
  • P2 - контакты считывателя ключей, используются для подключения к ключам;
  • R1 - резистор, подтягивающий линию 1-wire к VCC;
  • R2 - токопонижающий резистор для управления транзистором Q2;
  • R3 - резистор, ещё сильнее подтягивающий линию к VCC для считывания ключей Cyfral;
  • R4 - токопонижающий резистор, используется для открытия Q1 и определения подключения к USB;
  • R5 - подтягивает базу Q1 к земле, чтобы закрывать его, когда нет подключения к USB;
  • R6 - токопонижающий резистор для светодиодов, достаточно одного, т.к. одновременно они не горят;
  • R7 и R8 - делитель напряжения для одного из входов компаратора, чтобы считывать ключи Cyfral;
  • Q1 - транзистор для определения подключения к USB;
  • Q2 - транзистор для включения земли на считывателе и эмуляторе, чтобы не сажать батарейки, случайно замкнув контакты в кармане;
  • C1 , C2 и C3 - конденсаторы для фильтрации питания;
  • SW1 - единственная кнопка для управления устройством;
  • LEDS - семь светодиодов в форме восьмёрочки для отображения номера ключа.

Печатная плата (кликабельно):

Это было ещё время до покупки 3D принтера, когда я проектировал устройства под корпуса, а не корпуса под устройства. Ко мне в руки попал очень приятный экземпляр в виде брелка и с кнопкой. Просто идеально, оставалось только проделать отверстия под USB и светодиоды. Увы, я до сих пор не могу найти в продаже точно такой же корпус. В итоге получилось как-то так:

Батарейки под платой. Кстати, мне их хватило на год, пока я случайно не полез купаться, забыв вытащить ключи.

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

Длительное нажатие на кнопку переводит устройство в режим считывания ключей, при этом мигает средний светодиод. В этот момент нужно приложить ключ к контактам считывателя ключей (именно для этого у меня снизу вкручен винтик). Если считывание прошло успешно, отобразится номер, под которым ключ занесён в память.

При подключении по USB устройство видится как виртуальный COM-порт. Для простоты работы был написан клиент под Windows:

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

Исходники прошивки есть тут.