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
спасибо за подробный ответ. я только набирать начал. опередили. :))))
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,251
1,297
Москва
По классике должно быть 360 градусов. Но для упрощения сократили до 256, что бы в байт уместить. Это будут все цвета радуги на какой то одной яркости и насыщенности. Белого цвета не будет.
Пока писал (с отвлечениями) на все уже отвтил @poty
 
  • Лойс +1
Реакции: technotrasher

kDn

★★★★★✩✩
18 Ноя 2019
1,103
437
и хранение цвета превращается в 2 байта
Цвет хранится в трех байтах, вне зависимости от представления CRGB или CHSV - поглядите библиотеку. Менять же только байт H без байтов SV можно, но естественно при этом диапазон смены цвета будет сильно ограничен.
 

kostyamat

★★★★★★✩
29 Окт 2019
1,098
632
Не совсем понял
В FastLED 0-360 сжаты в 0-255 (1 байт) двумя разными способами и хранение цвета превращается в 2 байта. Использованная функция учитывает только сжатую hue-составляющую, saturation=255, потому и тип переменной - байт.
Все те же три байта CHSV(Hue, Sat, Val) - три байта, так же как CRGB(r, g, b).
То, что 360° hue замаплено на 256 значений, чтобы помещалось в байт, - правда.
 

poty

★★★★★★✩
19 Фев 2020
3,220
938
Согласен, что опустил Value - яркость цвета. В рассматриваемой функции оно также приравнивается к 255.
Что касается отсутствия SV в определении цвета: функция предназначена для генерации радуги, то есть не предполагается ненасыщенных цветов. В FastLED есть и функции, работающие с полным набором параметров HSV, есть - которые с отдельными (допустим, яркость, её @technotrasher использует как раз именно так). В данном случае выигрыш основывается на том, что в RGB невозможно определить цвет (как длину волны), воспользовавшись только одной составляющей, а в HSV - можно.
Ну, и, по большому счёту, для адресных светодиодов это профанация, так как полного охвата ни RGB, ни HSV пространства они не обеспечивают. Как и большинство современных экранов.
 

kDn

★★★★★✩✩
18 Ноя 2019
1,103
437
Что касается отсутствия SV в определении цвета: функция предназначена для генерации радуги, то есть не предполагается ненасыщенных цветов.
Я не совсем в курсе о каком коде вы говорите, но к примеру в коде лампы для генерации используются все три состовляющие CHSV, пусть даже для насыщенности и яркости заданы - 255, а меняется лишь оттенок. Впрочем это не мешает доработать код таким образом, чтобы менять и их также.
C++:
CHSV thisColor = CHSV(((hue + i * scale) * micCoef), 255, 255);
Про профанацию оставлю без комментариев, поскольку CRI вообще в контексте обсуждения не фигурировал.
 

poty

★★★★★★✩
19 Фев 2020
3,220
938
@kDn, так, может, сначала код посмотреть? Смысл добавлять управление насыщенностью и яркостью, если в данном применении они не нужны?
 

kDn

★★★★★✩✩
18 Ноя 2019
1,103
437
@kDn, так, может, сначала код посмотреть? Смысл добавлять управление насыщенностью и яркостью, если в данном применении они не нужны?
Да, рекомендую вам сначала поглядеть код библиотеки, прежде чем утверждать что-либо про хранение в одном или двух байтах. Если же вы про реализацию радуги, то уж поверьте - добавить мигалку той же яркостью или насыщенностью дело пары минут, в лампе же микрофон влияет на скорость смещения цвета в радуге и на наклон радуги (т.к. используется матрица, а не лента). Впрочем код тоже можете поглядеть, если вам это нужно.

что в RGB невозможно определить цвет (как длину волны), воспользовавшись только одной составляющей, а в HSV - можно.
Для информации, и понимания - определить цвет воспользовавшись только H и положив хрен на SV нельзя. Нужно в обязательном порядке определить все ТРИ параметра. Если используется статическая переменная где вся структура нулевая, то при задании лишь H будет всегда черный цвет, т.к. и насыщенность и яркость - в 0. Если же насыщенность увести в 0, а яркость в максимум - то всегда будет белый цвет. Если же возьмете переменную на стеке и не инициализируете ее, то потенциально в SV окажется мусор и итоговый цвет будет произвольным.

