Воскресенье, 11.12.2016, 12:57
Приветствую Вас Гость

Портал светоэффектов

Меню сайта
Категории раздела
Наш опрос
Оцените мой сайт
Всего ответов: 580
Статистика

Онлайн всего: 7
Гостей: 6
Пользователей: 1
Петрин
Форма входа
Главная » Статьи » RGB

Опыт работы с адресуемыми RGB лентами
Прочитал тут как то статью "Kitty - 18-канальное цветомузыкальное USB-устройство на RGB-ленте, работающее с приложением "Cat's Eye v.4" и решил поделиться с публикой своим опытом работы с адресуемыми RGB лентами. 



Они давно привлекали меня своими необычными свойствами, а ролики на YouTube только добавляли масла в огонь. 
Все начиналось обычно. Интернет, ввод в поисковую строку заветных слов и... полный облом. Оказалось в России такого никто не предлагает (по крайней мере в то время). Не хотелось связываться с китайцами, но пришлось. Заказ на Алибабе и томительное ожидание. Многих заинтересует цена вопроса, отвечаю. Заказал 5 метров ленты за 60 американских рублей  и заплатил 40$ за EMS почту. Считаю, что вполне уложился в запланированный бюджет. Посылка из Китая до Ростова-на-Дону шла 3 недели. Мой звездный час настал в тот миг, когда сотрудник экспресс-почты вручил наконец долгожданную коробочку с волшебным содержимым. Трясущимися от волнения руками вскрываю пакет и достаю оттуда нечто похожее на бобину от ленточного магнитофона на которую вполне себе аккуратненько намотана RGB лента. 



Не совсем доверяя Китайским товарищам решил замерить ее длину и, как оказалось, не зря. Производитель в описании сообщает, что на одном метре ленты располагается 32 светодиода, т.е. на 5 метрах 160 шт., а в моем случае их оказалось 157. Почему я заострил на этом внимание поясню ниже, при рассмотрении программы управления.
Продолжу с Вашего позволения описание принципов работы с лентой. 
Важно отметить, что у такого типа лент есть вход и выход. Путать их нельзя, и на это нужно обращать особое внимание, когда будете производить монтажные работы, особенно связанные с разрезанием ленты на части. В моем случае на входе заботливыми руками рабочих был припаян разъем. 



Если разъема не окажется, определить вход и выход можно ориентируясь по надписям на самой ленте. Например на моей это выглядит так, как показано на рисунке. Стрелка указывает направление от начала к концу. Отметим, что такие стрелки изображены не на всех элементах, поэтому сначала найдите такой символ, а потом по расположению элементов на плате вы всегда найдете вход и выход. 



Кстати о резке ленты. Ее можно смело кромсать на отдельные элементы вплоть до одной секции, размеры которой показаны на фото. Режут ленту просто ножницами по линии раздела, которую легко определить. На данном фото она находится слева от второй микросхемы между контактными площадками, там, где расположена правая выносная линия размера. Из своего опыта могу посоветовать следующее. После резки ленты внимательно под лупой рассмотрите место разреза. Если ножницы были слегка затупленными, то медные проводники могут смяться и устроить Вам подлянку в виде короткого замыкания и кучи зря потраченного времени на его поиск. Оно Вам надо? Так что лучше вычислить врага на дальних подступах.
Теперь повнимательней рассмотрим обозначения нанесенные на ленту. 


 
Как мы видим на каждой секции ленты находятся:
RGB светодиод.
Пять резисторов (это на первой секции, на следующих их нет). Эти два недостающих резистора есть ничто иное, как ограничители тока в линии. Их номинал 33 Ома. Так, что если Вы будете использовать секции ленты не с начала, не забудьте их установить последовательно в линии СК и SD.
Конденсатор.
Микросхема.
Слева и справа по 4 контактных площадки для подключения. Маркировка на лентах разных производителей будет отличаться от приведенной, но общий смысл останется прежним. На данном типе ленты, как мы видим, контактные площадки обозначены следующим образом:
+5В - напряжение питания.
СК — линия синхросигнала. 
SD — линия данных.
GND — общая шина.
Думаю, что о назначении контактов +5В и GND всяк догадается сам :-), а о назначении линий синхросигнала и данных более подробно я напишу ниже при рассмотрении протокола обмена.
Теперь не много об электрических характеристиках ленты и микросхемы.
Напряжение питания 5 вольт.
Мощность, потребляемая 1 метром ленты составляет 10 Вт, ток потребления 2А. На одном метре располагаются 32 RGB светодиода, так, что мощность одной матрицы 10/32=0,3Вт, ток потребления 60 мА (в случае зажигания всех трех светодиодов). Мощностью, которая потребляется микросхемой управления можно пренебречь, ввиду ее малости.
В зависимости от количества используемых светодиодов  Вы должны подобрать мощность источника питания. 
Я решил использовать все 5 метров, поэтому остановил свой выбор на источнике с выходным током 14 А, что с лихвой хватило на все мои эксперименты. В процессе работы блок питания практически не нагревался.





