Текущая версия платы процессорного модуля

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

Допиливание

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

1) Добавлен стабилизатор питания (AMS1117-5.0).
2) Изменена разводка питания микроконтроллера.
3) Плата основного модуля разведена с учетом промышленного изготовления, но второй слой меди используется по минимуму — можно кустарно изготавливать однослойную плату и ставить перемычки.
4) Добавлен джампер Endpoint для терминирования линии на последнем устройстве.
5) Добавлен джампер RST Lock для блокирования сброса микроконтроллера.
6) Аналогично п.3 разведены дочерние платы энкодера и драйвера светодиодной ленты.
7) Жду первый пробный заказ печатных плат, пока только основные модули (ITEAD Studio).


Дочерняя плата драйвера светодиодной ленты

Суета вокруг RS-485

Теперь перехожу к мастеру сети. В плане железа там все просто — ну, по крайней мере, я так думал. Взял переходник USB-UART, к нему подключил маленькую платку с MAX485 и несколькими резисторами, начал работать. И наступил на отличные грабли, вполне документированные, но для новичка совершенно не очевидные.

MAX485 нужно переключать между приемом (низкий уровень на объединенных пинах ~RE и DE) и передачей (высокий уровень). Руководствуясь простой логикой, я использовал для управления режимом выход DTR преобразователя (на CP2102), дергая его программно. И получил безобразие. Система кое-как работала только при неприемлемо больших задержках между приемом и передачей. А все из-за того, что DTR переключается медленно. Насколько медленно, мне нечем было померять, поэтому просто привожу ссылку на более вменяемое исследование граблей с применением осциллографа.

Из этого же материала я уяснил следующее: наименее болезненным будет использование FT232, поскольку у него есть вывод, при дефолтной настройке чипа как раз предназначенный для переключения режимов RS-485. Попросту говоря, на нем появляется высокий уровень при передаче по UART. Так что, из закромов извлечен китайский клон Arduino Nano, ~RST закорочен на землю, к 13-й ножке FT232 подпаян провод, и все это дело соединено с MAX485. Работает как часы. В «боевой» версии системы, конечно, такая конструкция использоваться не будет — китайская промышленность с удовольствием предлагает аналогичные готовые платы.

Логика системы

Наконец, к тому, как весь процесс выглядит с точки зрения мастера. Он работает с объектами устройств, которые могут быть управляющими или исполнительными. Управляющие подразделяются на реальные («железные»), виртуальные и таймеры. Исполнительные могут быть только реальными.

Виртуальные управляющие устройства понадобятся при реализации более сложного управления системой, в частности, когда к ней будет приделан веб-интерфейс. Также они пригодятся для интеграции с чем-то, что я еще не придумал. Да, тут, наверное, надо сказать о том, что вообще такое «устройство» в рамках системы.

Устройство — это объект класса Device. Минимальный набор атрибутов — имя, тип и флаг использования. Дальше, в зависимости от типа, могут быть добавлены адрес на шине, имя подчиненного устройства, приоритет управления, начальные значения регистров и некоторые другие атрибуты. Основные методы класса касаются работы с реальными устройствами — это чтение и запись регистров.

И вот, более-менее определившись с программной структурой системы, можно приступать к реализации. На текущий момент имеется следующее:
1) модуль Comm485, содержащий описание класса Conn. Методы класса — это открытие и закрытие подключения, передача и прием пакета, проверка контрольной суммы.
2) модуль Device485 содержит описанный выше класс Device.
3) основной программный модуль.


Дочерняя плата энкодера

Собственно, в основном модуле реализованы две вещи. Первая — создание нужных объектов класса Device согласно конфигурационному файлу. Вторая — непосредственно логика работы системы.

В процессе

В настоящее время работает следующее:

1) Составление списка задействованных исполнительных устройств.
2) Для каждого исполнителя составляется список задействованных управляющих устройств.
3) Значения регистров управляющего устройства с максимальным приоритетом записываются в регистры исполнительного устройства и управляющих, обладающих меньшим приоритетом.

То есть, предположим, у нас есть энкодер (железный) с низким приоритетом и виртуальное управляющее устройство — с высоким. В дежурном режиме виртуальное устройство отключено. Когда нужно отрегулировать свет, не поднимая пятой точки с дивана, задействуется виртуальное устройство (на короткий промежуток времени), чтобы выдать новые параметры исполнителю и энкодеру.

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

Собственно, пока все. Проект доступен на гитхабе, в папке host можно лицезреть леденящий душу код на Python. Там два модуля (Comm485, Device485), основная программа (host) и папка cfg, в которой конфигурационные файлы: настройка подключения UART и список устройств.

Продолжение непременно последует.

P.S. Будучи жертвой миграции с Хабра, в ряде возможностей ограничен.

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


  1. ssg1712
    20.07.2015 10:55

    Ого! Рад, что своим комментарием повлиял на целый проект. Очень приятно. Хабр работает!

    Если позволите, то еще по поводу decoupling capacitors. Если хотите сделать хорошо-хорошо, то надо прямо рядом с двумя ногами питания их ставить. Они и стоят везде парами. А под пузиком МК сделать земляной полигон.


    1. eta4ever Автор
      20.07.2015 12:09

      Так а они около ног и стоят, там, может, по разводке не особо видно. Вот как-то так:


      А про полигон я забыл. Если следующая «железная ревизия» будет — сделаю.


  1. mlu
    20.07.2015 12:15

    Гальванической развязки RS-485 не будет?


    1. eta4ever Автор
      20.07.2015 12:17

      Нет, не будет. Я все-таки решил, что у меня не самые тяжелые условия эксплуатации. Понимаю, конечно, что лучше бы перебдеть.


  1. crrr
    20.07.2015 20:06

    Возможно, я предложу оверхед, но… NCP3170A, КПД по питанию, особенно при нагрузке, будет в разы выше. Ну если это важно. Стоить будет ну от силы на 1$ больше.


    1. eta4ever Автор
      20.07.2015 21:13

      Эмм. А это куда?


      1. crrr
        21.07.2015 19:20
        +1

        Это заместо AMS1117-5.0. Мы использовали раньше линейные стабилизаторы, но… Попробовав раз, ем и сейчас :)) Потребление при токе 20-30мА с линейным, стало 10-15 с импульсным. В даташите есть полная схема на 5в, просто повторить и все работает.


        1. eta4ever Автор
          21.07.2015 20:02

          Я затупил вчера жестоко. Подумал, что как-то приделать его для ШИМирования светодиодов.
          Думал над чем-то подобным, но пока решил использовать не самое эффективное, но лично проверенное решение.
          Опять же, будет следующая ревизия железа (когда эту отлажу до блеска) — подумаю над эффективностью.