Гирлянда на UCS1903(WS2811) или ещё одна светодиодная DIY-гирлянда для начинающих

Опубликовал | 02.12.2015

  • Цена: $16.50 (покупал не тут)

Продолжаем тему новогоднего конструирования, начатую мной в предыдущем обзоре.
Ещё одна конструкция, пригодная для повторения непрофессионалами, в том числе и для детского творчества.

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

Ничего принципиально нового, никаких открытий. Профи и спецам снова будет скучно, «детский сад» и неинтересно.

А начинающим, думаю, будет интересно. Потому что, в отличие от ранее рассмотренной гирлянды, сегодня упор будет делаться не на ручной труд, а на интеллектуальный. Пайки почти не будет, гирлянда придёт уже полностью готовой к подключению. Нам же надо будет заставить её красиво светить.
Сразу оговорюсь, что эта конструкция рассчитана на чуть-чуть более сведущих в электронике. Сегодня уже будут мелькать слова «ардуино», «скетч», «амперы», «инсталлируем» и «прошиваем». Но очень хочу надеяться, что это не отпугнёт новичков, и, даже более того, что именно с этой самоделки кто-то решится познакомиться с «этими вашими ардуинами». Сложного действительно ничего нет.

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

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

Возьмём штангенциркуль и померяем модули нашей гирлянды
Длина модуля без учёта светодиода 30мм.