Микросхема WS2801 является драйвером постоянного тока для светодиодов и имеет на борту 3 выходных канала, каждый из которых может выдавать ток до 30 мА в режиме стабилизации выходного тока и до 50 мА в режиме стабилизации выходного напряжения.
Три 8-ми разрядных встроенных генератора ШИМ с частотой обновления 2,5 кГц дают нам 255 градаций яркости каждого светодиода.
Максимальная частота синхронизации 25 мГц. 
Микросхема содержит последовательный регистр сдвига, регистр-защелку данных, выходные регистры, встроенные генераторы опорного напряжения и синхронизации, а так же входы для задания выходного тока. Управление регистрами производится по двухпроводной схеме. Соединяя последовательно выход одной микросхемы со входом другой мы легко можем наращивать количество светодиодов для решения тех или иных задач. Не будем останавливаться более подробно на описании функционирования микросхемы, т.к. это не входит в нашу с Вами задачу. Любопытный читатель всегда найдет то, что ему интересно на бескрайних просторах инета.
Ну, что, пора переходить к самому вкусному. Каким же образом использовать всю эту красоту. 
Надеюсь читатель уже понял, что для того, чтобы управляться со всеми этими светодиодами, регистрами и прочими прибамбасами необходим микроконтроллер. 
Порывшись в развалах своего шкафа нашел завалявшуюся там макетную плату Savvy с ATMega128 на борту. Платка конечно крутовата для таких целей, но никакого желания паять что либо не было, поэтому решил использовать ее для своих экспериментов. Для желающих привожу ее фото. 



Кварц 12 мГц, что стояло, то и пошло в дело.
Пора перейти от абстрактных описаний к конкретному делу, а именно рассмотрению того, как же нам зажечь светодиод и менять его яркость. 
Для понимания сути дела рассмотрим диаграмму сигналов на входе и выходе каждой секции. 



Начнем с того, что массив данных для одной секции (называемый фреймом) имеет длину 24 бита. По 1 байту на каждый светодиод и 3 светодиода в матрице. Как видно из диаграммы первый байт управляют красным светодиодом, второй зеленым и третий синим. Передача данных ведется старшим разрядом вперед. Например если мы подадим на шину три байта 255 0 0, то зажжем красный светодиод на полную мощность, а если подать например такую комбинацию 127 200 0 то увидим, что красный светодиод будет зажжен на половинную яркость, зеленый чуть ярче красного, а синий погашен. Результирующее свечение будет напоминать желтый. Вот таким образом комбинируя эти три байта мы можем позволить себе синтезировать более 16 млн. цветов и оттенков. Справедливости ради нужно сказать, что все это теоретически. На практике вы вряд ли заметите разницу между например 255 0 0 и 254 0 0, но нам это и не нужно, то, что можно сделать с имеющимися у нас цветами поистине безгранично.
Разобравшись с управлением одной секцией можно перейти к управлению несколькими. Количество светодиодов в ленте теоретически может быть бесконечным, но мы же с Вами грамотные люди и прекрасно понимаем, что это совсем не так. Количество светодиодов будет ограничиваться мощностью нашего источника питания и быстродействием микросхем. 
Проведя множество экспериментов я пришел к выводу, что максимальную длину ленты не стоит брать более 5 метров. При этом можно обойтись не очень мощным блоком питания и дешевыми микроконтроллерами. Это не аксиома. Вы в своей разработке можете использовать такую длину, которая Вам необходима.
Так как же организовано каскадирование секций в ленте? Да очень просто. Каждая микросхема имеет вход и выход. Как видно из диаграммы  начало фрейма оформляется паузой длительностью не менее 500 мкс. Если на входе первой микросхемы появится такая пауза, она будет знать, что следующие данные предназначены именно для нее. 
При получении 3 байт она защелкнет данные в своем внутреннем регистре а все остальное будет тупо пропускать дальше на выход. Следующая микросхема будет делать тоже самое и все это безобразие будет длиться до тех пор, пока не будет передана вся информация. Заполнять регистры всей ленты следует максимально быстро без длинных пауз, т.к. пауза в передаче приведет к тому, что данные начнут опять приниматься первой микросхемой.
Ну что, устали небось от нудной теории, а руки так и тянутся к паяльнику? Не буду больше томить нетерпеливого читателя и перейду к практической части нашего повествования. 
Для начала необходимо заняться совсем не сложными вычислениями. В начале статьи я не просто так написал о количестве светодиодов, установленных на ленте и которыми мы собираемся управлять. На моей ленте оказалось ровно 157 светодиодов. Для симметрии я отрезал последний. В результате чего получил 156 светодиодов. Так, как фрейм состоит из 3 байт, то в нашем случае для того, чтобы выдать данные на все светодиоды нам будет необходим массив размером 156 х 3 = 468 байт. Вы должны определить количество передаваемых байт в зависимости от количества светодиодов на Вашей ленте.
Подключение. Шины питания ленты и контроллера подключены к одному блоку питания.  Шина СК (синхронизация) к порту А1, а шина данных SD к порту А0. Используется софтовый SPI, хотя в моем случае можно было использовать хардварный. Сделал я это намеренно с целью проверить быстродействие, т.к. не все дешевые МК имеют хардварный SPI.
Теперь программа. Я буду приводить кусочки программы с детальным описанием алгоритма для более полного понимания процесса. Всю программу я описывать не буду, желающие могут самостоятельно проанализировать ее. Исходник доступен. Сразу оговорюсь, что оптимизацией не занимался, поэтому не очень красивые куски кода сильно не критикуйте. Стояла задача украсить дом для Нового года. Надеюсь, что освоив принцип управления адресуемой лентой читатели смогут придумать и реализовать большое количество различных цветовых узоров. Можно создать отдельную ветку форума на http://lightportal.at.ua или http://bascomavr.3bb.ru/ для того, чтобы все желающие могли пользоваться наработками других пользователей.

Шапка программы.
'*****************************************************************************
'*                            Программа работы с RGB лентой V1.0                                            
'* Chip:  ATMEGA 128                                                                                                                   
'* Freq:  12 Mhz                                                                                                                              
'* Autor: Степанов В.А.      28 сентября 2012 года.                                                                   
'*****************************************************************************
$regfile = "m128def.dat"                              'Определение кристалла и частоты
$crystal = 12000000
$hwstack = 64                                               ' default use 32 for the hardware stack
$swstack = 20                                               ' default use 10 for the SW stack
$framesize = 48                                             ' default use 24 for the frame space
config submode = new
Чуток остановлюсь на строке config submode = new. Эта опция определяет поведение компилятора при работе с подпрограммами, функциями и декларациями. Если Вы установите эту опцию в режим NEW, то получите следующее. Становится необязательным декларирование Ваших функций и подпрограмм, как это делалось раньше. Т.е. строки типа declare sub test1() становятся не нужны, но реально код самой подпрограммы или функции должен располагаться перед ее первым вызовом. Похоже на С++. Сначала идут все подпрограммы и функции, а уж за ними главная программа откуда они и вызываются. Мне это показалось разумным.
Важно то, что при компиляции в НЕХ файл будут включены только те подпрограммы и функции, которые реально вызываются и работают. Т.е. если Вы написали какую нибудь функцию, а потом ее не использовали, а убрать забыли она не будет компилироваться.
Продолжим рассматривать наш код.
За шапкой программы идут подпрограммы вывода, но мы их пока пропустим и переместимся непосредственно в главную программу.

'---------------------------------- ПЕРЕМЕННЫЕ --------------------------------
 Dim i As Word , j As Word , k As Word , x As Byte , p As Byte
 Dim s As Integer , p1 As Integer , p2 As Integer
 Dim R As Byte , G As Byte , B As Byte
 Dim S1 As Byte , S2 As Byte , S3 As Byte
 Dim t1 As Integer , t2 As Integer , t3 As Integer
 Dim A(474) As Byte        'Массив для передачи

 Dim Red As Single , Green As Single , Blue As Single              'Определение цветов
 Dim Tred As Word , Tgreen As Word , Tblue As Word               'Яркость цвета
 Dim d_Red As Single , d_Green As single , d_Blue As Single   'Величина прибавки за шаг
 Dim Times As Word                                                                     'Длительность шага
 Dim Tr as Byte , Tg as Byte , Tb as Byte                                     'Временные
 Dim tmp As Single
 Dim ColourOff As Word                                                              'Выбор цвета для выключения
 Dim temp1 As Integer , temp2 As Integer , temp3 As Integer , temp4 As Word

 Const M = 156          'Количество светодиодов в ленте
 Const N = 474          'Количество байт для передачи.
 Dim ___rseed as word

Необходимо отметить, что длина массива для передачи была выбрана на 6 байт больше. Это сделано для того, чтобы некоторые узоры, которые перетекают из конца ленты в ее начало или наоборот, начинались с самого первого или последнего светодиода. Они не передаются в ленту, а используются только в подпрограммах формирования узоров.

 '--------------------------------- КОНФИГУРАЦИЯ -------------------------------
'Выход SD
 Config PinA.0 = Output
 SD Alias PortA.0

'Выход CK
 Config PinA.1 = Output
 CK Alias PortA.1

'Конфигурация софтового SPI
Config SPI = SOFT , DIN = PINA.2 , DOUT = PORTA.0 , SS = NONE , CLOCK = PORTA.1

'-------------------------------- Программа -----------------------------------

SPIINIT                                                    'Инициализируем SPI
ClearArray                                               'Очищаем передаваемый массив  
 ___rseed = 10234                                  'Устанавливаем генератор случайных чисел

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

Do                                     'Запускаем бесконечный цикл и начинаем поочередно вызывать написанные ранее подпрограммы. Вы можете это делать пока не кончится память.
'Из красного в зеленый
RinG
'Из зеленого в синий
GinB
'Из синего в красный
BinR
'Зажжем последовательно все зеленые огоньки слева направо
OnG_LR
'Зажжем последовательно все синие огоньки справа налево
OnB_RL
'Зажжем последовательно все красные огоньки слева направо
OnR_LR
'Зажжем последовательно все зеленые огоньки справа налево
OnG_RL
'Зажигаем синие из середины
B_Middle
'Зажигаем зеленые из середины
G_Middle
'Зажигаем красные из середины
R_Middle
'Выключим все
OffLed_LR
'Две цветные капли навстречу
RGB_Two_Kap
'Синяя капля вправо
B_Kap_R
'Красная капля влево
R_Kap_L
'Синяя капля влево
B_Kap_L
'Зеленая капля вправо
G_Kap_R
'Зеленая капля влево
G_Kap_L
'Красная капля вправо
R_Kap_R
'Капля вправо со случайным изменением цвета
RND_Kap_R
'Капля влево со случайным изменением цвета
RND_Kap_L
'Две синие капли навстречу
B_Two_Kap
'Желтый взрыв
YellowExplosion
'Затухание желтого взрыва
Off_YellowExplosion
'Две зеленые капли навстречу
G_Two_Kap
'Две красные капли навстречу
R_Two_Kap
'Сиреневый взрыв
LilExplosion
'Затухание сиреневого взрыва
Off_LilExplosion
'Две цветные капли навстречу
RGB_Two_Kap
'Случайные переливы цвета
RND_Color
'Выключим все
OffLed_RL
'Зажжем последовательно все огоньки слева направо с изменением цвета
OnGradient_LR
'Зажжем последовательно все огоньки справа налево с изменением цвета
OnGradient_RL
'Зажжем последовательно все красные огоньки слева направо
OnR_LR
'Выключим все
OffLed_RL
'Капля вправо со случайным изменением цвета
RND_Kap_R
'Капля влево со случайным изменением цвета
RND_Kap_L
'Зажигаем синие из середины
B_Middle
'Зажигаем зеленые из середины
G_Middle
'Зажигаем красные из середины
R_Middle
'Выключим все
OffLed_LR
'Набить огоньки слева направо
For k = 1 To 5
 Nab_LR
'Набить огоньки справа налево
 Nab_RL
