Прошивальщик ключей для домофона на ардуино

OSBoy notes.

Записки обо всём.

Дубликатор домофонных ключей на Arduino

В интернете можно найти достаточно готовых Arduino-проектов устройств для копирования домофонных ключей DS1990, в народе так же известных как ibutton, или просто «таблетки». Но практически всё проекты, что я нашёл, оказались несколько сыроваты. Поэтому решено было, используя уже имеющиеся наработки, сделать свой проект, полностью законченный и достаточно функциональный. За основу была взята эта статья, а так же, некоторые идеи были почерпнуты отсюда, поэтому на авторство сильно не претендую.

Аппаратная часть

Данное устройство я собрал на Arduino Nano (его китайском аналоге) в корпусе от нерабочего USB-хаба. Получилось достаточно компактно и удобно:

USB-кабель используется как для питания устройства, так и для взаимодействия с COM-терминалом. На корпусе установлена нефиксируемая кнопка для переключения режимов чтение/запись/восстановление, светодиод для индикации текущего режима, и контактная площадка (считыватель) для ключей.

Схема устройства простейшая. Линия данных 1wire (ibutton) обязательно подтягивается к питанию (+5В) через резистор 2,2 кОм (скорее всего, будет нормально работать и с другими номиналами порядка 1. 4,7 кОм). Светодиод подключаем через ограничительный резистор подходящего номинала. Так как в скетче используем вход кнопки (D2) со встроенным подтягивающим (PULLUP) резистором, то кнопку сажаем на GND.

Програмная часть

В прошивке практически без изменений оставил только часть кода, отвечающую непосредственно за чтение/запись данных в ключи по протоколу 1-wire и, собственно, принцип работы устройства (дабы не изобретать велосипеды). Однако, остальная программная часть была фактически полностью переписана и при этом дополнена разными полезными фичами. В скетче используется стандартная Ардуино-библиотека «OneWire».
Актуальную версию скетча смотрите в конце статьи.

Возможности устройства:

  • Чтение ID ключа с последующей записью в перезаписываемую «болванку» (RW1990);
  • Запись «универсального» ID, заранее заданного в скетче (в данном случае используется ID: 01:FF:FF:FF:FF:FF:FF:2F );
  • Защита от случайной записи некорректного значения ID;
  • Восстановление нечитаемых ключей, случайно испорченных при неудачной записи;
  • Ввод ID вручную в терминале;
  • Возможность работы без COM-терминала (при наличии источника питания постоянного тока на 5В с USB разъёмом).

Работа с устройством

Устройство можно использовать как с COM-терминалом (предпочтительно), так и без него. Для работы с терминалом на компьютере должны быть установлены драйверы для платы Arduino (FTDI, CH341 или др., в зависимости от того, какой чип установлен на Вашей плате). Если плата удачно программируется в среде разработки Arduino-IDE, значит нужный драйвер в системе уже установлен. Терминал COM-порта можно использовать любой, какой больше нравится (например, монитор порта среды Arduino-IDE или Гипертерминал. Лично я использую PuTTY). В настройках терминала нужно выбрать виртуальный COM-порт, под которым определилась наша плата, и скорость обмена, выставленную в скетче (в моём случае — 115200).

Итак, подключаем устройство к компьютеру и запускаем терминал COM-порта (Arduino при этом автоматически перезагружается). Светодиод несколько раз мигает в процессе загрузки. Через пару секунд устройство готово к работе, светодиод при этом гаснет, а в терминале выводится сообщение о готовности системы.

Список доступных команд через терминал:

  • d — загрузка в буфер «универсального» ключа (в данном случае: 01:FF:FF:FF:FF:FF:FF:2F);
  • w — переключение режима чтение/запись;
  • m — переход в режим ручного ввода ID;
  • r — переход в режим восстановления нечитаемых ключей;
  • h — показать справку по командам.

