Sep 28 Закрываем комп на амбарный замок Делаем электронный замок для компа на ключах iButton

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

Разбор полетов, постигаем теорию

Во-первых, наше устройство должно уметь считывать код с домофонных таблеток. Думаю, тебе известно, что, как правило, работают они по протоколу 1-wire. Есть несколько способов эмуляции этого протокола при помощи МК. Я использовал самый простой — дрыганье ножкой МК в такт протоколу. У этого способа, конечно, есть свои недостатки, но для нашего устройства они не критичны, ибо становятся заметны только в том случае, когда МК должен параллельно с чтением ключа заниматься кучей другой работы, а у нас такого к счастью нет. Для того чтобы отличать свой ключ от чужого, устройство должно помнить код своего ключа. Для этого мы используем EEPROM-память микроконтроллера. Ключ будем запоминать всего один, и на него понадобится 8 байт EEPROM-памяти (если чуть обрезать формат, то можно уложиться и в 6 байт. Чтобы обучить замок новому ключу на плате, в месте недоступном юзеру, сделаем кнопку «learn», при нажатии на которую, микроконтроллер будет считывать ключ и записывать в энергонезависимую память. Если есть необходимость, ты можешь увеличить количество запоминаемых ключей, немного дописав программу.

Когда компьютер выключен, замок должен питаться от какого-то внутреннего источника. Например, батарейки. Моя версия устройства почти год работала от одной батарейки CR2032, а от пары мизинчиковых батареек AAA проработает намного дольше. Кстати, если замок будет размещен в корпусе компьютера, то можно попробовать подключиться к линии 5VVSB (фиолетовый провод) на БП компа. На ней есть напряжение 5 V, даже когда компьютер выключен (разумеется, не из розетки). Тогда вместо двух источников питания (5 V и батарейка) в схеме будет всего один.

1-wire

Протокол 1-wire, по которому ключ общается с домофоном, описан в каждом втором блоге по электронике. Но я все же повторюсь и расскажу, что это такое, и под каким соусом его едят. Физически шина 1-wire состоит из одной линии, по которой передаются и данные, и питание. Эта линия подтянута к источнику питания (обычно 5 V) резистором в несколько килоом. Максимальный ток всех устройств на линии ограничивается этим резистором. Если устройству требуется больший ток, то можно подключить внешнее питание. Или подключать линию связи к питанию на то время, пока устройству нужен большой ток (например, так работают с термометром DS18Ь20).

Все устройства на шине 1-wire делятся на ведущих (master) и ведомых (slave). В нашем случае мастером будет замок, а ведомым — ключ. Мастер может по своему желанию начать обмен данными, передавать ведомым устройствам команды и читать из них данные. Ведомые должны ждать, пока к ним обратится ведущий — сами они не могут начать обмен данными.

Для передачи сигналов ведущий (или ведомый) прижимает линию к земле. В ведомом устройстве есть цепочка из диода и конденсатора, которая позволяет ему работать, пока напряжение на линии болтается около земли. Единица  передается коротким импульсом (5-10 микросекунд), а ноль — длинным (до 50-100 микросекунд). Между импульсами должна быть пауза в несколько микросекунд, чтобы конденсаторе ведомом устройстве успел зарядиться, и оно не сдохло на следующем импульсе. Кроме нуля и единицы есть два специальных сигнала: RESET, длиной не менее 480 мкс, который подается ведущим перед началом обмена, и PRESENCE, длиной в 100-200 мкс, его подает ведомый после того, как услышит сигнал RESET. При передаче байта сначала передается младший бит, а в конце — старший. Обмен данными между ведущим и ведомым идет по такому сценарию:

  1. Мастер подает сигнал RESET.
  2. Ведомый отвечает сигналом PRESENCE (типа — «я здесь!»).
  3. Ведущий подает ROM-команду.

У каждого ведомого есть 8 байт ROM-памяти с уникальным кодом, по которому ведущий отличает их друг от друга. А у наших ключей (если точнее — микросхема DS1990A — самая популярная модель iButtonl кроме этой памяти вообще ничего нет.
В зависимости от команды мастер может прочитать ROM-память ведомого или передать код нужного ему ведомого, чтобы продолжить связь конкретно с ним. Мы будем читать ROM-память ключа командой Read ROM (0x33).
Первым байтом в ROM-памяти идет код семейства. У DS1990A — это 0x01. Дальше идет 6 байт серийного номера и байт CRC. Мы будем сохранять серийный номер целиком (вместе с кодом семейства и CRC) в EEPROM. Считанный код ключа будем просто сравнивать с номером в памяти, без расчета CRC и прочих проверок на ошибки. Нашему замку понадобится как-то определять, что ключ появился на линии. Обычно эта задача решается регулярным опросом шины: мастер подает RESET и ждет PRESENCE-сигнала от ведомого. Но такой способ нам не подходит — МК будет постоянно в активном режиме, то есть, расходовать батарейку. Можно использовать спящий режим, просыпаясь раз в несколько секунд, чтобы проверить наличие ключа.
Но есть более красивое решение: МК настраивает внешнее прерывание так, чтобы оно сработало, когда линия связи прижимается к земле, потом переходит в спящий режим. В этом режиме отключается вся периферия МК, даже тактовый генератор, и потребление снижается до долей микроампера. Когда ты тыкаешь ключом в пад, конденсатор в ключе начинает заряжаться и просаживает напряжение на линии почти до нуля. Всего на несколько микросекунд, но этого хватит, чтобы прерывание сработало и вывело МК из спящего режима. Дальше он прочитает ключ, сравнит его с кодом в памяти и включит комп.

Схема устройства

Теперь пора поподробнее разобраться с железом. Микроконтроллер нам нужен простой и дешевый. Можно, конечно, поставить какой-нибудь понтовый ARM, но вдоволь и ограничиться ATTinyl3. К нему подключим кнопку «learn», подтягивающий резистор для 1-wire, зеленый светодиод (которым будем мигать, если ключ прошел проверку) и транзистор для управления БП компа (см. схему на рис. 6). Транзистор можешь взять любой маломощный, главное, чтобы он был  типа NPN. У меня были залежи ВС846 в мелком SMD-корпусе, поэтому поставил его. Коллектор транзистора (Х11 и его эмиттер (Х2) мы подключим к материнке вместо родной кнопки питания. Если перепутать контакты местами, то ничего страшного не произойдет, просто комп не будет реагировать на попытки его включить. Для питания схемы 5 Вольт можно найти на любом незанятом разъеме в системном блоке. Например, почти у всех без дела болтается разъем флоппивода. От него нам нужны красный (+5) и черный провода. Оба источника питания (5 V от компа и батарейка) подключены через диоды. Нужно это для того, чтобы они не перекачивали ток друг в друга. При включенном компьютере ток идет в схему через диод D1, а D2 не дает ему испортить батарейку. Когда комп отключен, ток пойдет через D2, а D1 не даст току от батарейки попасть в линию питания компа. В качестве D2 лучше всего брать диод Шоттки. Он обладает маленьким падением напряжения, порядка 0,2 В. Если взять обычный диод, то МК может не хватить напряжения для работы.



Serial code Serial code Serial code Serial code Serial code CRC Read ROM Family code II 1 2 3 4 5 6

Продолжение статьи

Menu Poll Photo Popular