Не вдаваясь в нюансы терминологии, что такое «цветомузыка» и «светомузыка», и чем они отличаются от «светодинамических устройств», свою разработку я назвал цветомузыкой. Я старался сделать не хуже, чем у известных проектов, и как можно проще во всех отношениях. Насколько это вышло – судить вам.
Характеристики и параметры
Диапазон анализируемых частот |
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-карты, вот такого:
Как было сказано ранее, DIGILIGHT может использовать SD-карту для воспроизведения с неё скриптов с описанием на особом языке световых эффектов. Этим скриптам посвящена отдельная статья.
Источник питания не разрабатывался. Требования к нему просты: выхоное напряжение 5 вольт, а ток минимум с 15% запасом по числу светодиодов (каждый светодиод потребляет максимум 60 мА).
Печатная плата
Для вышеприведенной схемы разработана печатная плата в САПР KiCAD, проект прилагается. Так как плата разрабатывалась под «эконом-вариант» изготовления в Китае, поэтому определяющим был габарит (не более 100 мм), в результате чего получилось не очень удобно для использования в готовом корпусе, но для тестовых экспериментов – в самый раз.
Ниже — 3D-модель платы, как её видит KiCAD, а еще ниже — реальные фотографии готовой платы в аналогичных ракурсах.
Основная проблема получившейся платы — слишком близкое расположение энкодера и кнопки к дисплею, что сильно ограничивает использование эстетичных ручек для энкодера и толкателя для кнопки. Так же, к сожалению, на плате ошибочно был разведен датчик системы ДУ DD3, в результате чего монтировать его пришлось с переподвыподвертом ножек, на фото этот момент показан детально:
Изначально планировалось просто загнуть на 90 градусов датчик, чтобы он был параллельно плате ближе к «лицевой» панели готового изделия.
Еще на плате для диода VD1 был указан не тот корпус, и в итоге диаметр монтажных отверстий слишком мал для указанного диода, в связи с чем вместо 1N4007 пришлось установить КД521.
Ошибки с ножками DD3 и VD1 уже исправлен, и в прилагаемом архиве плата уже корректная.
Схема достаточно проста, поэтому разработка собственной платы не должна вызвать проблем у любителя средней квалификации. Если уже изготовленный вариант устраивает (см. известные проблемы), я готов за символическое вознаграждение обеспечить пятерых желающих готовыми платами, и даже готов частично укомплектовать их дискретными компонентами. Следует отметить, что допустима замена маломощных биполярных транзисторов на любые в аналогичном корпусе (желательно, с повышенным коэффициентом усиления), транзистор KT817Г так же может быть заменен, например, на BD135 или другие аналоги. В качестве VD1 успешно работает КД522. Электролитические конденсаторы должны быть на напряжение не менее 10 вольт.
Сборка и наладка
Собирать устройство желательно в следующем порядке (речь о существующей плате). Сначала установить все резисторы, конденсаторы, кварц и остальные дискретные компоненты, кроме реле и микросхем. Кнопку и энкодер устанавливать в последнюю очередь. Для микроконтроллера и ОУ желательно применить цанговые панельки.
Затем следует установить (впаять) ОУ и проверить качество работы усилителя/фльтра. Для этого вход усройтсва (разъем Х1) следует закоротить, сигнал AGC (21-я ножка МК) заземлить, после чего подать питание 5 Вольт и измерить уровень напряжения на 7-ом выводе ОУ. Это напряжение должно быть равно примерно половине напряжения питания. Если это не так, следует подкорректировать его путем изменения номиналов делителя R4—R5 (напряжение на 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):
Фьюзы следует прошивать всегда в следующем порядке: считать из МК уже установленные, модифицировать в соответствии с рекомендациями, не меняя остальные, прошить новые значения. Для людей, использующих 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 так же продолжает перемещать вас по меню, а для выхода используется отдельная команда.
В этом меню в первой строке выводится наименование команды, а во второй — код пульта для неё (или черточки, если код не запрограммирован). Предусмотрены следующие семь команд дистанционного управления цветомузыкой:
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 | |||