Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 03.10.2017
Сообщений: 24
1

Плавное зажигание ws2812b

22.06.2020, 18:31. Просмотров 536. Ответов 28
Метки нет (Все метки)

Привет всем!
Имеются несколько светодиодов ws2812b. Нужно сделать так, чтобы они плавно зажигались, сначала первый, потом второй и т.д.
Никак не могу сообразить, как это сделать, пока научился только включать их всех сразу, фиксированным цветом и яркостью.
Подскажите, как реализовать задуманное? Заранее благодарен.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.06.2020, 18:31
Ответы с готовыми решениями:

stm32 + ws2811/ws2812b
приветствую всех. переписываю библиотеку для работы со светодиодами на базе ws2811 на STM32 с...

stm32f103 + dma + timer управление ws2812b
Здравствуйте, решил обучаться семейству Sortix-m3, сейчас пытаюсь подключить к моему stm32f103c8t6...

WS2812B работает только поштучно
Купил на oty ленту с WS2812B. Для теста отрезал кусочек с 4-мя светодиодами, взял здесь на...

Esp8266+ws2812b+control web interface
Доброго времени суток. Уважаемые знатоки есть скетч солянка из 3х скетчей работает, выполняет...

28
1779 / 1109 / 109
Регистрация: 04.01.2010
Сообщений: 3,888
22.06.2020, 22:48 2
Смотрите в сторону управления ШИМ.

Цитата Сообщение от Avellan Посмотреть сообщение
так, чтобы они плавно зажигались
PS: можно полить парафином ). Это немного отложит "поджиг" соседних СД )
0
2573 / 1165 / 152
Регистрация: 28.10.2011
Сообщений: 4,135
Записей в блоге: 6
22.06.2020, 23:44 3
Цитата Сообщение от Avellan Посмотреть сообщение
пока научился только включать их всех сразу, фиксированным цветом и яркостью.
Попробуйте изменять яркость одного светодиода.
0
0 / 0 / 0
Регистрация: 03.10.2017
Сообщений: 24
23.06.2020, 00:22  [ТС] 4
Как это лучше делать? Соображать какую-то функцию, или делать массив?.. Массив большой получится. А функцию так и не смог сообразить пока что..
0
Модератор
8199 / 6070 / 810
Регистрация: 14.02.2011
Сообщений: 21,057
23.06.2020, 07:31 5
Цитата Сообщение от Voland_ Посмотреть сообщение
Смотрите в сторону управления ШИМ.
какой ШИМ для ws2812b ??? там полностью цифровой интерфейс.
так что перефразируем: - "Смотреть в сторону даташит"
0
901 / 541 / 81
Регистрация: 15.05.2012
Сообщений: 3,168
23.06.2020, 07:32 6
Цитата Сообщение от Avellan Посмотреть сообщение
Массив большой получится.
Зато быстрый.
0
Тутошний я
1848 / 995 / 182
Регистрация: 03.11.2009
Сообщений: 3,321
Записей в блоге: 2
23.06.2020, 09:59 7
так ТС начнёт все значения яркости и для всех диодов в массив загонять. так никакой памяти не хватит.
Avellan, не можешь решить задачу полностью, сделай по частям.
сделай сначало плавное загорание одного диода.
0
1779 / 1109 / 109
Регистрация: 04.01.2010
Сообщений: 3,888
23.06.2020, 10:11 8
Цитата Сообщение от ValeryS Посмотреть сообщение
какой ШИМ для ws2812b ??? там полностью цифровой интерфейс.
ага. почитал ). Ну, тогда и я перефразирую:
"смотреть в сторону ШИМ, для управления на логическом уровне, для передачи бита .
Цитата Сообщение от pyzhman Посмотреть сообщение
Зато быстрый.
В данном случае, и случае с АВР - не очень-то оправданный. Большой массив + DMA + PWM - это то, что могло бы использоваться в случае их наличия (например, у ST). Но в AVR это нет, соответственно, особого смысла в этом - тоже. Проще сделать кодирование бита на уровне прерывания таймера.
0
Модератор
8199 / 6070 / 810
Регистрация: 14.02.2011
Сообщений: 21,057
23.06.2020, 10:40 9
Цитата Сообщение от Voland_ Посмотреть сообщение
Проще сделать кодирование бита на уровне прерывания таймера.
Фиг вам
посмотри на библиотеки Ардуинки, все сделано на ассемблере
не самый лучший камень AVR даже на STM8 я делал при помощи програмных задержек типа
C
1
2
3
asm(nop);
asm(nop);
......
сам подсчитай период 1.25 мкС
0- 0.4 мкС высокий уровень 0.85 мкС низкий
1- 0.8 мкС высокий уровень 0.45 мкС низкий

