Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Световые эффекты » Ох уж эта RAINBOW О_О


Ох уж эта RAINBOW О_О

Сообщений 31 страница 45 из 45

1

Привет товарищи.
Заморочился тут с вазой в которую встроены световоды.
Кому интересно это здесь: Ссылка
Немного подправил размеры, напечатал и приступил к электронной начинке.
Использую NeoPixelRing на 16 светодиодов WS2812B и процессор ATmega328PB (тупо взял, что было под рукой.)
Использую библиотеку RAINBOW (будь она не ладна)  :crazyfun:
Когда светики начали светиться заметил, что цвета совсем не те и решил проверить так ли это.
Написал коротенький тест:

Код:
$regfile = "m328pbdef.dat"
$crystal = 16000000
$baud = 9600
$hwstack = 16
$swstack = 8
$framesize = 32

'Настройка параметров для библиотеки WS2812b
Config RAINBOW = 1 , RB0_LEN = 16 , RB0_PORT = PORTB , rb0_pin = 0
RB_SelectChannel 0                                          'Выбираем первый канал
'Массив RGB-цветов
Dim Color(3) as Byte
R alias Color(_base) : G alias Color(_base + 1) : B alias Color(_base + 2)
Dim i as Byte
'Основной цикл
Do
   For i = 1 to 3
      Select case i
         Case 1 : R = 100 : G = 0 : B = 0
         Case 2 : R = 0 : G = 100 : B = 0
         Case 3 : R = 0 : G = 0 : B = 100
      End Select
      RB_SetColor 6 , Color(1)                        'Установим цвет
      RB_Send                                               'Обновляем состояние светодиодов
      Wait 1
   Next i
   Waitms 500
Loop

Как вы думаете, что должно было произойти? Я думаю, что должен загораться 7-й светодиод в последовательности R G B.
А вот фиг вам, загорается красный, потом зелёный и... потом пусто, синий не горит.
На любом светодиоде синий не горит. Скажете кольцо бракованное, а вот нет. Загонял программу из (где то в инете откопал) синий есть, но если его пытаться включить принудительно, то его нет.  o.O
Короче, мозг кипит, дело стоит.
Может кто чем поможет?
И ещё, при конфигурации библиотеки формируется массив RAINBOW0_ Так и не понял зачем он нужен? Смотрел в отладчике так там всегда пусто. Чтобы это значило?  :glasses:

А вот такая программка уверенно зажигает синий

Код:
RB_SETTABLECOLOR 10 , 2
RB_Send

end
Rainbow_Colors:
' R , G ,B
Data &HFF , &H00 , &H00                                     ' 0  - Red
Data &H00 , &HFF , &H00                                     ' 1  - Green
Data &H00 , &H00 , &HFF                                     ' 2   - Blue
Data &HFF , &HA5 , &H00                                     ' 3  - Orange
Data &HFF , &HFF , &H00                                     ' 4   - Yellow
Data &HFF , &H69 , &HB4                                     ' 5  - HotPink

Отредактировано sva-don (2022-05-16 15:32:32)

+1

31

sva-don
нич-че не понятно, но очень интересно  8-)
потом разберу, на досуге. и видео было бы в тему, конечно

0

32

IDok написал(а):

sva-don
нич-че не понятно, но очень интересно  
потом разберу, на досуге. и видео было бы в тему, конечно

Да что тут непонятного?  :D
Есть 16 светодиодов на кольце. Они случайным образом плавно меняют свой цвет.
Т.е. Каждый светодиод работает по своему алгоритму.
Например:
1-й СД имел цвет R-100 G-68 B-215
2-й СД свой цвет и т.д.
В следующем цикле генерится новый цвет для каждого СД.
Например для первого R-154 G-10 B-200 и так для всех СД. Этот массив называется Col(i) размером NumLed*3
Для выдачи в ленту есть свой массив Rainbow0_(i) тоже размером NumLed*3
Далее организуем цикл от 1 до 255 для изменения яркости пикселов.
Внутри этого цикла проверяем разность между новым цветом и тем, который был ранее.
Для нашего примера Raz1 = 154 - 100 = 54, Raz2 = 10 - 68 = -58, Raz3 = 200 - 215 = -15
Теперь делаем проверку как нам нужно изменить старый цвет на новый.
Например для нашего случая:
Raz1 > 0 значит увеличим значение цвета в массиве Rainbov0_ на 1, Raz2 и 3 < 0, значит уменьшим значение цвета в массиве Rainbov0_  на 1. Если разность = 0 то ничего не меняем.
Пробежали по массиву и выдали в ленту. И так 255 раз.
После этого цикл повторяется.
Недостатком данного алгоритма является то, что внешний цикл идёт 255 раз даже тогда, когда этого не нужно.
В нашем примере для первого СД нужно всего то пробежать по цвету 58 раз, чтобы достичь нового, но пока ничего лучшего не придумал.

Отредактировано sva-don (2022-05-30 16:27:06)

+1

33

sva-don
возможно, методом пузырька (о пяти звездах) надо выявлять наибольшего и крутить до его максимума

0

34

IDok написал(а):

глюк какой-то

Перенес это обсуждалово сюда - Глюки в BASCOM ;)
Думаю, так будет правильно.

0

35

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

