• - это 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

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

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

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