Реклама ⓘ
Главная » Световые эффекты
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Реклама ⓘ

Автономные световые эффекты DigiLight

В этой статье будет много букв, мало картинок и одно видео (с просмотра которого стоит начать). Но если вы заинтересовались проектом DIGILIGHT - прочтите, это наверняка будет вам полезным!

Потребность в автономных, то есть не связанных с музыкальным сигналом, световых эффектах возникает достаточно часто, но устройства с жестко прописанными алгоритмами переключения огоньков быстро утомляют, а переделывать или перепрограммировать их - это ведь такая морока! "Стоп, почему морока? Это ведь можно сделать легко и приятно" - подумал я и сделал соответствующий модуль для цветомузыки DIGILIGHT, о которой писал ранее.

Модуль - это чисто программно реализованная фишка, т.е. никаких дополнительных аппаратных устройств (не считая адаптера SD-карты, конечно) не требующая. Смысл его работы в том, что он считывает с SD-карты файлы скриптов, описывающих на специально мной придуманном языке световой эффект, и реализует этот эффект. Когда скрипт кончается, считывается следующий файл и так до последнего имеющегося на SD-карте, после чего снова все повторяется с первого. Таким образом, количество воспроизводимых эффектов становится практически неограниченным (на самом деле их может быть не более 65535, что, согласитесь, тоже немало), а замена надоевших делается в три клика мышкой на компьютере. И основная задача, которую пользователь должен решать самостоятельно, заключается именно в написании файлов-скриптов с желаемыми эффектами.

Для облегчения этого процесса я разработал специальную программу DIGILIGHT Script maker (DSM), которая позволяет не только удобно писать скрипты, но так же проверять их в действии без использования DIGILIGHT, т.е. применяется программная симуляция аппаратуры. Но прежде чем приступить к её описанию, следует пояснить принятую терминологию.

Каждый из светодиодов WS2812b, которыми управляет DIGILIGHT, принято называть пикселом. Пикселов, как вы уже знаете, может быть от 16 до 128. Однако описываемая программа предназначена для симуляции только 32 пикселов - так как для описания световых эффектов используется в большей мере алгоритмический подход, это не является ограничивающим фактором, к тому же я уже работаю над усовершенствованной версией, - но это я опять побежал впереди паровоза... Итак, каждый пиксел характеризуется тремя параметрами: COLOR - RGB значение цвета пиксела, BRIGHT - яркость пиксела, FADE - скорость автоматического изменения яркости. Последний термин требует дополнительного пояснения. Те, кто успел поковыряться в исхониках DIGILIGHT, наверное, уже в курсе, то каждый пиксел, будучи единожды засвечен, затем без каких либо дополнительных усилий каждые 10 миллисекунд может менять свою яркость, уменьшая или увеличивая её на величину FADE. Причем, если FADE имеет положительное значение, яркость пиксела будет уменьшаться, а если отрицательное, то яркость будет увеличиваться до предельного значения, а затем знак FADE автоматически изменится на противоположный, и пиксел начнет с тем же темпом терять яркость. Все параметры, как и вообще все числовые значения в скриптах, однобайтовые, и записываются в HEX-формате. Отрицательные числа в этом случае представляют некоторое неудобство, но это вынужденная жертва ради скорости исполнения скрипта.

Итак, приступим к практическому процессу создания скрипта, реализующему вот такой эффект (я назвал его "комета"), как на картинке ниже (кликните на превью, чтобы толком рассмотреть анимацию).

Скачиваем и запускаем DSM, и вводим в открывшемся окне показанный на рисунке текст

Сразу информирую, что при нажатии Ctrl-Space открывается окошко с алфавитным списком всех команд скрипта, которые можно вводить - любые иные символы будут восприняты, как комментарий. Если нажать на палитру - откроется окошко-помощник для выбора цвета, если выбрать и нажать ОК, то прямо в тексте скрипта появится соответствующее RGB значение этого цвета - удобно вводить параметр COLOR. Табуляции - это для удобства. Главное - скрипт всегда должен заканчиваться пустой строкой - не ошибитесь!

Итак, скрипт введен, нажимаем на "красного жучка" и видим новое окно "отладчика" следующего вида:

При этом и окно редактора чуть-чуть меняется: первая строчка скрипта выделяется синим цветом, активируются ранее недоступные команды в меню Debug и соответствующие им кнопки.