Next k
'Зажжем последовательно все огоньки слева направо со случайным цветом
For k = 1 to 5
OnRND_LR
'Выключим все
OffLed_RL
'Зажжем последовательно все огоньки справа налево со случайным цветом
OnRND_RL
'Выключим все
OffLed_LR
Next k
Loop
end 

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

'------------------------------ Подпрограммы ----------------------------------
'Выдать массив в ленту
Sub Send()
 Spiout A(1) , 234
 Spiout A(235) , 234
End Sub
Подпрограмма выдачи массива в ленту разбита на две строки. Это связано с тем, что софтовый SPI не может передать за один раз больше 255 байт. Поэтому я разбил его пополам и выдаю в два приема.

'Очистить массив
Sub ClearArray()
 For i = 1 to 474
  A(i) = 0
 Next i
End Sub

Ну с очисткой массива думаю все ясно. 
Теперь самое простое действие, поучимся последовательно гасить светодиоды слева направо и справа налево.

'Погасим последовательно все огоньки слева направо
Sub OffLed_LR()
 For i = 1 to 468 step 3  'Начнем заполнять массив нулями с самого первого элемента и с шагом 3
  A(i) = 0                        'Красный светодиод
  A(i + 1) = 0                  'Зеленый светодиод
  A(i + 2) = 0                  'Синий светодиод   
  Send                           'Прямо в цикле передадим его в ленту
  waitms 10                   'Сделаем задержку, чтобы эффект был виден. Можете подобрать свою
Next i                            'Закончим цикл и выход из п/п
End Sub

'Погасим последовательно все огоньки справа налево
Sub OffLed_RL()
 For i = 468 to 0 step -3  'Теперь наоборот, заполняем массив с конца в начало и тоже с шагом 3
  A(i -2) = 0                     'Красный светодиод                    
  A(i - 1) = 0                    'Зеленый светодиод
  A(i) = 0                          'Синий светодиод   
  Send
  waitms 10
 Next i
End Sub
Заметили, что в последней п/п синий светодиод имеет номер 468, зеленый 467, а красный 466. Сразу вспоминаем строение фрейма и все встанет на свои места.
Далее работаем с плавным цветом. Плавный переход из красного в зеленый Выполним следующим образом. Зажжем красный на максимальную яркость, а все остальное погасим. Затем в цикле начнем уменьшать яркость красного, а яркость зеленого наоборот увеличивать. Таким образом происходит перетекание цвета из одного в другой.

'Плавный переход из красного в зеленый
Sub RinG()
 G = 0
 For R = 255 to 0 step -1      'Цикл уменьшения яркости красного и количества шагов всего алгоритма. Т.е. наш мас-
                                             'сив размером 468 байт будет переформирован и выдан в ленту 255 раз 
  For i = 1 to 468 step 3        'Цикл формирования массива для передачи. Шаг 3 выбран потому, что за один проход 
                                             'формируется целый фрейм сразу. Вспомнили? Фрейм состоит из 3-х байт
   A(i) = R                              'Первый байт фрейма красный (макс. яркость)
   A(i + 1) = G                        'Второй байт фрейма зеленый (погашен G=0, как указано при входе в п/п)
   A(i + 2) = 0                         'Третий байт фрейма синий (в данном случае не используется)
  Next i                                  'Окончание цикла FOR формирования массива
   Send                                  'Передадим сформированный массив в ленту
   waitms 10                          'Чуток задержимся. Этим параметром меняем время перелива цвета
  G = G + 1                           'Увеличим яркость зеленого на 1
 Next R                                 'Окончание цикла FOR уменьшения яркости красного
End Sub

'Плавный переход из зеленого в синий. Все аналогично, только меняем переменные
Sub GinB()
 B = 0
 For G = 255 to 1 step -1
  For i = 1 to 468 step 3
   A(i) = 0
   A(i + 1) = G
   A(i + 2) = B
  Next i
   Send
   waitms 10
  B = B + 1
 Next G
End Sub

'Плавный переход из синего  в красный
Sub BinR()
 R = 0
 For B = 255 to 1 step -1
  For i = 1 to 468 step 3
   A(i) = R
   A(i + 1) = 0
   A(i + 2) = B
  Next i
   Send
   waitms 10
  R = R + 1
 Next B
End Sub

Надеюсь, что пока все понятно. Далее тоже все просто. Научимся зажигать светодиоды последовательно слева направо и справа налево.