Ничего сложного. Это стандартный алгоритм перевода цветового пространства HSV в RGB.
В принципе его не нужно понимать (если нет мысли разобраться в алгоритме перевода), а просто использовать, если нужно конечно, и всё.
При работе с HSV цвета получаются насыщеннее. Если выбросить этот кусок, то можно просто трижды генерить случайный цвет для R G B.
Но тогда нужно проверять, чтобы они были как можно дальше друг от друга, иначе будет белый и некрасивый.
Есть алгоритмы HSV в RGB с целочисленными значениями. Они в основном на С, но немного работы и можно сделать на Bascom.
Просто у меня памяти валом и я не стал заморачиваться.

Отредактировано sva-don (2022-06-01 14:12:29)

0

36

sva-don
покатал ваш код на симуляции - кросивое. но вот плавности по моему мнению не хватает. иногда цвета прям резко скачут. но похоже лучшего от рейнбоу не добиться

0

37

sva-don написал(а):

Начиная с версии 2.0.7.9, библиотека Rainbow преобразована в RainbowBSC.Lib, входящей в состав BASCOM-AVR и не требует подключения и декларирования. Она автоматически подключается при конфигурации библиотеки соответствующим кодом Config RAINBOW.

Нашел маленькую неточность в вашей трактовке фрагмента описания RainbowBSC:

В версии 2.0.8.1 была обновлена поддержка RGBW-светодиодов. Некоторые функции старой библиотеки манипулировали неправильными цветами, но для сохранения совместимости старая библиотека сохранена. Теперь при RGB=4 автоматически используется новая библиотека.

Тут все неоспоримо, интересное начинается дальше ;) :

Без этой опции или при RGB=3 применяется старая библиотека.

Так что получается, что иногда надо "заморачиваться" с её подключением:

Для использования новой библиотеки с RGB=3 нужно подключить библиотеку в коде директивой $lib "RAINBOWBSCN.lib" до применения оператора CONFIG RAINBOW.

Короче, параметр RGB=х дает возможность выбора библиотеки, но при определенных условиях требуется её подключение.

0

38

Nord написал(а):

Короче, параметр RGB=х дает возможность выбора библиотеки, но при определенных условиях требуется её подключение.

Да, всё верно, но, новая библиотека имеет в конце имени букву N и если её необходимо применить, то нужно установить RGB=4 и продекларировать её.
При использовании старой библиотеки не нужно писать RGB=3 (это подстановка по умолчанию) и ничего декларировать не нужно.

0

39

IDok написал(а):

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

Начнём с того, что симуляция никогда не даст истинной картины. Всё таки скорости совершенно несопоставимы.
В железе всё выглядит совершенно иначе. Всё плавно.
P.S. Я очень, очень редко использую симуляторы, если только что нибудь простенькое, а так в основном задействую COM порт и вывожу значения Print-ом. Получается намного эффективнее.

0

40

sva-don написал(а):

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

Никакой Print не заменит нормальной отладки с пошаговым выполнением, просмотром переменных, истории вызовов, прифилированием и т. д. Если по той или иной причине невозможна аппаратная отладка, протеус хорошая альтернатива.

0

41

Опять чуток не так... ;)
В #12 приведен перевод из оф. хелпа, там же все четко расставлено...
Позднее, в #37, была приведена цитата из PDF-ки, описания работы с Rainbow, но сути это не меняет.

sva-don написал(а):

Да, всё верно, но, новая библиотека имеет в конце имени букву N и если её необходимо применить, то нужно установить RGB=4 и продекларировать её.

При использовании RGB=4 как раз ничего декларировать не нужно.
Ни с N, ни без нее...
Новая библиотека будет подключена автоматически, а старая проигнорирована.

sva-don написал(а):

При использовании старой библиотеки не нужно писать RGB=3 (это подстановка по умолчанию) и ничего декларировать не нужно.

Вот тут-то как раз и появляется возможность выбора.
При желании использовать новую библиотеку с RGB=3 требуется её декларация, иначе будет использована старая библиотека (как и при отсутствии RGB=х вообще).

Этот "RGB=" - как ключ, подобный не так давно обсуждавшемуся #IF...

0

42

sva-don написал(а):

В железе всё выглядит совершенно иначе. Всё плавно.

через пару недель попробую, мож все и по другому (я б раньше попробовал, но код в Тини2313 никак не лезет)

0

43

Пётр написал(а):

Никакой Print не заменит нормальной отладки с пошаговым выполнением

Ну, это кому как нравится. Я не говорю, что совсем не использую пошаговую отладку, но это, в моём понимании, больше подходит для более или менее сложных программ.
Представляю себе пошаговое исполнение и просмотр переменных массива в двух вложенных циклах по 255 шагов. :dontknow:
Есть у меня и JTAG и консоль, но выбор методов отладки это личное предпочтение.

0

44

Nord написал(а):

Опять чуток не так...

Да всё так. Просто мы говорим об одном и том же, но разными фразами.  :glasses:
Для меня эта библиотека пустышка. Как нибудь соберусь написать свой Send и забуду про неё, как про страшный сон. Просто руки пока не доходят. :crazyfun:

+1

45

sva-don написал(а):

Представляю себе пошаговое исполнение и просмотр переменных массива в двух вложенных циклах по 255 шагов.

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

0


Вы здесь » Программирование ATMEL в BASCOM. » Световые эффекты » Ох уж эта RAINBOW О_О