Yellow Rabbit

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

Raspberry Pi и 1-wire устройства

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

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

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

Datasheet

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

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

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

Так что поставим резистор в , что даст , если ток будет маловат для измерения температуры, то уменьшим сопротивление. Упрощенная схема включения

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, которые не работают в паразитном режиме, то есть мне придётся подавать напряжение на микросхемы отдельно: Схема с внешним питанием

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

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

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

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

выглядит вполне правдоподобно:smile:

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

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

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

Погрешность укладывается в заявленную точность .:smiley:

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

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