За ликбез можете не благодарить. Остальное изучайте самостоятельно. Если есть проблемы с пониманием кода, то потрудитесь его привести и показать с чем именно у вас возникли проблемы.
 

technotrasher

★★★★✩✩✩
14 Ноя 2019
510
227
Оформи код соответствующим тэгом
с двумя режимами по прежнему не получается.
1. Плавная смена цвета всей ленты - долго сидит на красном. потом сменяется все как надо. и опять долго красный.
void rainbow_fade() {
if (timer_func(COLOR_SPEED)) {
one_color_all(this_color++, LIGHT_SAT, 255);
}
}
где - COLOR_SPEED скорость. таймер. тут понятно. и все работает.
LIGHT_SAT = 255 и this_color нарастает от 0 до 255.

2.
if (timer_func(RUNNING_SPEED)) {
this_color -= 1;
}
fill_rainbow( leds, 50, this_color, RAINBOW_STEP ); // RAINBOW_STEP 1 - 30

только 50 светодиодов...
параметр FastLED.setMaxPowerInVoltsAndMilliamps(5, CURRENT_LIMIT); убрал.
пересмотрел, что мог. память высвобождал. без изменений.
мои знания закончились.
 

Вложения

kostyamat

★★★★★★✩
29 Окт 2019
1,098
632
Плавная смена цвета всей ленты - долго сидит на красном. потом сменяется все как надо. и опять долго красный.
Уберите цветовую коррекцию ленты, и вы наверное увидите, что "долго красный" это оттенки красного, их в палитре действительно очень много. Имхо.
 

kDn

★★★★★✩✩
18 Ноя 2019
1,103
437
1. Плавная смена цвета всей ленты - долго сидит на красном. потом сменяется все как надо. и опять долго красный.
Так HUE в CHSV это как раз с красного до красного
if (timer_func(RUNNING_SPEED)) {
this_color -= 1;
}
fill_rainbow( leds, 50, this_color, RAINBOW_STEP ); // RAINBOW_STEP 1 - 30
Немного непонятно нафига использовать встроенные функции для данной задачи, но даже если так - то всегда можно поглядеть ее исходник...
Я не совсем понимаю чего вы добиваетесь меняя шаг преращения цвета для каждого последующего светодиода... И какого результата ждете, когда этот шаг делаете 50, что равнозначно 5 шагам для байта, может вам проще инкремент или декремент this_color увеличить на сколько надо, ну и шаг сильно не задирать. :)

* Зачем лимит тока отключали непонятно... 50 светюликов может БП и не перегрузят, но пару сотен - легко :)
 

technotrasher

★★★★✩✩✩
14 Ноя 2019
510
227
Уберите цветовую коррекцию ленты, и вы наверное увидите, что "долго красный" это оттенки красного, их в палитре действительно очень много. Имхо.
визуально ничего не изменилось. вернул обратно.

Так HUE в CHSV это как раз с красного до красного

Немного непонятно нафига использовать встроенные функции для данной задачи, но даже если так - то всегда можно поглядеть ее исходник...
Я не совсем понимаю чего вы добиваетесь меняя шаг преращения цвета для каждого последующего светодиода... И какого результата ждете, когда этот шаг делаете 50, что равнозначно 5 шагам для байта, может вам проще инкремент или декремент this_color увеличить на сколько надо, ну и шаг сильно не задирать. :)

* Зачем лимит тока отключали непонятно... 50 светюликов может БП и не перегрузят, но пару сотен - легко :)
применял четыре разных вариант для радуги. везде одинаково.
например и такое было
if (timer_func(RUNNING_SPEED)) {
rainbow_steps -= 1; // rainbow_steps++ counter меняется от 0 до 255 (тип данных byte)
}
for (int i = 0; i < NUM_LEDS; i++ ) {
leds = CHSV(rainbow_steps + i * RAINBOW_STEP, thissat, 255); // HSV. Увеличивать HUE (цвет)// умножение i уменьшает шаг радуги
}

