ГлавнаяАкадемияДатчики и входы: нормализация сигналов → Основы протокола 1-Wire: общая шина, уникальные адреса, 'паразитное' питание

Основы протокола 1-Wire: общая шина, уникальные адреса, 'паразитное' питание

Урок · Датчики и входы: нормализация сигналов · 30 мин · theory

Введение в 1-Wire: Топология и ключевые особенности

Протокол 1-Wire — это стандарт последовательной связи, разработанный компанией Dallas Semiconductor (в настоящее время является частью Maxim Integrated, дочерней компании Analog Devices). Его основная и самая узнаваемая черта, давшая ему название, — это возможность передачи данных и питания по единственной сигнальной линии относительно общего провода (GND). Это делает его чрезвычайно эффективным решением для создания распределенных сетей сбора данных, особенно на объектах, где прокладка большого количества кабелей нежелательна или экономически нецелесообразна.

Концепция «Одного Провода»

Несмотря на название, для работы 1-Wire шины требуется как минимум два физических проводника:

  • DATA (Данные): Сигнальная линия, по которой в обе стороны (от мастера к ведомым и обратно) передаются данные. В режиме «паразитного» питания эта же линия используется для подачи энергии на ведомые устройства.
  • GND (Земля): Общий провод, служащий опорным уровнем напряжения для линии данных.
  • В наиболее распространенной и надежной конфигурации используется третий провод — VDD (Питание), который обеспечивает отдельное, стабильное питание для ведомых устройств. Таким образом, в зависимости от схемы подключения, 1-Wire сеть может быть двух- или трехпроводной, но во всех случаях обмен данными происходит по одной-единственной линии.

    Топология «Общая Шина»

    Ключевой архитектурной особенностью протокола является топология «общая шина» (common bus). Это означает, что все ведомые (Slave) устройства подключаются к одной и той же линии данных параллельно. Ведущее устройство (Master), роль которого выполняет контроллер HI, управляет всей коммуникацией на шине.

    Такой подход дает несколько значительных преимуществ:

    > ℹ️ Информация: Мастер-контроллер инициирует все транзакции на шине. Два ведомых устройства не могут общаться друг с другом напрямую. Мастер последовательно опрашивает каждое устройство, запрашивая у него данные или отправляя команду.

    Области применения на платформе HI

    Протокол 1-Wire идеально подходит для задач, не требующих высокой скорости передачи данных, но выигрывающих от простоты развертывания. На типовых объектах автоматизации под управлением контроллера HI, 1-Wire чаще всего используется для:

    Благодаря встроенной поддержке на уровне операционной системы и аппаратных интерфейсов, контроллер HI позволяет эффективно и надежно работать с 1-Wire устройствами, делая их отличным выбором для инсталляторов.

    ---

    Уникальная адресация и обнаружение устройств

    Главная проблема любой шинной топологии — как обратиться к конкретному устройству, если все они «сидят» на одном проводе? Протокол 1-Wire решает эту задачу с помощью строгой и элегантной системы адресации.

    Каждое без исключения 1-Wire устройство покидает завод с вшитым в него уникальным 64-битным идентификатором, также известным как ROM ID или адрес. Этот адрес является неизменяемым на протяжении всего срока службы устройства и гарантированно не повторяется ни в одном другом 1-Wire устройстве в мире. Это достигается за счет огромного адресного пространства (2^48 уникальных серийных номеров).

    Структура 64-битного адреса

    Уникальный адрес состоит из трех частей:

    | Часть Адреса | Размер | Описание |

    | ----------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------- |

    | Код семейства (Family Code) | 8 бит | Определяет тип и функциональность устройства. Например, `0x28` — это код семейства для датчиков температуры DS18B20. |

    | Серийный номер | 48 бит | Уникальный номер устройства внутри его семейства. Гарантирует глобальную уникальность адреса. |

    | Контрольная сумма (CRC) | 8 бит | Значение, рассчитанное на основе первых 56 бит (код семейства + серийный номер). Используется для проверки целостности адреса. |

    Пример адреса для датчика DS18B20: `28-00000557AD3A`

    Процедура обнаружения (Search ROM)

    Когда контроллер HI (мастер) инициализирует шину, он не знает, какие устройства к ней подключены. Чтобы их обнаружить, он запускает специальную процедуру, называемую «поиск по шине» (Search ROM). Это сложный итеративный алгоритм, в ходе которого мастер бит за битом выясняет адреса всех присутствующих на шине устройств. В результате этой процедуры мастер получает полный список уникальных ROM ID всех подключенных ведомых.

    Имея этот список, контроллер может инициировать целевую коммуникацию. Перед тем как запросить, например, температуру, мастер сначала отправляет на шину специальную команду "Match ROM", за которой следует 64-битный адрес конкретного датчика. После этого все остальные устройства на шине будут игнорировать последующие команды, и только то устройство, чей адрес совпал, вступит в диалог с мастером.

    Адреса в файловой системе Linux

    На контроллерах HI, работающих под управлением ОС Debian, драйвер `w1` предоставляет доступ к 1-Wire устройствам через виртуальную файловую систему `sysfs`. Это чрезвычайно удобный механизм для диагностики и интеграции.

    Все обнаруженные устройства появляются в виде директорий в каталоге `/sys/bus/w1/devices/`.

    # Пример листинга директории с 1-Wire устройствами
    

    $ ls -l /sys/bus/w1/devices/

    total 0

    lrwxrwxrwx 1 root root 0 Dec 10 14:00 28-01203207b81f -> ../../../devices/w1_bus_master1/28-01203207b81f

    lrwxrwxrwx 1 root root 0 Dec 10 14:00 28-0120325f85e4 -> ../../../devices/w1_bus_master1/28-0120325f85e4

    lrwxrwxrwx 1 root root 0 Dec 10 14:00 w1_bus_master1 -> ../../../devices/w1_bus_master1

    В данном примере мы видим:

    Имя директории формируется из кода семейства и серийного номера, что позволяет инженеру однозначно идентифицировать каждое физическое устройство в системе.

    ---

    Схемы подключения: Стандартное и «Паразитное» питание

    Правильный выбор схемы подключения является одним из ключевых факторов, определяющих надежность работы 1-Wire шины. Существует два основных способа подключения: стандартный (3-проводной) и «паразитный» (2-проводной).

    Стандартное (нормальное) подключение

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

    При такой схеме датчик получает стабильное и непрерывное питание, что критически важно для его корректной работы, особенно в моменты преобразования данных (например, когда DS18B20 измеряет температуру), которые являются энергозатратными.

    ASCII-схема стандартного подключения (WIRING-SENS-1WIRE-001):
                     [CTRL:HI-Core]                  (SENS:Temp:DS18B20)
    

    Клемма Цвет

    +3.3V ---------------------- (Красный) ------------------- VDD

    DATA --+------------------- (Желтый) -------------------- DQ

    |

    | | 4.7kΩ (Подтяжка)

    |

    +3.3V --+

    GND ---------------------- (Черный) -------------------- GND

    > 💡 Подсказка: Обратите внимание на подтягивающий резистор (pull-up resistor) номиналом около 4.7 кОм между линией DATA и линией питания VDD. Он необходим для поддержания высокого уровня на шине, когда ни одно устройство не передает данные. На контроллерах HI этот резистор обычно уже встроен в схему 1-Wire интерфейса.

    «Паразитное» питание

    Эта схема позволяет сэкономить один провод, исключая линию VDD. Устройства получают энергию непосредственно от линии данных.

    Принцип работы:
  • Когда на шине нет обмена данными, мастер удерживает линию DATA в высоком логическом состоянии (подтягивает к питанию).
  • Ведомое устройство использует это напряжение на линии данных для зарядки своего внутреннего небольшого конденсатора.
  • В моменты, когда устройство должно выполнить энергозатратную операцию (например, измерить температуру), оно питается от энергии, накопленной в этом конденсаторе.
  • В это время линия данных может использоваться для передачи сигналов, но мастер должен обеспечить достаточно длительные паузы с высоким уровнем для "подзарядки" конденсаторов устройств.
  • ASCII-схема паразитного подключения (WIRING-SENS-1WIRE-002):
                     [CTRL:HI-Core]                  (SENS:Temp:DS18B20)
    

    Клемма Цвет

    DATA --+------------------- (Желтый) -------------------- DQ

    |

    | | 4.7kΩ (Подтяжка)

    |

    +3.3V --+

    GND ---------------------- (Черный) ---+---------------- GND

    |

    +---------------- VDD (на датчике)

    Обратите внимание, что на стороне датчика его выводы VDD и GND соединяются и подключаются к общему проводу шины.

    Сравнение и практические рекомендации

    | Критерий | Стандартное подключение (3 провода) | «Паразитное» питание (2 провода) |

    | -------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------- |

    | Надежность | Высокая. Стабильное питание исключает большинство проблем. | Средняя/Низкая. Чувствительно к длине шины и количеству устройств. |

    | Длина шины | До 100 метров и более при качественном кабеле и правильной топологии. | Обычно не более 20-30 метров. |

    | Кол-во устройств | Десятки устройств (ограничено емкостью шины). | Рекомендуется не более 5-7 устройств. |

    | Диагностика | Проще. Проблемы обычно связаны с целостностью сигнала, а не с питанием. | Сложнее. Нестабильная работа может быть вызвана "просадками" питания. |

    | Стоимость кабеля | Незначительно выше. | Незначительно ниже. |

    > ⚠️ Внимание: Паразитное питание не рекомендуется для длинных шин (>20 м) и при количестве устройств более 5-7. Нестабильность питания может приводить к «отваливанию» датчиков и ошибкам CRC, которые трудно диагностировать и которые могут проявляться спорадически, например, при изменении температуры окружающей среды. Для всех профессиональных инсталляций на объектах заказчика всегда используйте стандартную 3-проводную схему. Экономия на одном проводе не оправдывает риски нестабильной работы всей системы.

    ---

    Практика: Поиск и чтение данных с датчика в Linux

    Теперь рассмотрим, как на практике выполнить обнаружение и чтение данных с датчика температуры DS18B20, подключенного к контроллеру HI. Для этого мы будем использовать интерфейс командной строки (CLI) операционной системы Debian.

    > 💡 Подсказка: При монтаже всегда составляйте таблицу, где физическому расположению датчика (например, «гостиная, у окна») соответствует его уникальный 1-Wire адрес. Это сэкономит часы времени при дальнейшей настройке и обслуживании, когда вместо `28-01203207b81f` вам нужно будет понять, температуру чего именно вы видите.

    1. Активация поддержки 1-Wire

    На большинстве сборок для контроллера HI поддержка 1-Wire активирована по умолчанию. Если это не так, вам необходимо добавить специальную строчку в конфигурационный файл загрузчика.

  • Откройте файл `/boot/config.txt` для редактирования:
  •     sudo nano /boot/config.txt

  • Добавьте в конец файла следующую строку (если ее там нет), которая указывает системе использовать определенный GPIO пин для 1-Wire:
  •     dtoverlay=w1-gpio

  • Сохраните файл (`Ctrl+O`, `Enter`) и выйдите (`Ctrl+X`).
  • Перезагрузите контроллер, чтобы изменения вступили в силу:
  •     sudo reboot

    2. Поиск подключенных устройств

    После перезагрузки и физического подключения датчиков к правильным клеммам контроллера, система должна автоматически их обнаружить. Давайте проверим это.

  • Перейдите в директорию `sysfs` для 1-Wire устройств:
  •     cd /sys/bus/w1/devices/

  • Выведите список содержимого этой директории:
  •     ls -l

  • Вы увидите список, похожий на этот:
  •     total 0

    lrwxrwxrwx 1 root root 0 Dec 10 14:25 28-0120325f85e4 -> ../../../devices/w1_bus_master1/28-0120325f85e4

    lrwxrwxrwx 1 root root 0 Dec 10 14:25 w1_bus_master1 -> ../../../devices/w1_bus_master1

    Здесь `28-0120325f85e4` — это уникальный адрес вашего датчика. Запишите его. Если у вас несколько датчиков, вы увидите несколько таких директорий, каждая с уникальным именем. Если вы не видите ни одной директории с префиксом `28-`, это указывает на проблемы с физическим подключением или конфигурацией.

    3. Чтение «сырых» данных с датчика

    Каждая директория с адресом устройства содержит несколько файлов. Ключевой файл для нас — `w1_slave`. Его содержимое — это прямой ответ от датчика на команду измерения.

  • Используйте команду `cat` для чтения этого файла, подставив адрес вашего датчика:
  •     cat /sys/bus/w1/devices/28-0120325f85e4/w1_slave

  • Вы получите ответ, состоящий из двух строк:
  •     79 01 4b 46 7f ff 0c 10 1e : crc=1e YES

    79 01 4b 46 7f ff 0c 10 1e t=23562

    4. Разбор ответа датчика

    Давайте разберем, что означают эти строки.

    * `79 01 ... 1e`: Это 9 байт данных, прочитанных из памяти датчика.

    * `crc=1e`: Рассчитанная контрольная сумма.

    * `YES`: Самая важная часть. `YES` означает, что контрольная сумма, рассчитанная мастером на основе полученных данных, совпала с контрольной суммой, переданной датчиком. Это подтверждает, что данные не были искажены при передаче. Если здесь будет `NO`, данные считаются невалидными.

    * Данные дублируются.

    * `t=23562`: Это и есть "сырое" значение температуры. Чтобы получить значение в градусах Цельсия, его необходимо разделить на 1000.

    `23562 / 1000 = 23.562 °C`

    Этот простой механизм чтения файлов позволяет легко интегрировать опрос 1-Wire датчиков в любые скрипты или приложения, включая потоки Node-RED, что мы и рассмотрим в следующем уроке.

    ---

    Итоги и рекомендации

    В этом уроке мы заложили теоретический и практический фундамент для работы с одной из самых популярных технологий в автоматизации — протоколом 1-Wire.

    Ключевые выводы:

    > 📋 Ключевые понятия:

    > * Шина 1-Wire: Последовательный протокол, использующий одну линию для данных.

    > * Топология «общая шина»: Параллельное подключение множества устройств к одной линии.

    > * Уникальный 64-битный адрес (ROM ID): Заводской неизменяемый идентификатор каждого устройства.

    > * Паразитное питание: Способ питания устройства через линию данных.

    > * Обнаружение устройств (Search ROM): Процесс, с помощью которого мастер находит все устройства на шине.

    > * Драйвер w1-gpio: Модуль ядра Linux для работы с 1-Wire через GPIO.

    > * Файловая система sysfs: Интерфейс ядра Linux для взаимодействия с оборудованием через файлы.

    > * Датчик DS18B20: Популярный цифровой датчик температуры с интерфейсом 1-Wire.

    Что дальше?

    Теперь, когда вы понимаете, как 1-Wire работает на физическом и системном уровне, и умеете получать "сырые" данные в командной строке, следующим логическим шагом будет автоматизация этого процесса и интеграция данных в нашу основную платформу управления.

    > 🔗 Связанный материал: В следующем уроке, COURSE-04-M06-L02: Опрос датчиков 1-Wire в Node-RED, мы создадим поток, который будет периодически опрашивать датчики, парсить их ответы, преобразовывать в стандартный формат `msg.payload` и публиковать в MQTT для дальнейшего использования в сценариях автоматизации.