Какой дубликатор домофонных ключей лучше?
Содержание:
- Как функционирует дубликатор ключей от домофона
- Как прошивать ключи?
- Описание дубликатора домофонных ключей TMD-5S
- Шаг 4: Соединяем все детали
- Шаг 2: RFID-считыватель RC522
- Создание дубликатора своими руками
- Программная часть
- Шаг 5: Код проекта
- Шаг 3: OLED-дисплей
- 1Схема подключения ключа к Arduinoпо однопроводному интерфейсу
- Бесконтактные копировщики
- 3Запись идентификатора ключа Dallasс помощью Arduino
- Тестирование и настройка готового дубликатора
- Аппаратная часть
- 3Запись идентификатора ключа Dallasс помощью Arduino
- Предназначение дубликатора домофонных ключей
- 2Считывание идентификатора ключа iButton с помощью Arduino
- Производство дубликатора домофонных ключей своими руками
Как функционирует дубликатор ключей от домофона
Копировщик rfid ключей — электронный механизм, позволяющий считывать специальный шифр, записанный на магнитном носителе. Его дубликат в случае утери магнитного ключа легко получить, перезаписав на чистый магнитный носитель.
Чтобы понимать, как работает дубликатор домофонных ключей, нужно обратить внимание на его конструкцию. Внешне механизм похож на корпусный блок с несколькими комплектующими
В его составе есть:
- контактная пластина, обеспечивающая связь ключа со считывающим механизмом;
- приёмная антенна моделей домофонных ключей бесконтактного типа;
- клавиши и кнопки для эффективного управления, помогающие выбирать режим работы, включать и отключать рабочее устройство;
- индикаторы (например, жидкокристаллический экран с отображением символов или световая индикация);
- гнездо, через которое осуществляется питание устройства.
Классический программатор домофонных ключей сконструирован на базе микроконтроллера с несколькими функциональными деталями внутри:
- ячейка памяти;
- устройство, усиливающее сигнал;
- система питания;
- выводы по сигналам, отражающим состояние рабочего устройства.
Принцип работы программатора таков:
- активация микроконтроллера происходит после поступления электропитания на дублирующее устройство, а на его экране появляется один из 2-х возможных режимов: ожидание/выбор программы;
- электронный чип подносят к устройству и активируют приём сигнала специальной кнопкой;
- происходит считывание последовательного сигнального кода с помощью контроллера с последующей его записью в памяти;
- далее прибор для копирования домофонных ключей должен записать считанный сигнал на чистую магнитную «таблетку» и для этого её подносят непосредственно к устройству;
- с помощью дубликатора закодированный сигнал в нужной последовательности записывается в память магнитного носителя.
Все вышеперечисленные действия реализуются всего за несколько секунд. Чтобы проверить корректность записанного сигнала, чип тестируют непосредственно на домофоне.
Как прошивать ключи?
Многие чипы для домофонов выполнены в форме таблетки. Чтобы дверь открылась, поверхность «таблетки» прикладывается к считывающему устройству. Внутри такого механизма отсутствует магнитное поле, а функционирует прибор за счёт энергонезависимой памяти. Символы цифрового шифра вводятся в неё в определённой последовательности. Перезапись ключей такого типа происходит при помощи дубликатора tmd, считывающего шифр и воссоздающего его на базе чистого ключа. Система RFID устроена таким образом, что передаёт шифр при помощи определённой радиочастоты.
Схема чипа содержит колебательный контур, при активации которого информация из памяти через пространство передаётся на считывающий механизм. Сигнал, вызывающий колебания контура, поступает непосредственно с дубликатора или домофонной антенны. Дальнейший принцип копирования шифра в память и его воспроизведение оттуда происходит по аналогии с функционированием классического контактного устройства. Единственный отрицательный аспект заключается в том, что дубликатор прописывает в памяти только конкретный тип цифрового сигнала. Но есть и универсальные устройства, которые можно настроить на взаимодействие с любым видом цифровых данных.
Описание дубликатора домофонных ключей TMD-5S
Функциональный дубликатор, который собрал в себя все полезные функции других приборов.Поддерживает максимальное колличество типов ключей и заготовок.
Записная книга на 1000 записей, архив на 10.000 записей, лимиты и счетчики, связь с планшетом или смартфоном для ведения базы любого объема. Встроенный аккумулятор. Позволяет изменять параметры ТМ01А, RW15, устанавливать и снимать пароль для T55x7 без использования программы.Дубликатор основан на современной элементной базе с применением контроллера нового поколения ARM Cortex-M4, имеет большой резерв ресурсов для роста функциональных возможностей путём обновления программного обеспечения. Также имеет большой ресурс для увеличения функциональных возможностей при помощи обновления операционной системы.
Прибор использует продвинутый контроллер «ARM Cortex M4», и имеет большую базу для апгрейда ПО и функциональных опций. Обновление прошивки возможно при помощи компьютера или смартфона. Есть возможность менять параметры ТМ01А и RW15, убирать параль для T55x7.
TMD-5S работает со следующими форматами:
- ТМ: Cyfral, Metakom, Dallas, КТ-01 (трёхвыводные);
- RFID 125 кГц: Urmet, EM-Marin, HID26, HID34, HID37, Indala, Electra, PAC;
- RFID 13,56 МГц: Mifare Classic, Mifare Ultralight, «Техком» (в т.ч. защищенные от копирования), Factorial, iCode.
TMD-5S поддеживает запись на заготовки:
- контактные TM08v2 (RW1990), ТМ08 Vi-х, RW1990.2, TM01х, RW15, TM2004, RW1.1, RW2017, KC-07;
- квадратные трехвыводные КТ-01 (опционально);
- универсальные MegaKey, Key-99;
- RFID 125 кГц: H1, T55x7 (H2), EM4305 (H3), OTP, i57v2, H5.5, H7;
- RFID 13,56 МГц: MF ZERO, MF OTP, MF OTP 2.0, MF UL, MF UL2, MF UL3, UL-X, TKRF, TKRF-v2, FK-3, iCode;
- Возможность чтения/записи EEPROM ключей DS1996 и TM2004
Технические особенности программатора TMD-5S:
- работает с: Windows, MacOs, Linux и в мобильных устройствах с ОС Android или iOS.
- Для iOS поддерживаются iPhone 4S и выше, с версией системы не ниже 8.
- Для устройств на базе Android требуется версия не ниже 4.3, так же должна присутствовать поддержка Bluetooth v4.
- Обновление прошивки доступно через ПК (через программу iKeyBase) и через смартфон.
- Копирование «Факториал» на заготовку FK-3 возможно не для всех домофонов, зависит от прошивки панели.
- Запись копий ключей типа Mifare Ultralight осуществляется простым чтением оригинала и записью копии на заготовку.
- При копирования ключей типа Mifare Classic возможен поиск криптоключа для последующего чтения данных (заменяет приставку ACR122U).
- Если закрыты все сектора, то необходимо устройство SMKey и выход к домофону для получения данных от считывателя.
Шаг 4: Соединяем все детали
Связь с платой Arduino Uno очень проста. Сначала подключим питание как считывателя, так и дисплея.
Будьте осторожны, считыватель RFID должен быть подключен к выходу 3,3 В от Arduino Uno или он будет испорчен.
Так как дисплей также может работать на 3,3 В, мы подключаем VCC от обоих модулей к положительной шине макета. Затем эта шина подключается к выходу 3,3 В от Arduino Uno. После чего соединяем обе земли (GND) с шиной заземления макета. Затем мы соединяем GND-шину макета с Arduino GND.
OLED-дисплей → Arduino
VCC → 3.3V
GND → GND
SCL → Аналоговый Pin 5
SDA → Аналоговый Pin 4
RFID-ридер → Arduino
RST → Цифровой Pin 9
IRQ → Не соединен
MISO → Цифровой Pin 12
MOSI → Цифровой Pin 11
SCK → Цифровой Pin 13
SDA → Цифровой Pin 10
Модуль RFID-считывателя использует интерфейс SPI для связи с Arduino. Поэтому мы собираемся использовать аппаратные штыри SPI от Arduino UNO.
Вывод RST поступает на цифровой контакт 9. Контакт IRQ остается несвязным. Контакт MISO подключается к цифровому выходу 12. Штырь MOSI идет на цифровой контакт 11. Контакт SCK переходит на цифровой контакт 13, и, наконец, вывод SDA идет на цифровой вывод 10. Вот и все.
Считыватель RFID подключен. Теперь нам нужно подключить OLED-дисплей к Arduino, используя интерфейс I2C. Таким образом, вывод SCL на дисплее переходит к аналоговому выводу Pin 5 и SDA на дисплее к аналоговому Pin 4. Если теперь мы включим проект и разместим RFID-карту рядом с ридером, мы увидим, что проект работает нормально.
Шаг 2: RFID-считыватель RC522
В каждой метке RFID есть небольшой чип (на фото белая карточка). Если направить фонарик на эту RFID-карту, можно увидеть маленький чип и катушку, которая его окружает. У этого чипа нет батареи для получения мощности. Он получает питание от считывателя беспроводным образом используя эту большую катушку. Можно прочитать RFID-карту, подобную этой, с расстояния до 20 мм.
Тот же чип существует и в тегах RFID-брелка.
Каждый тег RFID имеет уникальный номер, который идентифицирует его. Это UID, который показывается на OLED-дисплее. За исключением этого UID, каждый тег может хранить данные. В этом типе карт можно хранить до 1 тысячи данных. Впечатляет, не так ли? Эта функция не будет использована сегодня. Сегодня все, что интересует, — это идентификация конкретной карты по ее UID. Стоимость RFID-считывателя и этих двух карт RFID составляет около 4 долларов США.
Создание дубликатора своими руками
ЖК-дисплей имеет 16 контактов, что слишком много для Arduino Nano домофона, поэтому важно иметь адаптер I2C. Это позволяет управлять дисплеем только из двух сигнальных штырей на Ардуино
Это полезно из-за небольшого числа контактов, которые нужно будет контролировать из MCU.
ЖК-контакты
ЖК-дисплеи имеют параллельный интерфейс, а это означает, что MCU должен одновременно управлять несколькими контактами интерфейса для управления дисплеем. В приведенной ниже таблице дается описание каждого из контактов на английском языке:
Спецификация контактов
Для начала сделаем связи между ЖК-дисплеем и I2C. Для этого нужен адаптер ЖК-дисплея I2C (LCD1602). Адаптер преобразует ЖК-дисплей формата 16 x 2 в серийный ЖК-дисплей I2C, которым можно управлять через Arduino всего посредством 2-х проводов.
Соединения между Arduino и LCD
Программная часть
Мы подключим клавиатуру для отображения номеров на ЖК-дисплее для Arduino и скопируем ключ, который вводим с клавиатуры.
Keypad.h – это библиотека, которая позволяет Arduino читать клавиатуру с матричным типом.
В этом проекте используется клавиатура 4 × 4.
В таблице показано соединение между платой Arduino и клавиатурой. Штыри клавиатуры подключены к цифровым выходным выводам Arduino. Pin D6 использовался для зуммера, потому что это был штырь ШИМ.
Вывод клавиатуры | Контакт Arduino |
---|---|
1 | D2 |
2 | D3 |
3 | D4 |
4 | D5 |
5 | A0 |
6 | D7 |
7 | D8 |
Соединение между Arduino, LCD и клавиатуройЖК-дисплей и клавиатура, подключенные к Arduino
Затем добавим RFID. В этом случае плата RFID использует протокол связи SPI, где Arduino будет действовать, как ведущий и считыватель RFID в качестве подчиненного. Считыватель карт и теги предназначены для связи с частотой, равной 13,56 МГц.
Это важный шаг, поскольку он помогает нам считывать данные с карты, и он будет решать, соответствует ли идентификатор информации, хранящейся в EEPROM. Если он соответствует, он даст нам доступ и отобразит «Unlocked». В противном случае на ЖК-дисплее отобразится «Заблокировано».
Соединение между Arduino, LCD и RFIDДомофон на Ардуино, LCD и RFID
Следующий шаг – добавить зуммер и 2 светодиода для имитации системы контролируемого доступа. Ознакомьтесь с приведенной ниже диаграммой. Зуммер установлен так, что он гудит всякий раз, когда мы получаем доступ (разблокирован). Красный светодиод всегда горит, когда он заблокирован, но зеленый светодиод загорается, когда он разблокирован.
Чтобы защитить модули, нужно использовать 3D-печать корпуса. Если у вас нет 3D-принтера, вы можете просто использовать пластиковый корпус, который позволяет вам вставлять все компоненты внутрь. Это очень полезно, потому что модули будут размещены внутри, а единственными частями вне коробки будут светодиоды, клавиатура и ЖК-дисплей.
Схема соединений, показывающая соединение между Nano, LCD, клавиатурой, RFID и звуковым сигналом
www.deviceplus.com/how-tos/arduino-guide/make-your-own-arduino-rfid-door-lock/
Шаг 5: Код проекта
Чтобы код проекта был скомпилирован, нам нужно включить некоторые библиотеки. Прежде всего, нам нужна библиотека MFRC522 Rfid.
Чтобы установить её, перейдите в Sketch -> Include Libraries -> Manage libraries (Управление библиотеками). Найдите MFRC522 и установите её.
Нам также нужна библиотека Adafruit SSD1306 и библиотека Adafruit GFX для отображения.
Установите обе библиотеки. Библиотека Adafruit SSD1306 нуждается в небольшой модификации. Перейдите в папку Arduino -> Libraries, откройте папку Adafruit SSD1306 и отредактируйте библиотеку Adafruit_SSD1306.h. Закомментируйте строку 70 и раскомментируйте строку 69, т.к. дисплей имеет разрешение 128×64.
Сначала мы объявляем значение метки RFID, которую должен распознать Arduino. Это массив целых чисел:
int code[] = {69,141,8,136}; // UID
Затем мы инициализируем считыватель RFID и дисплей:
rfid.PCD_Init(); display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
После этого в функции цикла мы проверяем тег на считывателе каждые 100 мс.
Если на считывателе есть тег, мы читаем его UID и печатаем его на дисплее. Затем мы сравниваем UID тега, который мы только что прочитали, со значением, которое хранится в кодовой переменной. Если значения одинаковы, мы выводим сообщение UNLOCK, иначе мы не будем отображать это сообщение.
if(match) { Serial.println("\nI know this card!"); printUnlockMessage(); }else { Serial.println("\nUnknown Card"); }
Конечно, вы можете изменить этот код, чтобы сохранить более 1 значения UID, чтобы проект распознал больше RFID-меток. Это просто пример.
Код проекта:
#include <MFRC522.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <SPI.h> #define OLED_RESET 4 Adafruit_SSD1306 display(OLED_RESET); #define SS_PIN 10 #define RST_PIN 9 MFRC522 rfid(SS_PIN, RST_PIN); // Instance of the class MFRC522::MIFARE_Key key; int code[] = {69,141,8,136}; //This is the stored UID int codeRead = 0; String uidString; void setup() { Serial.begin(9600); SPI.begin(); // Init SPI bus rfid.PCD_Init(); // Init MFRC522 display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3D (for the 128x64) // Clear the buffer. display.clearDisplay(); display.display(); display.setTextColor(WHITE); // or BLACK); display.setTextSize(2); display.setCursor(10,0); display.print("RFID Lock"); display.display(); } void loop() { if( rfid.PICC_IsNewCardPresent()) { readRFID(); } delay(100); } void readRFID() { rfid.PICC_ReadCardSerial(); Serial.print(F("\nPICC type: ")); MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak); Serial.println(rfid.PICC_GetTypeName(piccType)); // Check is the PICC of Classic MIFARE type if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI && piccType != MFRC522::PICC_TYPE_MIFARE_1K && piccType != MFRC522::PICC_TYPE_MIFARE_4K) { Serial.println(F("Your tag is not of type MIFARE Classic.")); return; } clearUID(); Serial.println("Scanned PICC's UID:"); printDec(rfid.uid.uidByte, rfid.uid.size); uidString = String(rfid.uid.uidByte)+" "+String(rfid.uid.uidByte)+" "+String(rfid.uid.uidByte)+ " "+String(rfid.uid.uidByte); printUID(); int i = 0; boolean match = true; while(i<rfid.uid.size) { if(!(rfid.uid.uidByte == code)) { match = false; } i++; } if(match) { Serial.println("\nI know this card!"); printUnlockMessage(); }else { Serial.println("\nUnknown Card"); } // Halt PICC rfid.PICC_HaltA(); // Stop encryption on PCD rfid.PCD_StopCrypto1(); } void printDec(byte *buffer, byte bufferSize) { for (byte i = 0; i < bufferSize; i++) { Serial.print(buffer < 0x10 ? " 0" : " "); Serial.print(buffer, DEC); } } void clearUID() { display.setTextColor(BLACK); // or BLACK); display.setTextSize(1); display.setCursor(30,20); display.print(uidString); display.display(); } void printUID() { display.setTextColor(WHITE); // or BLACK); display.setTextSize(1); display.setCursor(0,20); display.print("UID: "); display.setCursor(30,20); display.print(uidString); display.display(); } void printUnlockMessage() { display.display(); display.setTextColor(BLACK); // or BLACK); display.setTextSize(2); display.setCursor(10,0); display.print("RFID Lock"); display.display(); display.setTextColor(WHITE); // or BLACK); display.setTextSize(2); display.setCursor(10,0); display.print("Unlocked"); display.display(); delay(2000); display.setTextColor(BLACK); // or BLACK); display.setTextSize(2); display.setCursor(10,0); display.print("Unlocked"); display.setTextColor(WHITE); // or BLACK); display.setTextSize(2); display.setCursor(10,0); display.print("RFID Lock"); display.display(); }
Шаг 3: OLED-дисплей
В уроке используется OLED-монитор 0.96′ 128×64 I2C.
Это очень хороший дисплей для использования с Arduino. Это дисплей OLED и это означает, что он имеет низкое энергопотребление. Потребляемая мощность этого дисплея составляет около 10-20 мА, и это зависит от количества пикселей.
Дисплей имеет разрешение 128 на 64 пикселя и имеет крошечный размер. Существует два варианта отображения. Один из них монохромный, а другой, как тот, который использован в уроке, может отображать два цвета: желтый и синий. Верхняя часть экрана может быть только желтой, а нижняя часть — синей.
Этот OLED-дисплей очень яркий и у него отличная и очень приятная библиотека, которую разработала компания Adafruit для этого дисплея. В дополнение к этому дисплей использует интерфейс I2C, поэтому соединение с Arduino невероятно простое.
Вам нужно только подключить два провода, за исключением Vcc и GND. Если вы новичок в Arduino и хотите использовать недорогой и простой дисплей в вашим проекте, начните с этого.
1Схема подключения ключа к Arduinoпо однопроводному интерфейсу
Каждый ключ для домофона имеет свой номер – именно этот номер и служит идентификатором ключа. Именно по номеру ключа домофон решает – свой или чужой. Поэтому алгоритм копирования такой: сначала нужно узнать номер разрешённого ключа, а затем присвоить этот номер другому ключу – клону. Для домофона нет разницы, был приложен оригинальный ключ или его копия. Сверив номер со своей базой данных разрешённых номеров, он откроет дверь.
Ключи для домофона, которые мы будем подключать к Arduino (их иногда называют iButton или Touch Memory), считываются и записываются по однопроводному интерфейсу 1-wire. Поэтому схема подключения очень проста. Нам нужны лишь пара проводов и подтягивающий резистор номиналом 2,2 кОм. Схема соединений показана на рисунке.
Схема подключения ключа iButton к Arduino по интерфейсу 1-wire
Собранная схема может выглядеть примерно так:
Схема для чтения ключа Dallas на Arduino
Бесконтактные копировщики
Бесконтактные дубликаторы представлены 3-мя модификациями.
- Программаторы tmd, формирующие стандарт радиочастотной идентификации Indala, HID, EM-Marin.
- Дубликаторы, сочетающиеся с устройствами стандарта ТКРФ и ТЕХ-КОМ.
- Копировальщики, которые поддерживают стандарт Mifare.
Универсальные механизмы программирования
Программировать дубликаты ключей можно на универсальных устройствах. С их помощью можно не только создать копию цифрового ключа, но и получить набор дополнительных полезных функций:
- база памяти;
- возможность обновления;
- генерация символьных шифров.
Обновляющая функция позволяет подстраивать программную базу под новые, оригинальные модификации чипов, чтобы в дальнейшем устройство могло делать их дубликаты. База памяти обеспечивает возможность создавать дубликаты ключей без наличия оригинального устройства. Код ключа попадает во встроенную базу после первой же прошивки. В дальнейшем его можно будет найти и использовать для создания других дубликатов.
Генерирование кодов помогает записывать оригинальные символьные шифры на домофонный ключ. Такой вариант подходит для крупных корпораций, сотрудники которых получают на руки ключ с уникальным шифром для открывания дверей. Он позволяет проконтролировать время и число посещений конкретным человеком производственных объектов.
3Запись идентификатора ключа Dallasс помощью Arduino
Теперь напишем скетч для записи данных в память ключа iButton.
Скетч записи ключа iButton с помощью Arduino (разворачивается)
#include <OneWire.h> // подключаем библиотеку const int pin = 10; // объявляем номер пина OneWire iButton(pin); // объявляем объект OneWire на 10-ом пине // номер ключа, который мы хотим записать в iButton: byte key_to_write[] = { 0x01, 0xF6, 0x75, 0xD7, 0x0F, 0x00, 0x00, 0x9A }; void setup(void) { Serial.begin(9600); pinMode(pin, OUTPUT); } void loop(void) { delay(1000); // задержка на 1 сек iButton.reset(); // сброс устройства 1-wire delay(50); iButton.write(0x33); // отправляем команду "чтение" byte data; // массив для хранения данных ключа iButton.read_bytes(data, 8); // считываем данные приложенного ключа, 8х8=64 бита if ( OneWire::crc8(data, 7) != data ) { // проверяем контрольную сумму приложенного ключа Serial.println("CRC error!"); // если CRC не верна, сообщаем об этом return; // и прерываем программу } if (data & data & data & data & data & data & data & data == 0xFF) { return; // если ключ не приложен к считывателю, прерываем программу и ждём, пока будет приложен } Serial.print("Start programming..."); // начало процесса записи данных в ключ for (int i = 0; i } // Инициализация записи данных в ключ-таблетку iButton: void send_programming_impulse() { digitalWrite(pin, HIGH); delay(60); digitalWrite(pin, LOW); delay(5); digitalWrite(pin, HIGH); delay(50); }
Не забудьте задать номер своего оригинального ключа в массиве key_to_write, который мы узнали ранее.
Загрузим этот скетч в Arduino. Откроем монитор последовательного порта (Ctrl+Shift+M). Подключим к схеме ключ, который будет клоном оригинального ключа. О результате программирования монитор последовательного порта выведет соответствующее сообщение.
Если данный скетч не сработал, попробуйте заменить код после Serial.print(«Start programming…») и до конца функции loop() на следующий:
Дополнительный скетч записи ключа iButton с помощью Arduino (разворачивается)
delay (200); iButton.skip(); iButton.reset(); iButton.write(0x33); // чтение текущего номера ключа Serial.print("ID before write:"); for (byte i=0; i<8; i++){ Serial.print(' '); Serial.print(iButton.read(), HEX); } Serial.print("\n"); iButton.skip(); iButton.reset(); iButton.write(0xD1); // команда разрешения записи digitalWrite(pin, LOW); pinMode(pin, OUTPUT); delayMicroseconds(60); pinMode(pin, INPUT); digitalWrite(pin, HIGH); delay(10); // выведем ключ, который собираемся записать: Serial.print("Writing iButton ID: "); for (byte i=0; i<8; i++) { Serial.print(key_to_write, HEX); Serial.print(" "); } Serial.print("\n"); iButton.skip(); iButton.reset(); iButton.write(0xD5); // команда записи for (byte i=0; i<8; i++) { writeByte(key_to_write); Serial.print("*"); } Serial.print("\n"); iButton.reset(); iButton.write(0xD1); // команда выхода из режима записи digitalWrite(pin, LOW); pinMode(pin, OUTPUT); delayMicroseconds(10); pinMode(pin, INPUT); digitalWrite(pin, HIGH); delay(10); Serial.println("Success!"); delay(10000);
Здесь функция writeByte() будет следующей:
int writeByte(byte data) { int data_bit; for(data_bit=0; data_bit<8; data_bit++) { if (data & 1) { digitalWrite(pin, LOW); pinMode(pin, OUTPUT); delayMicroseconds(60); pinMode(pin, INPUT); digitalWrite(pin, HIGH); delay(10); } else { digitalWrite(pin, LOW); pinMode(pin, OUTPUT); pinMode(pin, INPUT); digitalWrite(pin, HIGH); delay(10); } data = data >> 1; } return 0; }
Временную диаграмму работы скетча записи идентификатора ключа показывать бессмысленно, т.к. она длинная и не поместится на рисунке. Однако файл *.logicdata для программы логического анализатора прикладываю в конце статьи.
Ключи для домофона бывают разных типов. Данный код подойдёт не для всех ключей, а только для RW1990 или RW1990.2. Программирование ключей других типов может привести к выходу ключей из строя!
При желании можно переписать программу для ключа другого типа. Для этого воспользуйтесь техническим описанием Вашего типа ключа (datasheet) и изменить скетч в соответствии с описанием. Скачать datasheet для ключей iButton можно в приложении к статье.
Кстати, некоторые современные домофоны читают не только идентификатор ключа, но и другую информацию, записанную на оригинальном ключе. Поэтому сделать клон, скопировав только номер, не получится. Нужно полностью копировать данные ключа.
Тестирование и настройка готового дубликатора
Для описанного выше проекта понадобится специальный корпус, чтобы аккуратно разместить все компоненты и сохранить их без ущерба.
Можно разработать корпус с использованием программы SketchUp, которая имеет удобный интерфейс с простыми кнопками, такими как Eraser, Lines и Tape Measure Tool.
Размеры коробки составляют: 120 х 125 х 37 мм.
Если вы не знакомы с Sketchup, вам нужно ознакомиться со следующими учебниками SketchUp:
http://www.sketchup.com/learn/videos/58
Коробка для корпуса устройства (вид сверху)Коробка для корпуса устройства (вид снизу)
Перед разработкой корпуса для проекта необходимо учитывать следующие аспекты:
-
Вид сверху:
— 2 отверстия для светодиодов (5,2 мм).
— 1 для ЖК-дисплея (42,2 × 7,3 мм).
— 1 отверстие для кабеля (16 × 10,5 мм). -
Вид снизу:
— 1 открытие для клавиатуры (27 × 10 мм).
После этого можно соотнести размеры и построить пластиковый корпус. Причем можно менять дизайн по своему усмотрению.
Полный корпус с модулями, расположенными внутри
Аппаратная часть
Для набора кода понадобится библиотека LiquidCrystal_I2C.h в Arduino IDE. Библиотека позволяет подключить ЖК-дисплей к Ардуино. Встроенная библиотека LiquidCrystal_I2C позволяет легко отображать символы на ЖК-дисплее.
Следуйте приведенным ниже инструкциям, чтобы установить новую библиотеку в свою среду разработки Arduino.
- Сначала загрузите файлы из Github.
- Извлеките из архивов каждую папку.
- Скопируйте ZIP-файлы в папку Ардуино.
- Откройте Ардуино и добавьте Keypad.zip:Меню эскиза -> Включить библиотеку -> Добавить ZIP-библиотеку
- Добавить библиотеку клавиатуры:Эскиз -> Включить библиотеку -> Клавиатура
3Запись идентификатора ключа Dallasс помощью Arduino
Теперь напишем скетч для записи данных в память ключа iButton.
Скетч записи ключа iButton с помощью Arduino (разворачивается)
#include <OneWire.h> // подключаем библиотеку const int pin = 10; // объявляем номер пина OneWire iButton(pin); // объявляем объект OneWire на 10-ом пине // номер ключа, который мы хотим записать в iButton: byte key_to_write[] = { 0x01, 0xF6, 0x75, 0xD7, 0x0F, 0x00, 0x00, 0x9A }; void setup(void) { Serial.begin(9600); pinMode(pin, OUTPUT); } void loop(void) { delay(1000); // задержка на 1 сек iButton.reset(); // сброс устройства 1-wire delay(50); iButton.write(0x33); // отправляем команду "чтение" byte data; // массив для хранения данных ключа iButton.read_bytes(data, 8); // считываем данные приложенного ключа, 8х8=64 бита if ( OneWire::crc8(data, 7) != data ) { // проверяем контрольную сумму приложенного ключа Serial.println("CRC error!"); // если CRC не верна, сообщаем об этом return; // и прерываем программу } if (data & data & data & data & data & data & data & data == 0xFF) { return; // если ключ не приложен к считывателю, прерываем программу и ждём, пока будет приложен } Serial.print("Start programming..."); // начало процесса записи данных в ключ for (int i = 0; i } // Инициализация записи данных в ключ-таблетку iButton: void send_programming_impulse() { digitalWrite(pin, HIGH); delay(60); digitalWrite(pin, LOW); delay(5); digitalWrite(pin, HIGH); delay(50); }
Не забудьте задать номер своего оригинального ключа в массиве key_to_write, который мы узнали ранее.
Загрузим этот скетч в Arduino. Откроем монитор последовательного порта (Ctrl+Shift+M). Подключим к схеме ключ, который будет клоном оригинального ключа. О результате программирования монитор последовательного порта выведет соответствующее сообщение.
Если данный скетч не сработал, попробуйте заменить код после Serial.print(«Start programming…») и до конца функции loop() на следующий:
Дополнительный скетч записи ключа iButton с помощью Arduino (разворачивается)
delay (200); iButton.skip(); iButton.reset(); iButton.write(0x33); // чтение текущего номера ключа Serial.print("ID before write:"); for (byte i=0; i<8; i++){ Serial.print(' '); Serial.print(iButton.read(), HEX); } Serial.print("\n"); iButton.skip(); iButton.reset(); iButton.write(0xD1); // команда разрешения записи digitalWrite(pin, LOW); pinMode(pin, OUTPUT); delayMicroseconds(60); pinMode(pin, INPUT); digitalWrite(pin, HIGH); delay(10); // выведем ключ, который собираемся записать: Serial.print("Writing iButton ID: "); for (byte i=0; i<8; i++) { Serial.print(key_to_write, HEX); Serial.print(" "); } Serial.print("\n"); iButton.skip(); iButton.reset(); iButton.write(0xD5); // команда записи for (byte i=0; i<8; i++) { writeByte(key_to_write); Serial.print("*"); } Serial.print("\n"); iButton.reset(); iButton.write(0xD1); // команда выхода из режима записи digitalWrite(pin, LOW); pinMode(pin, OUTPUT); delayMicroseconds(10); pinMode(pin, INPUT); digitalWrite(pin, HIGH); delay(10); Serial.println("Success!"); delay(10000);
Здесь функция writeByte() будет следующей:
int writeByte(byte data) { int data_bit; for(data_bit=0; data_bit<8; data_bit++) { if (data & 1) { digitalWrite(pin, LOW); pinMode(pin, OUTPUT); delayMicroseconds(60); pinMode(pin, INPUT); digitalWrite(pin, HIGH); delay(10); } else { digitalWrite(pin, LOW); pinMode(pin, OUTPUT); pinMode(pin, INPUT); digitalWrite(pin, HIGH); delay(10); } data = data >> 1; } return 0; }
Временную диаграмму работы скетча записи идентификатора ключа показывать бессмысленно, т.к. она длинная и не поместится на рисунке. Однако файл *.logicdata для программы логического анализатора прикладываю в конце статьи.
Ключи для домофона бывают разных типов. Данный код подойдёт не для всех ключей, а только для RW1990 или RW1990.2. Программирование ключей других типов может привести к выходу ключей из строя!
При желании можно переписать программу для ключа другого типа. Для этого воспользуйтесь техническим описанием Вашего типа ключа (datasheet) и изменить скетч в соответствии с описанием. Скачать datasheet для ключей iButton можно в приложении к статье.
Кстати, некоторые современные домофоны читают не только идентификатор ключа, но и другую информацию, записанную на оригинальном ключе. Поэтому сделать клон, скопировав только номер, не получится. Нужно полностью копировать данные ключа.
Предназначение дубликатора домофонных ключей
С помощью микроконтроллера Arduino можно копировать домофонный ключ, если случайно его потерял.
RFID – радиочастотная идентификация. Устройство выполняет ту же функцию, что и штрих-код или магнитная полоска на задней стороне кредитной карты. Он предоставляет уникальный идентификатор для этого объекта. И так же, как штрих-код или магнитная полоса, RFID должен быть отсканирован для получения информации.
RFID используется в этом проекте для чтения данных из RFID-меток и отправки информации в энергонезависимую память MCU.
Идентификатор, считываемый из тегов, сравнивается с хранимой информацией, и если он совпадает, то дверь открывается.
2Считывание идентификатора ключа iButton с помощью Arduino
Для работы с интерфейсом 1-wire существуют готовые библиотеки для Ардуино. Можно воспользоваться, например, этой. Скачиваем архив и распаковываем в папку /libraries/, расположенную в каталоге Arduino IDE. Теперь мы можем очень просто работать с данным протоколом.
Загрузим в Ардуино стандартным способом этот скетч:
Скетч чтения ключа iButton с помощью Arduino (разворачивается)
#include <OneWire.h> OneWire iButton(10); // создаём объект 1-wire на 10 выводе void setup (void) { Serial.begin(9600); } void loop(void) { delay(1000); // задержка 1 сек byte addr; // массив для хранения данных ключа if ( !iButton.search(addr) ) { // если ключ не приложен Serial.println("No key connected..."); // сообщаем об этом return; // и прерываем программу } Serial.print("Key : "); for(int i=0; i}
Данный скетч показывает номер ключа для домофона, который подключён к схеме. Это то, что нам и нужно сейчас: мы должны узнать номер ключа, копию которого хотим сделать. Подключим Ардуино к компьютеру. Запустим монитор последовательного порта: Инструменты Монитор последовательного порта (или сочетание клавиш Ctrl+Shift+M).
Теперь подключим ключ к схеме. Монитор порта покажет номер ключа. Запомним этот номер.
Запоминаем номер ключа iButton, выводимый в монитор последовательного порта
А вот какой обмен происходит на однопроводной линии при чтении идентификатора ключа (подробнее – далее):
Диаграмма взаимодействия ключа Dallas с Arduino по однопроводному интерфейсу (1-wire)
На рисунке, конечно, не видны все детали реализации. Поэтому в конце статьи я прикладываю временную диаграмму в формате *.logicdata , снятую с помощью логического анализатора и программы Saleae Logic Analyzer и открываемую ей же. Программа бесплатная и скачивается с официального сайта Saleae. Чтобы открыть файл *.logicdata нужно запустить программу, нажать сочетание Ctrl+O или в меню Options (расположено вверху справа) выбрать пункт Open capture / setup.
Производство дубликатора домофонных ключей своими руками
Копировальщик домофонных ключей при желании можно изготовить своими руками. Для этой цели понадобится микроконтроллер Ардуино. Чтобы изготовить такое устройство, потребуется следующий комплект устройств:
- модуль Arduino Nano, на который будет осуществляться запись информации, и её дальнейшая обработка;
- плата RFID RC522, предназначенная для считывания кодов модуля и перераспределения информации в микроконтроллер;
- LED элементы для монитора (2 шт.);
- резисторы величиной 330 Ом;
- клавиатурный блок 4*4;
- ЖК экран LCD16X2BL;
- адаптер для ЖК дисплея I2C (LCM1602), преобразующий монитор в формат совместимости с модулем Arduino Nano;
- пьезоэлектрический зуммер.
ЖК дисплей объединён с контактной группой адаптера с помощью 16 контактов с нумерацией на каждом из модулей.
От модуля rf ID RC522 отходят несколько проводков разного цвета к адаптеру монитора:
- чёрный — к контакту GND;
- красный — к контакту VCC (+).
Провода, обеспечивающие управление, припаиваются в контактам SCL и SDA. LED механизмы объединяют с резисторами ограничения тока.