для встроенной fill_rainbow
э... так. 50 это вообще то кол-во светодиодов! в документации - RAINBOW_STEP - это дельта-оттенок между светодиодами. у меня оно 1-5
а цвет тут как раз this_color. он и изменяется.
 

kDn

★★★★★✩✩
18 Ноя 2019
1,103
437
RAINBOW_STEP - это дельта-оттенок между светодиодами
C++:
void fill_rainbow( struct CHSV * targetArray, int numToFill,
                  uint8_t initialhue,
                  uint8_t deltahue )
{
    CHSV hsv;
    hsv.hue = initialhue;
    hsv.val = 255;
    hsv.sat = 240;
    for( int i = 0; i < numToFill; ++i) {
        targetArray[i] = hsv;
        hsv.hue += deltahue;
    }
}
Это всего навсего шаг изменения оттенка, о чем я вам и сказал.
а цвет тут как раз this_color. он и изменяется.
Это не цвет, а оттенок, от которого идет приращение шага
if (timer_func(RUNNING_SPEED)) {
rainbow_steps -= 1; // rainbow_steps++ counter меняется от 0 до 255 (тип данных byte)
}
for (int i = 0; i < NUM_LEDS; i++ ) {
leds = CHSV(rainbow_steps + i * RAINBOW_STEP, thissat, 255); // HSV. Увеличивать HUE (цвет)// умножение i уменьшает шаг радуги
}
И что вы хотели сказать этим кодом? К примеру если подставить значения:
250 + 49 * 5 = , то вы же понимаете, что это совсем не то же самое, что (250 + 49) * 5 ? В первом случае позицию светодиода домножаете на шаг и добавляете смещение, во втором случае смещение + позиция домножаются на шаг. В первом случае будет хз что, во втором - правильная логика.

* Для самостоятельной проверки понимания, предлагаю посчитать (250 + 49 * 5)%256, ((250 + 49) * 5)%256, (250 + 5 * 5)%256, ((250 + 5) * 5)%256, (250 + 6 * 5)%256, ((250 + 6) * 5)%256 и понять что происходит и почему :)
 

kDn

★★★★★✩✩
18 Ноя 2019
1,103
437
@technotrasher, если в уме не можете сходу прикинуть что происходит, то попросту добавляйте отладочный вывод в консоль значения hue и анализируйте значения)))

Для вашего фрагмента пример:
C++:
  if (timer_func(RUNNING_SPEED)) {
    rainbow_steps -= 1; // rainbow_steps++ counter меняется от 0 до 255 (тип данных byte)
  }
  EVERY_N_SECONDS(5){ // отладка, раз в 5 секунд, доп. вызовом
    for (int i = 0; i < NUM_LEDS; i++ ) {
        uint8_t hue = rainbow_steps + i * RAINBOW_STEP;
        leds = CHSV(hue, thissat, 255); // HSV. Увеличивать HUE (цвет)// умножение i уменьшает шаг радуги
        Serial.println(hue);
    }
  }
  // это остается как есть
  for (int i = 0; i < NUM_LEDS; i++ ) {
    leds = CHSV(rainbow_steps + i * RAINBOW_STEP, thissat, 255); // HSV. Увеличивать HUE (цвет)// умножение i уменьшает шаг радуги
  }
 

technotrasher

★★★★✩✩✩
14 Ноя 2019
510
227
Огромная благодарность!!! сейчас возьму как делал в 98 году калькулятор, бумагу и карандаш. и считать и прикидывать.
 

bort707

★★★★★★✩
21 Сен 2020
3,046
909
если подставить значения:
250 + 49 * 5 = , то вы же понимаете, что это совсем не то же самое, что (250 + 49) * 5 ? В первом случае будет хз что, во втором - правильная логика.
как по мне, правильная логика как раз в первом случае. Если во втором выражении раскрыть скобки, то получится что первое это 250 + 5*i, а второе превращается в 250*5 + 5*i
Как видим, и то и то выражение дают радугу с шагом 5. Разница только в смещении , в первом случае это 250, как мы и хотели, а во втором смещение 1250%256 = 226, то есть несколько иное.
 
  • Лойс +1
Реакции: kDn

bort707

