ARDUINO Анализатор аудиоспектра. Обсуждение проекта

Stig911

✩✩✩✩✩✩✩
11 Сен 2022
1
0
Всем хай, кто делал проект анализатор аудио спектра на Arduino на матрице WS2812B? Вроде прошил правильно и делал всё по смехе, но работает не как должно, а диоды просто хаотично мигают, в мониторе ком порта пусто. Гавер говорил за отдельный выпуск по этой матрице, но я его не нашёл.
 

novvel

★★★✩✩✩✩
29 Сен 2018
568
191
@Stig911, пробуй эти скетчи мои: https://community.alexgyver.ru/threads/analizator-audiospektra.31/post-63861 Это скорее всего из-за другой распайки матрицы отличной от стандарта который делал гайвер, в моих прошивках частично исправлена эта проблема. В гайверовской прошивке много где напутано столбцы с линиями.
 
Изменено:
  • Лойс +1
Реакции: Олег Поляков

00zzz00

✩✩✩✩✩✩✩
14 Янв 2023
8
5
Всем Добра! Решил повторить анализатор AlexGyver на матрице 16х16 на прошивке "spertrumWS2812_16x16_full" в двух экземплярах - стерео. Но не устраивает форм-фактор этой матрицы. На али есть размер матрицы 8х32. Задумка использовать все те же 16 каналов, но запаралелить столбы, т.е. одна частота будет занимать два столбца. Подскажите, в скетче https://community.alexgyver.ru/threads/analizator-audiospektra.31/post-63861 что нужно поменять, чтобы получить то, что хотелось.
 
Изменено:

novvel

★★★✩✩✩✩
29 Сен 2018
568
191
@00zzz00, насколько я помню там много чего придется поменять в разделе отрисовки, там разобраться не сложно в принципе, просто столбцы переделаешь, если решил качать мою прошивку, то там уже нет ошибок столбец/строка, как в оригинале. ищи подобный код и пробуй играть с ним:
C++:
if (pos % 2 != 0)                                            // если чётная строка
               if (REVERSE) leds[pos * HEIGHT + HEIGHT - j - 1] = color;   // заливаем в обратном/прямом порядке
               else leds[pos * HEIGHT + j] = color;
              else                                                         // если нечётная
               if (REVERSE) leds[pos * HEIGHT + j] = color;                // заливаем в прямом/обратном порядке
               else leds[pos * HEIGHT + HEIGHT - j - 1] = color;
и такой для пиков:

C++:
if (pos % 2 != 0)                                     // если чётная строка
            {
           if (maxLevel[pos] > HEIGHT) maxLevel[pos] = HEIGHT;
              leds[pos * HEIGHT + HEIGHT - maxLevel[pos]] = MAX_COLOR;      // заливаем в прямом порядке
            } else {                                             // если нечётная
              if (maxLevel[pos] >= HEIGHT) maxLevel[pos] = HEIGHT-1;
              leds[pos * HEIGHT + maxLevel[pos]] = MAX_COLOR;               // заливаем в обратном порядке
если прошивка будет из "моих" (от Олега Полякова ) которая с кнопкой и дополнительными эффектами, то там подобные строки тоже есть, но учти направление ленты зигзиг/змейка, я разобрался и ты разберешься)) Учитывай кусок кода еще "reverse" это поворот столбцов вверх ногами. У меня нет времени экспериментировать, проект пока заброшен.
 

Олег Поляков

★★★✩✩✩✩
18 Янв 2022
105
112
www.1812.ru
Важная информация для коллег-самодельщиков, которые будут использовать мой скетч и дальнейшие его модификации для своих проектов.
Максимально возможное количество светодиодов led-ленты (матрицы) для этой прошивки - 256.
Если после компиляции вы увидели сообщение, что свободной динамической памяти осталось меньше 112 байт - то глюки неизбежны.

Выложил новую версию скетча.
Огромное спасибо участнику 00zzz00 за помощь в продуктивном тестировании!
 
  • Лойс +1