Чтобы считать ID ключа, прикладываем ключ к контактной площадке. Светодиод при этом начинает часто моргать, а в терминале отображается считанный ID, который сохраняется в буфере (переменной oldID ) до тех пор, пока в неё не будет загружен другой ID. Идентификатор состоит из восьми бит, которые отображаются в шестнадцатиричном виде: 01 XX XX XX XX XX XX YY. Здесь первый бит — это Family code, для ключей ibutton он всегда будет равен 1. Если считанный Family code будет отличаться от 1, в терминал будет выведено соответствующее предупреждение и записывать данный ID устройство откажется.
Следующие шесть бит — это, собственно, уникальный идентификатор ключа. А восьмой бит — это, так называемый, «избыточный код» CRC или, другими словами, контрольная сумма, вычисляемая по специальному алгоритму из предыдущих семи бит. Контрольная сумма проверяется, и если её значение не верно, то, опять же, в терминал выводится предупреждение об этом и запись такого ID будет невозможна.

Чтобы записать ID в перезаписываемый ключ, в терминале нужно отправить символ «w», либо нажать кнопку на устройстве. При этом зажигается светодиод, что говорит о готовности устройства к записи. Прикладываем записываемый ключ к контактной площадке: светодиод при этом гаснет, а примерно через секунду начинает часто моргать, что говорит о завершении процесса записи и переключении устойства обратно в режим чтения. Если в терминале мы видим, что считывается только что записанный ID, без каких либо предупреждений, значит всё прошло успешно. С таким же успехом можно копировать ключи и без использования терминала, наблюдая только за светодиодом.

Если записываемый ID был некорректный (с неверным Family code, или CRC), в терминал выведется соответствующее сообщение и запись будет отменена. Таким образом, устройство предохраняняет ключ от записи в него некорректных данных. Тем не менее, всё же может случиться так, что данные запишутся с ошибками. Такое может произойти, например, если ключ будет недостаточно плотно приложен к контактной площадке при записи данных. Более того, ключ в этом случае может вовсе перестать читаться некоторыми устройствами (включая данный дубликатор), если в первый бит будет записано нулевое значение. А при эксперементах с ключами такое частенько бывает, особенно по неопытности! Так что незнавши можно и подумать, что ключик умер.

Для восстановления нечитаемого ключа необходимо перевести устройство в соответствующий режим. Для этого в терминале нужно отправить символ «r», либо включить устройство, удерживая кнопку нажатой. Светодиод начнёт часто моргать, независимо от того, приложен ключ, или нет (для выхода из режима восстановления отправьте символ «r» снова, или переподключите устройство).
Прикладываем ключ к контактной площадке. Если он читаемый, то его ID считается так же, как и в обычном режиме чтения. Если же ключ не читается, соответственно ничего не произойдёт. Удерживая ключ приложенным, нажимаем кнопку. При этом в ключ принудительно будет записан «универсальный» ID, прописанный в скетче (у меня: 01:FF:FF:FF:FF:FF:FF:2F) либо другой, ранее загруженный в буфер. По окончанию записи устройство вернётся в обычный режим чтения.

Загрузить в буфер универсальный ID можно, отправив в терминале символ «d», либо просто перезагрузив устройство (он используется по умолчанию, если не был введён какой-либо другой ID).

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

Переводим устройство в режим ручного ввода ID. Для этого в терминале нужно отправить символ «m». После этого появляется приглашение ввести ID, либо выйти из ручного режима (по нажатию Esc). После этого можно ввести любой ID (в шестнадцатиричном виде). При этом первый бит (Family code) всегда должен быть равным 1 и программа подставляет его автоматически, а так же, автоматически вычисляет CRC и подставляет в восьмой бит. Таким образом, нам нет необходимости вводить Family code и вычислять контрольную сумму CRC, достаточно ввести только значения битов со второго по седьмой.

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

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

Источник

Делаем универсальный RFID-ключ для домофонов

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

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

1. Что это такое? Что умеет?

