Дубликат ключей на arduino

Дубликатор ключей домофона rfid и ibutton на ардуино

Делаем дубликатор домофонных ключей на Arduino. Схема для изготовления. Идеи корпуса + видео по изготовлению.

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

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

Нужно просто узнать номер-идентификатор оригинального ключа и присвоить его дубликату. Система домофона будет распознавать такой ключ как «свой» и произведет открывание двери.

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

Ниже поэтапно будут рассмотрены все действия, посредством которых, за минимальное время можно самостоятельно изготовить дубликат своего ключа к домофону. Данный вариант дубликатора работает с болванками контактного типа RW1990 и бесконтактного RFID T5577, T5557.

Подробнее в видео

Источник

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 разъёмом!

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

Источник

Как сделать копию ключа для домофона в домашних условиях

С помощью Ардуино можно сделать дома копию ключа для домофона за 15 минут, если, к примеру, мастерская закрыта, а ключ нужен срочно.

Инструкция по чтению и записи ключа iButton (1-wire) с помощью Arduino
  • Ардуино (или совместимая плата);
  • персональный компьютер с Arduino IDE или иной средой разработки;
  • ключ для домофона типа iButton или 1-wire, копию которого нужно сделать;
  • ключ-болванка для создания «клона» оригинального ключа (покупаем здесь);
  • 1 резистор сопротивлением 2,2 кОм (вот отличный набор резисторов самых популярных номиналов);
  • макетная плата (breadboard);
  • соединительные провода (вот такие).

1 Схема подключения ключа к Arduinoпо однопроводному интерфейсу

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

Ключи для домофона, которые мы будем подключать к Arduino (их иногда называют iButton или Touch Memory), считываются и записываются по однопроводному интерфейсу 1-wire. Поэтому схема подключения очень проста. Нам нужны лишь пара проводов и подтягивающий резистор номиналом 2,2 кОм. Схема соединений показана на рисунке.

Схема подключения ключа iButton к Arduino по интерфейсу 1-wire

Собранная схема может выглядеть примерно так:

Схема для чтения ключа Dallas на Arduino

2 Считывание идентификатора ключа iButton с помощью Arduino

Для работы с интерфейсом 1-wire существуют готовые библиотеки для Ардуино. Можно воспользоваться, например, этой. Скачиваем архив и распаковываем в папку /libraries/, расположенную в каталоге Arduino IDE. Теперь мы можем очень просто работать с данным протоколом.

Загрузим в Ардуино стандартным способом этот скетч:

Скетч чтения ключа iButton с помощью Arduino (разворачивается)

Данный скетч показывает номер ключа для домофона, который подключён к схеме. Это то, что нам и нужно сейчас: мы должны узнать номер ключа, копию которого хотим сделать. Подключим Ардуино к компьютеру. Запустим монитор последовательного порта: Инструменты Монитор последовательного порта (или сочетание клавиш Ctrl+Shift+M ).

Теперь подключим ключ к схеме. Монитор порта покажет номер ключа. Запомним этот номер.

Запоминаем номер ключа iButton, выводимый в монитор последовательного порта

А вот какой обмен происходит на однопроводной линии при чтении идентификатора ключа (подробнее – далее):

Диаграмма взаимодействия ключа Dallas с Arduino по однопроводному интерфейсу (1-wire)

На рисунке, конечно, не видны все детали реализации. Поэтому в конце статьи я прикладываю временную диаграмму в формате *.logicdata , снятую с помощью логического анализатора и программы Saleae Logic Analyzer и открываемую ей же. Программа бесплатная и скачивается с официального сайта Saleae. Чтобы открыть файл *.logicdata нужно запустить программу, нажать сочетание Ctrl+O или в меню Options (расположено вверху справа) выбрать пункт Open capture / setup.

3 Запись идентификатора ключа Dallasс помощью Arduino

Теперь напишем скетч для записи данных в память ключа iButton.

Скетч записи ключа iButton с помощью Arduino (разворачивается)

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