Забегая вперед, сообщаю, что выделяется синим строка скрипта, которая готова к исполнению в режиме симуляции. Нажимайте сразу на "ракету", сдвигайте появившийся "регулятор" вправо до отказа, и наблюдайте за тем, как на черном фоне демонстрируются 32 виртуальных светодиода под действием только что написанного скрипта. Впечатляет? Кнопка "пауза" остановит симуляцию, после чего нажимая F8 (или кнопочку со стрелочкой "в обход") можно будет исполнять команды скрипта в пошаговом режиме, а повторное нажатие на "жучка" снова вернет программу в режим редактирования скрипта.

А теперь подробно о том, что же именно сделано и как оно вообще работает.

Первя строка скрипта содержит команду CLR - CLEAR, т.е. очистка. Эта команда устанавливает "внутренние пикселы" в исходное состояние, сбрасывая их цвет в "черный", устанавливая яркость на максимум (черный - это отсутствие свечения, так что хоть при какой яркости ничего светиться не будет), а FADE в ноль. В окне отладчика содержимое всех "внутренних", т.е. используемых скриптом, но невидимых, пикселов вы можете наблюдать в верхней его части. С этой команды рекомендуется всегда начинать любой скрипт.

Команда во второй строке называется PAINT COLOR, или, сокращенно, PC - цвет рисования. Как видите, эта команда после знака равенства содержит значение RGB составляющих цвета - попробуйте изменить его и перезапустить симуляцию в автоматическом режиме (кнопка "ракета") - "комета" из пикселов поменяет цвет. Имейте ввиду: ни в одной команде недопустимо использовать пробелы - такие команду будут восприняты, как комментарии, т.е. не будут исполняться. Команда PC сама по себе не воздейстует ни на один пиксел, она задает цвет, которым на пикселы будет воздействовать другая команда - PM, о ней далее. Текущее значение цвета вы можете контролировать в правой средней части окна отладчика, где, кстати, отображаются и остальные два параметра "рисования" - BRIGHT и FADE.

Третья строка содержит команду PF. Вы, наверное, уже догадываетесь, что это PAINT FADE, т.е. затухание для рисования. Как и PC, эта команда просто устанавливает текущее значение для команды PM. Аналогично будет действовать и... правильно, PB (PAINT BRIGHT), но в данном скрипте мы ей не пользуемся, удовлетворяясь предельно возможным значением FF, задаваемым командой CLR.

Команда RPT в четвертой строке - это REPEAT, или начало области повторения. Иначе говоря, эта команда обозначает начало области команд скрипта, которые будут повторяться один или более раз. Конец цикла помечается командой LV0 или INF (есть и другие команды, но все я перечислять в статье не буду, ибо приложил PDF файл с полным описанием всех команд - читайте самостоятельно). Логику работы этих команд рассмотрим позже. 

Команда V0=TP представляет собой операцию задания значения внутренней переменной. Скрипт-машина (условимся так называть интерпретатор DIGILIGHT) помимо внутренних пикселов и текущих параметров "рисования" содержит еще и 16 встроенных "переменных", обозначаемых V0, V1, V2 и так далее до VF. Как вы уже заметили, все числа в скрипте всегда вводятся двумя шестнадцатеричными цифрами, т.е. никогда 9, но всегда 09. B названия переменных всегда занимают 2 позиции. И это неспроста: в любом месте, где в скрипте требуется число, можно указывать вместо него имя переменной, и тогда будет использоваться её значение вместо явно указанного числа. То есть вместо PC=FF0000 мы вполне могли бы написать PC=V5V6V7, если бы заранее побеспокоились о том, чтобы переменные V5, V6 и V7 содержали нужные нам значения цветовых составляющих. Но, как видите, в команде в переменную заносится не число, и не значение другой переменной, а... что?

В дополнение к описанному, скрипт машина имеет и 3 "функции" - TP (TOTAL PIXELS), RD (RANDOM DATA) и RP (RANDOM PIXEL), которые используются всегда, когда надо получить общее количество пикселов, случайное значение числа в диапазоне от 00 до FF или случайный номер пиксела из числа доступных. Функции, как и переменные, могут использоваться во всех местах скрипта, где требуется число. Так что в пятой строке в переменную V0 помещается количество доступных пикселов - в DSM это будет 32, а в настоящей DIGILIGHT то значение, которое вы установите в настройках GROUP OF WS2812. Таким образом, наш скрипт будет одинаково исполняться на любых системах, не требуя корректировки.

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