'Зажжем последовательно все красные (в данном случае)  огоньки слева направо
Sub OnR_LR()
 For i = 1 to 468 step 3   'Формируем массив с шагом 3 с первого элемента
  A(i) = 255
  A(i + 1) = 0
  A(i + 2) = 0
  Send                             'и сразу его передаем в ленту
  waitms 10
 Next i
End Sub

'Зажжем последовательно все красные (в данном случае) огоньки справа налево
Sub OnR_RL()
 For i = 468 to 0 step -3    'Тоже самое, что и выше, но массив формируем с последнего элемента
  A(i -2) = 255
  A(i - 1) = 0
  A(i) = 0
  Send
  waitms 10
 Next i
End Sub
Вы можете задавать любой цвет для отображения изменив значения элементов массива А(). Например если вместо A(i) = 255  A(i + 1) = 0  A(i + 2) = 0 подставить A(i) = 100  A(i + 1) = 0  A(i + 2) = 200, то будет такой сиреневый. Попрактикуйтесь и подберите приятные для себя цвета.
А можно ли зажигать или гасить светодиоды не с краев, а например из середины? Да легко.

'Зажигаем синие (в данном примере) из середины
Sub B_Middle()
 j = 232 : k = 235                 'Определим две переменные цикла. Это как раз середина нашего массива
  For i = 1 to 78                   'Количество шагов 78. 156 светодиодов/2 = 78
   A(j) = 0                             'Включим синий. Вы можете выбирать любой
   A(j + 1) = 0
   A(j + 2) = 255

   A(k) = 0
   A(k + 1) = 0
   A(k + 2) = 255
    j = j - 3                            'Шагаем по массиву влево 
    k = k + 3                         'и вправо
    Send                              'Передаем все в ленту
    waitms 50
  Next i
End Sub

Видите, все очень просто.
Теперь чуть сложнее. Хочу, например, чтобы по моей ленте бегали огоньки, да не простые, а напоминающие червячков или капли, как кому будет удобнее их называть. Еще раз напоминаю, что чвет свечения Вы можете менять совершенно произвольно путем подстановки значений в массив для передачи. Я выбрал чистые цвета для более наглядного отображения методов формирования.
Маленькое предисловие к алгоритму. Я хотел добиться того, чтобы слева направо по ленте пробегали синие червячки (капли), состоящие из 5 зажженных с разной яркостью светодиодов, а между ними формировался пустой промежуток в два светодиода. Из этого следует, что в зависимости от шага нам необходимо заполнять массив разными значениями яркости. Вот тут нам пригодились лишние 6 байт массива. Как Вы помните на все 156 светодиодов необходим массив размерностью всего лишь 468 байт, но в этом случае формирование червячка будет начинаться не с самого начала, что не есть хорошо. Поэтому он родится в тени, выползать будет с самого первого светодиода. 

'Синяя капля вправо
Sub B_Kap_R()
 x = 1                                     'Определяем номер выводимого светодиода
  For i = 1 to 156                   'Червяк будет бежать до конца, т.е. по всем 156 светодиодам 
   p = A(474)                          'Для того, чтобы он переползал из конца ленты опять в ее начало запомним 
                                              'последний элемент
   Select case x                     'Теперь смотрим какой светодиод будет зажигаться
    Case 1 : A(1) = 0              'Первый — включим его с максимальной яркостью
             A(2) = 0
             A(3) = 255
    Case 2 : A(1) = 0              'Второй — убавим ему яркость
             A(2) = 0
             A(3) = 90
    Case 3 : A(1) = 0              'Третий — яркость еще меньше
              A(2) = 0
              A(3) = 50
    Case 4 : A(1) = 0              'Четвертый — еще меньше
             A(2) = 0
             A(3) = 10
    Case 5 : A(1) = 0              'Пятый — почти погас
             A(2) = 0
             A(3) = 1
    Case 6 : A(1) = 0             'Шестой и седьмой погасим для формирования промежутка
             A(2) = 0
             A(3) = 0
    Case 7 : A(1) = 0
             A(2) = 0
             A(3) = 0
   End Select
   x = x + 1                          'Выбор следующего светодиода           
   If x > 7 Then x = 1           'Если перебрали все 7, то начнем опять с первого
    For k = 1 to 3                 'Теперь нам нужно 3 раза сдвинуть весь массив вправо  
     For j = 474 to 2 Step -1 'Вот и двигаем его таким образом
      A(j) = A(j - 1)
     Next j
    Next k
    Send                              'Наконец то все сформировали и теперь со спокойной совестью все выдадим в ленту
    waitms 60                      'Чуток затормозим нашего червячка, чтобы он не носился, как угорелый
   A(1) = p                          'И вспомним то значение, которое сохранили вначале 
  Next i