Устройство, которое я собирал в далёком 2017 году, есть ни что иное, как спуфер домофонного RFID-ключа, работающего на частоте 125 кГц. Слово «спуфер» в данном случае означает, что устройство, по сути ключом не являясь, выдаёт себя за него, и домофоны реагируют на это соответствующе.

Прибор умеет транслировать любые коды ключей, которые записаны в его память. Некоторые коды можно найти в Сети по запросу «ключи-вездеходы», их я вставил в прошивку в первую очередь. Но при некотором навыке и желании можно вставить в прошивку коды вообще всех RFID-ключей, которыми вы пользуетесь (если они работают на частоте 125 кГц), и, таким образом, иметь возможность заменить одним прибором связку брелков.

Я знаю, что на просторе Сети гуляет большое количество схем подобных устройств. Моей целью было создать наипростейший вариант из всех доступных. Удалось или нет — судите сами.

2. Какими навыками нужно обладать, чтобы повторить данный проект?

Прежде всего, навыки работы с Arduino: иметь установленную среду разработки, уметь заливать в плату прошивки, устанавливать библиотеки, драйверы, вот это вот всё. Далее. Имеется в проекте место, где без пайки — ну вот никак. Потому — нужны прямые руки и паяльник с расходниками. Уметь читать электрические принципиальные схемы (или их подобия). Ну и навыки программирования на C++, дабы иметь возможность кастомизации прибора. Но это уже опционально.

3. Какие запчасти нужны и как их монтировать?

Как видно, BOM для базовой версии выглядит примерно так:

  1. Arduino Nano (или любая другая Дуня, которая под рукой есть);
  2. RFID-ключ формата EM4100 (вместо катушки индуктивности);
  3. n-p-n транзистор (любой какой отыщется, частоты тут не очень высокие);
  4. резистор на 10К;
  5. конденсатор на 560 пФ (лучше SMD, можно прямо в корпус от ключа припаять);
  6. литий-ионный аккумулятор — по вкусу;
  7. три сенсорных кнопки;
  8. OLED-дисплей с I2C интерфейсом;
  9. модуль зарядки для liIon;
  10. повышающий DC-DC преобразователь с выходом 5 В.

Схема питания может быть любой, лишь бы хватило Arduino чтобы стартовать. Устройства ввода/вывода — аналогично: прошивка легко может быть адаптирована под те кнопки/дисплеи, что есть в наличии (ссылка на гитхаб — чуть ниже). Текущая версия прошивки написана под OLED-дисплей и сенсорные кнопки (взяты были из соображений «бездребезговости»).

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

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

Она представляет собой катушку и микросхему памяти с двумя контактными площадками по бокам. Выводы катушки припаяны как раз к этим площадкам. Всё это залито тонким слоем эластичного термополимера (по виду и свойствам похожего на застывший клей B7000). Чтобы добыть катушку, я поступил следующим образом. Взяв канцелярский нож, я аккуратно продавил лезвием текстолит между площадками и микросхемой. Микросхему отделил от катушки и выкинул. Затем паяльником я аккуратно (чтобы не отпаять тонкие проводки катушки) сжёг термополимер над контактными площадками, сделав возможным дальнейшую прозвонку.

Прежде чем паять, следует измерить сопротивление катушки, убедившись, что она не в обрыве. Если всё в порядке, то собирать лучше так: сперва припаять SMD-конденсатор к контактным площадкам (он должен аккуратно поместиться между ними), затем — ножки транзистора и под конец — резистор к базе. Всё это можно аккуратно смонтировать в корпус ключа. Провода «земли» и базы транзистора припаивать в последнюю очередь.

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

4. Прошивка, тест и наладка

Как и обещал, ссылка на репозиторий проекта. Файлы прошивки лежат в папке My_125_kHz_spoofer_v.03.

