суббота, 19 февраля 2011 г.

Arduino: изучаем протокол 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 может работать с 1-Wire, используя библиотеку Jim Studt-а – OneWire.

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

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


Далее нужно скачать библиотеку OneWire и поместить её в свою директорию libraries.

Код скетча:

  1. #include <OneWire.h>
  2. /*
  3. * тестируем работу по 1-Wire с ключём-таблеткой DS1990A
  4. */
  5. OneWire ds(10); // на digital pin 10
  6. void setup(void) {
  7. Serial.begin(9600);
  8. }
  9. void loop(void) {
  10. byte i;
  11. byte present = 0;
  12. byte data[12];
  13. byte addr[8];
  14. if ( !ds.search(addr)) {
  15. Serial.print("No more addresses.\n");
  16. ds.reset_search();
  17. return;
  18. }
  19. Serial.print("R=");
  20. for( i = 0; i < 8; i++) {
  21. Serial.print(addr[i], HEX);
  22. Serial.print(" ");
  23. }
  24. if ( OneWire::crc8( addr, 7) != addr[7]) {
  25. Serial.print("CRC is not valid!\n");
  26. return;
  27. }
  28. if ( addr[0] != 0x01) {
  29. Serial.print("Device is not a DS1990A family device.\n");
  30. return;
  31. }
  32. Serial.println();
  33. ds.reset();
  34. delay(1000);
  35. }

Происходит постоянный поиск устройств на линии 1-Wire. Пока ключ не подключён – выдаётся:
No more addresses.
При подключении ключа-таблетки – считывается её номер и выдаётся в COM-порт.
Например, вот что выдаётся при подключении ключа-таблетки, с которого начиналась эта статья:
Первая цифра – номер серии – 01h
Далее, как видим, действительно ключ хранит номер, нанесённый на своём корпусе ;)
Только этот номер выведен наоборот – как и положено по протоколу 1-Wire – начиная с младшего байта ;)
Последний байт –B6h — CRC-код предыдущих байт.
 Ура! Вот мы и считали наш ключ :)

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





14 комментариев:

  1. Забавная машинка) Буду Вас читать.

    ОтветитьУдалить
  2. Очень интересно, я и не знал.

    ОтветитьУдалить
  3. тоже этой темой увлекаюсь, полезная статья

    ОтветитьУдалить
  4. Какая штуковина интересная

    ОтветитьУдалить
  5. Мне больше "пушистые" комменты нравятся.

    ОтветитьУдалить
  6. А это поможет взломать чужой домофон?

    ОтветитьУдалить
  7. не знал столько про ключи от домофонов

    ОтветитьУдалить
  8. Обязательно попробую, всегда хотел узнать принцип работы таких ключей, спасибо.

    ОтветитьУдалить
  9. По поводу вопроса, может ли взломать чужой домофон - читайте следующую статью :-)

    ОтветитьУдалить