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
501
223
В начале проекта, когда ТС сказал , что много брака данной микрухи, тоже искал аналоги. Ничего дядюшка гугл не нарисовал. Буду заказывать этот аналог.
для начала бы найти четкую документацию как это использовать. не даташит. а именно как использовать для нашего случая, и управлять этой микросхемой с помощью ардуино.
 

bort707

★★★★★★✩
21 Сен 2020
2,895
860
для начала бы найти четкую документацию как это использовать. не даташит. а именно как использовать для нашего случая, и управлять этой микросхемой с помощью ардуино.
Не думаю что вы найдете какую-то "документацию", да и не нужна она при наличии даташита. В даташите все более чем четко и просто. Выставляете номер частотного канала уровнями на ножках A B C и через 10мкс снимаете с пина Aout выходной сигнал соответвующего фильтра. Принцип работы довольно близок к MSGEQ7, поэтому портировать код с одной микрухи на другую труда не составит, основную логику можно не переписывать.

Реально код проще, чем это все описывать. Если кто захочет освоить - готов помочь.
Похоже, что и правда лучше отдельную ветку открыть.
 

technotrasher

★★★★✩✩✩
14 Ноя 2019
501
223
Избыточное цитирование
Не думаю что вы найдете какую-то "документацию", да и не нужна она при наличии даташита. В даташите все более чем четко и просто. Выставляете номер частотного канала уровнями на ножках A B C и через 10мкс снимаете с пина Aout выходной сигнал соответвующего фильтра. Принцип работы довольно близок к MSGEQ7, поэтому портировать код с одной микрухи на другую труда не составит, основную логику можно не переписывать.

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

bort707

★★★★★★✩
21 Сен 2020
2,895
860
а вот код опроса, если можно мне в личку сбросьте. посмотрите как у меня - и аналогично. а я изучу уже в практике.
ну вот как-то так (придумал только что, могут быть ошибки)
C++:
// пины А В С микросхемы ВА3834 подключены к пинам 10 9 8 ардуино (важно - в обратном порядке)
// в сетапе их надо описать как OUTPUT
void eq_read() {
  static byte key =0;
  key++;                                     // выбираем следующцю частоту комбинацией ключей A B C
  key &= 0x07;                           // нормируем от 0 до 7
  PORTB &= ~ 0x07;                   // устанавливаем пины 8 9 10 в LOW
  PORTB |= key;                         // устанавливаем пины 8 9 10 в значения A B C
  delayMicroseconds(20);             // ждем 30 мкс (min 10)
  vuMeterBands[key] = analogRead(A0);    // читаем сигнал
}
Эта функция читает за раз только одну частотную полосу,, так что ее надо запускать в 8 раз чаще, чем вашу.
Проще всего положить ее в прерывание по таймеру и дергать, например, каждые 3 мс. Тогда полный спектр будет создаваться каждые 24мс

Но вообще пока рано код обсуждать, у вас же все равно чипа нет :) Я еще тесты не закончил, может что и изменится. Сегодня ошибку вот нашел - порядок полос напутал, оказывается.
Видео сегодня снять так времени и не хватило, извините.
 
Изменено:

poty

★★★★★★✩
19 Фев 2020
2,990
895
@bort707, в этой конструкции мне не нравится delay. Мне кажется, нужно
vuMeterBands[key] = analogRead(A0); // читаем сигнал
Поместить сразу после static byte key =0;
тогда delayMicroseconds(20) будет просто не нужен.
 

bort707

★★★★★★✩
21 Сен 2020
2,895
860
@poty, согласен, но в данном случае я просто "передрал" код ТС для msgeq7, чтобы заметнее была аналогия между двумя микросхемами.

У себя я немного не так делаю - у меня данная процедура вызывается дважды на каждую частоту.
 
  • Лойс +1
Реакции: technotrasher

technotrasher

★★★★✩✩✩
14 Ноя 2019
501
223
я понял. в моей версии все можно переписать намного лучше. опрос микросхемы. без делей. и на ассемблере.
 

bort707

★★★★★★✩
21 Сен 2020
2,895
860
@technotrasher,
на ассемблере сами, у меня только С.

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

У меня выше написано через регистры не ради выпендрежа, а по простой причине - работа с этой мс требует одновременно выставлять уровень сразу на трех пинах, что на функциях digitalWrite() делать неудобно.
 
Изменено:
  • Лойс +1
Реакции: attach

technotrasher

★★★★✩✩✩
14 Ноя 2019
501
223
Избыточное цитирование
@technotrasher,
на ассемблере сами, у меня только С.

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

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

poty

★★★★★★✩
19 Фев 2020
2,990
895
работа с этой мс требует одновременно выставлять уровень сразу на трех пинах
Нет, не требует. Во-первых, есть пин SEL, при выставлении на нём нуля изменения на любых адресных пинах игнорируются. Если жалко тратить пин, то можно и без него - достаточно задержки 10мкс после последнего изменения (её в любом случае нужно использовать, поэтому в этом смысле ничего не меняется).
 

bort707

★★★★★★✩
21 Сен 2020
2,895
860
@poty, это понятно.
Как вы можете видеть, у меня в коде тоже не одновременно:)
 

bort707

★★★★★★✩
21 Сен 2020
2,895
860
Видео сравнение 7ми-полосного эквалайзера на чипе BA3834 и покупного 14-полосного DMS 307 на двух MSGEQ7 из вот этой ветки
На экране ПК проигрывается видео с DMS 307 а звук идет на вход BA3834 и далее на матрицу под экраном

Что можно сказать - микросхема работает, полоски на двух эквалайзерах бегают почти синхронно. Недостаток высоких на моем эквалайзере, думаю обьясняется более высоким качеством звука у автора видео - он его явно берет с качественного музыкального центра, а свое - со звуковухи компа после пережатия на ютубе :)

Надеюсь, хотя бы это видео будет видно и его не удалят...
Смешная ситуацмя -Уже третье видео гружу - а Ютуб блокирует за нарушение авторских прав используемой музыки ! :) и как им обьяснить, что не музыка тут главное :))) но как я светомузыку без музыки покажу?
 

technotrasher

★★★★✩✩✩
14 Ноя 2019
501
223
если можно, то код и схему. аквалайзер с полосками - хорошо. а вот цму из этого сделать не так просто.
 

technotrasher

★★★★✩✩✩
14 Ноя 2019
501
223
@technotrasher, уточните для понимания , DMS 307 это уже цму или еще эквалайзер?
аквалайзер. на цму нам нужно всего три частоты. для уровней амплитуда всего сигнала. это, кстати один из моментов и вопросов. для анализатора спектра 6 частот максимум. с учетом двух канальности тоже вопрос как складывать, а когда использовать отдельно. и банальный ответ сложить и найти среднее - не работает. аквалайзер намного проще. я именно и хочу, чтобы кто глянул мой скетч.
 

bort707

★★★★★★✩
21 Сен 2020
2,895
860
если можно, то код и схему.
схема
ba3834.jpg
Делитель на резисторах R2 R3 нужен в том случае, если используется контроллер на 3.3в. Для МК с питанием 5в делитель не нужен, в этом случае выводим Aout прямо на аналоговый вход ардуино

Код мой Вас вряд ли заинтересует, у меня СТМ32, к тому же две трети кода - это работа с RGB матрицей. Набросок кода выложен в #331
 
Изменено:

technotrasher

★★★★✩✩✩
14 Ноя 2019
501
223
stm32 - я завидую. тогда может принцип распишите. в мануале я прочитал. но хорошо проверить, все ли понял.
 

poty

★★★★★★✩
19 Фев 2020
2,990
895
@technotrasher, да там принцип прост:
1. Подключаем A, B, C, SEL к цифровым выходам Arduino.
2. Подключаем Aout к аналоговому входу.
3. Подаём на выход Arduino, подключенный к SEL низкий потенциал.
4. Подаём на выходы, подключенные к A, B, C, код полосы, которую нужно измерить (т.е., 1 или 0 на каждый выход).
5. Подаём на выход Arduino, подключенный к SEL высокий потенциал. Ждём не менее 10мкс.
6. Считываем амплитудное значение полосы с аналогового входа.
7. Переходим к п. 3.
 
  • Лойс +1
Реакции: bort707 и technotrasher

bort707

★★★★★★✩
21 Сен 2020
2,895
860
@poty, все правильно за исключением п.3 - включать выключать SEL при смене фильтра не обязательно, это следует из диаграммы 2 в даташите:
ba3834-timing.JPG
у меня SEL просто подтянут к питанию
 

poty

★★★★★★✩
19 Фев 2020
2,990
895
Да, sel необязателен. И надо (как и в случае MSGEQ7) контролировать постоянную изменения уровня.
 

kach-99

✩✩✩✩✩✩✩
11 Авг 2021
23
6
Тестил сегодня китайский контроллер sp107e. Гирлянда красивая. Как цветомузыка -ноль. Как там все работает только китайцам известно. Разделение по частотам я так и не увидел.