Реакции: 00zzz00, novvel и FerA

rufat66

✩✩✩✩✩✩✩
10 Фев 2023
15
1
@Олег Поляков, Приветствую! Пробую ваш скетч с матрицей 8*32,
Если поставить 32 полосы, анализатор превращается в кашу, а режиме лампы вся матрица работает нормально. Анализатор начинает работать если в настройках выставить 15 полос.
 
Изменено:

novvel

★★★✩✩✩✩
29 Сен 2018
568
191
@rufat66, неправильно выставлено видимо где то в коде ширина/высота. Выше примеры кусков кода отвечающих за это, надо все проверить и попробовать менять для тестов. либо 32 полосы просто не могут быть сделаны в прошивке, там вроде столько полос даже в фильтре нету.
 

Олег Поляков

★★★✩✩✩✩
18 Янв 2022
105
112
www.1812.ru
Избыточное цитирование, см. Правила. Отредактируй или сообщение будет удалено
@rufat66, вам необходимо создать свой массив тонов нужной размерности. В вашем случае:
byte posOffset[31] = {2, 3, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 60, 80, 100, 120};

Значения для фильтров я взял грубо из головы. По хорошему их нужно будет подстраивать под вашу акустику.
Напишите, если помогло.

@rufat66, неправильно выставлено видимо где то в коде ширина/высота. Выше примеры кусков кода отвечающих за это, надо все проверить и попробовать менять для тестов. либо 32 полосы просто не могут быть сделаны в прошивке, там вроде столько полос даже в фильтре нету.
Нет, тут дело в размерности фильтра тонов, как мне думается. Ваши корректировки в эффектах по WIDTH и HEIGHT я не трогал.

Если поставить 32 полосы, анализатор превращается в кашу, а режиме лампы вся матрица работает нормально. Анализатор начинает работать если в настройках выставить 15 полос.
Так, чего то я запутался... WIDTH (вертикальные столбики) у вас 8 или 32? :)
 

novvel

★★★✩✩✩✩
29 Сен 2018
568
191
@Олег Поляков, ну я и имел ввиду фильтр тонов в основном, про высоту и ширину в голове подумал что не менял по идее ни кто и там должно быть правильно, но проверить не мешает)) 32 столбика у него, не вывезет мне кажется ардуина такую нагрузку.
 

rufat66

✩✩✩✩✩✩✩
10 Фев 2023
15
1
@novvel, я пробовал увеличивать массив, ничего не меняется. Я думаю что дело не в массиве, а в самой библиотеке fastled.
Ширина 32, высота 8.
Если поставить размер 16*16 матрица работет во всю ширину, но движение линеек при прогоне генератором идет как бы по змейке.
Если потсавить ширину больше 15, например 16, на 16 линейке матрицы, появляются артефакты, при этом этом первые 15 работают и чем шире делаешь матрицу, тем больше линеек правой половины мерцают как попало. Такое впечатление что библиотека не умеет работать с размерами отличными от квадрата, т.е 8*8, 16*16, теряется порядок битов.
Для 32*32 у nano не хвататет памяти.
Если поставить сетку высота 8, ширина 32 матрица начинает тормозить и вся мерцает но при этом на левой части виднеются какие то попытки нарисовать спектр.
Если поставить ширина 8, высота 32, работает вся матрица, но пики падают по змейке.
Ррежим лампы 8*32


 
Изменено:
  • Лойс +1
Реакции: Олег Поляков

Олег Поляков

★★★✩✩✩✩
18 Янв 2022
105
112
www.1812.ru
@rufat66,
Дело, скорее всего, не в библиотеке FastLed - на первом видео (32x8) заставка отрисовывается корректно. Будем думать...
Мне, к сожалению, не удастся смоделировать вашу ситуацию. Использую квадрат 16х16.

Скажите, а сколько динамической памяти остаётся при компиляции скетча под матрицу 32x8?
 

