Для одного из проектов по автоматизации потребовалось сделать устройство, которое является подчинённым 1-Wire устройством, принимает команды от мастера и выставляет на своих выходах значение аналогового сигнала в диапазоне от 0 до 10В.
Проанализировав линейку стандартных микросхем 1-Wire от Maxim, стало ясно, что нет микросхемы, которая позволит реализовать подобный функционал.
Потому было принято решение реализовывать 1-Wire slave на микроконтроллере. Надеюсь, данный материал будет интересен и полезен людям, которые делают «умный дом» своими руками, т.к. 1-Wire достаточно популярная шина в подобных проектах. В качестве камня был выбран МК Cortex M0+ ATSAMD20G16 от Atmel, но о реализации в коде расскажем во второй части. Забегая немного вперед, скажу что в третьей части цикла пойдет речь о реализации собственного семейства устройств для линуксовой библиотеки OWFS (One Wire File System). А сегодня расскажем о некоторых аппаратных решениях, к которым мы пришли в процессе разработки.

Речь в основном пойдет о том как подключить ногу микроконтроллера к 1-Wire шине с минимальным вредом для здоровья. Будем двигаться от простого к сложному.

Ничего не делать


Первая проблема, с которой сталкиваешься при попытке собрать 1-Wire устройство на микроконтроллере с ядром Cortex – это уровень питания микроконтроллера 3.3В, в то время как на шине 1-Wire имеем 5В. Можно использовать толерантность ног микроконтроллера к 5В и подключать как есть, прямо к шине. К сожалению, ноги SAM D20 не толерантны к 5-ти вольтам, потому нам этот вариант не подошел, но отметить его, справедливости ради, стоит. Хотя, сажать внешнюю шину напрямую на ногу 3.3В камня идея не самая удачная. Во-первых, есть вероятность нестабильной работы других устройств на шине с паразитным питанием, во-вторых на длинном проводе можно «словить» наводку.

Преобразование уровней



Самый простой вариант — двунаправленный преобразователь уровня на транзисторе. Для него потребуется где-то брать 5В со стороны шины 1-Wire.
Первый вариант — делать 5В на своем устройстве (помимо 3.3В) для «запитки» шины. Как следствие, усложнение схемотехники.
Второй вариант — прокладывать шину 1-Wire в три провода. Третьим проводом идёт линия питания +5В. Из проблем — лишний провод, просадка напряжения на длинном проводе.

Согласование уровней


Если очень не хочется использовать +5В можно разделить сигнальную линию на 2 составляющих (вход и выход)

Важно учесть, что при такой схеме линии со стороны контроллера получаются инверсными.
В качестве бонуса, разделение линии данных на 2 части позволяет несколько упростить дальнейшую отладку софта, т.к. позволяет видеть осциллографом отдельно выходящие от нас сигналы (линия 1-Wire Tx), не смешанные с сигналами других устройств на шине.

Повышаем устойчивость


Для того что бы сделать прием данных по 1-Wire более уверенным необходимо сделать крутые фронты импульсов со стороны микроконтроллера. Для этого воспользуемся компаратором от TI LMV331, который обеспечит более точный и резкий переход между логическими «0» и «1», а так же гистерезис 160mV. Еще заменим выходной би-полярный транзистор BC547 на полевой IRLML6346 и поставим защитный TVS диод ESD5Z6 на 6В.

Для данной схемы компаратор потребуется запитать от 5В. Где их можно взять было сказано выше.

Развязанный 1-Wire


Для обеспечения электрической развязки шины 1-Wire и внутренней электроники устройства воспользуемся изолированным транслятором уровней ADuM1201, и изолированным DC/DC конвертор TES 1-1211. Как и в предыдущем случае, линию данных 1-Wire делим на 2 линии: 1W_Rx и 1W_Tx.

DC/DC конвертор с 12 на 5 вольт взят для примера, можно использовать аналогичный 3.3/5.

Остальная схемотехника


Для полноты картины покажем схемотехнику подключения микроконтроллера, а так же выходных аналоговых каналов 0-10В.


Т.к. протокол 1-Wire требует наличие уникального адреса для каждого устройства на шине, на плату ставим 1-Wire UID от Maxim DS2411. Будучи для неё мастером шины будем считывать её UID и использовать его в качестве собственного адреса. У DS2411 код семейства 0x01 (family code — старший байт UID’а). Мы же на сайте OWFS выберем незанятый код семейства для нашего нового устройства и будем подменять первый байт.

Как уже было сказано, во второй части приступим к программной реализации протокола 1-Wire Slave.

Комментарии (8)


  1. IronHead
    07.09.2015 10:20

    Вроде внимательно прочитал, но так и не понял этот момент:

    Самый простой вариант — двунаправленный преобразователь уровня на транзисторе. Для него потребуется где-то брать 5В со стороны шины 1-Wire.
    Первый вариант — делать 5В на своем устройстве (помимо 3.3В) для «запитки» шины. Как следствие, усложнение схемотехники.

    а дальше вы ставите LMV331, который запитываете от 5 Вольт.


    1. den1s1
      07.09.2015 10:34

      да, тут от 5 вольт не уйти. под схемой об этом сказано. т.е. не для всех из перечисленных вариантов стоит цель не избавиться от 5В.


  1. GarryC
    07.09.2015 14:25

    Опто-развязанный 1-Wire — Месье знает толк в извращениях.


    1. IronHead
      07.09.2015 14:43
      +1

      Мало того что опто-развязанный, еще и с внешним входным компаратором. Вообще статья из серии: как всунуть Cortex туда, где легко справится Tiny.


      1. GarryC
        08.09.2015 10:28

        Как всунуть Cortex-A…


    1. den1s1
      07.09.2015 14:44

      Да, вероятно задача специфичная. Но если питание МК не отвязано от питания 220В (например, сделано на конденсаторном делителе), то отвязывать придется интерфейс.
      Или вот апнота от Maxim, в которой показано как развязывать мастер. В аннотации там указано, что развязка обязательна для медицинских приборов.


  1. Dominikanez
    15.09.2015 11:36

    А почему бы вместо компаратора не использовать триггер Шмитта? 74lvc1g17 прекрасно принимает на вход 5 В при питании от 3.3 В.


    1. den1s1
      15.09.2015 11:41

      ну да, красивый вариант, похоже