Датчики со связью по одному проводу

437 слов | 2018-3-28

1-wire - это система связи между устройствами, разработанная Dallas Semiconductor Corp, которая обеспечивает низкоскоростной обмен данными и питание по единственному проводу.

Отличительной особенностью этой шины является возможность использовать только двух проводов: данных и земли. Чтобы добиться этого устройства включают конденсатор 800pF для запасания энергии и питания устройства в моменты использования линии данных.

Посмотрим на одну из таких штук, оказавшуюся у меня под рукой: DS18B20.

Datasheet

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

  • Может питаться от линии данных от 3.0V до 5.0V. Это хорошо.
  • Точность \(\pm 0.5^\circ C\) в диапазоне от \(-10^\circ C\) до \(+85^\circ C\).
  • Потребляемый ток в режиме измерения: от \(1mA\) до \(1.5mA\).

Далее в документации есть схема включения: Подозрительная схема включения которая мне не совершенно нравится. GPIO выход как мы рассмотрели ранее состоит из двух транзисторов. Если установим на выходе низкий уровень (фактически соединим с землёй) и в тот же момент откроем подтягивающий транзистор в предложенной схеме, то получим жаренную Raspberry Pi:smiley: Я не хочу так рисковать.

Схема включения попроще

Так что поставим резистор в \(4.7k\Omega\), что даст \(3.3V / 4.7e3\Omega\approx0.7mA\), если ток будет маловат для измерения температуры, то уменьшим сопротивление. Упрощенная схема включения

Software

Почему GPIO4? Почитаем /boot/overlays/README:


Name:   w1-gpio
Info:   Configures the w1-gpio Onewire interface module.
        Use this overlay if you *don't* need a GPIO to drive an external pullup.
Load:   dtoverlay=w1-gpio,<param>=<val>
Params: gpiopin                 GPIO for I/O (default "4")

        pullup                  Non-zero, "on", or "y" to enable the parasitic
                                power (2-wire, power-on-data) feature


Name:   w1-gpio-pullup
Info:   Configures the w1-gpio Onewire interface module.
        Use this overlay if you *do* need a GPIO to drive an external pullup.
Load:   dtoverlay=w1-gpio-pullup,<param>=<val>
Params: gpiopin                 GPIO for I/O (default "4")

        pullup                  Non-zero, "on", or "y" to enable the parasitic
                                power (2-wire, power-on-data) feature

        extpullup               GPIO for external pullup (default "5")

Оверлей w1-gpio-pullup - это не наш вариант1, а вот w1-gpio выглядит привлекательно. Так что добавим в файл /bbot/config.txt следующую строку:


dtoverlay=w1-gpio,gpiopin=4

Внимание

Как оказалось не все йогурты одинаково полезны (btw, йогурты вообще не полезны, никак). Некоторые из DS18B20 являются не очень удачными подделками. В частности мне достались обе микросхемы серии +158ac2, которые не работают в паразитном режиме, то есть мне придётся подавать напряжение на микросхемы отдельно: Схема с внешним питанием

Макетная плата

Рисунок макетной платы

Макетная плата

Проверяем обнаружение термометра и корректность показаний: Считывание показаний термометра

\(23.125^\circ C\) выглядит вполне правдоподобно:smile:

Несколько сенсоров

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

Смотрим: Два термометра

Погрешность \(0.313\) укладывается в заявленную точность \(\pm 0.5^\circ C\).:smiley:

  1. Если транзистор для сильного pull-up будет открыт, а GPIO канала данных будет включен как выход и с низким уровнем (из-за ошибки в драйвере допустим), то Raspberry Pi сгорит. 

  2. Как видно на картинке вверху поста. 

Дата изменения: