ARDUINO Цветомузыка на MSGEQ7 и на фильтрах

Цветомузыка на MSGEQ7 и на фильтрах
ЦМУ на MSGEQ7. Также сюда добавляю второй проект ЦМУ на фильтрах.
ссылка на плату и схему https://oshwlab.com/technotrasher/colormusic
За год была проведена большая работа.
Итак ЦМУ на MSGEQ7.
1. Двухканальная схема. стерео.
2. Ручная регулировка шумов. предустановки шумов.
3. 7 режимов цму. в которых есть под-режимы.
4. 10 вариантов световых эффектов.
5. регулировки эффектов и режимов.
6. за "спектр" отвечают микросхемы MSGEQ7. достать рабочие сложно. (Купить более менее рабочие MSGEQ7 - по поиску на алиэкспресс "Модуль анализатора звука Aispark")
7. Аудио компрессор и система контроля клипинга взята тут - kompressor_SSM2167. прочтите обязательно, кто будет собирать.
8. описание режимов в начале скетча.
9. работа возможна с 300 светодиодами!
10. регулировка параметров с пульта и возможность сброса настроек "когда, что то нажал и все поломалось"
11. режим тишины с подсветкой (можно отключить), время срабатывания так же выставляется в скетче.
12 . Использованы статьи. тут для понимания работы MSGEQ7.
13. работа от микрофона. включается с пульта! на плате есть возможность отрегулировать чувствительность и время срабатывания микрофона.
14. режимы работы отображаются светодиодами на плате. на плате возможно механическое отсоединение сигнала с микрофона либо "байпас"
компрессора.
15. регулировка уровня входного сигнала линейным стерео потенциометром.
17. кнопки с платы убраны все, кроме переключения из ждущего режима. нужно для аварийного режима. если перестал работать пульт, а нужно включить хоть что то.
никаких энкодеров и т.д. скетч в первую очередь адаптировался под большую ленту. была битва за каждый байт и даже бит. и дорабатываться будет дальше.
18. Параметры сохраняются в память при отключении ЦМУ. в том числе режимы, шумы, настройки для режимов.
19. питание ленты обособлено от питания ардуино. вы не "сожжете" ардуино, забыв подключить внешний БП и программируя её через USB.
20.

Если вы нашли ошибку или знаете, как что то доработать - напишите об этом.

Особая благодарность Евгению (Slenk) - он находил на меня пару минут на ответ и подсказку. я же подглядывал в его скетч и брал самое лучшее.
так же благодарность - Sergo_ST без его подсказок и терпеливых ответов на мои глупые вопросы скетч был бы намного "толще и тупее". и не факт, что работал бы.


Этап второй ЦМУ на фильтрах. проект делается совместно с poty
проект сложен для сборки.
что сделано - плата. бетта версия. постоянно вносятся изменения. часть отлажена и уже работает.
модуль сбора данных. частично отлажен. работа продолжается.
ЦМУ на фильтрах можно повторять. работает! плату можно заказывать. недавно были изменены некоторые номиналы конденсаторов в фильтрах.
плата доступна тут .
скетч colorMusic_v8_filter.rar
эффектов очень много. все описано вначале скетча. могу сказать, что есть эффекты от Лумазоид ЦМУ. :)
 

Вложения

Изменено:

Комментарии

technotrasher

★★★★✩✩✩
14 Ноя 2019
510
227
@technotrasher, формально - почему нет? Допустим, используем те же самые ОУ. Имеем ограничение сверху в 1,5В. Остаётся 3,5В. Т.о., offset должен быть увеличен на 3,5/2 + прямое падение на диоде. На амплитуду сигнала остаётся около 1В, поставить на каждый выход конденсатор. АРУ убрать...
схему!
 

kostyamat

★★★★★★✩
29 Окт 2019
1,098
632
При подаче этого на ADC контроллера - теряем половину диапазона измерений.
В принципе - нас рать. Потому как FastLED один фиг с байтом работает. Если приводить к значению яркости или цвета - 0-255 значений. Но, как бы всегда желательно на входе иметь разрешение по больше. Шире возможности для программной обработки.
 

technotrasher

★★★★✩✩✩
14 Ноя 2019
510
227
стоп. у нас же все просто. снимаем с фильтров амплитуду. 0-5В. чем выше напряжение тем ярче. зависимость. все. и так по 7 каналам. с переключением в 10 мкс на левый правый. тут походу ареф не нужен. ару на входе я вообще отбросил. оставил компрессор.
 

kostyamat

★★★★★★✩
29 Окт 2019
1,098
632
@technotrasher, тут один подводный камень есть. Дело в том, что A6-A7 на нано не умеют работать как digital. То есть переключить мод на дигитал, и сбросить заряд конденсатора после цикла чтения, прижав вывод к земле - не удастся. Имейте это в виду.
 

VictorArx

★★✩✩✩✩✩
22 Мар 2021
525
86
С kDn вы уже письками померялись, давайте еще со мной. Если, что я пасс.
Коллеги не ссориться. Я так и подумал, что вы ведёте ночную жизнь и поэтому про диод не сообразили. Я сам тута у молодёжи учусь.
Вообще правильное для ОУ всё же двухполярное включение, вернее предпочтительное. Если вы хотите однополярное, ставьте на вход делитель из двух резисторов одного номинала и подключите к + , создав искуственную среднюю точку. Например по 100 кОм.

2021-08-28_18-11-35.png
 

technotrasher

★★★★✩✩✩
14 Ноя 2019
510
227
@technotrasher, тут один подводный камень есть. Дело в том, что A6-A7 на нано не умеют работать как digital. То есть переключить мод на дигитал, и сбросить заряд конденсатора после цикла чтения, прижав вывод к земле - не удастся. Имейте это в виду.
если это так то все плохо...
 

poty

★★★★★★✩
19 Фев 2020
3,220
938
"... тут походу ареф не нужен...."
"... если это так то все плохо..."
@technotrasher, если Вы будете слушать все советы, то никогда ничего не сделаете. Впрочем, это - Ваша конструкция, не мне здесь Вас учить.
Версию схемы с однополярным питанием нарисую позже.
отрицательная волна будет отсекаться, тогда зачем она, какая польза? Нам то, по большему счету, нижняя часть синусоиды вообще не нужна. Нам бы верхнюю усилить, мы ж ее накапливать собрались на кондюке.
Потому что фильтр работает на полном сигнале. То же самое касается аналогового входа Ардуино: для того, чтобы сделать "цифровой фильтр" - выделение гармоник из сигнала - нам нужен весь сигнал, а не его полупериод.
Поэтому предлагаю смещение ОУ делать на величину потерь диода, можно на таком же диоде.
смотрите схему, да обрящете.
При подаче этого на ADC контроллера - теряем половину диапазона измерений.
Неверно. Смотрите мои объяснения ранее.
переключить мод на дигитал, и сбросить заряд конденсатора после цикла чтения, прижав вывод к земле - не удастся
Я нигде этого не предлагал. В моей идее это не требуется.
 

kDn

★★★★★✩✩
18 Ноя 2019
1,103
437
То же самое касается аналогового входа Ардуино: для того, чтобы сделать "цифровой фильтр" - выделение гармоник из сигнала - нам нужен весь сигнал, а не его полупериод.
Я вам уже ранее говорил, что для аналогового входа нужен сигнал от 0 до Vmax, где границы вы задаете AREF и/или делителем, при этом сигнал должен быть смещен за счет постоянной составляющей. К примеру при размахе 5В и отсутствии сигнала вы должны иметь 2.5В постоянки, при максимальной положительной полуволне - 5В, при максимальной отрицательной - 0В.

Но судя по вашему комментарию вида:
Особенно после "идеальный синусоидальный сигнал с размахом 2В на вход АЦП ..., при этом допустим что 0В соответствует 0 результирующего значения АЦП, 1023 соответствует 2В сигнала". :-D
Вы так и не поняли того, что я вам говорил. Подавать отрицательный сигнал на аналоговый вход бессмысленно.

* Но впрочем, я не вмешиваюсь, делайте что хотите :)
 

VictorArx

★★✩✩✩✩✩
22 Мар 2021
525
86
Версию схемы с однополярным питанием нарисую позже.

Отлично. Поможите страждущим. Одного не могу понять. Смещение нужно при однополярном питании. Зачем нужно смещение при двухполярном, объясните на пальцах.
 
Изменено:

poty

★★★★★★✩
19 Фев 2020
3,220
938
@VictorArx, @technotrasher попросил всё сделать на одном напряжении 5В, Вы же сами отвечали на это: "версию схемы с однополярным питанием". Мне это не нравится и часть "плюшек" становится недоступной, но это - его выбор.
 

technotrasher

★★★★✩✩✩
14 Ноя 2019
510
227
@VictorArx, @technotrasher попросил всё сделать на одном напряжении 5В, Вы же сами отвечали на это: "версию схемы с однополярным питанием". Мне это не нравится и часть "плюшек" становится недоступной, но это - его выбор.
Каких "плюшек"?
и да. а какие напряжения будут то? мне ж их как бы оцифровать то нужно!!!! и схему для питания бы хорошо. и что такое дигиталпин снижение, повышение. как управлять нужно там. что подавать на них. само не подастся. и действительно ли, что мы не можем использовать пины A...
для считывания сигнала. в проекте все было на пинах D. цифровых. и данные для фильтра брать из таблички Линейная передаточная функция. так проще?
далее - прошу помочь с включением микрофона. перенести включение на питание, а не землю как у меня.
схему можно уже просматривать тут https://easyeda.com/editor#id=|398b7af0fcf744898093c1e39c56d072
все в работе. постепенно меняется.
 
Изменено:

poty

★★★★★★✩
19 Фев 2020
3,220
938
Про напряжения - здесь. Первоначально рассматривалось два блока питания (5В и 12В), но потом Вы начали ориентироваться только на 5В. Мне перерисовывать схему на единственное однополярное питание 5В, если учесть, что сейчас у Вас на схеме есть источник питания 12В?
Про DigitalPinСнижение и Повышение. Как я уже говорил, при полноценном питании возможен ряд улучшений, в частности - автоматическая подстройка верхнего опорного уровня АЦП к уровню сигнала. В отличие от обычного (внешнего) АРУ в этом случае можно сначала выровнять АЧХ по стандарту частотной плотности DIN (Входной усилитель с режекторным фильтром или Передаточная функция коррекции DIN - практически одинаковый эффект), а потом - определить максимальный уровень сигнала в полосах (АРУ сигнал версия 1.1). В этом случае общий уровень, который оцифровывает АЦП, вырастает на глубину подавления режекторного фильтра (но не более 18дБ, правда, эта цифра в принципе недостижима). Опорный уровень АЦП можно определять из каждой полосы отдельно (АРУ сигнал N версия 1.2), в этом случае общий уровень, поступающий на оцифровку увеличивается значительно (примерно на 9-10дБ) даже без применения режекторного фильтра (Линейный входной усилитель или Линейная передаточная функция). Естественно, эти уровни имеют определённые временнЫе параметры, чтобы управлять уровнями из МК, а не автоматически, можно на DigitalPinСнижение и Повышение подавать короткие импульсы, которые заставят этот уровень увеличиваться или уменьшаться соответственно. Такая функция есть, пользоваться ей или нет - Ваше право. При использовании единственного однополярного питания 5В опорное напряжение вряд ли может быть установлено выше минимального значения 1В, расчёт причины приведён выше. Соответственно, невозможно будет задействовать АРУ хоть как-то эффективно.
Про пины А... Использование их в digital-режиме было не моей идеей и смысла в этом я не вижу. Если паче чаяния это захочется сделать, то достаточно будет выделить любой свободный digital порт и с помощью него обнулять напряжение на всех конденсаторах сразу. Решений для этого масса. Вывод - спрашивайте о необходимости портов А... у того, кто это придумал.
в проекте все было на пинах D. цифровых. и данные для фильтра брать из таблички Линейная передаточная функция.
это я не понял.
Схему посмотрю.
Про микрофон тоже посмотрю.
 

