DigiLight — цифровая цветомузыка

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

Характеристики и параметры

Диапазон анализируемых частот

20…4000 Гц

Максимальная частота визуального обновления

100 Гц

Количество анализируемых частотных полос

16

Шаг частотного анализа

250 Гц

Количество обслуживаемых светодиодов WS2812, минимум/максимум

16/128

Фоновая подсветка (отключаемая)

Есть

Автоматическая регулировка чувствительности

Есть (бета-версия)

Автоматическое отключение при длительном режиме тишины

Есть

Режим светильника

Есть

Управление всеми функциями

Вращающийся энкодер и 1 кнопка

IR-дистанционное управление

Предусмотрено

Возможность воспроизведения световых эффектов с SD-карты

Есть

Принципиальная схема

Принципиальная схема в «редактируемом формате» прилагается к статье в виде проекта KiCAD.

Принципиальная схема

Основа цветомузыки – микроконтроллер atmega32, тактируемый от внешнего кварцевого резонатора 16 МГц.

Входной усилитель и антиалиасинговый фильтр собраны на широкораспространенном ОУ типа LM358. Антиалиасинговый фильтр выполнен по топологии Саллена-Ки и имеет 3-й порядок. Разумеется, более высокий порядок предпочтительнее, но для цветомузыкальных устройств достаточно и такого. Расчет элементов фильтра выполнялся при помощи онлайн-калькулятора.

Дисплей для индикации текущих режимов работы и интерактивной настройки параметров – любой самый распространенный текстовый, 2 строки по 16 символов, русификация не обязательна, только убедитесь, что распиновка совпадает со схемой.

Энкодер – PEC12 или PEC16, с встроенной кнопкой. Датчик сигналов ДУ может быть любым при соответствующей корректировки номеров его выводов, мною применен TSOP4817. Это опциональный элемент схемы.

На клеммник Х2 подается питание 5В, к клеммнику Х3 подключается лента или гирлянда WS2812b.

Реле и транзисторный ключ его включения задумывались в качестве электронного выключателя питания (дело в том, что 96 запитанных, но не светящихся светодиодов потребляют почти 400 мА, поэтому для «дежурного режима» желательно снимать с них питание). Однако, разработанная печатная плата (о ней далее), к сожалению, работает крайне неустойчиво, если количество светодиодов превышает 32 (видимо, из-за неудачной разводки платы), в результате чего данный узел схемы может использоваться не всегда. Доработка системы управления питанием – первоочередная задача при разработке следующей версии DIGILIGHT.

Разъём Х4 служит для подключения адаптера SD-карты, вот такого:

Адаптер micro-SD

Как было сказано ранее, DIGILIGHT может использовать SD-карту для воспроизведения с неё скриптов с описанием на особом языке световых эффектов. Этим скриптам посвящена отдельная статья.

Источник питания не разрабатывался. Требования к нему просты: выхоное напряжение 5 вольт, а ток минимум с 15% запасом по числу светодиодов (каждый светодиод потребляет максимум 60 мА).

Печатная плата

Эскиз печатной платы

Для вышеприведенной схемы разработана печатная плата в САПР KiCAD, проект прилагается. Так как плата разрабатывалась под «эконом-вариант» изготовления в Китае, поэтому определяющим был габарит (не более 100 мм), в результате чего получилось не очень удобно для использования в готовом корпусе, но для тестовых экспериментов – в самый раз.

Изготовленная печатная плата 1Изготовленная печатная плата 2

Ниже — 3D-модель платы, как её видит KiCAD, а еще ниже — реальные фотографии готовой платы в аналогичных ракурсах.

Модель платы 1

Модель платы 2

Настоящий вид 1

Настоящий вид 2

Основная проблема получившейся платы — слишком близкое расположение энкодера и кнопки к дисплею, что сильно ограничивает использование эстетичных ручек для энкодера и толкателя для кнопки. Так же, к сожалению, на плате ошибочно был разведен датчик системы ДУ DD3, в результате чего монтировать его пришлось с переподвыподвертом ножек, на фото этот момент показан детально:

Косяк с ножками датчика

Изначально планировалось просто загнуть на 90 градусов датчик, чтобы он был параллельно плате ближе к «лицевой» панели готового изделия.

Еще на плате для диода VD1 был указан не тот корпус, и в итоге диаметр монтажных отверстий слишком мал для указанного диода, в связи с чем вместо 1N4007 пришлось установить КД521.

Ошибки с ножками DD3 и VD1 уже исправлен, и в прилагаемом архиве плата уже корректная.

