Обсуждаем цифровые устройства...
Ответить

Re: RGB гирлянда (WS2812b)

Пт фев 22, 2019 11:10:18

мне хотелось бы без ардуины разобраться в процессе ) Как раз весь смысл в том чтобы запариться и разобраться как оно происходит ) Но пока туго

Re: RGB гирлянда (WS2812b)

Пт фев 22, 2019 12:33:24

Вот хороший пример без посторонних библиотек. Я оттуда брал ассемблер в качестве драйвера для светодиодов, а все остальное писал на СИ. Штучка рабочая. С нею тинька 85 на 8 мгц, без кварца, управлялась с 80 ледами вполне нормально.

Re: RGB гирлянда (WS2812b)

Вт мар 12, 2019 19:29:12

Давайте начнем сначала... Есть какая-нибудь приблуда недорогая, чтобы управлять этими светодиодами проще. Ну, SPI какой-нибудь или еще чего, чтобы тупо через DMA кидать в него байты, он уже сам со своими периодами разбирался. И чтобы массив данных соответствовал количеству светодиодов. И вообще, какие-то неудобоваримые.
В том же STM32 слово - это 32 бита. Для светодиода надо всего 24. Значит остается старшие/младшие 8 бит свободными... Куда их девать? А для АВР все наоборот, там всего 8 бит, значит надо тратить 3 байта на каждый светодиод. Тоже не шибко удобно.
Слышал где-то, что есть такие светодиоды, которые по SPI сразу работают, но стоят дороже. Может можно одну такую микру вытащить, а дальше она уже как обычно в цепочке с остальными диодами работать будет?

Re: RGB гирлянда (WS2812b)

Вт мар 12, 2019 19:58:12

СКАЗОЧНИК писал(а):В том же STM32 слово - это 32 бита. Для светодиода надо всего 24. Значит остается старшие/младшие 8 бит свободными... Куда их девать?
Отдать следующему светодиоду.Что в STM32, что в AVR - 3 байта на "точку" вынь да положь. :) Сейчас появились на рынке и 32-битные светодиоды RGBW, там добавился белый светодиод.
СКАЗОЧНИК писал(а):Слышал где-то, что есть такие светодиоды, которые по SPI сразу работают, но стоят дороже.
Ага, даже устаревшие WS2801 стоят дороже WS2812, АРА102 еще дороже. За счет одного "лишнего" провода в шине, эти светодиоды гораздо менее строги к таймингам и управляются тоже гораздо быстрее. POI и виртуальные экраны на АРА102 строят давно.
СКАЗОЧНИК писал(а):Может можно одну такую микру вытащить, а дальше она уже как обычно в цепочке с остальными диодами работать будет?
Не будет. Не хватит после нее одного проводка.

Re: RGB гирлянда (WS2812b)

Вт мар 12, 2019 20:14:06

Как так? Китайцы светодиоды придумали, собственный протокол изобрели, а железное воплощение связи между интерфейсами нету!? :kill: :facepalm:

Да и отдать 8 бит следующему светодиоду из 32 как-то тоже не сподручно, как тогда организовывать массив, чтобы, например заполнить матрицу 100х100? и еще и мультики на нее выводить какие-нибудь?

И как я еще понял, если по DMA из памяти пулять, то там нет промежуточных звеньев... Т.е. либо целиком байт из массива и сразу в регистр отправки SPI, либо в регистр чтобы ШИМ настроить. И тогда вообще жуть получается, что каждый бит из 24 для светодиодов закодирован своим байтом. И на 100 светодиодов надо уже 24*100 = 2400 байт. Жуть.

Re: RGB гирлянда (WS2812b)

Вт мар 12, 2019 21:10:29

СКАЗОЧНИК писал(а):... как тогда организовывать массив, чтобы, например заполнить матрицу 100х100? ...
Массив байтовый - 1 кадр = 100х100х3 байт. Дальше, по указателю = (номеру пиксела х 3), заполняете 3 ячейки подряд значениями цветовых каналов GRB этого пиксела.
СКАЗОЧНИК писал(а):И как я еще понял, если по DMA из памяти пулять, то там нет промежуточных звеньев... Т.е. либо целиком байт из массива и сразу в регистр отправки SPI, либо в регистр чтобы ШИМ настроить.
Про DMA толком не знаю, там вроде потоки какие-то, а вам нужно ведь дождаться отправки байта по SPI или комплита таймера, чтобы положить следующий байт в регистр SPI либо перестроить длительность ШИМа. По прерыванию - следующий байт и т.д.
СКАЗОЧНИК писал(а): И на 100 светодиодов надо уже 24*100 = 2400 байт. Жуть.
Если напрямую посылать. На деле, не надо столько :)) Подготовили 2 байта: 1 - кодирует посылку "0", второй - посылку "1". Теперь побитово шерстите массив, и по состоянию проверяемого бита, отдаете ШИМу или SPI тот или иной подготовленный байт. И DMA не пригодится и между прерываниями чайкУ можно попить.
Можно попробовать еще сэкономить память, если не планируется много оттенков. Тогда в памяти надо создать массив - палитру всех используемых оттенков, а в кадровом массиве держать индексы палитры. Кадр уменьшается в 3 раза. Если палитра до 16 цветов, можно в одном байте закодить состояние 2-х пикселов. Так еще уполовинили массив.

