Инструкция по чтению и записи ключа iButton (1-wire) с помощью Arduino
Нам понадобится:
- Ардуино (или совместимая плата);
- персональный компьютер с Arduino IDE или иной средой разработки;
- ключ для домофона типа iButton или 1-wire, копию которого нужно сделать;
- ключ-болванка для создания «клона» оригинального ключа (покупаем здесь);
- 1 резистор сопротивлением 2,2 кОм (вот отличный набор резисторов самых популярных номиналов);
- макетная плата (breadboard);
- соединительные провода (вот такие).
Предназначение дубликатора домофонных ключей
С помощью микроконтроллера Arduino можно копировать домофонный ключ, если случайно его потерял.
RFID – радиочастотная идентификация. Устройство выполняет ту же функцию, что и штрих-код или магнитная полоска на задней стороне кредитной карты. Он предоставляет уникальный идентификатор для этого объекта. И так же, как штрих-код или магнитная полоса, RFID должен быть отсканирован для получения информации.
RFID используется в этом проекте для чтения данных из RFID-меток и отправки информации в энергонезависимую память MCU.
Идентификатор, считываемый из тегов, сравнивается с хранимой информацией, и если он совпадает, то дверь открывается.
3Запись идентификатора ключа Dallasс помощью Arduino
Теперь напишем скетч для записи данных в память ключа iButton.
Скетч записи ключа iButton с помощью Arduino (разворачивается) #include // подключаем библиотеку 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[8]; // массив для хранения данных ключа iButton.read_bytes(data, 8); // считываем данные приложенного ключа, 8х8=64 бита if ( OneWire::crc8(data, 7) != data[7] ) { // проверяем контрольную сумму приложенного ключа Serial.println(«CRC error!»); // если CRC не верна, сообщаем об этом return; // и прерываем программу } if (data[0] & data[1] & data[2] & data[3] & data[4] & data[5] & data[6] & data[7] == 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 довольно прост: сначала нужно проверить «разрешенный» ключ, а затем присвоить тот же номер другому ключевому клону.
Проверяя номер из своей базы данных разрешенных скоростей передачи данных, он откроет дверь. Ключи для внутренней связи, которые мы будем подключать к Arduino дубликатору (иногда называемому iButton или Touch Memory), считываются и записываются в 1-проводной интерфейс. Поэтому схема подключения очень проста.
Корпус и Механическая сборка
Я забацал 3D модель кастомного корпуса для моего дубликатора.
STL-файл для печати 3D модели корпуса и крышки
Распечатанный корпус
3D модель корпуса и крышки .STL
А вот как это напечаталось на 3D принтере. У меня нет принтера, но я нашёл человека через сервис дружественная печать.
Чтобы плата энкодера влезла в корпус ее необходимо немного подпилить напильником с конца, на котором нет дорожек.
Катушку можно взять готовую, например от модуля rdm или купить у китайцев на али на 340 мкГн. Если будете мотать на спичечный короб — это 59 витков.
Вот как выглядит аппарат в сборе.
Создание дубликатора своими руками
ЖК-дисплей имеет 16 контактов, что слишком много для Arduino Nano домофона, поэтому важно иметь адаптер I2C. Это позволяет управлять дисплеем только из двух сигнальных штырей на Ардуино. Это полезно из-за небольшого числа контактов, которые нужно будет контролировать из MCU.
ЖК-контакты
ЖК-дисплеи имеют параллельный интерфейс, а это означает, что MCU должен одновременно управлять несколькими контактами интерфейса для управления дисплеем. В приведенной ниже таблице дается описание каждого из контактов на английском языке:
Спецификация контактов
Для начала сделаем связи между ЖК-дисплеем и I2C. Для этого нужен адаптер ЖК-дисплея I2C (LCD1602). Адаптер преобразует ЖК-дисплей формата 16 x 2 в серийный ЖК-дисплей I2C, которым можно управлять через Arduino всего посредством 2-х проводов.
Соединения между Arduino и LCD
Необходимые Материалы
- Arduino nano
- OLED дисплей
- Энкодер
- Луза
- Пищалка buzzer
- RGB светодиод
- Микро выключатель
- Контакт для батарейки
- Готовая катушка на 340 мкГн (10 шт) и от RDM (1шт)
- 3D модель корпуса STL
- Gerber файл печатной платы
- Кондесатор 4.7 нФ — 1 шт
- Кондесатор 2.2 нФ — 2 шт
- Кондесатор 10 нФ — 1 шт
- Резистор 0.25 Вт, 220 Ом — 3 шт
- Резистор 0.25 Вт, 2.4 кОм — 1 шт
- Резистор 0.25 Вт, 10 кОм — 1 шт
- Резистор 0.25 Вт, 120 кОм — 1 шт
- Резистор 0.25 Вт, 510 кОм — 1 шт
- Диод 1N4148 — 1 шт
- Заготоква rfid-ключа T5557
- Заготовка dallas-ключа RW1990
- Универсальная заготовка для метаком, цифрал и dallas TM-01a
Конденсаторы любые неполярные. Я использовал керамические на 50В.
Аппаратная часть
Для набора кода понадобится библиотека LiquidCrystal_I2C.h в Arduino IDE. Библиотека позволяет подключить ЖК-дисплей к Ардуино. Встроенная библиотека LiquidCrystal_I2C позволяет легко отображать символы на ЖК-дисплее.
Вы можете скачать LiquidCrystal_I2C.h с нашего сайта отсюда, или с Github — https://github.com/todeilatiberia/SmartDoor.
Следуйте приведенным ниже инструкциям, чтобы установить новую библиотеку в свою среду разработки Arduino.
- Сначала загрузите файлы из Github
. - Извлеките из архивов каждую папку.
- Скопируйте ZIP-файлы в папку Ардуино.
- Откройте Ардуино и добавьте Keypad.zip: Меню эскиза -> Включить библиотеку -> Добавить ZIP-библиотеку
- Добавить библиотеку клавиатуры: Эскиз -> Включить библиотеку -> Клавиатура
2Считывание идентификатора ключа iButton с помощью Arduino
Для работы с интерфейсом 1-wire существуют готовые библиотеки для Ардуино. Можно воспользоваться, например, этой. Скачиваем архив и распаковываем в папку /libraries/, расположенную в каталоге Arduino IDE. Теперь мы можем очень просто работать с данным протоколом.
Загрузим в Ардуино стандартным способом этот скетч:
Скетч чтения ключа iButton с помощью Arduino (разворачивается) #include OneWire iButton(10); // создаём объект 1-wire на 10 выводе void setup (void) {
Serial.begin(9600);
} void loop(void) {
delay(1000); // задержка 1 сек byte addr[8]; // массив для хранения данных ключа 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 и скопируем ключ, который вводим с клавиатуры.
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/
Делаем универсальный RFID-ключ для домофонов
Приветствую всех, кого интересует тема электронных ключей-вездеходов. Сам я, по правде сказать, давно не слежу за новостями в этой области. Но свою разработку трёхлетней давности хочу опубликовать, так как она проста в повторении и может быть кому-то интересна. Суть: вместо десятка ключей с кодами-вездеходами и просто кодами, все ключи можно носить в одном небольшом устройстве.
Дисклеймер: повторять — не призываю, за сборку и применение — отвечаете сами, я делюсь информацией исключительно в ознакомительных целях. Например, чтоб помогали компаниям, обслуживающим домофоны, вовремя латать «дыры», если таковые с помощью прибора обнаружатся.
Что это такое? Что умеет?
Устройство, которое я собирал в далёком 2022 году, есть ни что иное, как спуфер домофонного RFID-ключа, работающего на частоте 125 кГц. Слово «спуфер» в данном случае означает, что устройство, по сути ключом не являясь, выдаёт себя за него, и домофоны реагируют на это соответствующе.
Прибор умеет транслировать любые коды ключей, которые записаны в его память. Некоторые коды можно найти в Сети по запросу «ключи-вездеходы», их я вставил в прошивку в первую очередь. Но при некотором навыке и желании можно вставить в прошивку коды вообще всех RFID-ключей, которыми вы пользуетесь (если они работают на частоте 125 кГц), и, таким образом, иметь возможность заменить одним прибором связку брелков.
Я знаю, что на просторе Сети гуляет большое количество схем подобных устройств. Моей целью было создать наипростейший вариант из всех доступных. Удалось или нет — судите сами.
Какими навыками нужно обладать, чтобы повторить данный проект?
Прежде всего, навыки работы с Arduino: иметь установленную среду разработки, уметь заливать в плату прошивки, устанавливать библиотеки, драйверы, вот это вот всё. Далее. Имеется в проекте место, где без пайки — ну вот никак. Потому — нужны прямые руки и паяльник с расходниками. Уметь читать электрические принципиальные схемы (или их подобия). Ну и навыки программирования на C++, дабы иметь возможность кастомизации прибора. Но это уже опционально.
Какие запчасти нужны и как их монтировать?
Не откладывая в долгий ящик — вот схема устройства:
Простите за то, что «не по ГОСТ» — я в drawio рисую, ибо единственная бесплатная и удобная альтернатива Visio, а я сейчас только лицензионный софт использую. Но, полагаю, всё и так предельно понятно.
Как видно, BOM для базовой версии выглядит примерно так:
- Arduino Nano (или любая другая Дуня, которая под рукой есть);
- RFID-ключ формата EM4100 (вместо катушки индуктивности);
- n-p-n транзистор (любой какой отыщется, частоты тут не очень высокие);
- резистор на 10К;
- конденсатор на 560 пФ (лучше SMD, можно прямо в корпус от ключа припаять);
- литий-ионный аккумулятор — по вкусу;
- три сенсорных кнопки;
- OLED-дисплей с I2C интерфейсом;
- модуль зарядки для liIon;
- повышающий DC-DC преобразователь с выходом 5 В.
Схема питания может быть любой, лишь бы хватило Arduino чтобы стартовать. Устройства ввода/вывода — аналогично: прошивка легко может быть адаптирована под те кнопки/дисплеи, что есть в наличии (ссылка на гитхаб — чуть ниже). Текущая версия прошивки написана под OLED-дисплей и сенсорные кнопки (взяты были из соображений «бездребезговости»).
Собрать тестовый образец можно и на беспаечной макетке. Особых инструкций тут не требуется, за исключением того, как быть с «индуктивностью». Об этом — поподробнее.
Ключ, подобный тому, что на фото, можно раздобыть у любого местного мастера, либо заказать на Али. На корпусе ключа имеется крышка, которую следует аккуратно открыть, добравшись до начинки:
Она представляет собой катушку и микросхему памяти с двумя контактными площадками по бокам. Выводы катушки припаяны как раз к этим площадкам. Всё это залито тонким слоем эластичного термополимера (по виду и свойствам похожего на застывший клей B7000). Чтобы добыть катушку, я поступил следующим образом. Взяв канцелярский нож, я аккуратно продавил лезвием текстолит между площадками и микросхемой. Микросхему отделил от катушки и выкинул. Затем паяльником я аккуратно (чтобы не отпаять тонкие проводки катушки) сжёг термополимер над контактными площадками, сделав возможным дальнейшую прозвонку.
Прежде чем паять, следует измерить сопротивление катушки, убедившись, что она не в обрыве. Если всё в порядке, то собирать лучше так: сперва припаять SMD-конденсатор к контактным площадкам (он должен аккуратно поместиться между ними), затем — ножки транзистора и под конец — резистор к базе. Всё это можно аккуратно смонтировать в корпус ключа. Провода «земли» и базы транзистора припаивать в последнюю очередь.
Затем сделать в крышке ключа отверстие под эти провода, и закрыть брелок, придав ему почти что первозданный вид. Для сборки на беспаечной макетке к проводам следует припаять штырьевые разъёмы (или просто хорошенько залудить их, чтобы можно было без проблем вставлять в макетную плату).
Прошивка, тест и наладка
Как и обещал, ссылка на репозиторий проекта. Файлы прошивки лежат в папке My_125_kHz_spoofer_v.03.
После сборки и заливки прошивки прибор готов к использованию. Чтобы убедиться в его работоспособности, совсем не обязательно искать домофон — можно обойтись китайским модулем для чтения RFID-ключей, который называется RDM6300 и ещё одной платой Arduino (хотя кому что проще). Прошивку для модуля RDM6300, выдающую транслируемый код ключа в том же формате, в каком он внесён в прошивку спуфера, я также положил в репозиторий проекта. Схема подключения ридера — там же.
Порядок тестирования с помощью ридера RDM6300:
- Убедиться, что ридер работает, поднеся к антенне любой из имеющихся в наличии ключей на 125 кГц (данные будут выводиться в COM-порт);
- Выбрать в меню спуфера интересующий код ключа;
- Поднести антенну к ридеру. Если ридер прочёл тот же ключ, что указан в прошивке — всё получилось! Else — проверяем схему, ищем, где ошибка, устраняем её и начинаем с пункта 1.
Что в прошивке можно менять, а что — лучше не трогать
Поскольку лепилась прошивка на основе вот этого, не вполне понятного для меня кода, то жизненно-необходимые функции, которые менять нельзя вот прям совсем, я вынес в отдельную вкладку functions.ino. Остальная часть программы служит исключительно для предоставления пользователю комфортной возможности вызвать функцию EmulateCard (ну, и нескольких строчек кода перед ней).
Свои ключи можно добавлять в массив uint64_t universalID[], расположенный на 75 строке кода. Поскольку я не «задефайнил» общее количество ключей в памяти устройства, а некоторые функции завязаны на эту константу, при добавлении своего ключа следует менять также пределы, в которых находится переменная keyNumber, отвечающая за выбор ключа. Ну и не забывать свой ключ в меню добавлять. В общем, всё сыровато, но при желании, повторюсь, разобраться не трудно.
Что в приборе можно было бы доработать
- Добавить поддержку ключей iButton (хотя бы самых распространённых от Dallas).
- Добавить эмуляцию ключей, работающих на частоте 13,5 МГц (как я понял, либо через ношение перезаписываемой заготовки и модуль RC522, либо технически-сложно, через реальную эмуляцию).
- Добавить в прибор ридеры iButton, RDM6300 и RC522, чтобы сделать прибор ещё более универсальным.
У кого что получится — пишите о результатах. Сам я к разработке этой игрушки в ближайшее время возвращаться не собираюсь)
История создания
Была на дворе осень 2022 года. Будучи студентом второго курса магистратуры, я томился неразрешёнными вопросами самоопределения. Проще говоря, маялся бездельем и искал, чем бы заняться. В итоге решил довести до конца свои старые инженерные проекты в ущерб посещению университета.
Погода на дворе стояла просто роскошная. А что может быть лучше, чем прохладной осенней ночью сидеть где-нибудь на крыше многоэтажки, попивая чай из термоса и созерцая суету ночного города под ногами?..
Днём попасть в подъезд любой многоэтажки труда не составляет никакого — социнженерия из серии «Здравствуйте, соцопрос о качестве работы управляющей компании для название_местной_газеты
» отлично работает, да и вообще, в основном жильцы не против, чтобы кто-то заходил в подъезд вместе с ними. Ночью — другое дело. А я любил вылазить на крыши либо на закате, либо ночью… Назрела проблема, которую я и решил вышеописанным способом.
Как я помню, информация о подобных устройствах нашлась не сразу. Гуглёжка по ключевикам «взломщик домофонов» не давала почти ничего. Адекватное стало находиться, когда я чуть-чуть разобрался в технологии RFID, и стал задавать уже более осмысленные вопросы, типа «RFID emulator», «RFID multykey», «RFID spoofer».
В итоге получилось отыскать две приличные англоязычные статьи по теме. В одной автор описывал, как на основе Arduino делался довольно замороченный с аппаратной точки зрения ключик, а во второй — всё то же самое, но без исходников, зато с очень простой аппаратной частью. Справедливо рассудив, что раз и та, и другая схема соединяются с антенной одним пином Arduino, я решил скрестить простое аппаратное решение и открытые исходники. Удалось, пусть и не с первого раза).
На фото в начале данной статьи — далеко не первая версия прибора. Первая была на макетке, и работала через СОМ-порт. Помню, как прохожие всячески давали мне понять, что я выгляжу подозрительно
, когда я с раскрытым ноутом стоял у двери многоэтажного дома, и что-то там пиликал в домофоне.
Затем было несколько более компактных версий, которые я собирал и разбирал ради интереса. Предпоследнюю спёр один из главных героев предыдущей моей статьи. Нынешняя версия была собрана 29 января сего года, в перерыве между уроками, которые я веду в своём кружке. Собрана только с целью убедиться, что я никого не дезинформирую, и прошивка со схемой работают.
Тестирование и настройка готового дубликатора
Для описанного выше проекта понадобится специальный корпус, чтобы аккуратно разместить все компоненты и сохранить их без ущерба.
Можно разработать корпус с использованием программы SketchUp, которая имеет удобный интерфейс с простыми кнопками, такими как Eraser, Lines и Tape Measure Tool.
Размеры коробки составляют: 120 х 125 х 37 мм.
Если вы не знакомы с Sketchup, вам нужно ознакомиться со следующими учебниками SketchUp:
https://www.sketchup.com/learn/videos/58
Коробка для корпуса устройства (вид сверху)
Коробка для корпуса устройства (вид снизу)
Перед разработкой корпуса для проекта необходимо учитывать следующие аспекты:
- Вид сверху: — 2 отверстия для светодиодов (5,2 мм). — 1 для ЖК-дисплея (42,2 × 7,3 мм). — 1 отверстие для кабеля (16 × 10,5 мм).
- Вид снизу: — 1 открытие для клавиатуры (27 × 10 мм).
После этого можно соотнести размеры и построить пластиковый корпус. Причем можно менять дизайн по своему усмотрению.
Полный корпус с модулями, расположенными внутри
4Описание однопроводного интерфейса 1-Wire
Давайте чуть глубже познакомимся с интерфейсом One-wire. По организации он похож на интерфейс I2C: в нём также должно присутствовать ведущее устройство (master), которое инициирует обмен, а также одно или несколько ведомых устройств (slave). Все устройства подключены к одной общей шине. Устройства iButton – всегда ведомые. В качестве мастера чаще всего выступает микроконтроллер или ПК. Скорость передачи данных составляет 16,3 кбит/сек. Шина в состоянии ожидания находится в логической «1» (HIGH). В данном протоколе предусмотрены всего 5 типов сигналов:
- импульс сброса (master)
- импульс присутствия (slave)
- запись бита «0» (master)
- запись бита «1» (master)
- чтение бита (master)
За исключением импульса присутствия все остальные генерирует мастер. Обмен всегда происходит по схеме: 1) Инициализация 2) Команды работы с ПЗУ 3) Команды работы с ППЗУ 4) Передача данных.
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) Передача данных
Продолжение следует…