Схема достаточно проста, поэтому разработка собственной платы не должна вызвать проблем у любителя средней квалификации. Если уже изготовленный вариант устраивает (см. известные проблемы), я готов за символическое вознаграждение обеспечить пятерых желающих готовыми платами, и даже готов частично укомплектовать их дискретными компонентами. Следует отметить, что допустима замена маломощных биполярных транзисторов на любые в аналогичном корпусе (желательно, с повышенным коэффициентом усиления), транзистор KT817Г так же может быть заменен, например, на BD135 или другие аналоги. В качестве VD1 успешно работает КД522. Электролитические конденсаторы должны быть на напряжение не менее 10 вольт.

Сборка и наладка

Собирать устройство желательно в следующем порядке (речь о существующей плате). Сначала установить все резисторы, конденсаторы, кварц и остальные дискретные компоненты, кроме реле и микросхем. Кнопку и энкодер устанавливать в последнюю очередь. Для микроконтроллера и ОУ желательно применить цанговые панельки.

Затем следует установить (впаять) ОУ и проверить качество работы усилителя/фльтра. Для этого вход усройтсва (разъем Х1) следует закоротить, сигнал AGC (21-я ножка МК) заземлить, после чего подать питание 5 Вольт и измерить уровень напряжения на 7-ом выводе ОУ. Это напряжение должно быть равно примерно половине напряжения питания. Если это не так, следует подкорректировать его путем изменения номиналов делителя R4R5 (напряжение на 7 ножке должно быть равным напряжению на 3-й ножке ОУ).

Затем желательно удостовериться в качестве работы фильтра, для чего потребуется генератор синусоидального сигнала и осциллограф. Подавая на вход неизменный по амплитуде сигнал в диапазоне от 250 до 4000 Гц следует установить амплитуду входного сигнала такой, при котором на частоте 1000 Гц выходной сигнал ОУ еще не искажен (ограничений сигнала быть не должно). Затем надо, не меняя входную амплитуду, убедиться, что в диапазоне 250…4000 Гц амплитуда входного сигнала почти не меняется, а при более высокой частоте — кардинально падает. Можно считать работу фильтра удовлетворительной, если на его выходе амплитуда частоты 5000 Гц примерно в 3 раза меньше, чем 4000 Гц, а сигнал 8000 Гц по амплитуде должен быть меньше, чем входной. Если это не так, то следует более тщательно подобрать номиналы R8, R9, R11, C11, C12 и С13.

После этого можно монтировать остальные компоненты. Реле устанавливается в последнюю очередь. Для ЖКИ на плату желательно установить разъём-маму PLS, а на сам индикатор, соответственно, штыревую часть этого разъема, хотя, конечно, можно соединить ЖКИ с платой и проводниками нужной длины. Для крепления индикатора к плате желательно использовать диэлектрические стойки, но сойдут любые подходящие.

Компиляция проекта

Не смотря на то, что в прилагаемом архиве есть уже готовая прошивка, все желающие могут пересобрать её самостоятельно из исходников. Для этого необходимо иметь установленный компилятор AVR-GCC версии не хуже 5.2.1 (сборка возможна начиная с версии 4.9.2, это тестировалось, но размер прошивки может быть заметно больше).

Для компиляции проекта следует перейти в папку Debug и «из неё» выполнить команду make all (предварительно можно сделать и make clean). Если при этом будет подключен программатор USBAsp, то автоматически будет и прошит микроконтроллер в случае успешной компиляции. Однако фьюзы при этом не прошиваются, их надо прошивать отдельно.

Прошивка микроконтроллера

Для прошивки МК используется разъем XP1, распиновка которого стандартная для программаторов от Atmel. Рекомендуемые значения фьюзов следующие (скриншот из среды Eclipse):

Состояние FUSE-битов

Фьюзы следует прошивать всегда в следующем порядке: считать из МК уже установленные, модифицировать в соответствии с рекомендациями, не меняя остальные, прошить новые значения. Для людей, использующих USBAsp и avrdude, привожу командную строку для прошивки фьюзов «в одно действие»:

avrdude.exe -pm32 -cusbasp -V -u -Ulfuse:w:0x3f:m -Uhfuse:w:0xc7:m

После успешной настройки фьюзов можно заливать основную прошивку (из папки Debug). 

Успешная прошивка просигнализирует вам текстом на ЖКИ. Устройство готово к работе.

Заставка

Настройка параметров

После подачи питания устройство находится в дежурном режиме, при этом подсветка ЖКИ отключена (не смотря на выведенную информационную надпись), питание светодиодов и ОУ отключено. Нажатие кнопки энкодера (далее я буду писать «нажатие энкодера») переводит цветомузыку в рабочий режим.

