Основы протокола 1-Wire: общая шина, уникальные адреса, 'паразитное' питание
Введение в 1-Wire: Топология и ключевые особенности
Протокол 1-Wire — это стандарт последовательной связи, разработанный компанией Dallas Semiconductor (в настоящее время является частью Maxim Integrated, дочерней компании Analog Devices). Его основная и самая узнаваемая черта, давшая ему название, — это возможность передачи данных и питания по единственной сигнальной линии относительно общего провода (GND). Это делает его чрезвычайно эффективным решением для создания распределенных сетей сбора данных, особенно на объектах, где прокладка большого количества кабелей нежелательна или экономически нецелесообразна.
Концепция «Одного Провода»
Несмотря на название, для работы 1-Wire шины требуется как минимум два физических проводника:
В наиболее распространенной и надежной конфигурации используется третий провод — VDD (Питание), который обеспечивает отдельное, стабильное питание для ведомых устройств. Таким образом, в зависимости от схемы подключения, 1-Wire сеть может быть двух- или трехпроводной, но во всех случаях обмен данными происходит по одной-единственной линии.
Топология «Общая Шина»
Ключевой архитектурной особенностью протокола является топология «общая шина» (common bus). Это означает, что все ведомые (Slave) устройства подключаются к одной и той же линии данных параллельно. Ведущее устройство (Master), роль которого выполняет контроллер HI, управляет всей коммуникацией на шине.
Такой подход дает несколько значительных преимуществ:
- Экономия на кабеле: Вместо того чтобы тянуть отдельный кабель от контроллера к каждому датчику (как в топологии «звезда»), прокладывается один магистральный кабель, к которому в нужных точках подключаются устройства.
- Простота монтажа: Подключение нового датчика сводится к его физическому врезанию в существующую шину, что значительно упрощает монтажные работы.
- Гибкость расширения: Систему можно легко масштабировать, добавляя новые датчики на шину, пока не будут достигнуты ее физические пределы (по длине или количеству устройств).
> ℹ️ Информация: Мастер-контроллер инициирует все транзакции на шине. Два ведомых устройства не могут общаться друг с другом напрямую. Мастер последовательно опрашивает каждое устройство, запрашивая у него данные или отправляя команду.
Области применения на платформе HI
Протокол 1-Wire идеально подходит для задач, не требующих высокой скорости передачи данных, но выигрывающих от простоты развертывания. На типовых объектах автоматизации под управлением контроллера HI, 1-Wire чаще всего используется для:
- Мониторинга температуры: Легендарные датчики DS18B20 являются отраслевым стандартом для недорогого и точного измерения температуры. Их можно размещать в комнатах, на трубах отопления, в вентиляционных каналах.
- Идентификации: Электронные ключи iButton (также известные как «таблетки Далласа») используются в системах контроля доступа или для идентификации обслуживающего персонала.
- Измерения других параметров: Существуют 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`
- `28` — код семейства (датчик температуры).
- `00000557AD3A` — 48-битный серийный номер в шестнадцатеричном представлении.
- Контрольная сумма проверяется мастером при чтении адреса и обычно не отображается пользователю в таком виде.
Процедура обнаружения (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
В данном примере мы видим:
- `w1_bus_master1`: Директория, представляющая сам мастер-контроллер (интерфейс на контроллере HI).
- `28-01203207b81f`: Директория, соответствующая одному датчику DS18B20.
- `28-0120325f85e4`: Директория, соответствующая второму датчику DS18B20.
Имя директории формируется из кода семейства и серийного номера, что позволяет инженеру однозначно идентифицировать каждое физическое устройство в системе.
---
Схемы подключения: Стандартное и «Паразитное» питание
Правильный выбор схемы подключения является одним из ключевых факторов, определяющих надежность работы 1-Wire шины. Существует два основных способа подключения: стандартный (3-проводной) и «паразитный» (2-проводной).
Стандартное (нормальное) подключение
Это наиболее надежный и рекомендуемый способ подключения. Он использует три провода:
- VDD (+V): Выделенная линия питания (обычно +3.3В или +5В от контроллера).
- DATA (Данные): Линия для обмена данными.
- GND (Земля): Общий провод.
При такой схеме датчик получает стабильное и непрерывное питание, что критически важно для его корректной работы, особенно в моменты преобразования данных (например, когда 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. Устройства получают энергию непосредственно от линии данных.
Принцип работы: [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 активирована по умолчанию. Если это не так, вам необходимо добавить специальную строчку в конфигурационный файл загрузчика.
sudo nano /boot/config.txt
dtoverlay=w1-gpio
sudo reboot
2. Поиск подключенных устройств
После перезагрузки и физического подключения датчиков к правильным клеммам контроллера, система должна автоматически их обнаружить. Давайте проверим это.
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 /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 4b 46 7f ff 0c 10 1e : crc=1e YES`
* `crc=1e`: Рассчитанная контрольная сумма.
* `YES`: Самая важная часть. `YES` означает, что контрольная сумма, рассчитанная мастером на основе полученных данных, совпала с контрольной суммой, переданной датчиком. Это подтверждает, что данные не были искажены при передаче. Если здесь будет `NO`, данные считаются невалидными.
- Вторая строка: `79 01 4b 46 7f ff 0c 10 1e t=23562`
* `t=23562`: Это и есть "сырое" значение температуры. Чтобы получить значение в градусах Цельсия, его необходимо разделить на 1000.
`23562 / 1000 = 23.562 °C`
Этот простой механизм чтения файлов позволяет легко интегрировать опрос 1-Wire датчиков в любые скрипты или приложения, включая потоки Node-RED, что мы и рассмотрим в следующем уроке.
---
Итоги и рекомендации
В этом уроке мы заложили теоретический и практический фундамент для работы с одной из самых популярных технологий в автоматизации — протоколом 1-Wire.
Ключевые выводы:- 1-Wire — это эффективный и экономичный протокол для подключения множества датчиков по общей двух- или трехпроводной шине, где весь обмен данными происходит по одной линии.
- Каждое устройство обладает глобально уникальным 64-битным адресом, который позволяет мастер-контроллеру обращаться к нему индивидуально даже на общей шине.
- Существует две схемы подключения: стандартная (3-проводная) и «паразитная» (2-проводная). Для обеспечения максимальной надежности и стабильности системы на объектах заказчика всегда следует выбирать стандартную 3-проводную схему.
- На контроллерах HI, работающих под управлением Linux, все обнаруженные 1-Wire устройства становятся доступны через виртуальную файловую систему sysfs, что позволяет легко читать с них данные с помощью стандартных команд, таких как `cat`.
> 📋 Ключевые понятия:
> * Шина 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 для дальнейшего использования в сценариях автоматизации.