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
Для программной реализации эти 32МГц погоды не делают, так что китайский клон тут особого смысла не имеет, а сам код от гайверовского варианта не далеко ушел, имея практически весь тот же набор "болячек", надо напрямую работать с АЦП в прерывании или в ручном управлении, все AnalogRead() сходу идут лесом.
так и этот вариант проверим.
 

Sergo_ST

★★★★★★✩
15 Мар 2020
944
820
Думаю для программной реализации анализатора спектра будет полезна отрисовка светодиодов без запрета прерываний на хардверном SPI:
C++:
uint8_t dataLed[3] = {0, 0, 50}; //массив светодиодов

const uint8_t maskLo[] = {0x08, 0x0C}; //маска младшего бита
const uint8_t maskHi[] = {0x80, 0xC0}; //маска старшего бита
const uint8_t maskBit[] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01}; //маска анализа бита

void setup() {
  ledInit(); //инициализация шины
}

void loop() {
  ledWrite(dataLed, sizeof(dataLed)); //отрисовываем массив
}
//---------------------------------Передача массива данных на шину-----------------------------
void ledWrite(uint8_t* data, uint16_t size) {
  ledReset(); //сигнал сброса
  for (uint16_t i = 0; i < size; i ++) { //счетчик байт
    for (uint8_t b = 0; b < 8; b += 2) { //счетчик бит
      SPDR = maskHi[(boolean)(data[i] & maskBit[b])] | maskLo[(boolean)(data[i] & maskBit[b + 1])]; //загружаем 2 бита
      while (!(SPSR & (0x01 << SPIF))); //ждем отправки
    }
  }
}
//------------------------------------Сброс шины-------------------------------------
void ledReset(void) {
  __asm__ __volatile__ (
    "CBI 0x05, 0x03       \n\t" //LOW на выход пина
    "LDI r19, 200         \n\t" //счетчик сигнала reset(50мкс)
    //-------------------------------------------------------------------------------
    "_LOOP_DELAY_%=:      \n\t" //цикл задержки
    "NOP                  \n\t" //пропускаем цикл
    "DEC r19              \n\t" //декремент счетчика циклов
    "BRNE _LOOP_DELAY_%=  \n\t" //переход в начало цикла задержки
    :
    :
  );
}
//---------------------------------Инициализация шины--------------------------------
void ledInit(void) {
  DDRB |= (0x01 << 3); //устанавливаем MOSI как выход
  SPCR = (0x01 << SPE | 0x01 << SPR0 | 0x01 << MSTR); //включаем SPI с пределителем 4
  SPSR = (0x01 << SPI2X); //включаем удвоение скорости
}
Лента подключается к D11, D13 использовать нельзя тк на нем формируется тактирования шины SPI.
 
  • Лойс +1
Реакции: kostyamat

Sergo_ST

★★★★★★✩
15 Мар 2020
944
820
@technotrasher, да в принципе ничего такого особенного, разница в том что сигнал битов формирует SPI а не процессор. В ledWrite отправляется массив яркости светодиодов в формате((G,R,B) для каждого светодиода).
В принципе, если показания с ацп будут считываться в прерывании, то после запуска нового преобразования можно отправить байт в SPI, много времени это не займет, но зато отрисовка будет постоянной и без остановок в основном цикле программы.
 
Изменено:
  • Вау +0
Реакции: VictorArx

kDn

★★★★★✩✩
18 Ноя 2019
1,103
437
@Sergo_ST, я по большей мере ориентировался на то, что контроллер будет использоваться как вспомогательный в дополнение к основному, но в принципе т.к. постоянный массив реализующий циклический буфер предполагается один на 128 байт, а остальное - динамически распределяемые, то можно подумать на счет того чтобы и на одном контроллере все сделать. Но это будет виднее позже.

* Семплирование сделал в прерывании, чтобы тайминги не высчитывать. Но по сути там все очень просто:
C++:
ISR(ADC_vect)
{
  // read value from ADC
  // работа с циклическим буфером
#if N_BT<2
  MICWORKER::adcdata[MICWORKER::adc_rpos][0] = ADCH;
#else
  MICWORKER::adcdata[MICWORKER::adc_rpos][0] = ADCL;
  MICWORKER::adcdata[MICWORKER::adc_rpos][1] = ADCH;
  // uint16_t val = ADC;
  // MICWORKER::adcdata[MICWORKER::adc_rpos][1] = (val&0xFF00)>>8;
  // MICWORKER::adcdata[MICWORKER::adc_rpos][0] = val&0x00FF;
#endif
  MICWORKER::adc_rpos++;
  MICWORKER::adc_rpos&=(MICWORKER::samples-1);
}
По кругу заполняется буффер, а когда нужно - вытягиваются последние семплы начиная с текущей позиции.
В общем-то код практически весь написан, его осталось оттестировать и "причесать", но т.к. время на это выделяется фрагментарно, то дело движется неспешно :)
 
  • Лойс +1