Кнопка MENU позволяет войти в меню параметров цветомузыки и перемещаться по этому меню. Вращение энкодера меняет текущий параметр (если не сказано иное – см. далее). Выход из меню (если не сказано иное – см. длее) происходит при нажатии энкодера или при отсутствии воздействия на энкодер и кнопку в течение 15 секунд.

Меню - чувствительность

Первый пункт меню – SENSITIVITY – чувствительность. Это по сути регулятор чувствительности устройства к входному сигналу. При вращении энкодера уровень чувствительности меняется, что отображается шкалой.

Меню - автоотключение

Следующий пункт меню – SLEEP TIME – время отсутствия на входе сигнала в секундах, по истечении которого цветомузыка перейдет в дежурный режим автоматически. Если автоматическое отключение не требуется, следует задать значение параметра 0.

Меню - АРУ

Следующий пункт экспериментальный – A.G.C. – это АРУ. Если включено, то устройство будет стараться поддерживать оптимальный уровень чувствительности для сохранения работоспособности без «перезасветки» при изменении уровня сигнала в широких пределах. Когда включен режим АРУ, то регулировать SENSITIVITY через меню не получится, вместо этого в этом режиме можно визуально наблюдать, как АРУ стремится подстраивать чувствительность.

Регулирование осуществляется программно, и, к сожалению, я пока не не смог довести алгоритм до идеального состояния: если сигнал стихает, то АРУ загоняет чувствтельность на максимум, в результате чего система начинает реагировать на малейшие шумы/помехи, а при появлении «нормального» сигнала примерно в течение 1-3 секунд пересвечивает светодиоды, пока не войдет в оптимальное состояние. Ну и эффекты ведут себя по-разному с АРУ и без (те, что я уже сделал, рассчитаны на отключенную АРУ). Если кто-нибудь готов помочь мне с алгоритмом работы АРУ – буду очень рад.

Меню - количество группМеню - количество в группе

Два следующих пункта GROUPS OF WS2812 (количество групп светодиодов) и WS2812 IN GROUP (количество светодиодов в группе) служат для настройки конфигурации светоизлучающих светоиодов, названных пикселами. Общее количество пикселов, как уже не раз говорилось, не может превышать 128, при этом они могут быть разбиты на «группы», функционирующие, как один светодиод. Поясню примером: допустим, у вас всего 32 светодиода, а в группе вы задали 4 пиксела. Тогда программное обеспечение будет считать, что у вас всего 8 пикселов, но будет повторять код цвета для каждого 4 раза. Таким образом, вместо одного пиксела заданного цвета будут включаться 4 рядом расположенных. Такое разделение введено для случая, когда в наличии есть много светодиодов, но разработанные эффекты рассчитаны на меньшее количество. Обычно же достаточно задавать размер группы в 1 пиксел. Оба параметра взаимосвязаны, ввести недопустимые значения не получится.

Меню - смещение не компенсировано

Следующий пункт меню — DC OFFSET — поможет вам компенсировать смещение выходного сигнала фильтра. Делать это надо всегда при отсутствии входного сигнала (желательно даже при закороченном входе) при «среднем» значении чувствительности. Компенсация заключается в следующем: во второй строке дисплея вы будете видеть два числа, разделенных черточкой, например, 12/30200 (значение первого числа может скакать в широких пределах). Вращая неторопливо энкодер, следует добиться минимального значения первого числа, в идеале – ноля. Не торопитесь, после каждого щелчка энкодера должно пройти не менее 100 миллисекунд, прежде чем значение может измениться. В принципе, допустимо любое значение, менее 10, но стремиться надо к нулевому.

Меню - смещение компенсировано

Установленное смещение запоминается при нажатии энкодера. О том, когда требуется повторная корректировка смещения, я скажу далее.

Субменю - обучение пульта

Затем следует пункт-подменю IR REMOTE MENU для «обучения» цветомузыки командам любого (почти) пульта дистанционного управления.

По умолчанию устройство запрограммировано на команды вот такого пульта:

Пульт ДУ

Если вы желаете управлять цветомузыкой другим пультом, следует «войти» в это субменю нажатием энкодера, как и написано на дисплее, и обучить DIGILIGHT. Следует иметь ввиду, что логика этого обучающего субменю отличается от логики основного меню: нажатие энкодера включает и выключает режим обучения, кнопка MENU так же продолжает перемещать вас по меню, а для выхода используется отдельная команда.

Меню - обучение пульта 1

В этом меню в первой строке выводится наименование команды, а во второй — код пульта для неё (или черточки, если код не запрограммирован). Предусмотрены следующие семь команд дистанционного управления цветомузыкой:

POWER OFF — отключение питания (включается питание только нажатием энкодера)
VOLUME+ и VOLUME- — регулирование чувствительности
EFFECT NEXT и EFFECT PREV — переключение эффектов
PRESET NEXT и PRESET PREV — переключение пресета текущего эффекта.

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

Обучение пульта включено

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

Меню - обучение завершено

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

Меню - Сброс настроек

Заключительный пункт меню восстанавливает все настройки «по умолчанию». Он пригодится вам, если в результате экспериментов что-то пойдет не так…

Эксплуатация цветомузыки

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

В основном режиме в первой строке ЖКИ выводится название текущего светового эффекта (их может быть несколько), а вторая служит для дополнительных сведений. Световые эффекты делятся на основные и фоновые, соответственно первые сопровождают музыку, а вторые работают в тишине. Выбор (перебор) эффектов осуществляется либо нажатием энкодера, либо командами с пульта ДУ. При отсутствии сигнала на входе нажатие энкодера управляет фоновыми эффектами, при наличии сигнала – основными. То есть в тишине выбрать основой эффект нельзя.

Каждый эффект может иметь «пресеты», т.е. варианты поведения, отличающиеся какими-то нюансами. Смена пресета осуществляется при вращении энкодера, при этом во второй строке ЖКИ кратковременно выводится наименование или номер пресета (если пресеты есть, конечно). Так же пресеты меняются командами пульта ДУ.

При наличии входного сигнала и отсутствии команд (с энкодера или ДУ), во второй строке ЖКИ выводится спектрограмма входного сигнала. Если при отсутствии сигнала на входе (и даже при закороченном входе) вы наблюдаете постоянное переключение эффектов между основным и фоновым, и/или спектрограмма сигнала содержит высокие столбики в первой-второй позициях, это говорит о том, что по каким-то причинам компенсация постоянной составляющей стала недостаточной, необходимо провести корректировку, как было описано ранее. Сразу после включения питания устройство выходит на рабочий режим, в аналоговых цепях происходят переходные процессы, что может сопровождаться всякими световыми эффектами — это нормально, если прекращается секунд за 5-6.

В базовой (т.е. уже готовой) прошивке доступны следующие эффекты:

Фоновые эффекты

НАЗВАНИЕ ЭФФЕКТА

Описание

Варианты пресетов

DARKNESS

Тьма – свечение светодиодов отсутствует, равносильно отключению фоновой подсветки.

Нет

LAMP

Светильник – постоянное однотонное свечение. При включении этого режима прекращается реакция на входной сигнал, т.е. выключить его можно только сменой эффекта.

Плавное изменение цвета при вращении энкодера.

PING-PONG

Пинг-понг – световой огонек мечется от края к краю линейки светодиодов, меняя цвет.

5 пресетов с разной скоростью движения и темпом смены цвета

SKY STAR

Звездное небо – плавное появление и исчезновение цветных огней в случайных местах. Скорость появления и исчезновения случайная.

3 пресета с разным количеством одновременно светящихся огней и темпом погасания.

DOUBLE SPECTRE

Двойной спектр – от краёв к центру линейки светодиодов плавно затухают два постоянно меняющихся цветовых оттенка.

4 пресета с разными скоростями изменения цветов

RUNNING RAINBOW

Бегущая радуга – вся линейка заполнена движущимся спектром

5 пресетов с разной скоростью движения и «плотностью» спектра

SCRIPT PLAYER

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

Вращение энкодера вместо смены пресета выбирает следующий/предыдущий файл скрипта на карте

Основные эффекты

НАЗВАНИЕ ЭФФЕКТА

Описание

Варианты пресетов

CLASSIC

Классический – 8 частотных полос сопоставляются 8 цветам, занимающим равные доли от числа светодиодов, красный — НЧ, зеленый – СЧ, синий – ВЧ, остальным частотным полосам цвет назначен (условно) произвольно. Яркость каждого цвета пропорциональна уровню соответствующей частотной полосы

2 пресета, отличающиеся цветом «каналов» и их «реактивностью»

SPARKLER

Бенгальские огни – в такт с мелодией вылетают цветные огоньки, движущиеся с разной скоростью.

Нет

PLASMA

Плазма – сигнал разделен на три частотных полосы, как в предыдущем эффекте для аналогичных цветов. Чем выше уровень соответствующей полосы, тем большее количество случайно размещенных светодиодов включается.

12 пресетов, отличающихся темпом погасания и соотношением цветов пикселов.