Габаритный диаметр чуть меньше 12мм (от модуля к модулю чуть меняется, это ж мягкий силикон.

Модули имеют возможность крепления к какой-либо панели изнутри, сквозь отверстия. Для этого сформирована канавка (на картинке помечена красной стрелочкой или на фото выше видно хорошо) и дальше несколько упорных насечек. Диаметр по посадочной канавке 11 мм.

Диаметр самого светодиода 8 мм (непривычно). Он очень хорошо матирован, свет даёт ровный, видно с любых углов обзора. Прозрачность силикона тут тоже на руку.

Светодиод выступает из модуля на 6.5 мм.

Питается гирлянда от источника постоянного тока напряжением 5 вольт. Каждый модуль при полном зажигании всех кристаллов потребляет ток до 50mA, это надо учитывать. В частности, если планируется использовать гирлянду на полную яркость, следует для её питания выбирать адаптер с силой тока не менее 3А. В предлагаемом проекте модули используются лишь на четверть яркости (и этого более чем достаточно; иначе это не ёлка, а прожектор получается), и, с учётом того, что вся гирлянда никогда не светит чистым белым, для её длительного питания с избытком хватает адаптера 5V 1,5A. У меня такой адаптер нашёлся «в тумбочке». Для конструкции вполне подойдёт ненужный зарядник для планшета или другого мощного гаждета, лишь бы значение тока не было менее 1,5 ампер и напряжение соответствовало 5 вольтам.

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

Для тех кто не знает, что такое Ардуино, коротенько
Ардуино — это маленькая законченная платка с микроконтроллером и всей обвязкой для него. Сначала платка по USB подключается к компьютеру, и через USB в ардуину вливается прошивка. Далее платку можно отключить от ПК, она будет работать сама по себе по заданной программе, только питание подавай.
Программное обеспечение для ардуино бесплатно и доступно; возможна как инсталляция, так и portable-работа приложения (оно называется, кстати, Arduino IDE). В одной среде совмещено как средство разработки и отладки программ, так и средство программирования ардуины. Язык программирования не сложен и понятен; в сети есть огромное количество уроков, примеров, библиотек, учебников и конференций по ардуино.

Таким образом, для успешной сборки устройства нам необходимо всего лишь три компонента:
— Гирлянда;
— Ардуино;
— Адаптер питания.

Из неосновных, но желательных компонентов напрашивается:
— Кабель с тремя проводниками, чтобы удлинить шину гирлянды — иначе контроллер будет в пяти сантиметрах от первого светодиода;
— Маленький корпус, в который можно убрать платку ардуины;
— Гнездо для подключения адаптера питания (если адаптер питания имеет штекер, разумеется).

Ещё нам потребуется ПК, на котором будет стоять софт для работы с ардуино (на сегодня это Arduino IDE 1.6.6) и шнур USB-miniUSB (или USB-microUSB) в зависимости от того, какой разъём на борту имеет ардуина.

Не знаю, нужно ли приводить принципиальную схему устройства, но пусть будет:

В качестве J1 у меня выступает гнездо питания 5,5*2,1:

Под разъёмом J2 условно понимается подключение гирлянды.

Питание с адаптера подаётся сразу и на гирлянду, и на ардуину.
Цвета проводов в гирлянде:
красный — плюс питания,
в середине шлейфа белый — данные,
синий — общий минус.

В силу того, что в конструкции используется всего лишь один вывод ардуины (у меня на схеме это пин 2), нам с одинаковым успехом подойдёт любая ардуина. Вот прямо какая будет ближе и дешевле, та и подойдёт.
Новичкам я бы посоветовал Arduino Nano, она имеет небольшие размеры, дополнительных шилдов мы использовать не будем, подключается стандартным microUSB проводом.
Более подготовленные и продвинутые, уверен, выберут самый экономичный вариант, Arduino Pro Mini, но эта модель ардуино не имеет USB интерфейса, их надо прошивать специальным конвертером TTL UART (всячески советую с пином DTR), поэтому новичкам советовать этот вариант не стану.
Но подойдёт и UNO, и любая другая модель, хотя это будет более расточительно.

Итак, качаем и инсталлируем Arduino IDE. Подключаем нашу платку.
Система находит и инсталлирует драйвера.
Но прежде, чем запустить программу, сделаем ещё несколько подготовительных операций.
Вот сюда я положил архив с исходным скетчем и необходимыми ему библиотеками. Библиотеки одинаково успешно были проверены как на версии 1.6.5, так и на 1.0.5, так что проблем быть не должно.
Надо содержимое папки libraries из архива (там две подпапки) распаковать в аналогичную папку libraries туда, куда установлена программа.
Запускаем программу.
Настройки просты: В меню «Инструменты» в списке «Плата» установить свою модель платы и в списке «Порт» установить тот виртуальный порт, который создался после подключения ардуино кабелем к ПК.
В главном окне уже будет пустой скетч. Что-то типа «void setup()» первой строкой. Нам это не нужно. Открываем скетч «Led1903.ino», который был в архиве.

На всякий случай, приведу скетч ещё и тут, вдруг архив протухнет
  #include "FastLED.h"  #include <MsTimer2.h>    #define NUM_LEDS 50  // Количество светодиодов в гирлянде    #define GreenChannelTune 0.68 // Эти коэффициенты выравнивают реальный белый цвет светодиодов при одинаковых значениях RGB.  #define  BlueChannelTune 0.5    #define DATA_PIN 2  #define CLOCK_PIN 13        CRGB leds[NUM_LEDS];  byte reds1 [NUM_LEDS];   byte reds2 [NUM_LEDS];     byte greens1 [NUM_LEDS]; byte greens2 [NUM_LEDS];   byte blues1 [NUM_LEDS];  byte blues2 [NUM_LEDS];      byte MaxBright=64;  // Максимальная яркость гирлянды    int cRed1,cGreen1,cBlue1=0;  int cRed2,cGreen2,cBlue2=0;  int sRed1, sGreen1, sBlue1, sRed2, sGreen2, sBlue2;    int Eticker, Emaxticker=0;  int alpha1,alpha2;  byte effect=1;      void TickEvery1s()  // Эта процедура вызывается 1 раз в секунду  {    Eticker++;    if (Eticker>=Emaxticker)      {Eticker=0; Emaxticker=random(20, 60);        switch(effect){        case 1: effect=2;          break;        case 2: effect=1;          break;      }    }  }        void setup() {   randomSeed(analogRead(0));    FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);     MsTimer2::set(1000, TickEvery1s); // 10000ms period   MsTimer2::start();     Emaxticker=random(20, 60);     sRed1=random(-2, 2);   sGreen1=random(-2, 2);   sBlue1=random(-2, 2);   sRed2=random(-2, 2);   sGreen2=random(-2, 2);   sBlue2=random(-2, 2);  }    void loop() {       cli();    cRed1=cRed1+sRed1; cRed2=cRed2+sRed2;  if ((cRed1>=MaxBright) or (cRed1<=0)) {sRed1=random(-2, 2);};  if ((cRed2>=MaxBright) or (cRed2<=0)) {sRed2=random(-2, 2);};  cRed1 = constrain(cRed1, 0, 255); cRed2 = constrain(cRed2, 0, 255);  for(int i = 1; i < NUM_LEDS; i++) {reds1[i-1]=reds1[i];} reds1[NUM_LEDS-1]=cRed1;  for(int i = NUM_LEDS-1; i>0 ; i--) {reds2[i]=reds2[i-1];} reds2[0]=cRed2;    cGreen1=cGreen1+sGreen1; cGreen2=cGreen2+sGreen2;  if ((cGreen1>=MaxBright) or (cGreen1<=0)) {sGreen1=random(-2, 2);};  if ((cGreen2>=MaxBright) or (cGreen2<=0)) {sGreen2=random(-2, 2);};  cGreen1 = constrain(cGreen1, 0, 255); cGreen2 = constrain(cGreen2, 0, 255);  for(int i = 1; i < NUM_LEDS; i++) {greens1[i-1]=greens1[i];} greens1[NUM_LEDS-1]=cGreen1;  for(int i = NUM_LEDS-1; i>0 ; i--) {greens2[i]=greens2[i-1];} greens2[0]=cGreen2;    cBlue1=cBlue1+sBlue1; cBlue2=cBlue2+sBlue2;   if ((cBlue1>=MaxBright) or (cBlue1<=0)) {sBlue1=random(-2, 2);};  if ((cBlue2>=MaxBright) or (cBlue2<=0)) {sBlue2=random(-2, 2);};  cBlue1 = constrain(cBlue1, 0, 240); cBlue2 = constrain(cBlue2, 0, 240); //200  for(int i = 1; i < NUM_LEDS; i++) {blues1[i-1]=blues1[i];} blues1[NUM_LEDS-1]=cBlue1;  for(int i = NUM_LEDS-1; i>0 ; i--) {blues2[i]=blues2[i-1];} blues2[0]=cBlue2;        	for(int i = 0; i < NUM_LEDS; i++) {  		leds[i] = CRGB(((greens1[i]*alpha1/32)+(greens2[i]*alpha2/32))*GreenChannelTune,((reds1[i]*alpha1/32)+(reds2[i]*alpha2/32)),((blues1[i]*alpha1/32)+(blues2[i]*alpha2/32))*BlueChannelTune);    		FastLED.show(); // Отображаем массив  	}          switch(effect) {  case 1:   { if (alpha1<32) {alpha1++;};     if (alpha2>0) {alpha2--;};   } break;  case 2:   { if (alpha1>0) {alpha1--;};     if (alpha2<32) {alpha2++;};   } break;      }  }  


В основном окне программы видим перед собой открывшийся скетч.
Нажимаем на кнопку «Проверить»
Если после процесса проверки не видим красного текста и сообщений об ошибках — то всё замечательно.
Смело можем отправлять этот код в плату.
Нажимаем «Вгрузить» и через несколько секунд в окне статуса мы должны получить сообщение, что всё вгружено.
Поздравляю, наша ардуина готова к работе.

Лирическое отступление о данном скетче. Можно не читать.
Когда в начале обзора я сказал, что на построение этой гирлянды не уйдёт много времени, я не лукавил. Я сам построил эту гирлянду, когда на кухне уже нарезались салаты. Если посмотреть на дату первой версии скетча, то это будет 31 декабря прошлого года. Мне вот пришло тогда в голову — а не украсить ли интерьер интересной гирляндой, всё равно есть полчаса времени. Поэтому гуру программирования, посмотрев на скетч, будут рады позадавать мне ехидные вопросики и рассказать, что всё можно сделать проще и изящнее. Согласен, да, можно. Я и сам знаю. Числа с плавающей точкой не надо бы; это вообще всё можно заменить целочисленными таблицами. Много лишних телодвижений в массивах. И их самих тоже много. Но, сорри, я писал этот скетч быстро. И он работает. Так, как мне нужно. А вот после того, как мы бы сели за стол и открыли шампанское, самый изящный и безупречный скетч был бы никому не нужен. А так — гирлянда радовала и это главное её предназначение.


Пора браться за паяльник.
Пока он разогревается, подберём корпус. У меня «в тумбочке» завалялся более-менее подходящий.
С одной стороны я ввёл подходящий кабель для подключения гирлянды, с противоположной поставил гнездо для подключения адаптера питания.

В соответствии со схемой, подпаиваем провода.
Я в конструкции использовал Arduino Pro Mini, мне они нравятся малыми габаритами и стоимостью. Я их обычно заказываю сразу пригоршню, чтобы для очередной конструкции не искать, а сразу взять из кучки. Да и устанавливать их, учитывая стоимость, в конструкцию не жалко, это не «мегу» навсегда замуровать. А крепить их можно «терпосоплёй» или двухсторонним пеноскотчем. Лишь бы шесть контактов для возможного программирования оставались доступными.

Корпус великоват, наверное. Но это лучше, чем ничего.
Получается вот так:

Проверяем, включаем, убеждаемся, что всё работает. Можно закрывать крышку и наводить окончательный «марафет», чтобы конструкция не выглядела сильно колхозно.

О характере свечения гирлянды.
Я уже писал как-то, что меня раздражают гирлянды с резкими мельтешениями, миганиями, мерцаниями и прочим. Я тяготею к плавной смене цвета, «ламинарному» (т.е. без пульсаций и хаоса) характеру свечения. Мне кажется, для новогодней ёлки это более подходит.
Поэтому в своём скетче я реализовал неспешное движение световых «волн» вдоль гирлянды. Цвет, интенсивность и направление волн случайны, т.е. рисунок никогда не повторяются. Это обеспечивается тем, что генератор случайных чисел отталкивается от аналогового сигнала на ни к чему не подключённой ножке контроллера.
Безусловным плюсом конструкции является то, что каждый может в любой степени поменять предлагаемый скетч, чтобы получить тот характер свечения, который устроит именно его. В аппаратном смысле не изменится ничего, а в программном — всё определяется исключительно фантазией. В любом случае, переделывать готовый скетч проще, чем писать что-то новое «с нуля».
Покажу минутный ролик с работой гирлянды. Я уже говорил, что светодиоды практически невозможно снимать так, чтобы получилось красиво. Прошу прощения за засветы возле самих диодов, в реальности их нет. Прошу прощения за дрожание автофокуса, я ничего не смог с этим поделать. Прошу прощения за плавающий баланс цветности. Словом, ролик позволяет «более-менее» понять, что происходит с цветом гирлянды, не более. «Сосед напел кое-что из Шаляпина», да. В данном минутном отрезке разноцветовые волны движутся вдоль гирлянды справа налево.

Саму гирлянду я покупал у другого продавца. Сейчас его магазина нет на Али, поэтому ссылку дал на аналогичный товар, хотя сам у данного продавца ничего не покупал.

Все ссылки в тексте даны лишь для иллюстрации.

Для обзора никто ничего не предоставлял и никаких условий не ставил. Всё покупалось исключительно на свои деньги в разное время.

PS: Да. Полноцветные светодиоды на WS2811/UCS1903 бывают конструктивно оформлены не только в виде силиконовых модулей и проводов, как описано в этом обзоре. Они бывают ещё в форм-факторе светодиодных лент или различных модулей для уличного монтажа. С точки зрения электроники и программирования ничего не меняется. Оформляйте ёлку и интерьер так, как посчитаете нужным. Главное, чтобы было праздничное новогоднее настроение!

(c) 2015 Источник материала.

Рекламные ссылки