Реакции: Sergo_ST

technotrasher

★★★★✩✩✩
14 Ноя 2019
510
227
по блокам питания. я нашол двуполярные БП на +12 -12 или +5 -5. и БП с двойным выходом. 12, 5В. что нам нужно?
 

kostyamat

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

@technotrasher,
Судя по схеме poty, ни один из этих трех. Нужно два независимых друг от друга БП - на 5 и 12в. При этом минусы питальников объединять нельзя. То есть аналоговая часть питается от однополярника 12в, а цифровая от 5в. При этом, в аналоговой части формируется виртуальная земля, которая соединяется з цифровой землей, которая по совместительству минус 5в БП. Короче все сложно, но не страшно. :)
 
  • Лойс +1
Реакции: kach-99

poty

★★★★★★✩
19 Фев 2020
3,220
938
@technotrasher, давайте уточнять, что собираемся этим питать и какой ток для этого нужен? Двуполярные +12В/-12В можно использовать для питания всей схемы (включая Ардуино): там всего будет миллиампер 30. Но для питания ленты нужно будет что-то придумывать, не знаю сколько там Ампер, но всё равно нужен будет конвертор DC/DC. Если +12В/-12В мощные, то проблем нет.
Нужны какие-то данные по блокам питания. Я бы всё же остановился на варианте внешнего питания 5В + любая плата DC/DC 5В-> +10В/-10В (вторичное напряжение допустимо от 7,5 до 15В). Ток вторичного источника - не более 20мА.

В схеме, в фильтрах не все резисторы превратились в килоомные.
Транзистор, управляющий микрофоном, включен наоборот (сток с истоком). Резистор в затворе не перемещен.
 
Изменено:

kach-99

✩✩✩✩✩✩✩
11 Авг 2021
23
6
Берите компьютерный. На все хватит. Хотя бы для теста

А я схему цму выкладывал. Там все на однополярном работало
 
  • Лойс +1
Реакции: novvel и kostyamat

poty

★★★★★★✩
19 Фев 2020
3,220
938
@kach-99, здесь вопрос не в этом. Имеется два (как минимум) потребителя с разным требуемым напряжением:
  • Ардуино + светодиодная лента: требуют 5В и токи там немаленькие;
  • предварительное усиление + фильтры: требуют напряжения 2х5В + потери на выпрямление + ограничения ОУ, токи небольшие.
Второй потребитель можно привести также к напряжению 5В, я об этом писал, но теряем несколько полезных вещей. Если используем два источника, то проще сделать их независимыми, чем добавлять к каждой полосе блокирующие конденсаторы и обеспечивать их разрядную цепь. Впрочем, изменений там немного, если до этого дойдёт - сделаем.
Приведённая ранее схема - законченный вариант. Для сопряжения с Ардуино необходимо её немного изменить (хотя бы добавить разрядные цепи для конденсаторов после выпрямления), кроме того, есть большая вероятность, что она не сможет работать в режиме переключения каналов.
 

technotrasher

★★★★✩✩✩
14 Ноя 2019
510
227
тогда делаем так. для ленты использую исключительно свой отдельный бп. на 5В и на 3А. может так оно и лучше. а для запитки схемы используем только двуполярный бп который я сбросил. на 12В. прошу внести изменения в схеме в модуле "организация двуполярного питания" с учетом этого.
 

kach-99

✩✩✩✩✩✩✩
11 Авг 2021
23
6
Все правильно говорите. В ардуине свой стабилизатор проде стоит можно и не 5 вольтами запитывать, но это к слову. А что если аналоговую часть через оптопары к ардуине подсоединить. И коммутировать наверное можно
 

poty

★★★★★★✩
19 Фев 2020
3,220
938
@kach-99, не очень понял - зачем здесь оптопары? Во-первых, оптопары - это ключевые элементы (работают как ключи), без какой-либо ОС заставить их работать в линейном режиме, учитывая разброс и сильную зависимость от температуры, я не представляю как. Во-вторых, я не вижу необходимости в усложнении схемы, всё решается гораздо проще.
для запитки схемы используем только двуполярный бп который я сбросил. на 12В.
Есть данные по этому БП?
 

