Копируем ключ без ключа: умный дубликатор 1-Wire на ассемблере AVR с ручным вводом и контролем CRC

от автора

Здравствуйте, уважаемые хабровчане!

И снова новое устройство. И снова древний чип и ассемблер — на радость комментаторам. 😊

Сразу хочу расставить все точки над «i». Да, я знаю, что можно было взять чип поновее или вообще что-то типа Raspberry Pi, прикрутить к нему экран 640х480, подсоединить мышь, клавиатуру, модуль GSM для выхода в глобальную сеть и сохранения ключей на сервере. Да и код можно было написать не на ассемблере, а на Си, Python, Rust, «навайбкодить» или добавить искусственный интеллект. Всё это я прекрасно знаю, так что давайте не будем на это отвлекаться.

Данный проект — чистый DIY. Его цель — показать, что можно сделать на довольно старом (не буду говорить «устаревшем») контроллере. Относитесь к этой статье как к видео о выживании в лесу. Знаете, есть такие ролики, где блогер сознательно уходит в тайгу, имея при себе только топор, спички, соль и чистый энтузиазм. Он строит себе жилье, находит пропитание и отлично отдыхает. А ведь мог бы на вертолете долететь до турбазы, выйти из дверей прямо к телевизору, попивать пивко и закусывать шашлыком, глядя на красиво постриженные сосны за окном…


Итак, представляю вам копировщик ключей формата DS1990.

Внешний вид

Внешний вид

Да, тема избитая, и подобных проектов в сети не счесть. Сами ключи такого формата сейчас находятся почти в забытьи, новый стандарт уже де-факто — RFID-метки 125 кГц. Но иногда «таблетки» все же встречаются. Что же тогда особенного в моем проекте, помимо того, что он написан на ассемблере, от которого многие морщатся как от незрелого лимона? 😉

Главная фишка — этот копировщик умеет записывать на болванку уникальный ID, не имея исходного ключа на руках. Допустим, ключ потерялся или жена утащила его в сумочке. Физически его нет, но сам номер у вас сохранился (например, в базе ТСЖ или в договоре). Имея этот код, мы можем просто набрать его кнопками и зашить в болванку. Именно эта особенность и отличает мой проект.

Архитектура и аппаратная часть

Из чего состоит устройство:

  • Мозг: Микроконтроллер ATmega8.

  • Интерфейс: LCD-дисплей типа WH1602. Программа полностью русифицирована. Если у вас экран без поддержки кириллицы — не беда, недостающие символы программно прописываются в CGRAM дисплея.

  • Управление: Три кнопки для навигации по меню.

  • Индикация: Пьезоэлектрический зуммер со встроенным генератором и считыватель ключей со светодиодом (так красивее).

Плата верх

Плата верх
Плата низ

Плата низ

Логика работы устройства

При включении в верхней строчке экрана появляется надпись < ЧТЕНИЕ >. Угловые скобки означают, что мы находимся в меню выбора и можем переключать режимы. Кнопками «Влево» / «Вправо» можно циклически выбирать нужный пункт: < ЧТЕНИЕ >, < ЗАПИСЬ > или < РЕДАКТИРОВАНИЕ >.

Пункт меню "ЧТЕНИЕ"

Пункт меню «ЧТЕНИЕ»
Пункт меню "РЕДАКТИРОВАНИЕ"

Пункт меню «РЕДАКТИРОВАНИЕ»

Нижняя строка при первом включении пустая — в дальнейшем там будет отображаться номер ключа. Подтверждение выбора режима осуществляется кнопкой «Ввод». В режиме навигации по меню светодиод на считывателе постоянно горит красным.

Главное отличие активированного режима от меню — на экране пропадают угловые скобки < >, а светодиод начинает мигать красным и зеленым цветом.

1. Режим «Чтение»

