1. 1-Wire Slave на микроконтроллере ATMega168

  2. 1Wire

    ATMega168

    DS18S20

Технология 1-wire хорошо известна всем любителям повозиться с микроконтроллерами. Почти каждый наверняка сделал самостоятельно или повторил какой-нибудь градусник или часы с градусником на микроконтроллере.

В роли терпеливой и молчаливой подопытной собаки Павлова при изучении протокола 1-wire обычно выступают замечательные датчики температуры DS18S20 (или вариации 18B20, 1820). Иногда их могут заменять таблетки iButton, что делает процесс создания устройства не менее захватывающим.

На любительском уровне процесс почти всегда выглядит одинаково - у нас есть произведенные на заводе ведомые (slave) устройства, наша задача - написать код контроллера, который выполняет функции ведущего (master) на шине. Задача, в целом, не слишком сложная, поэтому в интернете можно найти много разных конструкций с использованием 1-wire.

Если посмотреть каталог slave-компонентов, то в нем можно увидеть множество интересных позиций. Кроме термометров и таблеток есть энергонезависимая память, часы реального времени, порты ввода-вывода с разным количеством ног, цифровые потенциометры. В общем, есть периферия на разный вкус. Почти всегда можно что-то подобрать для очередной идеи. Но это "почти" и привело к мысли о создании своего слейва (пардон мой французский), который по командам мастера делал бы то, что надо нам.

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

Конечно же хотелось использовать для управления уже существующую шину 1-wire. В результате размышлений решено было сделать отдельный простенький контроллер, который бы решал локальные задачи управления шаговым двигателем, концевыми датчиками, калибровкой, восстановлением состояния после сбоев по питанию, управлению помпой и прочее. А от центрального контроллера по шине получать только команды "по-большому счету", т.е. "выстави 40С", "включи помпу", "сколько сейчас выставлено?". Т.е. должен был получиться слейв со своей внутренней логикой работы.

Надо сказать, что найти в интернете слейв на распространенных дешевых 8-ми битных микроконтроллерах не удалось. Не исключено, что он там где-то есть, но найти что-то годное для дальнейшей доработки мне не удалось.

Пришлось начинать с нуля. В целом, на данный момент можно считать, что затея удалась. В качестве микроконтроллера был выбран ATMega168, который был под рукой. Дополнительно использован формирователь P82B96, который заменил формирователь на двух транзисторах, стоявший первоначально. Правда кроме уменьшения размеров никаких дополнительных бонусов не отмечено. Позже еще добавлена микросхема ADuM1201, для обеспечения гальванической развязки контроллера с шиной, но это всё украшательства.

На данный момент контроллер прекрасно уживается с несколькими датчиками температуры на одной шине длиной метров 15. Правда, выполняет пока не всё множество команд шины, но не мешает в этом остальным. В частности он не участвует при поиске устройств на шине (команда F0H "Search ROM").

Ниже приведена принципиальная схема получившегося устройства.

Принципиальная схема slave-устройства шины 1-wire

На микросхеме драйвера L298N по стандартной схеме собран узел управления биполярным шаговым двигателем.

Симистор MAC15N и оптосимистор MOC3020 так же реализуют стандартный узел управления нагрузкой 220V.

U1 и U2 - концевые оптопары узла с шаговым двигателем.

Вывод PD1 микроконтроллера используется для вывода отладочной информации на компьютер через COM-порт.

На схеме так-же изображен датчик газа MQ4, который пока лежит в коробочке и будет подключен позже. Датчик имеет аналоговый выход и подключен ко входу с АЦП.

Собранный контроллер и привод с шаговым двигателем выглядят так:

Собранный на макетке контроллер. Справа узел с шаговым двигателем

Update: Шаговый двигатель с верхнего фото напрактике оказался слабоват. Пришлось переделать. Привод с новым шаговиком и редуктором, установленный на котле выглядит теперь так:

Привод с новым шаговым двигателем, установленный на котле

Центральный контроллер собран на базе платы STM32F429I-DISCO на 32х битном процессоре. На дополнительной макетке собрана всякая нужная периферия, например защита процессора от статики на шине 1-wire, дрйвер COM-порта, стабилизатор 5 вольт и прочее:

Центральный master-контроллер

После подачи питания контроллер производит калибровку узла шагового двигателя (определение нулевого и текущего положения) и восстанавливает последний запомненный режим нагрузки. После этого он готов к приему команд по шине 1-wire. В текущей реализации контроллер выполняет команды поворота двигателя на заданное число шагов в заданном направлении, включает и выключает нагрузку.

Кроме этого контроллер отвечает на запросы о текущем положении двигателя и состоянии нагрузки, времени с момента включения. Так же есть команды для калибровки шагового двигателя и перезагрузки контроллера. Пошивка так-же предусматривает определенную логику автономной работы контроллера, если в течение определенного времени нет обмена по шине 1-wire.

Возможности, появляющиеся при реализации слейва на мкропроцессоре весьма широки. Например, можно сделать мост между 1-wire и другим интерфейсом. Можно организовать обмен по шиине между несколькими контроллерами. В общем, есть куда двигаться!