rufat66

✩✩✩✩✩✩✩
10 Фев 2023
15
1
@Олег Поляков,
Скетч использует 22380 байт (72%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 1700 байт (83%) динамической памяти, оставляя 348 байт для локальных переменных. Максимум: 2048 байт.
 

Олег Поляков

★★★✩✩✩✩
18 Янв 2022
105
112
www.1812.ru
@rufat66,
Посмотрите у вас так?:
C++:
//Ширина спектра (0 - 16 кГц, 1 - 6.4 кГц)
#define SPECTRUM  1
и ниже:

C++:
#if (SPECTRUM == 0)
#define FHT_N 256   // ширина спектра х2
byte posOffset[31] = {2, 3, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 60, 80, 100, 120};
#else
#define FHT_N 128  // ширина спектра х
byte posOffset[31] = {2, 3, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 60, 80, 100, 120};
#endif
 

rufat66

✩✩✩✩✩✩✩
10 Фев 2023
15
1
@Олег Поляков, с увеличением массива, при настройке 20, работать стало 19 полос, остальная часть артефачит.
сейчас частота генератора 8 кГц.
IMG_20230212_213910.jpg
 

novvel

★★★✩✩✩✩
29 Сен 2018
568
191
@rufat66, отличные от квадрата обязаны работать, я потому что с этого и начинал исправление багов в своей версии и в версии Олега, у меня не квадратная матрица, а 10х12. Ты какую прошивку заливаешь? Можешь попробовать стандартную прошивку гайвера которую я исправлял, там код самый простой и должен показать исправность матрицы, правильность пайки направления ленты и прочее. Еще судя по видео у тебя неправильно выставлена матрица змейка/зигзаг. Или это из-за разницы в физическом размере матрицы и в коде наезды на соседние столбцы....
 
Изменено:
  • Лойс +1
Реакции: Олег Поляков

Олег Поляков

★★★✩✩✩✩
18 Янв 2022
105
112
www.1812.ru
@rufat66,
так у вас же выставлено сейчас 20x8? И все 19 столбиков работают?
Если так, то это прогресс.
Теперь попробуйте выставить WIDTH=32 и HEIGHT=8. И, теоретически, всё должно заработать.
 

rufat66

✩✩✩✩✩✩✩
10 Фев 2023
15
1
@Олег Поляков, да, стало рабоать 19, 32 без изменений. попробовал увеличить массив до 65, пока ничего не меняется.
Попробовал увеличенный массив в скетче от novvel, результат другой.

у novvel матрица выглядит так. работает почти вся.
Теперь у Nano не хватило памяти для отрисовки 8*32, при включении сразу зависает. при уменшьении размера массива с 256 на 128, не включается совсем.

IMG_20230212_222445.jpg

C++:
Скетч использует 17214 байт (56%) памяти устройства. Всего доступно 30720 байт.

Глобальные переменные используют 1989 байт (97%) динамической памяти, оставляя 59 байт для локальных переменных. Максимум: 2048 байт.

C++:
#define WIDTH 32            // ширина матрицы (число диодов) количество полос
#define HEIGHT 8           // высота матрицы (число диодов) высота полос
#define FHT_N 256         // ширина спектра х2
byte posOffset[65] = {2, 3, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 60, 80, 100, 120, 140, 150, 170, 190, 230, 240, 290, 320, 360, 390, 420, 460, 500, 560, 650, 720, 800, 900, 1500, 2000, 2500, 3000, 3500, 4000, 4500, 5000, 5500, 6000, 7000, 8000, 9000, 10000, 12500}; //оригинал AlexGyver для 16 полос
 

Вложения

Изменено:

novvel

★★★✩✩✩✩
29 Сен 2018
568
191
@rufat66, какой результат? Выложи кусок кода с настройками скетчей.
 

Олег Поляков

★★★✩✩✩✩
18 Янв 2022
105
112
www.1812.ru