Загрузим этот скетч в Arduino. Откроем монитор последовательного порта ( Ctrl+Shift+M ). Подключим к схеме ключ, который будет клоном оригинального ключа. О результате программирования монитор последовательного порта выведет соответствующее сообщение.

Если данный скетч не сработал, попробуйте заменить код после Serial.print(«Start programming. «) и до конца функции loop() на следующий:

Дополнительный скетч записи ключа iButton с помощью Arduino (разворачивается)

Здесь функция writeByte() будет следующей:

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

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

При желании можно переписать программу для ключа другого типа. Для этого воспользуйтесь техническим описанием Вашего типа ключа (datasheet) и изменить скетч в соответствии с описанием. Скачать datasheet для ключей iButton можно в приложении к статье.

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

4 Описание однопроводного интерфейса 1-Wire

1) Инициализация

Инициализация заключается в том, что ведущий выставляет условие сброса RESET (на время от 480 мкс или более опускает линию в «0», а затем отпускает её, и за счёт подтягивающего резистора линия поднимается в состояние «1»), а ведомый не позднее чем через 60 мкс после этого должен подтвердить присутствие, также опустив линию в «0» на 60…240 мкс и затем освободив её:

Инициализация: сигнал сброса и подтверждения протокола 1-wire

2) Команды работы с ПЗУ

Если после импульса инициализации не пришёл сигнал подтверждения, мастер повторяет опрос шины. Если сигнал подтверждения пришёл, то мастер понимает, что на шине есть устройство, которое готово к обмену, и посылает ему одну из четырёх 8-битных команд работы с ПЗУ:

Название Команда Назначение
Чтение (Read ROM ) 0x33 Мастер считывает 64 первых битов iButton, в которых содержатся: 8 бит кода семейства (*), 48 бит серийного номера и 8 бит контрольной суммы.
Совпадение (Match ROM) 0x55 Обращение к определённому устройству с известным 64-битным номером.
Поиск (Search ROM) 0xF0 Позволяет определить все 64-битные номера ведомых устройств, подключённых к шине.
Пропуск (Skip ROM) 0xCC Позволяет сэкономить время обмена данными с ключом благодаря тому, что мастер пропускает проверку серийного номера. Не рекомендуется к использованию в ситуации, когда на линии присутствуют несколько ведомых.

(*) Кстати, семейств устройств iButton существует довольно много, некоторые из них перечислены в таблице ниже.

Коды семейств устройств типа iButton (разворачивается)

Код семейства Устройства iButton Описание
0x01 DS1990A, DS1990R, DS2401, DS2411 Уникальный серийный номер-ключ
0x02 DS1991 Мультиключ, 1152-битная защищённая EEPROM
0x04 DS1994, DS2404 4 кб NV RAM + часы, таймер и будильник
0x05 DS2405 Одиночный адресуемый ключ
0x06 DS1993 4 кб NV RAM
0x08 DS1992 1 кб NV RAM
0x09 DS1982, DS2502 1 кб PROM
0x0A DS1995 16 кб NV RAM
0x0B DS1985, DS2505 16 кб EEPROM
0x0C DS1996 64 кб NV RAM
0x0F DS1986, DS2506 64 кб EEPROM
0x10 DS1920, DS1820, DS18S20, DS18B20 Датчик температуры
0x12 DS2406, DS2407 1 кб EEPROM + двухканальный адресуемый ключ
0x14 DS1971, DS2430A 256 бит EEPROM и 64 бита PROM
0x1A DS1963L 4 кб NV RAM + счётчик циклов записи
0x1C DS28E04-100 4 кб EEPROM + двухканальный адресуемый ключ
0x1D DS2423 4 кб NV RAM + внешний счётчик
0x1F DS2409 Двухканальный адресуемый ключ с возможностью коммутации на возвратную шину
0x20 DS2450 Четырёхканальный АЦП
0x21 DS1921G, DS1921H, DS1921Z Термохронный датчик с функцией сбора данных
0x23 DS1973, DS2433 4 кб EEPROM
0x24 DS1904, DS2415 Часы реального времени
0x26 DS2438 Датчик температуры, АЦП
0x27 DS2417 Часы реального времени с прерыванием
0x29 DS2408 Двунаправленный 8-разрядный порт ввода/вывода
0x2C DS2890 Одноканальный цифровой потенциометр
0x2D DS1972, DS2431 1 кб EEPROM
0x30 DS2760 Датчик температуры, датчик тока, АЦП
0x37 DS1977 32 кб защищённой паролем EEPROM
0x3A DS2413 Двухканальный адресуемый коммутатор
0x41 DS1922L, DS1922T, DS1923, DS2422 Термохронные и гигрохронные датчики высокого разрешения с функцией сбора данных
0x42 DS28EA00 Цифровой термометр с программируемым разрешением, возможностью работать в режиме подключения к последовательному каналу и программируемыми портами ввода/вывода
0x43 DS28EC20 20 кб EEPROM