Устройство ждет прислонения исходного ключа.

  • Успешное чтение: Долгий писк зуммера (250 мс), на экране в нижней строчке появляется HEX-код.

  • Ошибка чтения: Код все равно появится, но зуммер издаст 5 коротких предупреждающих писков по 75 мс.

    Тут есть одна фишка: устройство выводит на экран одновременно и тот байт CRC, который реально прилетел из ключа (он находится в строке кода), и вычисленный контроллером «на лету» правильный CRC (он отображается в верхней строчке дисплея).

    На фотографии ниже как раз зафиксирован именно такой случай. Ключ считался с ошибкой: сверху вычислен правильный CRC [4F], а в самом коде ключа на конце вывелось 4D. Устройство выдало ошибку писком, но битый код на экране остался. Так что если ключ полуживой, этот «слепок» можно использовать как основу, чтобы потом вручную подправить неверные символы в режиме редактирования.

    • Особенность: Устройство не имеет энергонезависимой базы и помнит только последний считанный ключ (до выключения питания).

      Выход в главное меню — нажатие кнопки «Ввод».

    Чтение прошло с ошибкой

    Чтение прошло с ошибкой

    2. Режим «Запись»

    Если память пуста, на экране на 3 секунды высветится надпись ПУСТО, и прибор вернется в меню. Если же код в памяти есть, светодиод замигает, приглашая к действию: прислоняем болванку (RW1990 / TM01) — и готово. Успешная запись подтверждается долгим писком, сбой — пятью короткими.

    Ключ не считан

    Ключ не считан

    3. Режим «Редактирование» (Самый смак)

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

    • Текущий редактируемый символ подсвечивается курсором в виде подчеркивания _. Кнопками «Влево» / «Вправо» выбираем позицию и нажимаем «Ввод».

    • Курсор меняется на мигающий квадрат, после чего теми же кнопками «Влево» / «Вправо» мы меняем значение от 0 до F.

    • Важный нюанс: Два самых левых символа на дисплее — это байт контрольной суммы (CRC-8). Он вычисляется автоматически «на лету», и отредактировать его вручную нельзя.

    • Выход из режима редактирования — удержание кнопки «Ввод» более 3 секунд.

    Пункт меню "РЕДАКТИРОВАНИЕ"

    Пункт меню «РЕДАКТИРОВАНИЕ»
    Вручную вводим код с нуля

    Вручную вводим код с нуля

    Бонус: Умная подсветка

    Если в течение 3 секунд на устройстве нет никакой активности (не нажимаются кнопки, не прикладываются ключи), подсветка дисплея гаснет. При любом действии она мгновенно просыпается.

    Да, кстати, питание устройства подразумевается от внешнего источника — какого-нибудь БП 9–12 В, можно и от батарейки типа «КРОНА». Но никаких режимов сна не предусмотрено, кроме отключения подсветки, так что лучше, конечно, БП.

    Репозиторий и исходные материалы

    Проект я выложил на GitHub, всё открыто. Там в файле README.md расписаны подробные указания по поводу прошивки, фьюз-битов под внешний кварц, питания схемы и всего остального.

    В самом репозитории лежат:

    • Проект для Microchip Studio.

    • Исходник на чистом ASM.

    • Готовый к заливке HEX-файл.

    • Схема устройства в PDF и PNG.

    • Гербер-файлы печатной платы, если захотите заказать её на производстве.

    👉 Ссылка на GitHub: https://github.com/vic80-designs/vic80_iButton_copier

    Дисклеймер

    Данное устройство разработано исключительно в ознакомительных, образовательных и легальных DIY-целях (например, для создания дубликата ключа от собственного подъезда, если оригинал был утерян). Автор не несет ответственности за любое неправомерное использование прибора, порчу чужого имущества, СКУД-систем или нарушение чьих-либо прав. Всё, что вы делаете, вы делаете на свой собственный страх и риск.

ссылка на оригинал статьи https://habr.com/ru/articles/1053762/