kostyamat

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

@technotrasher,
Снова вопрос - зачем снова двухполярник на +-12в, что усложняет и удорожает повторяемость схемы @poty, если для питания текущей схемы достаточно что-то типа этого https://m.aliexpress.com/item/4000534910455.html ? А для ленты/матрицы + цифровая часть - любой доступный БП на 5в.
Если у вас сомнения в том, как все это сейчас запитано, я описал тут https://community.alexgyver.ru/threads/cvetomuzyka-na-msgeq7.5624/post-97433 , вы читали?
 

kach-99

✩✩✩✩✩✩✩
11 Авг 2021
23
6
Cd4053 для коммутации входов можно использовать? В чипе дипе по 16 руб
 
Изменено:

poty

★★★★★★✩
19 Фев 2020
3,220
938
@kostyamat, для этого варианта схема нарисована, Вы правы. И можно реально получить не от 220В, а от входного питания всей схемы (5В) с помощью DC/DC, об этом я тоже упоминал.
Для двуполярного источника единственное изменение - удаляем формирователь отрицательного напряжения. Нарисую, если будет нужно.
@kach-99, CD4053 использовать можно, там, вроде, есть common output. На рассыпухе, с моей т.з., будет проще. Хотя никому ничего не запрещаю.
 
  • Лойс +1
Реакции: kach-99

VictorArx

★★✩✩✩✩✩
22 Мар 2021
525
86
В предыдущих постах говорили про постоянную составляющую на выходе ОУ при однополярном питании. Самый простой способ убрать её через разделительный кондёр. Его реактивное сопротивление расчитывается по формуле в зависимости от частоты или берётся из готовых таблиц. Далее начинается софт и из- за малых познаний в этой области буду сторонним наблюдателем.
 

technotrasher

★★★★✩✩✩
14 Ноя 2019
510
227
@kostyamat, для этого варианта схема нарисована, Вы правы. И можно реально получить не от 220В, а от входного питания всей схемы (5В) с помощью DC/DC, об этом я тоже упоминал.
Для двуполярного источника единственное изменение - удаляем формирователь отрицательного напряжения. Нарисую, если будет нужно.
@kach-99, CD4053 использовать можно, там, вроде, есть common output. На рассыпухе, с моей т.з., будет проще. Хотя никому ничего не запрещаю.
Так. теперь я запутался. 1. ленту питаем от независимого источника. 5В. все. его не трогаем. и это правильно. меньше наводок. далее. теперь что делать с остальным питанием. 2. используем двуполярное питание? отдельный бп. на сколько вольт? 12? или используем хайлинк на 12В и схему получения двуполярного питания?
poty - давайте уже точно утвердим. я могу и то и то. Вы, как схемотехник нарисуйте уже окончательно. я реализую любой вариант. проверим ещё раз все и я начну разводить плату. если двуполярное - для запитки микросхем - брать землю как? виртуальную GNDD. или отрицательное напряжение?
 

poty

★★★★★★✩
19 Фев 2020
3,220
938
@technotrasher, постараюсь завтра нарисовать. День был сложный, сегодня не выдалось время.
 

technotrasher

★★★★✩✩✩
14 Ноя 2019
510
227
электролитический конденсатор из цифрового сигнала вычитает все нули. потому что они круглые! и не пролазят через его обкладки!!!! остаются только единички. :whistle:
может все же решим с БП что нибудь. :) вопрос только один - используем 12В полярный и выкидываем модуль. или берем не полярный и делаем виртуальную землю. ну и остальные микросхемы питаем тоже от полярного источника.
 

poty

★★★★★★✩
19 Фев 2020
3,220
938
@technotrasher, обновил последнюю схему. Добавил режекторный фильтр вместо линейного усилителя. Обратите внимание, режекторный фильтр имеет изменения! Эта конструкция должна иметь два независимых источника питания: 5В (однополярное), от которого питаются лента и процессор, и 12В (однополярное), от которого питается аналоговая часть. Считаю такой расклад оптимальным.

Для возможного выбора позже нарисую тоже самое с зависимыми блоками питания (5В и 12В имеют общую землю), но количество деталей там будет немного больше.
 
  • Лойс +1
Реакции: kach-99 и technotrasher