а вот на stm32 при помощи таймеров и DMA все прекрасно получается
я даже динамически уровни умудрялся подставить
подозреваю что у ТС
Цитата Сообщение от Avellan Посмотреть сообщение
пока научился только включать их всех сразу, фиксированным цветом и яркостью.
не выдержаны временные параметры

Добавлено через 1 минуту
Цитата Сообщение от Voland_ Посмотреть сообщение
+ DMA + PWM
еще делают на SPI и на UART, но я не пробовал
0
0 / 0 / 0
Регистрация: 03.10.2017
Сообщений: 24
23.06.2020, 11:10  [ТС] 10
Цитата Сообщение от ValeryS Посмотреть сообщение
не выдержаны временные параметры
Ну зажигаются они все разными цветами, как и было задумано.

Добавлено через 13 минут
Цитата Сообщение от Grey Посмотреть сообщение
не можешь решить задачу полностью, сделай по частям.
сделай сначало плавное загорание одного диода.
Буду пробовать, есть одна идея, посмотрю, что выйдет..
0
1779 / 1109 / 109
Регистрация: 04.01.2010
Сообщений: 3,888
23.06.2020, 11:25 11
Цитата Сообщение от ValeryS Посмотреть сообщение
сам подсчитай период 1.25 мкС
ну то есть достаточно "выдержать" частоту прерываний в 1.25мкс для передачи пакета программирования ленты светиков. Правильно?
1.25мкс это 800кГц частота прерываний. Если представить что AVR "давит газульку" на 16МГц - то это 20 тактов процессора. Из них у нас 6 (или 8?) используется на переход в прерывание, и остальные - на декодирование текущего байта и выставление регистра таймера в режиме ШИМ.

То есть теоретически таки влазим. На АСМе это выглядит проще, конечно, для понимания. А для SPI - да, будет лучше. С UART'ом сильно сомневаюсь. Наверное, предполагается что старт-стоп биты каким-то чуднЫм образом так мягко накладывают ограничения на пакеты, что это не очень-то заметно.
0
2573 / 1165 / 152
Регистрация: 28.10.2011
Сообщений: 4,135
Записей в блоге: 6
23.06.2020, 12:34 12

Не по теме:

Цитата Сообщение от Voland_ Посмотреть сообщение
Большой массив + DMA + PWM - это то, что могло бы использоваться в случае их наличия (например, у ST).
У них большой массив на передачу не обязателен. Данные заполняются частями в прерываниях по половине и полной отправке буфера через DMA. https://github.com/Silencer2K/... s2812b-lib



Цитата Сообщение от Voland_ Посмотреть сообщение
Проще сделать кодирование бита на уровне прерывания таймера.
Примерно 2.5 миллиона прерываний в секунду! AVR не сможет выдерживать временные интервалы в заданных рамках.