★★★★★★✩
21 Сен 2020
3,046
909
э... так. 50 это вообще то кол-во светодиодов! в документации
вот с этого места поподробнее. Вы в параметрах функции радуги указываете 50 диодов и потом удивляетесь, что только 50 диодов и светятся?
 

kostyamat

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

@technotrasher,
Не поверите, иногда, работая над эффектами для лампы, именно так и делаю, бумажка в клеточку, карандаш и калькулятор. Сижу рисую, пересчитываю...
 

VictorArx

★★✩✩✩✩✩
22 Мар 2021
526
86

@technotrasher,
Не поверите, иногда, работая над эффектами для лампы, именно так и делаю, бумажка в клеточку, карандаш и калькулятор. Сижу рисую, пересчитываю...
Мне прислали ленту WS8212 . Не совсем понятно про радугу, что тут обсуждали, смещение, шаг и т.д. Не сочтите за труд подсказать , где можно про это прочитать. Тоже возьму карандаш, тетрадку, калькулятор и посчитаю.
 

technotrasher

★★★★✩✩✩
14 Ноя 2019
510
227
вот с этого места поподробнее. Вы в параметрах функции радуги указываете 50 диодов и потом удивляетесь, что только 50 диодов и светятся?
нет, конечно. :))))))) не читали все посты. 50 только работают как нужно. радуга. если поставить 60 или, как мне нужно 180 - все. только красный и зеленый. других цветов нет.

как по мне, правильная логика как раз в первом случае. Если во втором выражении раскрыть скобки, то получится что первое это 250 + 5*i, а второе превращается в 250*5 + 5*i
Как видим, и то и то выражение дают радугу с шагом 5. Разница только в смещении , в первом случае это 250, как мы и хотели, а во втором смещение 1250%256 = 226, то есть несколько иное.
а что так не работает, что так. все равно 50 светодиодов и все. ставлю больше и пропадают цвета. а по числам все как бы должно работать! и!!! если сделать отдельный скетч - все отлично работает. это где то что то на что то влияет где то внезапно именно в данном скетче. :( и это ж...па. потому что придется перекапывать все!
 

technotrasher

★★★★✩✩✩
14 Ноя 2019
510
227
Мне прислали ленту WS8212 . Не совсем понятно про радугу, что тут обсуждали, смещение, шаг и т.д. Не сочтите за труд подсказать , где можно про это прочитать. Тоже возьму карандаш, тетрадку, калькулятор и посчитаю.
а вот по фаст лед документации внятной мало. есть много на английском языке в которой глаза сломать, если новичок. есть пару примеров. есть пару зарубежных форумов, где тоже народ жалуется на невнятную документацию и помогают друг другу разбираться.
 

bort707

★★★★★★✩
21 Сен 2020
3,046
909
а вот по фаст лед документации внятной мало. есть много на английском языке в которой глаза сломать
по факту фастлед самая навороченная и раскрученная либа для ленты, и вряд ли для какой библиотеки больше информации чем для фастледа. А что до английского - то вообщето любой программист и электронщик без него никуда

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

technotrasher

★★★★✩✩✩
14 Ноя 2019
510
227
тут скорее наоборот. буду отнимать из скетча "лишнее". есть одно подозрение на таймеры. и на FastLED.setBrightness(50);
в аттаче скетч - как раз нужный мне эффект. кратко и четко. на нем тестировал. так вот - там есть строчка FastLED.setBrightness(50);
если убрать эту строчку то - тоже только красный и зеленый!!!! по всей ленте. если поставить больше 50-60 то тоже только красный и зеленый!!!!!!!
но ведь - CHSV((rainbow_steps + i) * RAINBOW_PERIOD, 255, 255) - тут же переопределяется!!!!!
кстати - да. со скобками наиболее верно работает. шаг именно тот , что меня устраивает.
 

Вложения

VictorArx

★★✩✩✩✩✩
22 Мар 2021
526
86
У меня библиотека фаст лед с готовым кодом из инета не фунциклировала. С библиотекой нео пиксель всё заработало. Не подумайте, что я даю советы, я в этом ни хера не понимаю в цифрах, но может здесь собака порылась.