НГ с MegaD-2561 и WS2818 или гирлянда не как у соседей

23/12/2017 12:16:38

В прежние времена в канун новогодних праздников под запах хвои и мандаринов я изучал возможности по созданию атмосферной иллюминации, проводил эксперименты с оборудованием, которое имелось в наличии на тот момент. Так, в 2010-2011 году я управлял елочной гирляндой по 1-wire, а в 2013-2014 пошел дальше, применив контроллер MegaD-328 для создания цветомузыки по Ethernet. Был также опыт по управления RGB-лентами. В этом году изначально я не планировал ничего такого. Были дела и поважнее. К тому же китайская гирлянда, которую мы развешивали ежегодно на заборе, кажется, доживала свои последние часы, и из 3-х цветов горел только синий, да и то не всегда. Кроме того, несмотря на экономический кризис, уличные гирлянды население нашего города раскупило еще в ноябре. В конце концов, Новый Год случается каждые 365 дней в году. Не каждый же раз развешивать все эти лампочки... Но когда все дома по соседству, будто сговорившись, врубили на своих фасадах, заборах и калитках весь свой многокиловаттный арсенал, тщательно скупленный еще по осени, мои домочадцы затосковали. Им тоже захотелось ощущения праздника...

Мне никогда не нравились режимы в китайских гирляндах. Ну, во-первых, они не поддаются толком никакому управлению. Выберешь, казалось бы, какой-то режим, а он через пару минут съедет. А во-вторых, от всего этого перемыргивания у меня лично рябило в глазах, особенно после стакана другого игристого пивосамогоновина. Да и скучно было просто копипастить иллюминацию соседнего забора. Душа просила хоть какого-то эксклюзива. И тут я вспомнил, что на днях по просьбе одного из пользователей баловался лентой с чипами WS2818. О! Так это же то, что нужно!

Начну с того, что для диммирования обычных RGB лент нужны специальные драйверы, которые подключаются к ШИМ портам контроллера. Я использовал L298N, но сейчас есть и другие решения. Все бы ничего, но необходимость в отдельном драйвере создает некоторые неудобства, да и ШИМ портов в контроллере всего 7, не к каждому порту его подключишь. Но есть такие RGB-ленты, которым не нужны никакие дополнительные устройства, которые можно подключать к ЛЮБОМУ порту контроллера. Это ленты со встроенными цифровыми микросхемами, которые получают команды от контроллера и преобразуют их в нужный цвет. Таких микросхем выпускается достаточно много: WS2811, WS2812, WS2813, WS2818 и т.д. Каждая такая микросхема обслуживает один-три RGB-диода. То есть в ленте таких чипов много. Отсюда и цена, которая в 3-5 раз выше, чем у обычных RGB-лент. Но зато для управления всей RGB-лентой нужно не 3 ШИМ порта, а всего ОДИН, и при этом любой, не важно - с ШИМ или без.

LED strip WS2818
Лента с чипами WS2818

Микросхемы типа WS28** устроены довольно оригинально. Каждая такая микросхема сначала получает команду для себя, а все последующие транслирует дальше по цепочке. Таким образом важной особенностью подобных лент является то, что можно управлять каждым диодом ( или группой диодов в зависимости от того, сколько их подключено к отдельному чипу) индивидуально.

Итак, у меня была лента WS2818. В ней 300 диодов и 100 чипов. К каждому чипу подключено три RGB-диода. Напряжение питания 12В, общая потребляемая мощность 72Вт. Конечно, чтобы подключить такую ленту к контроллеру MegaD-2561 потребовалось дописать прошивку (версия 4.21b1). Протокол для работы с лентой несложный, но тайминги очень короткие. Вот почему чаще всего реализацию работы с подобными лентами пишут на ассемблере. Но у меня задача была сложнее. Нужно было добиться, чтобы лента работала не с каким-то конкретным портом и не по заранее определенному алгоритму, а с любым портом, доступным в контроллере и с любым алгоритмом, написанным на сервере. И такую реализацию я сделал. Конечно, не все тайминги уложились в требования Datasheet'а, но тем не менее лента заработала. Также пользователи отмечают, что контроллер отлично работает с лентами WS2811 и WS2813.


Подключение ленты WS2818 к MegaD-2561. Всего 3 провода, но питание подавать с обоих концов!

