В последнее время часто приходится таскать с собой несколько домофонных ключей (aka iButton).
Поначалу их было всего два и меня это не сильно напрягало, но вскоре в связку добавилась ещё пара таблеток.
И как на зло, они все были одинаковые на вид/цвет/вкус, поэтому приходилось подбирать ключ методом тыка, тупя у двери.
И вот, в один прекрасный день, я решил, что с этим надо что-то делать. Либо подписывать все ключи, но от связки это не избавляет, либо искать альтернативу.
Эмулятор
К счастью альтернатива оказалась, в буквальном смысле, под рукой.
Маленький эмулятор ключей на базе ATTiny13V-10SSU. Сделан он был в начале лета, эксперимента ради.
После пары испытаний, валялся без дела у меня в ящике, как инопланетное оружие в зоне 51. Главное его достоинство заключается в том, что ему не нужно внешнее питание. При работе эмулятор питается от домофона, что избавляет от возни с батарейками.
По размеру вся конструкция не больше рублевой монетки. Можно прицепить к связке ключей. На верхней части разместился переключатель для выбора ключа из памяти. Это обычный тройной ДИП-переключатель.
Выбор ключа реализован довольно оригинально. Тут балом правит двоичная система. Три переключателя. Каждый из них может быть в двух состояниях: включен (1) и выключен (0). Всего получается 8 комбинаций 8 ключей. Если повернуть ключик так, чтобы диод (на фотке не видно) находитля слева, то переключатели будут идти в обычном порядке старший >> младший. Да, на первый взгляд это кажется какой-то неоправданно сложной фигней, но на деле, очень быстро запоминается.
В качестве альтернативного управляющего элемента можно заюзать крутилку, подключенную к АЦП. Сделать шкалу с номерами ключей 1 8 и какой-нибудь компактный переменный резистор. Но такая конструкция работает менее надежно. При испытаниях она не могла открыть два из трех домофонов, а ключик с переключателем нормально работал на всех.
Коды в память эмулятора можно запихивать двумя способами. Зашить в EEPROM память ещё на этапе прошивки, или собрать что-то типа док-станции для перенастройки девайса. Дело в том, что кроме того, что прикидываться Ай-батоном, этот эмулятор умеет еще одну штуку. По команде 0x00 он выдает компу всю свою EEPROM память 64 байта. А по команде 0xFF принимает 64 байта и записывает их себе в EEPROM. Физически это обычный 1-Wire.
То есть, чтобы перезаписать EEPROM память новыми кодами нужно подать ресет, выкинуть на линию команду 0xFF, и скинуть 64 байта новой EEPROM. А для чтения памяти ресет, 0x00 и прочитать 64 байта. Эти команды прописаны в самом начале кода, и их можно заменить на другие. 0 и FF были взяты просто для теста.
Аппаратная часть эмулятора проста до безобразия:
Главная особенность схемы питание. В этом плане эмулятор полностью повторяет настоящий iButton, питаясь во время работы от линии связи (Dq на схеме). Со стороны домофона нам обеспечена подтяжка в пару килоом (это в лучшем случае) от которой ключ питается. Это предъявляет очень важное требование к устройству как можно более низкое потребление. При частоте 1.2 МГц и питании примерно 3V (очень примерно, т.к. зависит от мастера домофона) получается потребление приблизительно 500 мкА.
С другой стороны, при передаче данных, линия прижимается к земле нужно где-то запасать энергию. Для этого в схеме есть конденсатор C1 и диод D1, который не дает кондеру разряжаться, когда линия прижимается к земле.
На схеме указан диод Шоттки, и не спроста. Если поставить обычный диод, то из-за большого падения напряжения на нем (около 0.6В), напряжение на ножке PB0 будет слишком высоким. По даташиту оно не должно превышать Vcc+0.5V, а с простым диодом будет Vcc+0.6V или больше. Диод Шоттки, кроме маленького падения напряжения (0,1-0,2В) обладает другим полезным свойством очень быстро закрывается и открывается.
Конденсатор выбирался чисто экспериментально. Пробовал разные варианты от 220nF до 10uF. Надежнее всего устройство работало с кондером в 1uF, его и оставил. При большей ёмкости тоже работало нормально, а вот меньше 1uF начинались глюки.
Алгоритм работы ключика, в переводе с ассемблера, выглядит примерно так:
- Инициализируем всю периферию. Отключаем, за ненадобностью, компаратор и вешаем подтяжку на те пины, куда подключен переключатель.
- Тупим 50мс. На всякий случай. За это время конденсатор должен полностью зарядиться, питание стабилизироваться, а подтяжка подняться. Конечно, значение 50 мс взято с большим запасом.
- Читаем переключатель и соображаем, с какого адреса нам начинать чтение. В EEPROM хранятся полные коды ключей, т.е. все 8 байт. Читаем нужный код из EEPROM в оперативку.
- Ждем RESET импульса на линии 1-Wire. Как только ресет подан, отвечаем PRESENSE.
- После этого ловим с линии код команды, которую нам сообщает домофон. Если это команда 0x00 или 0xFF значит от нас что-то хотят (записать память или прочитать) переходим к соответсвующим функциям. Если код другой, значит с нами хочет говорить домофон.
- Домофон настойчиво требует данные. Выдаём ему код из оперативки. Все 64 бита.
- Переходим к шагу 4. На тот случай, если домофон захочет прочитать ключ ещё раз. Для верности.
После основного алгоритма идут процедуры чтения и записи EEPROM. Там всё просто: при чтении сначала извлекается байт из EEPROM, потом эмулятор даёт его прочитать. А при записи принимается байт и записывается в EEPROM. И так, пока не будет записана/прочитана вся оперативка (64 байта).
Посмотреть код
Также всё есть в архиве + куча комментариев. Так-что разобраться можно. Так-же тут не описан протокол 1-Wire его описание было в другом посте.
- Архив с исходниками (асм под AVR Studio)
- Печатная плата в формате Sprint Layout
Оцените статью!