RGB гирлянда (WS2812b)
- Kotto
- Опытный кот
- Сообщения: 795
- Зарегистрирован: Чт ноя 08, 2012 22:28:05
- Откуда: Ижевск
- Контактная информация:
Re: RGB гирлянда (WS2812b)
мне хотелось бы без ардуины разобраться в процессе ) Как раз весь смысл в том чтобы запариться и разобраться как оно происходит ) Но пока туго
- Реклама
Re: RGB гирлянда (WS2812b)
Вот хороший пример без посторонних библиотек. Я оттуда брал ассемблер в качестве драйвера для светодиодов, а все остальное писал на СИ. Штучка рабочая. С нею тинька 85 на 8 мгц, без кварца, управлялась с 80 ледами вполне нормально.
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: RGB гирлянда (WS2812b)
Давайте начнем сначала... Есть какая-нибудь приблуда недорогая, чтобы управлять этими светодиодами проще. Ну, SPI какой-нибудь или еще чего, чтобы тупо через DMA кидать в него байты, он уже сам со своими периодами разбирался. И чтобы массив данных соответствовал количеству светодиодов. И вообще, какие-то неудобоваримые.
В том же STM32 слово - это 32 бита. Для светодиода надо всего 24. Значит остается старшие/младшие 8 бит свободными... Куда их девать? А для АВР все наоборот, там всего 8 бит, значит надо тратить 3 байта на каждый светодиод. Тоже не шибко удобно.
Слышал где-то, что есть такие светодиоды, которые по SPI сразу работают, но стоят дороже. Может можно одну такую микру вытащить, а дальше она уже как обычно в цепочке с остальными диодами работать будет?
В том же STM32 слово - это 32 бита. Для светодиода надо всего 24. Значит остается старшие/младшие 8 бит свободными... Куда их девать? А для АВР все наоборот, там всего 8 бит, значит надо тратить 3 байта на каждый светодиод. Тоже не шибко удобно.
Слышал где-то, что есть такие светодиоды, которые по SPI сразу работают, но стоят дороже. Может можно одну такую микру вытащить, а дальше она уже как обычно в цепочке с остальными диодами работать будет?
Станислав
Re: RGB гирлянда (WS2812b)
Отдать следующему светодиоду.Что в STM32, что в AVR - 3 байта на "точку" вынь да положь.СКАЗОЧНИК писал(а):В том же STM32 слово - это 32 бита. Для светодиода надо всего 24. Значит остается старшие/младшие 8 бит свободными... Куда их девать?
Ага, даже устаревшие WS2801 стоят дороже WS2812, АРА102 еще дороже. За счет одного "лишнего" провода в шине, эти светодиоды гораздо менее строги к таймингам и управляются тоже гораздо быстрее. POI и виртуальные экраны на АРА102 строят давно.СКАЗОЧНИК писал(а):Слышал где-то, что есть такие светодиоды, которые по SPI сразу работают, но стоят дороже.
Не будет. Не хватит после нее одного проводка.СКАЗОЧНИК писал(а):Может можно одну такую микру вытащить, а дальше она уже как обычно в цепочке с остальными диодами работать будет?
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: RGB гирлянда (WS2812b)
Как так? Китайцы светодиоды придумали, собственный протокол изобрели, а железное воплощение связи между интерфейсами нету!?
Да и отдать 8 бит следующему светодиоду из 32 как-то тоже не сподручно, как тогда организовывать массив, чтобы, например заполнить матрицу 100х100? и еще и мультики на нее выводить какие-нибудь?
И как я еще понял, если по DMA из памяти пулять, то там нет промежуточных звеньев... Т.е. либо целиком байт из массива и сразу в регистр отправки SPI, либо в регистр чтобы ШИМ настроить. И тогда вообще жуть получается, что каждый бит из 24 для светодиодов закодирован своим байтом. И на 100 светодиодов надо уже 24*100 = 2400 байт. Жуть.
Да и отдать 8 бит следующему светодиоду из 32 как-то тоже не сподручно, как тогда организовывать массив, чтобы, например заполнить матрицу 100х100? и еще и мультики на нее выводить какие-нибудь?
И как я еще понял, если по DMA из памяти пулять, то там нет промежуточных звеньев... Т.е. либо целиком байт из массива и сразу в регистр отправки SPI, либо в регистр чтобы ШИМ настроить. И тогда вообще жуть получается, что каждый бит из 24 для светодиодов закодирован своим байтом. И на 100 светодиодов надо уже 24*100 = 2400 байт. Жуть.
Станислав
- Реклама
Re: RGB гирлянда (WS2812b)
Массив байтовый - 1 кадр = 100х100х3 байт. Дальше, по указателю = (номеру пиксела х 3), заполняете 3 ячейки подряд значениями цветовых каналов GRB этого пиксела.СКАЗОЧНИК писал(а):... как тогда организовывать массив, чтобы, например заполнить матрицу 100х100? ...
Про DMA толком не знаю, там вроде потоки какие-то, а вам нужно ведь дождаться отправки байта по SPI или комплита таймера, чтобы положить следующий байт в регистр SPI либо перестроить длительность ШИМа. По прерыванию - следующий байт и т.д.СКАЗОЧНИК писал(а):И как я еще понял, если по DMA из памяти пулять, то там нет промежуточных звеньев... Т.е. либо целиком байт из массива и сразу в регистр отправки SPI, либо в регистр чтобы ШИМ настроить.
Если напрямую посылать. На деле, не надо столькоСКАЗОЧНИК писал(а): И на 100 светодиодов надо уже 24*100 = 2400 байт. Жуть.
Можно попробовать еще сэкономить память, если не планируется много оттенков. Тогда в памяти надо создать массив - палитру всех используемых оттенков, а в кадровом массиве держать индексы палитры. Кадр уменьшается в 3 раза. Если палитра до 16 цветов, можно в одном байте закодить состояние 2-х пикселов. Так еще уполовинили массив.
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: RGB гирлянда (WS2812b)
Точно блин! Я же не с АВРками, все думаю на уровне регистров.... А можно же прямо по адресам обращаться. )
Станислав
- Kotto
- Опытный кот
- Сообщения: 795
- Зарегистрирован: Чт ноя 08, 2012 22:28:05
- Откуда: Ижевск
- Контактная информация:
Re: RGB гирлянда (WS2812b)
Всем здравствуйте! Дошли наконец снова руки до этих светодиодов ) Написал на тини13 программку, управляет 6 светодиодами. Успешно крутится алгоритм непрерывного спектра.
Дальше хотел сделать эффект кометы таким алгоритмом
unsigned char colors[12] = {0, 0, 0, 0, 0, 0, 20, 40, 60, 80, 120, 150}; // ну пусть будет такая яркость, пофиг, не суть, все RGB каналы будут одни и те же, цвет белый
// Тут двигаю все элементы массива вправо
tmp = colors [12];
for (k = 10; k <=0; k--) {
colors[k+1] = colors[k];
}
colors[0] = k;
// Теперь вызываю функцию вывода на диоды
set_color (colors[0], colors[0], colors[0]);
.
.
.
set_color(colors[5], colors[5], colors[5]);
delay_us (100); // Сброс, чтобы светодиоды зажглись
Ну а собственно дальше происходит какая то фигня ) Иногда комета пробегает, только зажигаясь рандомными цветами, иногда застревает или мерцает...
Может тини вообще не способна на такое? Хотя алгоритм непрерывного спектра спокойно крутится без единого глюка.
Или может вызов элемента массива занимает какое то время и рушит NOPы? Подскажите пожалуйста, ибо с программированием все довольно слабо ( Среда Coldevision, хотелось бы без сторонних библиотек, ибо цели 1) Разобраться 2) Подтянуть программирование
---
Если алгоритм сдвига массива вправо заменить на алгоритм непрерывного спектра, где просто использованы 3 переменные типа Unsigned char, то все работает, цвета плавно, ровно и корректно меняются. Прерывания не используется, в функции set_color тупо nop nop nop, переключить порт, nop nop... и т.д. Алгоритм непрерывного спектра уверенно работает на 20 светодиодах. Больше к сожалению у меня нету )
Дальше хотел сделать эффект кометы таким алгоритмом
unsigned char colors[12] = {0, 0, 0, 0, 0, 0, 20, 40, 60, 80, 120, 150}; // ну пусть будет такая яркость, пофиг, не суть, все RGB каналы будут одни и те же, цвет белый
// Тут двигаю все элементы массива вправо
tmp = colors [12];
for (k = 10; k <=0; k--) {
colors[k+1] = colors[k];
}
colors[0] = k;
// Теперь вызываю функцию вывода на диоды
set_color (colors[0], colors[0], colors[0]);
.
.
.
set_color(colors[5], colors[5], colors[5]);
delay_us (100); // Сброс, чтобы светодиоды зажглись
Ну а собственно дальше происходит какая то фигня ) Иногда комета пробегает, только зажигаясь рандомными цветами, иногда застревает или мерцает...
Может тини вообще не способна на такое? Хотя алгоритм непрерывного спектра спокойно крутится без единого глюка.
Или может вызов элемента массива занимает какое то время и рушит NOPы? Подскажите пожалуйста, ибо с программированием все довольно слабо ( Среда Coldevision, хотелось бы без сторонних библиотек, ибо цели 1) Разобраться 2) Подтянуть программирование
---
Если алгоритм сдвига массива вправо заменить на алгоритм непрерывного спектра, где просто использованы 3 переменные типа Unsigned char, то все работает, цвета плавно, ровно и корректно меняются. Прерывания не используется, в функции set_color тупо nop nop nop, переключить порт, nop nop... и т.д. Алгоритм непрерывного спектра уверенно работает на 20 светодиодах. Больше к сожалению у меня нету )
Re: RGB гирлянда (WS2812b)
Я управлять этими светодиодами не пробовал, но вот тут у Вас как-то нелогично...
Kotto писал(а):for (k = 10; k <=0; k--)
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
- Kotto
- Опытный кот
- Сообщения: 795
- Зарегистрирован: Чт ноя 08, 2012 22:28:05
- Откуда: Ижевск
- Контактная информация:
Re: RGB гирлянда (WS2812b)
А что вам кажется не логичным? Может конечно ошибка есть, но я как думаю...
tmp = colors [12]; // сохраняем последний элемент
for (k = 10; k <=0; k--) {
colors[k+1] = colors[k];
}
colors[0] = k; // последний элемент помещаем на место первого.
Всего у нас в массиве 0..11 элементов, 12 штук. Берем элемент 10 (k), помещаем его в следующую ячейку, k+1 (11), и так далее, весь массив у нас сдвигается по кругу вправо.
Если я где ошибаюсь, подскажите более точно, а то не понятно (
tmp = colors [12]; // сохраняем последний элемент
for (k = 10; k <=0; k--) {
colors[k+1] = colors[k];
}
colors[0] = k; // последний элемент помещаем на место первого.
Всего у нас в массиве 0..11 элементов, 12 штук. Берем элемент 10 (k), помещаем его в следующую ячейку, k+1 (11), и так далее, весь массив у нас сдвигается по кругу вправо.
Если я где ошибаюсь, подскажите более точно, а то не понятно (
Re: RGB гирлянда (WS2812b)
Kotto писал(а):А что вам кажется не логичным?
Ну расскажу, как вижу...Kotto писал(а):for (k = 10; k <=0; k--)
Итак, присваиваете переменной k значение 10. Далее, проверяете это значение на условие меньше или равно нулю. Естественно 10 больше нуля, можно вычитать. Только вот какой тип переменной k? может ли его значение быть отрицательным? Почему не просто k !=0?
PS, я не программист, если что. Но я всегда стараюсь уходить от декремента в циклах. Тем более в вашем случае и с инкрементом можно было двигать массив вправо, написав colors[11-k] = colors[10-k];
Просто если дело не в задержках, к которым, как я читал, WS2812B критична, что даже код на ассемблере многие применяют, то проблема, как мне видится, именно в типе переменной k
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
- Kotto
- Опытный кот
- Сообщения: 795
- Зарегистрирован: Чт ноя 08, 2012 22:28:05
- Откуда: Ижевск
- Контактная информация:
Re: RGB гирлянда (WS2812b)
Да, вы правы
В целом заработало, но все равно подглюкивает, видимо разваливаются таймеры на нопах (
- GARMIN
- Держит паяльник хвостом
- Сообщения: 953
- Зарегистрирован: Вс дек 02, 2012 16:58:33
- Откуда: от туда
- Контактная информация:
Re: RGB гирлянда (WS2812b)
Если вам не обязательно делать гирлянду ногодрыгом и на тиньке, то давно открыт код на таймере с DMA на STM32F051.
Повторяйте, я вышлю прошивку для 10 эффектов.
Повторяйте, я вышлю прошивку для 10 эффектов.
- Kotto
- Опытный кот
- Сообщения: 795
- Зарегистрирован: Чт ноя 08, 2012 22:28:05
- Откуда: Ижевск
- Контактная информация:
Re: RGB гирлянда (WS2812b)
Да я просто хочу сделать подсветку, использовать что то мощнее это как уничтожать тараканов ядерной бомбой мне кажется. Вот и стараюсь на тини13 или подобном восьминогом камне )
- GARMIN
- Держит паяльник хвостом
- Сообщения: 953
- Зарегистрирован: Вс дек 02, 2012 16:58:33
- Откуда: от туда
- Контактная информация:
Re: RGB гирлянда (WS2812b)
Тогда вам не нужно постоянно слать данные. Достаточно одного раза, и гирлянда светится до выключения питания 
- Kotto
- Опытный кот
- Сообщения: 795
- Зарегистрирован: Чт ноя 08, 2012 22:28:05
- Откуда: Ижевск
- Контактная информация:
Re: RGB гирлянда (WS2812b)
Как раз таки нужно. Хочется какой нибудь анимации по интереснее. Ну да ладно, пока этот вопрос отложил, потом снова вернусь к нему, буду экспериментировать. Пока предполагаю что при обращении к массиву данных теряется время и идет развал времени посылки.
- Ariadna-on-Line
- Это не хвост, это антенна
- Сообщения: 1479
- Зарегистрирован: Вс май 13, 2012 00:01:54
Re: RGB гирлянда (WS2812b)
Как-то так. Обратите внимание PIC-у нужно 10МГц. Те он должен работать от кварца. На его стандартных 4МГц сформировать такты для WS-ов невозможно в принципе. Если нужен будет код для АТтини13 - могу выложить. Код на Бейсике. Вся фишка в том, что у ПИКа почти нет свободной оперативки.
- Вложения
-
- PIC12F508_WS2812.zip
- (1.1 КБ) 266 скачиваний
-
- PIC12F508_WS2812.hex
- (2.46 КБ) 243 скачивания
-
- PIC12F508_WS2812.JPG
- (142.54 КБ) 314 скачиваний
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: RGB гирлянда (WS2812b)
мой опыт показал, что при цвете RGB=0x010000 светодиод уже светится весьма заметно, меньше яркость сделать невозможно. поэтоу для "кометы" самое простое, это удваивать яркость: {0,1,2,4,8,16,32,64,128,255}. в принципе, в динамике на галз разницы в яркости свыше 64 уже не заметно - сливаются.Kotto писал(а):unsigned char colors[12] = {0, 0, 0, 0, 0, 0, 20, 40, 60, 80, 120, 150}; // ну пусть будет такая яркость, пофиг, не суть, все RGB каналы будут одни и те же, цвет белый
Добавлено after 3 minutes 53 seconds:
какой посылки?! алгоритм у вас должен быть такой:Kotto писал(а):Хочется какой нибудь анимации по интереснее. Ну да ладно, пока этот вопрос отложил, потом снова вернусь к нему, буду экспериментировать. Пока предполагаю что при обращении к массиву данных теряется время и идет развал времени посылки.
1. подготовили данные
2. выплюнули их в ленту светодиодов
3. перешли к п.1
во время п.2 никаких других действий не осуществляется, кроме как работа с времянкой, а во время п.1 нет никакого взаимодействия с лентой. как у вас может что-то разваливаться?!
если вас не ограничивает именно attiny13, томожете посмотреть в сторону моего проекта: https://radiokot.ru/forum/viewtopic.php ... 5#p3745305
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
-
DimoniyJ
- Первый раз сказал Мяу!
- Сообщения: 32
- Зарегистрирован: Ср сен 10, 2014 13:07:22
- Откуда: Свердловская область, Ивдель
Re: RGB гирлянда (WS2812b)
[uquote="IRF840",url="/forum/viewtopic.php?p=2459644#p2459644"]Есть у кого WS2811(в виде 50шт диаметром 12мм гирлянды) + T1000s? Как работает (не работает)? Хочу заказать, но что то неясно - будет работать или нет.[/uquote]
Работает 500 штук. Цвет RGB. Это путем проб. Иначе цвета не сходятся. Создаю фильм их гифок или футажей в ProShow и потом захватываю прогой Led Edit 2014/ Все прекрасно работает.
Работает 500 штук. Цвет RGB. Это путем проб. Иначе цвета не сходятся. Создаю фильм их гифок или футажей в ProShow и потом захватываю прогой Led Edit 2014/ Все прекрасно работает.
Лужу, паяю, самоделки собираю.