Подключение ленты к контроллеру проще некуда. Используется, грубо говоря, три провода: питание (+12В), земля (эти два провода подключаются к блоку питания нужной мощности) и один провод, идущий к порту микроконтроллера. На фотографии сигнальный провод подключен к P35. Провод для передачи данных можно подключать к любому порту разъемов XP1/XP2 напрямую, к любым портам клеммы XT2, к любым портам MegaD-14-IN в режиме цифрового входа, к цифровому порту модулей MegaD-8I7O, MegaD-14-R. Важно, чтобы мощность блока питания соответствовала мощности ленты. Я использовал БП DR-100-12.

Также важной особенностью длинных лент, подобных моей (5 метров), является то, что питание нужно подключать с обеих сторон ленты. Если питание подключить только с одной стороны, то яркость диодов на конце ленты будет падать. А еще китайские производители ленты видимо что-то попутали и подключили диоды так, что лента стала не RGB, а RBG. То есть, при передачи сигнала для зеленого цвета загорается синий и наоборот. Для гирлянды значения абсолютно не имеет.

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

Включить все диоды красным цветом
http://192.168.0.14/sec/?pt=35&ws=FF0000

Включить все диоды красным цветом
http://192.168.0.14/sec/?pt=35&ws=FF0000

Включить диоды красного и синего (зеленого в моем случае) цвета
http://192.168.0.14/sec/?pt=35&ws=FF00FF

Выключить ленту
http://192.168.0.14/sec/?pt=35&ws=000000

MegaD-2561 отправит код, состоящий из 3 байт, 100 раз и вся лента загорится определенным цветом.
Но если в качестве параметра передать не 3, а 6 байт, то цвета будут чередоваться.

Включить первый сегмент красным, а второй зеленым и т.д. до конца ленты
http://192.168.0.14/sec/?pt=35&ws=FF000000FF00

В текущий момент буфер контроллера может принять до 133 таких RGB команд (133 индивидуальных чипов в ленте.)
Можно заложить в контроллер и другие возможности, но пока для пробных целей я решил ограничиться простейшей реализацией.

Параметр "chip" определяет количество чипов, которым мы отправляем команду (по умолчанию 100).
Если к примеру в ленте только 10 чипов или нам нужно "зажечь" только первые 10 чипов, а остальные оставить без изменения, то мы можем вызывать следующий URL:

Зажигаем 10 первых чипов красным
http://192.168.0.14/sec/?pt=35&ws=FF0000&chip=10

А теперь, зная все это, можно написать PHP-скрипты для управления такой лентой. Здесь я попытаюсь показать, насколько все это в действительно просто.

Вариант 1. Hello world! Плавное изменение яркости красного цвета ленты
 

for ( $i = 0; $i < 256; $i++ )
{
    $r = dechex($i);
    if ( $i < 16 )
    $r = "0".$r;
    file_get_contents("http://192.168.0.14/sec/?pt=35&ws=".$r."0000");
}




Вариант 2. Изображаем из себя китайскую гирлянду
 

$cmd_list = array("FF0000", "00FF00", "0000FF", "FFFFFF", "000000");
while(true)
{

    $cmd = $cmd_list[rand(0,4)].$cmd_list[rand(0,4)].$cmd_list[rand(0,4)];
    file_get_contents("http://192.168.0.14/sec/?pt=35&ws=$cmd");
    sleep(1);
}





Вариант 3. Прокаченный вариант китайской гирлянды. Добавим немного свежих цветов
 

$cmd_list = array("FF0000", "00FF00", "0000FF", "FFFFFF", "000000");
$color = 0;

while(true)
{
    $cmd = "";
    for ( $i = 0; $i < 9; $i++ )
    {
        $color = dechex(rand(0,100));
        if ( strlen($color) == 1 )
        $color = "0".$color;
        $cmd .= $color;
    }
    file_get_contents("http://192.168.0.14/sec/?pt=35&ws=$cmd");
    sleep(1);
}




Вариант 4. Еще больше цветов. Каждый сегмент светится своим цветом
 

$cmd_list = array("FF0000", "00FF00", "0000FF", "FFFFFF", "000000");
$color = 0;

