НГ с 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
Любое использование материалов сайта возможно только с разрешения автора и с обязательным указанием источника.



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



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

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


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


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


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


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


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


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


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


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


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


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


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


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


2019-04-22 10:39:10 | Александр
Добрый день, попытался подключить ленту к контроллеру, но что-то не получается.
Питание подал, лента горит.
Зеленый провод от ленты подключил на 4-й контакт в XT2 на MegaD (т.е. P30).
Поле Type для P30 все варианты перепробовал.
Проверяю командой /192.168.0.1/xxx/?pt=30&ws=FF0000
Цвет не меняется.

Какой ставить Type и прочие параметры порта?

Заранее большое спасибо.


2019-04-22 12:20:38 | Andrey_B
Александр, тип порта "NC". Если для питания ленты используется отдельный БП, то минус этого БП должен быть соединен с минусом БП, от которого запитан контроллер.


2019-05-20 15:55:13 | Игорь
Здравствуйте
Хочу сделать верхний свет по периметру в комнатах, максимальная длина периметра - до 25 метров.
Подскажите, я правильно понял, что можно подключить несколько лент последовательно, при условии подвода питания на все стыки, включая промежуточные?
В случае, например , 5 лент, как они при этом будут "выглядеть" для контроллера, как одна лента из 500 чипов (и если да, то планируете ли увеличить максимальное значение параметра chip)? Или они будут работать как подключенные параллельно?
И, уже спрашивали, но пока никто не ответил: какова примерно максимальная длина управляющего UTP кабеля для устойчивой работы?
Спасибо!


2019-05-20 17:13:03 | Andrey_B
Игорь, подключить последовательно можно, вот только есть нюансы.
1. Если выставлять один цвет всем 500-чипам, то в текущий момент максимальное значение параметра "chip" - 255 (8-битная переменная). Но это легко исправить в прошивке.
2. Если управлять каждым чипом индивидуально, то в текущий момент максимальное количество индивидуально-управляемых чипов - 133 (размер буфера 800 байт, 6 байт на цвет). С этим намного сложнее, так как ресурсы микроконтроллера ограничены. Можно попробовать реализовать управление через POST и передачу 3 байт на цвет вместо символьного представления и 6 байт. Это позволит в теории удвоить количество управляемых чипов, но все равно 500 не получится.
Альтернативный вариант - подключать управление каждой лентой на свой порт контроллера. Тогда никаких ограничений вроде бы нет. Но, соответственно, 5 лент - 5 портов. В чем-то этот вариант даже надежнее и гибче.
Я лично не тестировал, на каком максимальном удалении от контроллера может располагаться лента при подключении управляющей линии кабелем UTP. Но вроде бы пользователи писали, что на небольшом удалении (5-10 метров) работает стабильно.


2019-05-20 18:49:16 | Игорь
А если подключить ленты к сигнальному проводу параллельно? Будет ли устойчиво работать?
Не хочется использовать так много портов на одно помещение, хоть и получается ну очень гибко, но в моих сценариях это излишне. Хотелось бы обойтись одним портом на одну комнату..


2019-05-20 20:03:30 | Andrey_B
Игорь, к одному порту несколько лент подключать не пробовал, но какой в этом смысл? Ведь индивидуального адресного управления всеми 500 чипами в этом случае не получится. Проще увеличить максимальное значение параметра chip. Будет тоже самое.


2019-05-20 20:27:04 | Игорь
Всеми не получится, да, но я предполагал что получится управлять 100 группами по 5 чипов..?


2019-05-22 19:10:34 | Игорь
Т.е. программно работать тогда надо со 100 чипами, а ленты просто будут работать синхронно-параллельно.. Так не получится?


2019-05-23 10:02:23 | Andrey_B
Игорь, я не тестировал параллельное подключение нескольких управляющих линий от лент к одному порту. Нет полной уверенности, что будет работать надежно.


2019-08-30 13:12:47 | Андрей
Здравствуйте! Что-то не с лентой не то или подключать нужно по особенному? WS2812b на 12 вольт. Кусок подключен сразу на мегу 12 вольт и горит сразу белы даже без управляющего зеленого провода.


2019-08-30 15:12:31 | Andrey_B
Андрей, это нормально для лент с подобными чипами. WS2811 ведут себя также - сразу загораются при подаче питания. А вот ленты с WS2818, которые были у меня вели себя иначе. В любом случае - это особенность самих лент.


2019-08-30 17:49:26 | Андрей
Пусть бы и белым светила сначала. Так она совсем не хочет светить другим. Порт пробовал 35 как в примере и цифровой от платы датчиков. Питание от той же платы датчиков (кусок 12 диодов). При отправке /192.168.0.17/sec/?pt=35&ws=000000 едва заметно меняет полутон если установлено сначала FF0000. Брак или есть свой подход?


2019-08-30 17:51:45 | Андрей
(fw: 4.37b5), в ответ ничего не приходит через браузер. Порт как NC. Пробовал с разных сторон подключать зеленый провод.


2019-08-30 21:06:47 | Андрей
В то же время от платы с прошивкой ESP8266 MegaD api работает лента.


2019-08-30 22:00:59 | Андрей
ws2812b завелась на 36 и 37 портах (без подтяжки то есть). На остальных 4,7к ей много. Уменьшать подтяжку не пробовал. Именно эта распространенная лента управляется по 3 диода.


2019-08-30 23:16:33 | Андрей
Заспамил маленько, однако дело оказалось в меге, которая не зажигала нормально ленту на всех портах. На другой работает и с подтяжкой тоже.