technotrasher

★★★★✩✩✩
14 Ноя 2019
510
227
есть и блок на 12В. но если очень все критично, то куплю блок с двуполярным питанием. может тогда посоветуете такой? и можно ли от него питать ещё и ленту. какие напряжения я буду считывать на пинах после фильтров. как использовать DigitalPinСнижение и Повышение - для того, чтобы понять какой код писать нужно понять как это работает.
 

VictorArx

★★✩✩✩✩✩
22 Мар 2021
525
86
Вечер добрый, коллеги. У меня остался один невыясненный вопрос. С позволения ТС вопрос озвучу. ОУ не бывает идеальных, даже при отсутствии входного сигнала и даже если оба входа соединены на землю, на выходе нет нуля и присутствует напряжение смещения на выходе. Надеюсь это понятно всем. Для установки нуля на выходе, надо подать напряжение смещения на один из входов, которое рассчитывается по формуле, либо из даташита.
Для данной микрухи оно равно 2 mv. Offset на диоде , даже если это диод Шоттки при падении напряжения на нём 0,35 V. Сколько же будет на выходе ОУ при отсутствии сигнала? Точно не ноль или нуль, как правильно.
 

poty

★★★★★★✩
19 Фев 2020
3,220
938
Схема с двумя источниками питания (12В и 5В, оба - однополярные). Я бы линейный усилитель всё же заменил на режекторный фильтр, но в приведённой схеме по Вашей ссылке этого нет. Как вариант - выбирать значения пассивных элементов в фильтре из таблицы Передаточная функция коррекции DIN. (Кстати, у меня резисторы - в килоомах, у Вас на схеме - в омах).
Изменения: диоды заменены на шоттки с малым падением напряжения. Не сосредотачивайтесь на приведённой маркировке, допустимы любые с падением напряжения не более 500мВ.
В переключателе биполярные транзисторы заменены на MOSFET. 2N7002 выбраны с потолка, можно выбрать любые, у которых threshold voltage не более 2В.
Схема независимые 5В, 12В.png
Как это должно работать:
В setup:
1. устанавливаем, что опорным напряжением для АЦП будет AREF;
2. считываем А0 - А6;
3. создаём массив уровня шума для каждой линии AN0 - AN6, записываем в него значения из п. 2;
4. создаём массив гармоник AS0 - AS6, записываем в него значения из п. 2.
5. Подаём лог. 1 на DigitalSwL, лог. 0 на DigitalSwR.

В loop:
Каждые 20мс:
1. считываем A0 - A1;
2. для каждого А0 - А1 определяем, не равно ли оно 1023, если равно - посылаем импульс 1мс длиной на DigitalPinПовышение, если это действие не происходит 10 раз подряд - переходим на п. 1, иначе - продолжаем;
3. если не выполнялись изменения в п. 2 - для каждого А0 - А1 определяем, меньше ли принятое значение, чем AN0 - AN6, если меньше - посылаем импульс 1мс длиной на DigitalPinСнижение, если это действие не происходит 10 раз подряд - переходим на п. 1, иначе - заменяем соответствующее AN0 - AN6 на А0 - А1 и продолжаем;
4. DigitalSwL ^= 1; DigitalSwR ^= 1;
5. Записываем в AS0 - AS6 значения (A0-AN0) - (A6-AN6), отображаем. (Если An < ANn, то записываем 0)