А вот в седьмой строке, наконец, встречается упомянутая уже команда PM - PAINT MAP, то есть "карта рисования". После знака равенства в этой команде вводятся номера пикселов, которые следует "закрасить" текущими параметрами COLOR, BRIGHT и FADE. В нашем случае закрашивается единственный символ, номер которого хранится в переменной V0

Если вы по мере чтения не ленились нажимать кнопку F8, вы к этому моменту уже увидели, что исполнение этой команды изменило внутренний пиксел в окне отладчика. Но, вероятно, у вас возник вопрос - если PM раскрасила пиксел в предельно яркий цвет, откуда берется затухающий" хвост?! Но это вы поторопились с вопросом, продолжайте чтение - все станет ясно через буквально 4 оставшиеся строки скрипта.

В строке №8 вы видите очередную команду WT, или WAIT - задержка. Этак команда реализует сразу 2 действия: выводит внутренние пикселы на настоящие, внешние светодиоды, и осуществляет задержку исполнения скрипта на указанное после знака равенства десятимиллисекундных интервалов. В конкретно нашем случае задержка делается на 50 мс. А теперь - внимание: яркость пиксела изменяется каждые 10 мс, значение FADE у пиксела мы задали равным пяти; спрашивается - что будет к моменту завершения команды WT=05? Верно, пиксел вспыхнет на максимум и успеет уменьшить свою яркость на 25 условных единиц, т.е. к моменту завершения этой команды его яркость будет уже не 255, а 230 (в десятичном представлении - так нагляднее).

Команда в девятой строке LV0, как уже было анонсировано, обозначает конец циклически повторяемой последовательности команд. Буква L в этой команде обозначает LOOP, т.е. цикл, а вот остальные два символа определяют условие повторения цикла. Их может быть несколько (см. файл с подробным описанием), но в конкретном случае применен вариант "цикла по значению переменной V0 с автоуменьшением". Это означает, что переменная V0 будет уменьшена на 1, результат будет проверен на равенство нулю, и если переменная еще не равна нулю, будет повторено выполнение команд тела цикла, т.е. от предыдущей (ближайшей) команды RPT. При помощи пошагового исполнения цикла в симуляторе можно разобраться, как это работает. 

Если вспомнить, что до начала цикла (строка 6) переменная V0 содержала номер последнего пиксела, и учесть, что каждую итерацию цикла она будет уменьшаться на 1, то легко можно понять, что всякий раз будет выводиться пиксел, приближающийся к первому. Причем, как недавно было сказано, в момент вывода очередного пиксела ранее выведенные теряют в яркости 25 условных единиц - теперь понятно, как образуется "хвост" кометы? Не нужно выводить много пикселов с разной яркостью, достаточно только выводить новый, а остальное возьмет на себя DIGILIGHT. Только следует учитывать, что симулятор все-таки не идеально имитирует DIGILIGHT, в частности, яркость пикселов в симуляторе спадает более интенсивно, чем в реальности, так как зависимость яркости WS2812b от значения цветовой составляющей нелинейная. Это означает, что реальный хвост кометы будет более длинный, чем в симуляторе, но теперь ведь всем понятно, какие строки надо подкорректировать, чтобы укоротить его?

В 10-й строке используется занятная команда REV - REVERSE, т.е. реверс. Занятность её в том, что всякий раз при её исполнении меняется порядок нумерации пикселов для команды PM: если изначально порядок нумерации прямой, т.е. 0, 1, 2 и т.д. до значения TP, то после исполнения команды REV нулевым пикселом станет последний, первым - предпоследний и т.д. Если команду REV выполнить дважды - снова восстановится прежний порядок нумерации, и так далее. Эта небольшая хитрость приводит к тому, что наша "комета", долетев до края полоски пикселов, отскакивает от него и движется в обратную сторону, таща за собой хвост.

Ну а заключительная команда INF - INFINITY - это команда "бесконечного" цикла, т.е. без всяких условий она вызывает повтор "своего" тела цикла, т.е. начиная со строки 5. Осталось лишь сохранить скрипт в файл на SD-карту и вставить ее в адаптер DIGILIGHT - и можно наслаждаться содеянным.

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

