Цифровой энкодер для MegaD-2561

09/04/2019 12:07:49

Контроллер MegaD-2561 поддерживает работу ШИМ-портами, которые используются в том числе для управления яркостью освещения, а иначе говоря, для диммирования. Чтобы задать яркость, нужно, например, указать значение от 0 до 255 через встроенный Web-интерфейс контроллера или при помощи инструментов визуализации и управления серверного ПО. Но удобнее делать это с помощью обычных кнопок. Контроллер поддерживает как двухкнопочное управление, когда одна клавиша увеличивает яркость, а другая снижает, так и однокнопочное. При использовании всего лишь одной кнопки и команды сценария "~" можно короткими нажатиями включать и выключать свет, а удерживая кнопку нажатой, изменять яркость. Все это работает прекрасно, но для полноты картины не хватало еще одного, альтернативного элемента управления - энкодера.

Энкодер, или в простонародье любителей домашней автоматизации "крутилка", довольно привычная штука в обособленных диммерах, никак не связанных с автоматикой. Крутилка интуитивно понятна. Покрутил влево - свет убавляется, вправо - яркость нарастает. Подключение к MegaD-2561 обычного механического энкодера как есть было теоретически возможным, но немного не вписывалось в концепцию проекта и потребовало бы значительные изменения в прошивке для реализации возможности специальной настройки портов. Но простой парень из итальянского Турина решил сделать то, что до него, кажется, не делали. Он сделал I2C Encoder. Штука крайне любопытная и заслуживающая внимания.

I2C-энкодер с RGB-подсветкой
I2C-Encoder с RGB-подсветкой

I2C Encoder, который рассматривается в этом материале - это механический энкодер с опциональными диодами RGB-подсветки, смонтированный на плате с микроконтроллером PIC16F18344. Подробнее о проекте можно найти на сайте разработчика. Главная особенность данного продукта заключается в том, что он берет на себя всю черновую работу, позволяя вышестоящему контроллеру сконцентрироваться на более глобальных задачах. И вот, как это работает.

 

Автономная работа контроллера с I2C энкодером

Для начала сконфигурируем порты для работы с I2C-устройством, выбрав в списке поддерживаемых устройств Encoder.

Прошивка контроллера MegaD-2561 должна быть 4.35b3 или выше!
Поддерживаемый адрес энкодера 0x20/0x21 - перемычка A4 на плате I2C-энкодера запаяна


В данном примере I2C-энкодер подключен к цифровым портам P30 (линия SCL) и P31 (линия SDA) клеммы XT2 контроллера. Стоит напомнить, что I2C позволяет подключать несколько устройств на одну шину. Это делает возможным в ряде случаев экономить порты контроллера.

Далее следует подключить линию INT (прерывание) энкодера к любому цифровому порту и настроить его как вход.
Для примера возьмем P35 той же клеммы XT2.

  • Тип: IN - порт является входом для сигнала прерывания
  • Режим: P - срабатывание по факту появления сигнала
  • Raw: включен - защита от дребезга, которая здесь будет мешать, отключена

Подробнее следует остановиться на сценарии (Act): 13:@31
Здесь мы будем управлять диммируемым портом P13. При появлении сигнала на линии INT необходимо дать понять контроллеру, что, во-первых, событие сгенерировано энкодером (команда "@"), а во-вторых, что линия-SDA энкодера подключена к P31. Говоря человеческим языком, этот сценарий можно прочесть так: лампочка на P13 управляется крутилкой (знак @ ведь похож на крутилку?), которая подключена к цифровом порту P31 - читать данные оттуда.

Порт P13 при этом конфигурируется обычным способом, за исключением одного нюанса.

Желательно установить опцию Smooth, так как она способна сгладить скачкообразные изменения яркости при резких поворотах ручки энкодера, тем самым улучшая плавность и комфорт.

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

По умолчанию каждый шаг энкодера прибавляет или убавляет 5 к значению PWM и к собственному счетчику энкодера.
Значение счетчика энкодера (его положение от 0 до 255) сохраняется в счетчике IN-порта, к которому подключено прерывание. В примерах P35.


Управление подсветкой энкодера с помощью сервера

В автономном режиме MegaD-2561 не включает RGB-диоды подсветки, встроенные в ручку энкодера, так как не знает, какой цвет нужен пользователю, нужен ли вообще и при каких обстоятельствах. Но подсветкой можно интеллектуально управлять с помощью сервера.


А проводочки подключались в чётком патриотично настроенном ключе

Если в настройках контроллера прописан сервер, то сообщение о срабатывании прерывания, подключенного к порту P35, будет отправлено ему. Но непосредственное управление ШИМ-портом все равно необходимо поручить контроллеру. Сделать это можно, установив флажок рядом с полем Act - обязательное выполнение сценария даже при наличии сервера.

Логика здесь довольно очевидная. Контроллер как и прежде будет самостоятельно управлять диммируемым портом P13 на основании данных, которые он сам будет считывать с энкодера, подключенного к P31, но при этом о фактах поворота ручки или нажатия на нее будет сообщать серверу. Серверу же остается только управлять подсветкой.

Вот пример скрипта на PHP для работы с посветкой энкодера.

<?
flush(); // Использование данной функции или ее аналогов в других языках программирования обязательно!

