Перейти к основному содержимому

1-Wire

Робот подключает несколько температурных датчиков к одной линии 1-Wire

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

Коротко

1-Wire использует одну сигнальную линию DQ, но общий GND всё равно обязателен. Линия данных возвращается в высокий уровень через подтягивающий резистор. Обмен начинается с импульса reset, затем устройство отвечает импульсом presence.

Шина 1-Wire с подписанными линиями DQ, GND, VDD и подтяжкой

Зачем это нужно

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

При этом протокол не рассчитан на большие объёмы данных и очень высокую скорость. Его сильная сторона — простая шина для небольших датчиков с уникальными адресами.

Главная идея

Контроллер задаёт время обмена. Чтобы передать ноль, участник тянет DQ к земле. Чтобы получить единицу, он отпускает линию, а резистор подтягивает её к питанию.

Reset и presence на линии 1-Wire

Перед командами контроллер выполняет reset. Если на шине есть устройство, оно отвечает presence. После этого контроллер может выбрать конкретный ROM-код или обратиться ко всем устройствам, если операция это допускает.

Провода и сигналы

СоединениеНазначениеЧто важно
DQдвунаправленные данныенужна подтяжка к VDD
GNDобщий нольобязателен
VDDпитание устройства при обычном режименапряжение берут из datasheet
резистор подтяжкивозвращает DQ вверхчасто начинают с 4,7 кОм, но проверяют по схеме и длине проводов

Название 1-Wire не означает «один провод вообще». Оно означает одну сигнальную линию данных. Для обычного внешнего питания DS18B20 всё равно нужны DQ, GND и VDD.

Где находятся пины

ПлатаКакой пин использоватьКомментарий
Arduino Unoлюбой свободный цифровой пин, часто D2номер указывают в программе
Arduino Nanoлюбой свободный цифровой пинудобно выбирать пин рядом с GND и питанием
ESP32 DevKitлюбой подходящий GPIO, например GPIO4избегают загрузочных и занятых выводов
ESP8266свободный GPIO с учётом особенностей загрузкинекоторые пины влияют на старт платы

В отличие от I2C и SPI, у Arduino Uno нет специальных аппаратных выводов «только для 1-Wire». Протокол обычно реализует библиотека через обычный GPIO.

Подключение устройства к Arduino Uno: DS18B20

DS18B20 подключён к Arduino Uno по 1-Wire

DS18B20Arduino UnoЗачем
DQD2данные в обе стороны
GNDGNDобщий ноль
VDD5V или 3.3V по датчику и схемепитание
резистор 4,7 кОммежду DQ и VDDподтяжка линии данных

У разных корпусов и готовых модулей порядок выводов может отличаться. Перед подключением смотрят datasheet или маркировку конкретного модуля.

Пример с несколькими Arduino

Учебный стенд 1-Wire с несколькими платами и датчиком

В 1-Wire нельзя просто соединить несколько Arduino как равноправные платы и ждать, что они сами договорятся. На шине должен быть один контроллер обмена, а остальные участники должны вести себя как 1-Wire-устройства.

Учебная схема для сравнения с UART, I2C и SPI выглядит так:

УзелРоль на шинеПодключение
Arduino Uno Aконтроллер, запускает поиск устройствD2 к общей линии DQ, GND к общей земле
Arduino Uno Bэмулирует 1-Wire-устройствопин эмулятора к DQ, GND к общей земле
Arduino Uno Cэмулирует второе 1-Wire-устройствопин эмулятора к DQ, GND к общей земле
резистор 4,7 кОмподтяжка шинымежду DQ и VDD

Такой опыт уже сложнее, чем подключение настоящих DS18B20: Arduino, которая изображает устройство, должна очень точно выдерживать интервалы протокола. Для этого используют специальные библиотеки эмуляции, например OneWireHub или Arduino-OWI, а не обычную Serial.

Для первого практического опыта лучше собрать ту же топологию с реальными DS18B20: одна Arduino Uno опрашивает несколько устройств на общей линии DQ. Так школьник видит главную идею 1-Wire без борьбы с таймингами эмулятора.

Пример чтения адресов обычно строится так:

#include <OneWire.h>

const byte ONE_WIRE_PIN = 2;
OneWire bus(ONE_WIRE_PIN);

void setup() {
Serial.begin(9600);
}

void loop() {
byte address[8];

bus.reset_search();
while (bus.search(address)) {
for (byte i = 0; i < 8; ++i) {
if (address[i] < 16) {
Serial.print('0');
}
Serial.print(address[i], HEX);
Serial.print(' ');
}
Serial.println();
}

delay(3000);
}

Если преподавателю нужен именно стенд из нескольких Arduino, одна плата остаётся контроллером с таким сканером, а на остальных запускают готовый пример эмуляции DS18B20 из выбранной библиотеки. До занятия этот стенд обязательно проверяют логическим анализатором: ошибка в микросекундах выглядит для контроллера как пропавшее устройство.

Частые ошибки

ОшибкаЧто произойдёт
нет подтяжки DQлиния не возвращается в высокий уровень
забыли GNDконтроллер не видит корректные уровни
перепутали выводы DS18B20датчик не отвечает или может быть повреждён
длинные провода без проверкифронт становится медленным, появляются пропуски
читают температуру без CRCможно принять повреждённые данные
паразитное питание подключили «по памяти»операция измерения может срываться

Что запомнить про 1-Wire

  • Одна сигнальная линия не отменяет общий GND.
  • DQ нужна подтяжка к питанию.
  • Транзакция начинается с reset и ответа presence.
  • Несколько устройств различаются ROM-кодами.
  • На Arduino Uno 1-Wire обычно реализуют через библиотеку на обычном цифровом пине.

Практика

  1. Подключите один DS18B20 к Arduino Uno на D2 и подпишите DQ, GND, VDD.
  2. Добавьте второй датчик на ту же линию DQ.
  3. Выведите ROM-коды датчиков в Serial Monitor.
  4. Для продвинутого стенда замените один настоящий датчик Arduino-эмулятором и проверьте, что контроллер видит новый ROM-код.
  5. Нарисуйте, где стоит подтягивающий резистор.

Проверьте себя

  1. Почему 1-Wire не означает отсутствие GND?
  2. Зачем нужен резистор между DQ и VDD?
  3. Что такое presence?
  4. Почему несколько DS18B20 можно различать на одной линии?
  5. Почему несколько Arduino на 1-Wire нельзя подключать как несколько равноправных контроллеров обмена?
Ориентиры для самопроверки

Сначала ответьте без подсказки. Ответ можно считать полным, если вы:

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

Если один из пунктов объяснить не получается, найдите соответствующую главу статьи, перечитайте её и повторите ответ.

Словарь статьи

  • 1-Wire — адресная шина с одной сигнальной линией и общим проводом.
  • DQ — линия данных 1-Wire.
  • ROM-код — уникальный 64-битный идентификатор устройства.
  • Presence — ответ устройства после импульса сброса контроллера.
  • Паразитное питание — режим, в котором устройство получает энергию через линию данных.

Связанные темы

  • UART — две линии данных для прямого обмена.
  • I2C — общая адресная шина с SDA и SCL.
  • SPI — синхронный обмен с отдельным выбором устройства.
  • Сравнение протоколов — как выбрать интерфейс.
  • Отладка обмена — как проверять уровни и временные сигналы.

Источники