Как видите, алгоритмический принцип создания эффектов дает пользователю мощный и гибкий, не смотря на примитивность двух-трех-буквенных команд, инструмент по созданию световых эффектов. Вряд ли вы найдете еще более простой инструмент с аналогичной результативностью. Однако, этот принцип требует каких-никаких, но навыков программирования, что не каждому гуманитарию может быть понятно - что же делать им? Для них остаётся способ прямого указания последовательности включения-выключения пикселов: очистили внутреннее состояние командой CLR, задали параметры командами PC, PF и PB - перечислили все пикселы с этими параметрами в команде PM, повторили аналогичное для пикселов с другими параметрами и выполнили команду WT - получили один "кадр" эффекта. Затем аналогичным образом нарисовали и вывели второй кадр, третий и так далее... Ну и в конце можно добавить INF, чтобы "музыка стала вечной". Муторно, долго, объем скрипта заметно вырастет - но что делать? Это плата за отсутствие навыков алгоритмического мышления...

Да, чуть не забыл: скрипт, содержащий команду INF, сам по себе не закончится никогда, т.е. если DIGILIGHT доберется до файла с таким скриптом, ни один следующий файл автоматически уже не будет считан, вам придется вручную энкодером принудительно считывать следующий. Поэтому команды INF следует избегать, если это, конечно, не обусловлено какой-то осознанной необходимостью.

Надеюсь, описанная программа, как и сам принцип создания световых эффектов вместе с конструкцией цветомузыки DIGILIGHT, вам понравились. Предлагаю делиться (через форум) созданными скриптами эффектов, чтобы накопить "библиотеку". Архив с несколькими "учебными", но вполне рабочими скриптами, сделанными мной в процессе работы над DIGILIGHT, я прилагаю к статье вместе с исходниками программы DSM (Free Pascal, проект для среды Typhon).

Прикрепленные файлы:

Теги:

Опубликована: 0 3
Я собрал 0 2
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 5 Проголосовало: 2 чел.

Комментарии (10) | Я собрал (0) | Подписаться

0
andro #
Довольно непросто. Целая наука получается.
Ответить
0

[Автор]
ARV #
Просто "покадрово" совсем просто: никаких циклов, просто задать цвет и перечислить номера светиков... Потом снова и снова... Муторно - пожалуй, да, но не сложно.
Я в настоящее время работаю над новым визуальным редактором скриптов, в котором можно будет " мышкой натыкать" эффект...
Отредактирован 07.03.2018 17:25
Ответить
0
andro #
Вот уже другое дело, не нужно будет вникать в структуру скрипта. Каждый сможет повторить.
Ответить
0
Василий Рубашка #
Из моей немалой практики конструкторы эффектов пишутся только для себя. Народ желает готового. Так что надеяться на массовое творчество конечно можно, но маловероятно. А вообщем оценка 100 из 100 возможных!
Ответить
0

[Автор]
ARV #
Я тоже желаю готового... но, кроме меня, готовить-то некому... С другой стороны, рано или поздно, наготовлю, тогда появится и готовое.
Хотя обидно, что никому не интересно.
Ответить
0
bytex #
Хотя обидно, что никому не интересно.
Ну что ж Вы так, очень даже интересно. Всегда хотел сделать что-то подобное.Но с программной частью всегда проблемы. Что-то подобное видел у итальяшек на ардуино, тоже загружали эффекты с SD. но как-то гемморно. Безусловно, тема интересная.
Ответить
0

[Автор]
ARV #
Ваш комментарий вселяет некоторый оптимизм...
Ответить
0
dimaviolinist #
Весьма даже интересно.
Как раз после той же статьи на гиктаймсе (они плагиатчики, кстати, но очень скромные, потому что об этом не упоминают) собирался сделать нечто подобное. Вот только ленточки мне шли 2,5 месяца...
Ответить
0

[Автор]
ARV #
Я сделал новую версию "редактора скриптов", как мне кажется, не требующую навыков программирования... Если кому интересно - см. сообщение на форуме
Ответить
0

[Автор]
ARV #
Если кому интересен плейер эффектов с SD-карты по принципу, описанному в статье, но в виде отдельного небольшого устройства (atmega8) - могу учесть ваш интерес при заказе печатных плат, сообщайте о потребностях в платах (примерно 30х45 мм).
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется сила тока?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Набор для сборки - LED лампа
Набор для сборки - LED лампа
Катушка Тесла Ветрогенератор
вверх