End Sub

'Синяя капля влево      'Аналогично двигаем справа налево, но массив сдвигаем в обратную сторону.
Sub B_Kap_L()
 x = 1
  For i = 1 to M
   p = A(1)
   Select case x
    Case 1 : A(469) = 0
             A(470) = 0
             A(471) = 255
    Case 2 : A(469) = 0
             A(470) = 0
             A(471) = 100
    Case 3 : A(469) = 0
             A(470) = 0
             A(471) = 50
    Case 4 : A(469) = 0
             A(470) = 0
             A(471) = 10
    Case 5 : A(469) = 0
             A(470) = 0
             A(471) = 1
    Case 6 : A(469) = 0
             A(470) = 0
             A(471) = 0
    Case 7 : A(469) = 0
             A(470) = 0
             A(471) = 0
   End Select
   x = x + 1
   If x > 7 Then x = 1
    For k = 1 to 3
     For j = 1 to 470
      A(j) = A(j + 1)
     Next j
    Next k
    Send
    waitms 60
   A(N) = p
  Next i
End Sub
  
Все получилось чуть мудренее, чем в предыдущих примерах, но поверьте, эффект того стоит.
Не буду дальше все так подробно расписывать, потому что эти алгоритмы бесконечны. 



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

Если вдруг возникнут вопросы с радостью на них отвечу.
С уважением  Владимир Степанов. 
E-mail: sva-donDOGyandex.ru

От администрации портала.
Тема очень интересная, открывает огромные перспективы для творчества.
Контроллеры для таких лент стоят немалые деньги, а тут отличная альтернатива с творческим уклоном.
Желаем автору успехов и развития проекта!
А все повторившие - присылайте коды своих эффектов, мы их опубликуем.

Ну и напоследок несколько видео, как это может выглядеть: 1 2 3 4 5 6 7 8 9 10

Категория: RGB | Добавил: defaultNick (04.03.2013) | Автор: Radan
Просмотров: 11737 | Комментарии: 32
Всего комментариев: 32
27  
доброго времени суток! на машину установил по днищу подсветку из RGB ленты через месяц стало гореть лишь метр ленты из 5! почему?? из за сырости или же контролер? подскажите пожалуйста!

24  
доброго времени суток! на машину установил по днищу подсветку из RGB ленты через месяц стало гореть лишь метр ленты из 5! почему?? из за сырости или же контролер? подскажите пожалуйста!

0
25  
Если лента не в силиконе, то возможно что влага сделала своё дело.
Но в любом случае необходимо заботиться о стабилизации напряжения - ведь при работающем двигателе  его повышение может стать для ленты критическим.

26  
лента в силиконе! повышение врятли все таки на форд фокусе стабилизация напряжения неплохая! а понижении напряжения ей не страшно?

0
28  
Остаётся демонтировать и смотреть что и почему.
У меня одна лента в силиконе в помещении при стабильном напряжении через неделю работы стала деградировать. Яркость падает до сих пор, причём неравномерно по всем светодиодам сразу.
И дорогую брал...

29  
Совершенно точно что из за бросков напряжения (кратковременных), увидеть их можно только осциллографом. То что у вас Форд Фокус не при чём, это бывает во всех авто. Именно по этой причине быстро выходят из строя дешёвые автомобильные светодиодные лампочки (гаснут половина светодиодов а другая половина моргает как стробоскоп), потому что в них только светодиоды и 1 резистор.
Чтобы такого не происходило нужно паралельно питанию ленты ставить супрессор (например P1,5KE-15CA) и обязательно всё это включать в автомобильную сеть через резистор 1-2 Ом.
Я так делал, всё это запаивал прямо в цоколи ламп, работало без проблем около трёх лет (потом машину продал).

30  
значит ленту выкидывать они сгорели получается, хотя лента не из дешевых там в каждой секции 3 светодиода и три резистора!