По схеме - компрессор я не проверял. Для отключения микрофона по плюсу питания можно использовать p-MOSFET (например, BSS84, FDV304P, IRLML6302, BSH201...), подключив его стоком к VDD микрофона, истоком - к +5В, сопротивление 10кОм включить между затвором и +5В, на затвор подать управление. Обратите внимание, что для исключения самовозбуждения резистор 100 Ом нужно подключать непосредственно на затвор (т.е., он как бы должен представлять единое целое с транзистором).

@VictorArx, я надеюсь, что определение уровня шума поможет избавится от смещения.
 
Изменено:

technotrasher

★★★★✩✩✩
14 Ноя 2019
510
227
режектороный фильтр ставить перед компрессором? он ему не помешает? и как он работает?
 

poty

★★★★★★✩
19 Фев 2020
3,220
938
@technotrasher, нет, это вместо линейного входного усилителя на U1A из последней схемы. В первой схеме у меня есть пример такого фильтра в прямоугольнике под названием "Входной усилитель с режекторным фильтром (версия 2)". Т.е., там разница в паре резисторов и паре конденсаторов. Я могу перерисовать последнюю схему с режекторным фильтром.
Работает он просто: усиление в полосе частот 100Гц - 1кГц опускается примерно на 4-5дБ, при этом в полосе частот ниже 100Гц и выше 1кГц - поднимается примерно на 2-3дБ. Это выравнивает статистическую мощность типичного музыкального сигнала и делает эффектнее отображение.
 
Изменено:

technotrasher

★★★★✩✩✩
14 Ноя 2019
510
227
сейчас перерисую с учетом всех исправлений. poty, если это не заработает мы просто о...ся на весь форум. :) но это тоже опыт. :)
 

kostyamat

★★★★★★✩
29 Окт 2019
1,098
632
@technotrasher, а между тем, имхо, программный способ тоже имеет право на жизнь, как минимум на lgt8F328p, пульнутой на 32МГц выглядит это многообещающе
 

kDn

★★★★★✩✩
18 Ноя 2019
1,103
437
@technotrasher, а между тем, имхо, программный способ тоже имеет право на жизнь, как минимум на lgt8F328p, пульнутой на 32МГц выглядит это многообещающе
Для программной реализации эти 32МГц погоды не делают, так что китайский клон тут особого смысла не имеет, а сам код от гайверовского варианта не далеко ушел, имея практически весь тот же набор "болячек", надо напрямую работать с АЦП в прерывании или в ручном управлении, все AnalogRead() сходу идут лесом.
 
  • Лойс +1
Реакции: technotrasher

kostyamat

★★★★★★✩
29 Окт 2019
1,098
632

@kDn,
Ну, как сказать. Если иметь в виду, что китайский клон зачастую обходит оригинал в математике в 1.5-2 раза, и еще и крутится на вдвое большей частоте, то как бы появляется больше шансов, что ресурсов контроллера хватит на обсчет относительно сложных эффектов. А не только на разложение сигнала на полосы. Правда ОЗУ все равно маловато.

*** Не, ну на счет analogRead() я спорить не собираюсь. Но клоны - хорошие камни получились.
 
Изменено:

poty

★★★★★★✩
19 Фев 2020
3,220
938

@technotrasher, что тут может не заработать? Всё - классическое, оскомину за годы всем набило.
Режекторный фильтр добавлять?
 

technotrasher

★★★★✩✩✩
14 Ноя 2019
510
227

@technotrasher, что тут может не заработать? Всё - классическое, оскомину за годы всем набило.
Режекторный фильтр добавлять?
по отдельности то все работает. посмотрим как это все будет с ардуино работать. схему перерисовал. исправил. добавил. но пока полная непонятность с бп. я так понимаю что нужно два отдельных на 5 и на 12 Вольт. а 12 Вольт переделывается в двуполярный. куда девать тогда землю от 5 вольтового. проверяйте схему.