Сегодня мы познакомимся с интересным протоколом и даже сразу попробуем поработать с устройством, использующим этот протокол. «Как?» — спросите Вы – «мне не нужно будет покупать детали в радиомагазине?»
«Нет» — отвечу я :) С большой долей вероятности, Вы пользуетесь устройством 1-Wire и, возможно, даже не догадываетесь об этом :) Это всего-навсего – ключ-таблетка от домофона ()!
Неужели?
Достанем ключи из кармана и примемся их пристально разглядывать :)
У меня контактная площадка сильно затёрта, но какие-то надписи проглядывают.
Потёр площадку фломастером и становится видна заветная надпись:
Ага! 1-Wire!
Так что же это за интерфейс?
Это однопроводной интерфейс, разработан фирмой Dallas Semiconductor (ныне MAXIM) в конце 90-х годов.
Этот интерфейс интересен тем, что для двустороннего обмена требуется всего одна линия! (отсюда и название :)
Подробнее об интерфейсе .
Возвращаемся к нашему ключу :) На самой таблетке указан тип устройства и, похоже, уникальный номер микросхемы ;)
DS1990A – это и есть название нашего устройства.
Смотрим
Наш ключ — это самая первая модель в списке :) DS1990A — 64 Bit ID — уникальный серийный номер-ключ
Страничка этого ключика , а можно скачать датащит ;)
Число после # определяет форм-фактор ключа – у меня F5.
Итак, наш ключ хранит 64 бита уникальной информации
Питается от 2.8V до 6.0V
К центральной контактной площадке подключается линия данных, а к боковой каёмке – землю.
Ключ может работать в диапазоне температур от -40°C до +85°C – впрочем, это нам не нужно :)
Читаем датащит далее :)
Величина подтягивающего резистора рекомендуется в 2.2k
Так… запомним :)
Каждый DS1990A прошивается уникальным 64-битным номером
первые 8 бит — номер серии устройства (01h)
следующие 48 бит — уникальный серийный номер
последние 8 бит — CRC-код предыдущих 56 бит информации :)
(Cyclic redundancy code, — циклический избыточный код) — способ цифровой идентификации некоторой последовательности данных, который заключается в вычислении контрольного значения её циклического избыточного кода.
Далее в датащите перечислены команды, которые понимает ключ: 33h — считать ROM — команда позволяет считать заветные 64-бита данных ключа F0h — поиск ROM — т.к. к сети 1-wire может быть подключено несколько устройств данная команда используется для идентификации подключённых устройств. 55h — соответствие ROM / CCh — пропуск ROM
— данные команды входят в минимальный набор необходимых команд 1-wire-устройств. Т.к. в ключе DS1990A эти команды не требуются — он на них не отвечает.
Arduino//Freeduino может работать с 1-Wire, используя библиотеку Jim Studt-а – .
Настало время пообщаться с нашим ключиком! :)
Схема подключения – крайне проста (это ведь 1-Wire! :)
Далее нужно и поместить её в свою директорию libraries.
Код скетча:
#include <OneWire.h>
/*
* тестируем работу по 1-Wire с ключём-таблеткой DS1990A
*/
OneWire ds(10); // на digital pin 10
void setup(void) {
Serial.begin(9600);
}
void loop(void) {
byte i;
byte present = 0;
byte data[12];
byte addr[8];
if ( !ds.search(addr)) {
Serial.print("No more addresses.\n");
ds.reset_search();
return;
}
Serial.print("R=");
for( i = 0; i < 8; i++) {
Serial.print(addr[i], HEX);
Serial.print(" ");
}
if ( OneWire::crc8( addr, 7) != addr[7]) {
Serial.print("CRC is not valid!\n");
return;
}
if ( addr[0] != 0x01) {
Serial.print("Device is not a DS1990A family device.\n");
return;
}
Serial.println();
ds.reset();
delay(1000);
}
Происходит постоянный поиск устройств на линии 1-Wire. Пока ключ не подключён – выдаётся:
No more addresses.
При подключении ключа-таблетки – считывается её номер и выдаётся в COM-порт.
Например, вот что выдаётся при подключении ключа-таблетки, с которого начиналась эта статья:
Первая цифра – номер серии – 01h
Далее, как видим, действительно ключ хранит номер, нанесённый на своём корпусе ;)
Только этот номер выведен наоборот – как и положено по протоколу 1-Wire – начиная с младшего байта ;)
Последний байт –B6h — CRC-код предыдущих байт.
Ура! Вот мы и считали наш ключ :)
Теперь можно самостоятельно сделать замок для комнаты или разблокировать свой компьютер по ключу :) Фантазируем :)
Читать далее:
Cсылки на материалы:
— данная замечательная статья использовалась при написании заметки об интерфейсе 1-Wire
я об этом напишу в следующей статье :) но сразу хочу анонсировать, что обычный брут-форс не получится :(
однако, на некоторых домофонах есть другая возможность ;)
Почемуто после создания папки libraries и копирования в неё папки с библиотекой OneWire выдает ошибку
21: error: OneWire.h: No such file or directory In function 'void loop()':
Если же в #include прописать полный путь #include <C:\\arduino-0017\lib\OneWire\OneWire.h>
Выдает ошибку
C:\DOCUME~1\snk\LOCALS~1\Temp\build2355.tmp/_1wire.cpp:46: undefined reference to `OneWire::reset()'
Ещё вопрос почему в serial monitor пишет чтото вроде
R=0 0 0 0 0 0 0 0 Device is not a DS1990A family device.
R=0 0 0 0 0 0 0 80 CRC is not valid!
R=0 0 0 0 0 8 0 40 CRC is not valid!
Причина может быть в том, что вместо 2,2 ком взял 2 ком?
В какое именно зазмление на плане arduino нужно втыкать провод?
У меня почти также пишет:
R=1 5D 9B 9 B 0 0 CC Device is not a DS18S20 family device.
R=1 5D 9B 9 B 0 0 CC Device is not a DS18S20 family device.
R=1 5D 9B 9 B 0 0 CC Device is not a DS18S20 family device.
но для разных ключей разные цифры. такое ощущение что он ключ видит, но почемуто считает его неправильным.
Есть хорошее . Там же есть код для микроконтроллеров PIC — от кнопки iButton. Кстати, разобравшись в особенностях работы протокола, можно создавать небольшие (или большие — кому как) сети 1-Wire устройств — сети Microwire — а это уже интересней.
Использовал резистор 2.7 ком. Всё хорошо читается, но заметил такую особенность: на монитор выводятся
не все нули. На таблетке написано 3A 00 00 12 A1 A3 03 01, а на монитор выводится 13 A3 A1 12 00 3A.
Почему так?
Забыл сказать, данные я вывожу не на СОМ порт, а на LCD дисплей, подключенный к Arduino,
без промежутков между байтами, командой LCD.print. И именно по этому отсутствие ноликов удручает.
А почему в данном примере считывается и выводится не содержание ПЗУ, а его адрес? Разве читать сам ROM не нужно?
Кстати, у моего ключа, CRC8 почему-то равна последнему байту адреса. (Возможно, совпадение...)
Помогите не могу никак разобраться! У меня Ардиуно Мега 1280 и ни одна из двух библиотек OneWire не работает! — все отлично компилируется и записывает в ардуину, но ключи не считываются! Все время повторяется надпись No more addresses. Кто знает в чем может быть дело? может есть какое то несоостветствие в номерах выводов на плате, но как узнать что чему соовтетсвтует???
А какой ключик использовали? Ключи от домофонов Цифрал и Визит не подходят. У них собственный протокол, отличный от DS1990A! Если пробовать их, то как раз и будет постоянно надпись No more addresses. Хотя иногда может и прочитать все нули и выдать ошибку. Нужно использовать только оригинальные ключи DS1990A или их ПОЛНЫЙ аналог…
Комментарии (20)
RSS свернуть / развернутьjbrain
admin
Oboroten
однако, на некоторых домофонах есть другая возможность ;)
admin
21: error: OneWire.h: No such file or directory In function 'void loop()':
Если же в #include прописать полный путь #include <C:\\arduino-0017\lib\OneWire\OneWire.h>
Выдает ошибку
C:\DOCUME~1\snk\LOCALS~1\Temp\build2355.tmp/_1wire.cpp:46: undefined reference to `OneWire::reset()'
Подскажите что делать?
snicksnk
noonv
R=0 0 0 0 0 0 0 0 Device is not a DS1990A family device.
R=0 0 0 0 0 0 0 80 CRC is not valid!
R=0 0 0 0 0 8 0 40 CRC is not valid!
Причина может быть в том, что вместо 2,2 ком взял 2 ком?
В какое именно зазмление на плане arduino нужно втыкать провод?
snicksnk
В землю — в любую — они гальванически связаны.
noonv
R=1 5D 9B 9 B 0 0 CC Device is not a DS18S20 family device.
R=1 5D 9B 9 B 0 0 CC Device is not a DS18S20 family device.
R=1 5D 9B 9 B 0 0 CC Device is not a DS18S20 family device.
но для разных ключей разные цифры. такое ощущение что он ключ видит, но почемуто считает его неправильным.
mogalkov
PICengine
не все нули. На таблетке написано 3A 00 00 12 A1 A3 03 01, а на монитор выводится 13 A3 A1 12 00 3A.
Почему так?
sambor
Обратите внимание на скриншот, приведённый в статье ;)
просто print не дополняет нулями слева :)
noonv
sambor
noonv
Так или иначе спасибо за совет.
sambor
без промежутков между байтами, командой LCD.print. И именно по этому отсутствие ноликов удручает.
sambor
Кстати, у моего ключа, CRC8 почему-то равна последнему байту адреса. (Возможно, совпадение...)
Ogogon.
ogogon
Alec
Vladis
TrueNow
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.