После сборки и заливки прошивки прибор готов к использованию. Чтобы убедиться в его работоспособности, совсем не обязательно искать домофон — можно обойтись китайским модулем для чтения RFID-ключей, который называется RDM6300 и ещё одной платой Arduino (хотя кому что проще). Прошивку для модуля RDM6300, выдающую транслируемый код ключа в том же формате, в каком он внесён в прошивку спуфера, я также положил в репозиторий проекта. Схема подключения ридера — там же.

Порядок тестирования с помощью ридера RDM6300:

  1. Убедиться, что ридер работает, поднеся к антенне любой из имеющихся в наличии ключей на 125 кГц (данные будут выводиться в COM-порт);
  2. Выбрать в меню спуфера интересующий код ключа;
  3. Поднести антенну к ридеру. Если ридер прочёл тот же ключ, что указан в прошивке — всё получилось! Else — проверяем схему, ищем, где ошибка, устраняем её и начинаем с пункта 1.

5. Что в прошивке можно менять, а что — лучше не трогать

Поскольку лепилась прошивка на основе вот этого, не вполне понятного для меня кода, то жизненно-необходимые функции, которые менять нельзя вот прям совсем, я вынес в отдельную вкладку functions.ino. Остальная часть программы служит исключительно для предоставления пользователю комфортной возможности вызвать функцию EmulateCard (ну, и нескольких строчек кода перед ней).

Свои ключи можно добавлять в массив uint64_t universalID[], расположенный на 75 строке кода. Поскольку я не «задефайнил» общее количество ключей в памяти устройства, а некоторые функции завязаны на эту константу, при добавлении своего ключа следует менять также пределы, в которых находится переменная keyNumber, отвечающая за выбор ключа. Ну и не забывать свой ключ в меню добавлять. В общем, всё сыровато, но при желании, повторюсь, разобраться не трудно.

6. Что в приборе можно было бы доработать

  1. Добавить поддержку ключей iButton (хотя бы самых распространённых от Dallas).
  2. Добавить эмуляцию ключей, работающих на частоте 13,5 МГц (как я понял, либо через ношение перезаписываемой заготовки и модуль RC522, либо технически-сложно, через реальную эмуляцию).
  3. Добавить в прибор ридеры iButton, RDM6300 и RC522, чтобы сделать прибор ещё более универсальным.

У кого что получится — пишите о результатах. Сам я к разработке этой игрушки в ближайшее время возвращаться не собираюсь)

7. История создания

Была на дворе осень 2017 года. Будучи студентом второго курса магистратуры, я томился неразрешёнными вопросами самоопределения. Проще говоря, маялся бездельем и искал, чем бы заняться. В итоге решил довести до конца свои старые инженерные проекты в ущерб посещению университета.

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

Днём попасть в подъезд любой многоэтажки труда не составляет никакого — социнженерия из серии «Здравствуйте, соцопрос о качестве работы управляющей компании для название_местной_газеты» отлично работает, да и вообще, в основном жильцы не против, чтобы кто-то заходил в подъезд вместе с ними. Ночью — другое дело. А я любил вылазить на крыши либо на закате, либо ночью… Назрела проблема, которую я и решил вышеописанным способом.

Как я помню, информация о подобных устройствах нашлась не сразу. Гуглёжка по ключевикам «взломщик домофонов» не давала почти ничего. Адекватное стало находиться, когда я чуть-чуть разобрался в технологии RFID, и стал задавать уже более осмысленные вопросы, типа «RFID emulator», «RFID multykey», «RFID spoofer».

В итоге получилось отыскать две приличные англоязычные статьи по теме. В одной автор описывал, как на основе Arduino делался довольно замороченный с аппаратной точки зрения ключик, а во второй — всё то же самое, но без исходников, зато с очень простой аппаратной частью. Справедливо рассудив, что раз и та, и другая схема соединяются с антенной одним пином Arduino, я решил скрестить простое аппаратное решение и открытые исходники. Удалось, пусть и не с первого раза).

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

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

Источник

Adblock
detector