while(true)
{
    $cmd = "";
    for ( $i = 0; $i < 37; $i++ )
    {
        $color = dechex(rand(0,rand(0,100)));
        if ( strlen($color) == 1 )
        $color = "0".$color;
        $cmd .= $color;
    }
    file_get_contents("http://192.168.0.14/sec/?pt=35&ws=$cmd");
    sleep(1);
}




Вариант 5. Покатаемся?
 

$cmd_list = array("500000", "005000", "000050", "505050", "000000");
$color = 0;

while(true)
{
    $cmd = "";
    for ( $i = 0; $i < 12; $i++ )
    {
        if ( $i == $cnt )
        $cmd .= $cmd_list[$color];
        $cmd .= "000000";
    }
    $cnt++;

    if ( $cnt == 12 )
    {
        $cnt = 0;
        $color = rand(0,3);
    }
    file_get_contents("http://192.168.0.14/sec/?pt=35&ws=$cmd");
    usleep(50000);
}




Вариант 6. Не как у соседей!
 

while(true)
{
    $cmd_rgb = "";
    for ( $i = 0; $i < 12; $i++ )
    {
        for ( $j = 0; $j < 3; $j ++ )
        {
            if ( $color_now[$j][$i] == $color_steps[$j][$i] )
            $color_steps[$j][$i] = rand(0, 100);

            if ( $color_now[$j][$i] < $color_steps[$j][$i] )
            {
                $color_now[$j][$i]++;
                $color[$j][$i]++;
            }
            else
            {
                $color_now[$j][$i]--;
                $color[$j][$i]--;
            }
    
            if ( $color[$j][$i] > 255 )
            $color[$j][$i] = 254;
            if ( $color[$j][$i] < 0 )
            $color[$j][$i] = 1;

            if ( strlen(dechex($color[$j][$i])) == 1 )
            $cmd[$j][$i] = "0".dechex($color[$j][$i]);
            else
            $cmd[$j][$i] = dechex($color[$j][$i]);
        }
        $cmd_rgb .= $cmd[0][$i].$cmd[1][$i].$cmd[2][$i];
    }

    file_get_contents("http://192.168.0.14/sec/?pt=35&ws=$cmd_rgb");
}




Разумеется, можно придумать массу других алгоритмов. Таких, какие нравятся именно вам. И это будет гирлянда, которой можно будет похвастаться перед друзьями, это будет настоящий эксклюзив, то, что сделано своим умом и своими руками. Забавно, что в данном случае ошибки в алгоритмах не только не страшны, но даже в некоторых случаях полезны для создания каких-то новых, необычных эффектов.

Интересно, что такие гирлянды можно интегрировать в общую систему Умного Дома:
- включать и выключать по расписанию;
- до 22 часов использовать более активные режимы, а после 22 успокаивающе-умиротворяющие;
- приветственно моргать проходящему через калитку (каждому домочадцу можно назначить свой "цвет");
- если гирлянда смонтирована на въезде в гараж, можно в процессе парковки автоматически включать белый цвет для подсветки въезда;
- в случае проникновения в дом имитировать красно-синие милицейские стробоскопы для привлечения внимания;
- на государственные праздники раскрашивать гирлянду в бело-синие-красный цвет (или жовто-блакитный, что даже проще);
- окрашивать гирлянду в красно-белые цвета после победы мяса московского Спартака;
- придумывать и воплощать любые другие интересные идеи. Ведь в этом то и заключается смысл Умного Дома;

Если кому-то интересно, размещаю реально работающий у меня в данный момент скрипт с автоматическим переключением режимов, который управляет лентой WS2818, смонтированной на моем заборе.
megad-ws2818.zip
Текущий режимы: Разноцветие, Бегущие черточки, Повторяющийся флаг России, Рандомная полоска, Бегущая линия, Большой флаг России, Бабах.
Режимы дополняются сейчас почти каждый день.

 

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



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



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

2018-11-26 09:40:26 | Andrey_B
Михаил, Vdd - +3.0~+5.3V (согласно даташиту)
В случае с Мегой - это приблизительно +3.3-3.4V
Питание (не сигнальный провод) конкретно таких лент +12В, так как к одному чипу WS2818 здесь подключено три RGB диода.


2018-11-25 20:28:08 | Михаил
На сигнальный провод в этой ленте WS2818 приходится 5 вольт или 12 вольт?