Данные передаются последовательно, бит за битом. Передачу каждого бита инициирует ведущее устройство. При записи ведущий опускает линию к нулю и удерживает её. Если время удерживания линии равно 1…15 мкс, значит записывается бит «1». Если время удерживания от 60 мкс и выше – записывается бит «0».

Чтение битов также инициируется мастером. В начале чтения каждого бита мастер устанавливает низкий уровень на шине. Если ведомое устройство хочет передать «0», оно удерживает шину в состоянии LOW на время от 60 до 120 мкс, а если хочет передать «1», то на время примерно 15 мкс. После этого ведомый отпускает линию, и за счёт подтягивающего резистора она возвращается в состояние HIGH.

Вот так, например, выглядит временная диаграмма команды поиска Search ROM (0xF0). Красным цветом на диаграмме отмечены команды записи битов. Обратите внимание на порядок следования битов при передаче по 1-Wire: старший бит справа, младший – слева.

Временная диаграмма отправки команды поиск (0xF0) ведомому iButton

Далее, если предшествующей командой подразумевается работа с ППЗУ (чтение и запись из перезаписываемой памяти ключа Dallas), то мастер передаёт команду работы с ППЗУ.

3) Команды работы с ППЗУ

Прежде чем рассматривать команды для работы с ППЗУ iButton, необходимо пару слов сказать о структуре памяти ключа. Память разделена на 4 равных участка: три из них предназначены для хранения трёх уникальных ключей, а четвёртый – для временного хранения данных. Этот временный буфер служит своеобразным черновиком, где данные готовятся для записи ключей.

Структура памяти ключа iButton

Для работы с ППЗУ существуют 6 команд:

Название Команда Назначение
Записать во временный буфер (Write Scratchpad) 0x96 Используется для записи данных во временный буфер (scratchpad).
Прочитать из временного буфера (Read Scratchpad) 0x69 Используется для чтения данных из временного буфера.
Копировать из временного буфера (Copy Scratchpad) 0x3C Используется для передачи данных, подготовленных во временном буфере, в выбранный ключ.
Записать пароль ключа (Write Password) 0x5A Используется для записи пароля и уникального идентификатора выбранного ключа (одного из трёх).
Записать ключ (Write SubKey) 0x99 Используется для непосредственной записи данных в выбранный ключ (минуя временный буфер).
Прочитать ключ (Read SubKey) 0x66 Используется для чтения данных выбранного ключа.

4) Передача данных

5 Возможные ошибки при компиляции скетча

1) Если при компиляции скетча возникнет ошибка WConstants.h: No such file or directory #include «WConstants.h», то, как вариант, следует в файле OneWire.cpp заменить первый блок после комментариев на следующий:

2) Если при компиляции появляется ошибка class OneWire has no member named read_bytes, то найдите и попробуйте использовать другую библиотеку для работы с интерфейсом OneWire.

Источник

Adblock
detector