MODERN Разновидность «классического» эффекта, но вместо изменения яркости в соответствии с уровнем частоты меняется «ширина» светящейся полоски, которая постепенно «схлопывается». Эффект достаточно «мигающий», на любителя. Нет
PICASSO Из всего спектра выбирается частота с максимально изменившимся уровнем и пропорционально этому изменению в случайных местах выводятся цветные огни, чем сильнее изменилась полоса, тем больше огней. В зависимости от регулировки чувствительности эффект может быть почти неотличим от PLASMA или быть совершенно ни на что не похожим. Нет

Предвидя вопросы о «слишком узком частотном диапазоне» и «малом количестве анализируемых частот», скажу, что ознакомление с видео цветомузык на YouTube, убедило меня в мнении о главенствующей важности алгоритма визуализации, а не частот/полос анализа. В сети полно видео работы аппаратов, анализирующих спектр всего звукового диапазона и имеющих более 128 частотных каналов, а демонстрируемые «эффекты» не впечатляют совершенно (хотя попадаются и шедевры). Конечно, не меньше половины успеха зависит от светоизлучающих устройств, экранов и т.п., но вторая половина успеха исключительно в алгоритме. Тем не менее, так как для анализа сигнала используется всем известная библиотека FFT от японца Чена, переделать программу на другие характеристики не представляет особых проблем — исходники открыты. 

Для некоторой демонстрации возможностей DIGILIGHT я подготовил ознакомительный видеоролик. В качестве светоизлучающего устройства применены две линейки по 96 WS2812, «направленных» в разные стороны и закрепленные внутри кабель-канала. Я свел в один кадр 5 разных видеороликов, каждый из которых демонстрирует один из режимов работы цветомузыки на одной и той же мелодии. Таким образом, за один просмотр ролика можно ознакомиться сразу с 4-я разными эффектами (и парой фоновых эффектов). Разумеется, все варианты всех эффектов со всеми пресетами продемонстрировать невозможно, тем более на разных музыкальных произведениях… Да и отсутствие профессиональной аппаратуры (и навыков) не позволяет продемонстрировать всю красоту цвета в эффектах… Но что есть, тем и делюсь.

Я в постоянном поиске алгоритмов новых эффектов и буду благодарен за идеи.

К статье так же прилагается полный комплект исходников на Си (AVR-GCC версии не хуже 5.0) в виде проекта Eclipse, проект KiCAD, описание программного обеспечения в HTML-формате. Скомпилированный HEX-файл находится в архиве с исходниками в папке Debug.

ПО постоянно дорабатывается, так что в прилагаемом к статье архиве могут находиться исходники со слегка отличающимся от описанного функционалом, например, могут быть добавлены новые эффекты или изменены надписи, выводимые на ЖКИ и т.п.

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
DA1 Операционный усилитель LM358N 1
DD1 МК AVR 8-бит ATmega32 1
DD3 ИК-приемник TSOP4817 1
VT1, VT3 Биполярный транзистор КТ3102А 2
VT2 Биполярный транзистор КТ817Г 1
VD1 Выпрямительный диод 1N4007 1
DS1 ЖКИ 1602 1
R1 Резистор 10 кОм 1 SMD 0805
R10 Подстроечный резистор 10 кОм 1
R11 Резистор 27 кОм 1 SMD 0805
R13 Резистор 100 1 SMD 0805
R12, R14, R18 Резистор 1 кОм 3 SMD 0805
R2, R3 Резистор 1.8 кОм 2 SMD 0805
R4 Резистор 22 кОм 1 SMD 0805
R5 Резистор 22 кОм 1 SMD 0805
R6 Резистор 2.2 кОм 1 SMD 0805
R7 Резистор 240 кОм 1 SMD 0805
R8 Резистор 9.1 кОм 1 SMD 0805
R9 Резистор 100 кОм 1 SMD 0805
K1 Реле SRD-05VDC-SL-C 1
C1, C2 Конденсатор 20 пФ 2 NP0 0805
C8, C10 Конденсатор 1.5 мкФ 2 X7R 0805
C11 Конденсатор 0.015 мкФ 1 NP0 0805
C12 Конденсатор 6800 пФ 1 NP0 0805
C13 Конденсатор 100 пФ 1 NP0 0805
C6, C9, C16 Электролитический конденсатор 100 мкФ 3
C3, C4, C5, С7, C14 Конденсатор 0.1 мкФ 5 X7R 0805
L1, L2 Катушка индуктивности 47 мкГн 2
SB1 Кнопка тактовая 1
SW1 Энкодер PEC12 1
ZQ1 Резонатор кварцевый 16 МГц 1 HC-49V
X1 Разъем PLS-2 1
X2, X3 Клемма винтовая 3 контактная 1
X4 Розетка BLS-6 1
XP1 Разъем PLD-6 1