• - это CraftDuino - наш вариант полностью Arduino-совместимой платы.
  • CraftDuino - настоящий конструктор, для очень быстрого прототипирования и реализации идей.
  • Любая возможность автоматизировать что-то с лёгкостью реализуется с CraftDuino!
Просто добавьте CraftDuino!
подписаться на RSS-ленту

Практическое программирование Arduino/CraftDuino - протокол 1-Wire и iButton

Сегодня мы познакомимся с интересным протоколом 1-Wire и даже сразу попробуем поработать с устройством, использующим этот протокол. «Как?» — спросите Вы – «мне не нужно будет покупать детали в радиомагазине?»
«Нет» — отвечу я :) С большой долей вероятности, Вы пользуетесь устройством 1-Wire и, возможно, даже не догадываетесь об этом :) Это всего-навсего – ключ-таблетка от домофона (iButton)!

Неужели?
Достанем ключи из кармана и примемся их пристально разглядывать :)
У меня контактная площадка сильно затёрта, но какие-то надписи проглядывают.

Потёр площадку фломастером и становится видна заветная надпись:

iButton.com
00000F67CE41
1-Wire
0744 UB1 DS1990A#F5


Ага! 1-Wire!
Так что же это за интерфейс?
Это однопроводной интерфейс, разработан фирмой Dallas Semiconductor (ныне MAXIM) в конце 90-х годов.

Этот интерфейс интересен тем, что для двустороннего обмена требуется всего одна линия! (отсюда и название :)

Подробнее об интерфейсе здесь.

Возвращаемся к нашему ключу :) На самой таблетке указан тип устройства и, похоже, уникальный номер микросхемы ;)

DS1990A – это и есть название нашего устройства.

Смотрим варианты iButton-ов на сайте производителя
Наш ключ — это самая первая модель в списке :)
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, CRC — циклический избыточный код) — способ цифровой идентификации некоторой последовательности данных, который заключается в вычислении контрольного значения её циклического избыточного кода.


Далее в датащите перечислены команды, которые понимает ключ:
33h — считать ROM — команда позволяет считать заветные 64-бита данных ключа
F0h — поиск ROM — т.к. к сети 1-wire может быть подключено несколько устройств данная команда используется для идентификации подключённых устройств.
55h — соответствие ROM / CCh — пропуск ROM
— данные команды входят в минимальный набор необходимых команд 1-wire-устройств. Т.к. в ключе DS1990A эти команды не требуются — он на них не отвечает.

Arduino/CraftDuino/Freeduino может работать с 1-Wire, используя библиотеку Jim Studt-а – OneWire.

Настало время пообщаться с нашим ключиком! :)

Схема подключения – крайне проста (это ведь 1-Wire! :)

Далее нужно скачать библиотеку OneWire и поместить её в свою директорию 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-код предыдущих байт.

Ура! Вот мы и считали наш ключ :)

Теперь можно самостоятельно сделать замок для комнаты или разблокировать свой компьютер по ключу :) Фантазируем :)

Читать далее: Arduino/CraftDuino и эмулятор iButton.

Cсылки на материалы:
Интерфейс 1-Wire — данная замечательная статья использовалась при написании заметки об интерфейсе 1-Wire

iButton
варианты iButton
Understanding and Using Cyclic Redundancy Checks with Maxim iButton Products

внутренности iButton

http://en.wikipedia.org/wiki/1-Wire
http://ru.wikipedia.org/wiki/Фантомное_питание
http://ru.wikipedia.org/wiki/Порядок_байтов
http://ru.wikipedia.org/wiki/CRC
библиотека Jim Studt-аOneWire для Arduino
  • +4
  • 6 декабря 2009, 16:10
  • admin

Комментарии (9)

RSS свернуть / развернуть
+
+1
ага, т.е. таким образом можно и сделать обратную операцию? сообщить в домофон код ключа посредством ардуино?
avatar

jbrain

  • 7 декабря 2009, 01:30
+
0
разумеется :) про это в следующей статье ;)
avatar

admin

  • 7 декабря 2009, 10:11
+
0
И сколько времени понадобится для подбора неизвестного ключа?)
avatar

Oboroten

  • 12 декабря 2009, 12:53
+
0
я об этом напишу в следующей статье :) но сразу хочу анонсировать, что обычный брут-форс не получится :(
однако, на некоторых домофонах есть другая возможность ;)
avatar

admin

  • 12 декабря 2009, 14:39
+
0
Почемуто после создания папки 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()'

Подскажите что делать?

avatar

snicksnk

  • 13 июля 2010, 14:26
+
0
в Вашем случае библиотеку нужно поместить в каталог
arduino-0017\hardware\libraries\
avatar

noonv

  • 13 июля 2010, 14:36
+
0
Ещё вопрос почему в 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 нужно втыкать провод?
avatar

snicksnk

  • 14 июля 2010, 00:20
+
0
резистор 2-2.2к, по идее, не должен так сильно влиять.
В землю — в любую — они гальванически связаны.
avatar

noonv

  • 14 июля 2010, 09:59
+
0
У меня почти также пишет:
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.

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

mogalkov

  • 14 июля 2010, 21:46

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.