2018-04-29 10:44:25 | Andrey_B
Влажность для IP67 - не проблема, а вот температура... Например, заявленная максимальная температура работы для чипов WS2818 составляет +85 градусов. Но, кажется, основная проблема даже не в этом, а в том, что материал оболочки, что-то вроде силикона, от нагрева может начать плавится или издавать запах. У меня нет личного опыта использования подобных лент в условиях высоких температур окружающей среды.
А вообще для саун и бань обычно используют оптоволоконную подсветку с генерирующим свет блоком за пределами непосредственно парилки.
Кстати, только что посмотрел на упаковке ленты написано: Operating Temperature: -25+60C


2018-04-28 20:57:04 | Anton
Андрей доброго времени суток.
Не подскажите в каких диапазонах температур работает эта лента. а то есть идея поставить ее в бани в парилки для подсветки. а температура там может подняться до 90-100 градусов и хорошей такой влажностью. если с влажностью справится IP67. то как быть с температурой?


2018-01-17 01:22:57 | Виктор
Андрей, а можете проверить на линии управления длиной метров 30 витухи? Я собирался себе дома делать несколько подсветок на лентах с драйвером L298N, по рекомендациям более ранних форумных веток, но тут такая оказия с экономией портов, что хотелось бы заложиться на такой вариант. Однако, есть несколько линий связи по длинным (~30 м) проводам. Ниже видел комментарий, что может не заработать.


2018-01-09 18:40:31 | Andrey_B
Александр, лента у меня IP67, а соединения можно организовать в подходящих распределительных коробочках.


2018-01-09 08:32:05 | Александр
Андрей, здравствуйте! А как быть с влагозащищенностью ленты и электрических соединений? Лента у Вас в корпусе?


2018-01-04 13:49:30 | Andrey_B
Роман, да это стандартный разъем, который висел на ленте (тип мама, папа с другого конца) для соединения лент последовательно друг с другом. Вот в этот разъем просто воткнут проводок (Jumper Cable) для макеток.
Если лента будет длинной, то питание нужно как-то подавать и в центр ленты, потому что если соединить 2 ленты вместе и питание подать с концов, то яркость будет падать в центре этой конструкции. Кроме того, в текущий момент параметр "chip" может принимать значения только до 255, но это теоретически можно поправить.


2018-01-04 01:29:03 | Роман
Круто!! Подскажите плиз - что это за соединение /take.ms/eaGNR? Насколько понимаю мощность (длина) ленты ограничивается только мощностью блока питания?


2017-12-27 19:17:37 | Джалил
Замечательно, но печально что уже купил ленту :)


2017-12-24 11:40:08 | Andrey_B
Если посмотреть в даташиты на различные версии чипов, то можно заметить, что для разных чипов разные тайминги. Совершенно не уверен, что будет работать, нужно проверять. С другой стороны и для WS2818 в прошивке в точности не соблюдены тайминги, но работает. Но где-то писали, что именно WS2818 не так критична к таймингам. Что касается сигнальной линии, то не проверял, но сам по себе протокол не содержит никакой коррекции ошибок и никак не защищен. И я заметил, что если вблизи сигнальной линии есть источник сильных электромагнитных помех, то в процессе передачи данных возникают ошибки. Разные сегменты ленты вспыхивают не теми цветами, которые нужно. Возможно одна из причин то, что в MegaD-2561 используются уровни 3,3В, тогда как в других контроллерах 5В. Поэтому вероятно длина сигнальной линии должна быть минимальной. Еще из особенностей заметил, что чипы в ленте при длительной работе могут изредка (не часто) "зависать", то есть они пропускают через себя сигнал, но сами не реагируют. Лечится сбросом питания с ленты. Пока наблюдаю. Попробую также по возможности другие варианты лент, с другими чипами.


2017-12-24 10:29:50 | Игорь
Заказал чипы WS2813. Как я понял, это тоже что и 2818 только на один RGB элемент в едином корпусе SMD5050. Жду реализацию количества элементов в шине. Надеюсь, что значения можно будет задавать от 1. Андрей, а Вы тестировали работу на длинной сигнальной линии, например, метров 30?


2017-12-24 04:54:31 | Михаил
Спасибо за вашу реализацию.
Очень ждем > В ближайшее время будет добавлен параметр, определяющий количество чипов в ленте, чтобы можно было работать с лентами любой длины.
потому что WS2818 похоже не самая популярная модификация - на али их мало, по сравнению с другими типами.