ФОРУМ КУПИТЬ

Последние статьи

ВСЕ СТАТЬИ

Цифровой энкодер для 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

 

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

Выше описана работа энкодера, когда прерывания обрабатываются контроллером. Однако теоретически возможно, чтобы сервер контролировал весь процесс полностью. Это работает хуже, так как при быстром вращении ручки энкодера связка "контроллер-сервер-ПО" может не успевать. Контроллер отправляет сообщение о событии, сервер запрашивает состояние счетчика, контроллер отправляет состояние счетчика, сервер отправляет команду выходу, сервер отправляет команду на изменение подсветки. Но все же при плавном вращении такой механизм допустим. Для этого необходимо убрать из поля Act сценарий, а по факту срабатывания входа запрашивать состояние счетчика. Пример ниже.

if ( $_GET['pt'] == 35 )
{
	$cnt = file_get_contents("http://192.168.0.14/sec/?pt=31&scl=30&i2c_dev=encoder");
	file_get_contents("http://192.168.0.14/sec/?cmd=13:$cnt");
}

Но нам необходимо также как-то отличать события, вызванные вращением ручки энкодера, от событий, связанных с нажатием на эту ручку. Для это контроллер в случае нажатия на ручку энкодера отправляет состояние счетчика со звездочкой. Например: *225

 

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

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


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 | Андрей
Спасибо! Очень интересно


2020-06-17 22:02:40 | Илья
Здравствуйте. А 4-мя проводами его никак не подключить? А то вывел только 4 как для других i2c устройств...


2020-06-17 22:32:53 | Илья
Возможно имеет смысл попробовать шину прерываний припаять к шине данных SDA, а на другом конце разделить на 2 порта меги?


2020-06-18 08:45:09 | Andrey_B
Илья, к сожалению 4-я проводами нельзя. Нужно 5.


2020-10-07 10:25:16 | Александр
А есть возможность реализовать управление rgb подсветкой на уровне контроллера (вращение энкодера менает цвет, короткое нажатие включает выключает подсветку, длительное нажатие меняет яркость?


2020-10-07 20:32:28 | Andrey_B
Александр, в данный момент такой режим работы с энкодером не поддерживается. Автономно контроллер может работать только интерьерными лентами WS2811, но с управлением не энкодером, а кнопками. Подробнее есть в документации.


2021-02-05 15:08:56 | Александр
Подскажите, есть ли возможность задавать цвет через mqtt?


2021-02-05 22:25:51 | Александр
и второй вопрос, можно ли забирать разные нажатия? одинарное, двойное и тп.
(в частности по mqtt)


2021-02-06 10:26:45 | Andrey_B
Александр, в данный момент цифровой энкодер поддерживается только по протоколу HTTP.


2021-05-19 17:38:16 | Александр
Здравствуйте, подскажите, по mqtt ничего не поменялось? может есть планы или вообще не стоит ждать?


2021-05-19 20:19:03 | Andrey_B
Александр, пока ничего не поменялось. Это очень специфическое изделие, спрос на него очень ограниченный, поэтому в ближайших планах реализации для MQTT пока не планировалась.


2021-05-22 13:25:38 | Александр
Так потому что нет MQTT, вот и не популярен :) Крутилок для умного дома днем с огнем не найти. а так этот инткодер+megaD(как шлюз) и отдавай в любую систему УД.


2021-10-31 22:50:11 | Илья
Здравствуйте! А какой синтаксис, если нужно управлять группой выходов? g1:@31 ? 13:@31;12:@31 ?


2021-11-01 00:40:35 | Andrey_B
Илья, к сожалению командами типа "@" или "~" в автономном режиме можно управлять только одним диммируемым выходом. Несколькими - только при участии сервера.


2023-08-27 00:58:04 | Илья
Подскажите, а яркостью энкодера управлять можно? Если нет, может быть резистор на питание получится поставить?