Цитата Сообщение от Voland_ Посмотреть сообщение
ну то есть достаточно "выдержать" частоту прерываний в 1.25мкс для передачи пакета программирования ленты светиков. Правильно?
Нет, 0.4 мкс. А это 2.5 МГц. Сколько тактов есть у AVR на вход в прерывание, сохранение регистров, выполнение кода, восстановление регистров и выход из прерывания?
0
1779 / 1109 / 109
Регистрация: 04.01.2010
Сообщений: 3,888
23.06.2020, 13:01 13
Цитата Сообщение от locm Посмотреть сообщение
Нет, 0.4 мкс. А это 2.5 МГц.
Вы путаете. Одиночный импульс делается таймером (то есть один ноль, одна единица). Это период всегда 1.25мкс. В итоге длительность нуля и единицы определяется регистром сравнения, в режиме PWM. Соответственно, не надо таймером мерять 0,4мкс и 0,8мкс.
Цитата Сообщение от locm Посмотреть сообщение
Данные заполняются частями в прерываниях по половине и полной отправке буфера через DMA.
это и так понятно. Просто для управления одним СД (в примере на гитхабе) используется 2 * 8 * 3 = 48 байт буфер (ну, то есть буфер должен быть 96 минимум, чтобы не дробить последовательность стейт-машиной). В принципе, действительно, не много, для одного светодиода. Если учесть, что даже в F103 их (рама) десятки килобайт (вроде, от 20ти до 64х, если правильно помню). Но раз уж мы в разделе AVR и ТС говорит о "нескольких СД) - сотня байт, это уже ощутимый буфер (нет, не невозможный, конечно). К тому же ТС не надо хранить сырые данные для PWM, потому что в них нет смысла. Достаточно сделать так, как я уже написал чуть выше.
0
0 / 0 / 0
Регистрация: 03.10.2017
Сообщений: 24
24.06.2020, 00:04  [ТС] 14
Кажется получилось плавно зажечь один сд, и также потушить его. Поиграл со скоростью и цветом, вроде получилось.
Теперь как плавно зажечь один, оставить светиться, и зажигать следующий?..
0
1779 / 1109 / 109
Регистрация: 04.01.2010
Сообщений: 3,888
24.06.2020, 09:37 15
Цитата Сообщение от Avellan Посмотреть сообщение
Кажется получилось
без кода гадать будем?
0
0 / 0 / 0
Регистрация: 03.10.2017
Сообщений: 24
24.06.2020, 12:27  [ТС] 16
Ах да, совсем забыл..
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
void SendByte(unsigned char green, unsigned char red, unsigned char blue)
{
    signed char i;
    
    for (i=7; i>=0; i--)
    {
        if (green&(1<<i)) SendBit1();
        else SendBit0();
    }
    
    for (i=7; i>=0; i--)
    {
        if (red&(1<<i)) SendBit1();
        else SendBit0();
    }
    
    for (i=7; i>=0; i--)
    {
        if (blues(1<<i)) SendBit1();
        else SendBit0();
    }
}
 
int main(void)
{
    DDRD|=(1<<6);
    
    while(1)
    {
        signed char i;
        unsigned char tem;
        
        for(tem=0;tem<=170;tem++)
        {
            SendByte(tem,0b00000000,0b00000000);
            SendByte(0b00000000,tem,0b00000000);
            
            _delay_ms(250);
        }
        for(tem=170;tem>0;tem--)
        {
            SendByte(tem,0b00000000,0b00000000);
            SendByte(0b00000000,tem,0b00000000);
            
            _delay_ms(250);
        }   
    }
}
0
0 / 0 / 0
Регистрация: 03.10.2017
Сообщений: 24
25.06.2020, 16:46  [ТС] 17
Господа, подскажите, как зажигать их независимо друг от друга, в разном порядке?.. Что то застрял, не знаю, куда думать дальше..
0
2573 / 1165 / 152
Регистрация: 28.10.2011
Сообщений: 4,135
Записей в блоге: 6
25.06.2020, 16:50 18
Создаете массив где храните информацию о цветах светодиодов ленты. Меняете цвет в массиве для требуемого светодиода и отправляете данные в ленту.
0
Модератор
8199 / 6070 / 810
Регистрация: 14.02.2011
Сообщений: 21,057
25.06.2020, 18:17 19
Цитата Сообщение от Voland_ Посмотреть сообщение
ну то есть достаточно "выдержать" частоту прерываний в 1.25мкс для передачи пакета программирования ленты светиков. Правильно?
1.25мкс это 800кГц частота прерываний. Если представить что AVR "давит газульку" на 16МГц - то это 20 тактов процессора.
если только управлять лентой то вроде хватит
но в реальных изделиях не только управляют лентой,например ловля DMX, те же обработки кнопок, индикация и все... тактов не хватает
да тот же перевод из hsv в RGB
0
404 / 192 / 40
Регистрация: 21.09.2008
Сообщений: 661
05.07.2020, 20:41 20
Интересная статья с примером в подразделе "[Разбор примера кода inline-ассемблера GCC]".
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.07.2020, 20:41

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как подключить нескольких светодиодных лент на WS2812b одновременно?
Приветствую всех! Нужно, что бы один ардуино одновременно и одинакого управлял шестью...

SMART RGB диоды WS2812b - нужно узнать некоторые нюансы
В общем нет ничего сложного и непонятного в их работе - &quot;0&quot; или &quot;1&quot; определяется по длительности...

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

Зажигание светодиодов AT90S2313
Доброго времени суток. На AVR только начинающий Вот написал программу для циклического зажигания...

Зажигание ВАЗ 2109
Поворачиваю ключ (на холодную) срабатывает стартер в первом положении. И бывает на ходу треск...

Последовательное зажигание светодиодов
Собственно задание: при включении МК светодиоды не горят, через 2 с загораются 1-й, затем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.