if ( $_GET['pt'] == 35 )
{
    // Считываем значение счетчика порта IN/INT - оно же относительное состояние энкодера от 0 до 255
    list(, $cnt) = explode("/", file_get_contents("http://192.168.0.14/sec/?pt=35&cmd=get"));

    if ( $cnt == 0 )
    $cnt = "001000"; // Если свет погас (ручка выкручена влево до 0 или нажата кнопка), включить зеленую подсветку
    elseif ( $cnt == 255 )
    $cnt = "333333"; // Если свет на максимуме (ручка выкручена до 255), включить оранжевую подсветку
    else
    $cnt = sprintf("%02X0000", round($cnt/5));
    // Во всех остальных случаях подсветка красная, которая меняется синхронно с освещением

    // rgb=XXXXXX, управлять RGB-подсветкой энкодера
    file_get_contents("http://192.168.0.14/sec/?pt=31&scl=30&i2c_dev=encoder&rgb=$cnt");
}
?>

Сервер сначала считывает значение счетчика порта P35, в который записывается относительное, абстрактное положение ручки энкодера. Энкодер инициализируется контроллером таким образом, что его внутренние счетчики могут принимать значения только в диапазоне от 0 до 255. Это упрощает управление ШИМ-портами, так как получается, что значение счетчика энкодера равно значению ШИМ-порта. Почему нельзя использовать параметр "cnt", который передается серверу. Дело в том, что когда происходит событие на входе (срабатывает прерывание), то сначала формируется сообщение для сервера, а потом происходит обработка прописанного сценария. Поэтому на момент формирования запроса значение счетчика еще неизвестно.

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

Как видно из кода скрипта, посветка управляется с помощью параметра "rgb", в который передается цвет, кодируемый 3 байтами в 16-ричном виде в символьном представлении.
Для форматирования кода цвета удобно использовать функцию sprinf().

rgb=FF0000 - красный
rgb=00FF00 - зеленый
rgb=CC28BF - малиновый (или это розовый?..)

Обязательно стоит сказать, что подсветка ручки также меняется плавно, что равносильно работе опции Smooth=1 в контроллере. Выглядит это весьма эффектно. Если при максимальной яркости (pwm=255) нажать на ручку энкодера, то его подсветка при использовании кода из примера плавно изменит цвет с оранжевого на зеленый.


Когда сервер тоже управляет диммируемыми портами

А что, если свет включался пользователем с помощью энкодера, а позже выключался или регулировался через приложение в планшете или голосовыми командами? Ведь тогда получается, что значение ШИМ-порта не будет соответствовать значению счетчиков в энкодере? И когда пользователь захочет энкодером убавить яркость света, ранее увеличенной прямым запросом сервера, получится небольшой спецэффект. Сначала яркость прыгнет до того значения, которое было на момент последнего кручения ручки, а дальше уже будет регулироваться обычным образом. Чтобы данного эффекта не возникало, сервер может установить нужное стартовое "состояние" энкодера с помощью параметра "setcnt".

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

// Сервер решил установить новое значение ШИМ-порта
http://192.168.0.14/sec/?pt=13&pwm=200
// Сервер отправляет энкодеру команду на изменение счетчика
http://192.168.0.14/sec/?pt=31&scl=30&i2c_dev=encoder&setcnt=200
// Сервер меняет подсветку ручки. Яркость освещения регулируется на планшете,
// а при этом меняется в том числе и подсветка энкодера
http://192.168.0.14/sec/?pt=31&scl=30&i2c_dev=encoder&rgb=280000

 

Вкус, цвет и фломастеры

Извечный вопрос, который часто возникает в процессе самостоятельной автоматизации: как "это" вписать в дизайн и интерьер, чтобы не получить скалкой по голове? Можно было бы сказать, что на безрыбье и рак щука, но есть вариант получше. В сущности подобный энкодер довольно легко интегрировать в любую серию электроустановочных изделий. Нужны только две вещи: стандартная "заглушка" и ручка.


Life is On...

На фото две стандартные заглушки популярной серии Unica от Schnider Electric. Достаточно по центру просверлить отверстие и закрепить в нем с помощью шайбы и гайки энкодер.

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

Черная ручка на черном основании смотрится эффектно. Кольцо засвечивается равномерно. Выглядит неплохо. Но черный цвет электротехнических изделий в уютном домашнем интерьере, пожалуй, редкость, поэтому можно попробовать вариант с белой заглушкой и прозрачной ручкой.

"Transparent knob" выглядит намного проще, главным образом, из-за своей не вполне современной формы, хотя пользоваться такой ручкой удобно. Нужно сказать, что в Интернете можно найти большое количество ручек для энкодеров: пластиковых и алюминиевых, простых и дизайнерских, крупных и мелких, красных и под золото. Не является проблемой даже изготовить ручку из карельской березы. Но основная сложность в данном случае - это светопрозрачность. Впрочем, ручка должна прилегать к основанию не плотно, чтобы обеспечить свободное вращение. И если использовать непрозрачную ручку, увеличив при этом яркость светодиодов, то такая амбиентная подсветка может смотреться даже лучше. Обязательно проверю.

 

Автор: Andrey_B
Любое использование материалов сайта возможно только с разрешения автора и с обязательным указанием источника.



Добавить комментарий:



Сортировка комментариев: Последние сверху | Первые сверху

2019-04-09 12:17:43 | Ruslan
В очередной раз спасибо за проделанную работу!


2019-04-09 14:43:41 | Bonefolder
Андрей, спасибо большое. Прочитал с удовольствием.
Как всегда, интересная подача, казалось бы, сухого технического материала.


2019-04-10 17:08:19 | Андрей
Спасибо! Очень интересно