0
31  
Получается что так.
Опыт так и нарабатываеться...

32  
Если первый метр (от подключения) работает а дальше нет то может обрыв где то. В любом вам лезть смотреть.

23  
при компиляции ошибка -"unknown CONFIG parametr (SUBMODE)".Компилировал в BASCOM 2.0.5.0.Да и при проверке кода та же ошибка.

22  
НЕТ. ВЫ меня однозначно не поняли!!!
ВСЕГО 99 светодиодов. Но с круговой разверткой.
Если взять 600 оборотов в минуту, то 10-в секунду!
СМОЖЕТ ли ATMEGA вкачивать данные 628 *10 раз в секунду?

21  
Контроллер указанный не справиться.
Однозначно.
Т.к. больше 6000 светодиодов получается.
Нужен ARM.

20  
Изеняюсь -опечатка: 100 светодиодов в линейке!

18  
Посмотрел видео, неплохо. Правда не совсем понятно в каком режиме цму работает. Я тоже пробовал ws2803 подключить, только не ленту а пиксели 12мм результат мне не очень понравился. Поэтому и хотелось на ленту посмотреть. Спасибо.

17  
Что-то с администрированием сайта у Вас не очень !
У меня вижу есть личное сообщение но прочитать я его не имею права почему-то !

13  
ы входите в группу пользователей, которым запрещено совершать данное действие.

По всем вопросам обращайтесь к администратору сайта.

Почкму-то такое выходит сообщение при чтении ЛС

14  
Попробуйте теперь. smile

11  
Почемут-о не могу читать личные сообщения !

12  
Странно, продублировал на почтовый ящик.

10  
Огрмное спасибо АВТОРУ !!!

4  
Может у Вас еще информация есть - если не жалео делитесь !
Спасибо еще раз !

3  
Спасибо за Вашу статью !
Подключил к "Aurora borealis" (Северное сияние) ленту вместо кучи элементов и проводов ! Работает Супер !

5  
А вот с этого места поподробнее  biggrin
Всем интересно, как подключили ленту к Северному сиянию.
Изменения коснулись только схемы или прошивки тоже?

6  
Вы мне давали исходники Авроры RGB . Может помните !
Я начал возиться с ней, прерывание от таймера обзвал с буквой 2, перед Loop Вставил вывод на ленту, из статьи на Вашем сайте, о работе с адресуемыми лентами.
Что-бы не разбираться с алгоритмом, просто подменил своей подпрограммой Вашу, где идет вывод ШИМ !

8  
Ну вот и отлично, присылайте материал, добавим на сайт.
Схема теперь упростилась, и каналов можно будет сделать больше.

19  
Вот сюда скинул наброски работы с лентой, может кто еще что подскажет !
http://lightportal.at.ua/forum/2-10-1

7  
Ну и к Северному Сиянию таким же образом, просто все это происходит то на работе , то дома поздним вечером, подпаиваю детальки на монтажку, программирую, слава богу человек поделился метром ленты, САМОЕ главное - всего 4 провода и минимум монтажа
И ОГРОМНОЕ СПАСИБО ЗА ВАШ САЙТ !!!

9  
Мда, "smart RGB pixels" ленточку пора, пора мне заказывать...   biggrin Спасибо за Вашу работу, за продвижение темы! Желаю творческих успехов! К слову WS2811 это тоже самое что WS2801, но один чип на несколько диодов, или опять там всё по другому, и такую ленту не покупать? Спасибо!

15  
А как насчёт видео выложить?

16  
Вариант еще сырой ,не доработанный, но сейчас всеравно некогда до осени будет заняться, поэтому смотрите что есть !!!
http://www.youtube.com/watch?v=uFFXc-QLddk

2  
Отличная статья ! Спасибо !

1  
О, новая статья! Здорово, спасибо! Не зря я тут почти каждый час проверяю, нет ли каких новостей :))) Тоже собираюсь заказать RGB ленту с чипами WS2801, в надежде, что рано или поздно (лучше рано) программисты любящие светоэффекты и цветомузыки эту ветку развития подхватят.

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
YOUTUBE LIGHTPORTAL
ALIEXPRESS
Поиск
Translation
Donate
QR
Часики
 
Облако тегов
Друзья сайта
Портал светоэффектов
Catcatcat Electronics
Color Music Beniamina Grinberg