Re: RGB гирлянда (WS2812b)

Ср мар 13, 2019 03:00:45

Точно блин! Я же не с АВРками, все думаю на уровне регистров.... А можно же прямо по адресам обращаться. )

Re: RGB гирлянда (WS2812b)

Чт ноя 14, 2019 11:44:29

Всем здравствуйте! Дошли наконец снова руки до этих светодиодов ) Написал на тини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 светодиодах. Больше к сожалению у меня нету )

Re: RGB гирлянда (WS2812b)

Чт ноя 14, 2019 13:07:41

Я управлять этими светодиодами не пробовал, но вот тут у Вас как-то нелогично...
Kotto писал(а):for (k = 10; k <=0; k--)

Re: RGB гирлянда (WS2812b)

Чт ноя 14, 2019 13:15:05

А что вам кажется не логичным? Может конечно ошибка есть, но я как думаю...

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)

Чт ноя 14, 2019 15:11:54

Kotto писал(а):А что вам кажется не логичным?

Kotto писал(а):for (k = 10; k <=0; k--)

Ну расскажу, как вижу...
Итак, присваиваете переменной k значение 10. Далее, проверяете это значение на условие меньше или равно нулю. Естественно 10 больше нуля, можно вычитать. Только вот какой тип переменной k? может ли его значение быть отрицательным? Почему не просто k !=0?
PS, я не программист, если что. Но я всегда стараюсь уходить от декремента в циклах. Тем более в вашем случае и с инкрементом можно было двигать массив вправо, написав colors[11-k] = colors[10-k];

Просто если дело не в задержках, к которым, как я читал, WS2812B критична, что даже код на ассемблере многие применяют, то проблема, как мне видится, именно в типе переменной k

Re: RGB гирлянда (WS2812b)

Чт ноя 14, 2019 20:38:50

Да, вы правы :facepalm: :facepalm: В целом заработало, но все равно подглюкивает, видимо разваливаются таймеры на нопах (

Re: RGB гирлянда (WS2812b)

Пт ноя 15, 2019 15:48:08

Если вам не обязательно делать гирлянду ногодрыгом и на тиньке, то давно открыт код на таймере с DMA на STM32F051.
Повторяйте, я вышлю прошивку для 10 эффектов.

Re: RGB гирлянда (WS2812b)

Сб ноя 16, 2019 21:25:19

Да я просто хочу сделать подсветку, использовать что то мощнее это как уничтожать тараканов ядерной бомбой мне кажется. Вот и стараюсь на тини13 или подобном восьминогом камне )

Re: RGB гирлянда (WS2812b)

Пн ноя 18, 2019 10:36:58

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

Re: RGB гирлянда (WS2812b)

Пн ноя 18, 2019 17:09:04

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

Re: RGB гирлянда (WS2812b)

Ср дек 11, 2019 01:25:12

Как-то так. Обратите внимание PIC-у нужно 10МГц. Те он должен работать от кварца. На его стандартных 4МГц сформировать такты для WS-ов невозможно в принципе. Если нужен будет код для АТтини13 - могу выложить. Код на Бейсике. Вся фишка в том, что у ПИКа почти нет свободной оперативки.
Вложения
PIC12F508_WS2812.zip
(1.1 KiB) Скачиваний: 77
PIC12F508_WS2812.hex
(2.46 KiB) Скачиваний: 76
PIC12F508_WS2812.JPG
(142.54 KiB) Скачиваний: 125

Re: RGB гирлянда (WS2812b)

Ср дек 11, 2019 08:37:58

Kotto писал(а):unsigned char colors[12] = {0, 0, 0, 0, 0, 0, 20, 40, 60, 80, 120, 150}; // ну пусть будет такая яркость, пофиг, не суть, все RGB каналы будут одни и те же, цвет белый
мой опыт показал, что при цвете RGB=0x010000 светодиод уже светится весьма заметно, меньше яркость сделать невозможно. поэтоу для "кометы" самое простое, это удваивать яркость: {0,1,2,4,8,16,32,64,128,255}. в принципе, в динамике на галз разницы в яркости свыше 64 уже не заметно - сливаются.

Добавлено after 3 minutes 53 seconds:
Kotto писал(а):Хочется какой нибудь анимации по интереснее. Ну да ладно, пока этот вопрос отложил, потом снова вернусь к нему, буду экспериментировать. Пока предполагаю что при обращении к массиву данных теряется время и идет развал времени посылки.
какой посылки?! алгоритм у вас должен быть такой:
1. подготовили данные
2. выплюнули их в ленту светодиодов
3. перешли к п.1
во время п.2 никаких других действий не осуществляется, кроме как работа с времянкой, а во время п.1 нет никакого взаимодействия с лентой. как у вас может что-то разваливаться?!

если вас не ограничивает именно attiny13, томожете посмотреть в сторону моего проекта: https://radiokot.ru/forum/viewtopic.php ... 5#p3745305
Ответить