ESP, IoT Анализатор аудиоспектра на ESP32

Олег Поляков

★★✩✩✩✩✩
18 Янв 2022
77
88
www.1812.ru
Реализация проекта "Анализатор аудио спектра" на ESP32

Версия 1.8 от 26 июля 2023 г.


Преимущества по сравнению с начальным проектом на Arduino Nano:
  1. Возможность работы с длинными (составными) LED-матрицами. Проверялось на матрицах 32x16 и 48x16.
  2. Полноценное использование возможностей двух-ядерного процессора esp32.
  3. Управление анализатором через ИК-пульт и через web-интерфейс.
  4. Управление анализатором через облачный сервис "Розетка".
  5. Расширенный набор эффектов в режиме "Лампа", в том числе бегущая строка (текст, время, дата).
  6. Доступ к большому количеству тонких настроек анализатора череp web-интерфейс.
  7. Значительно улучшена визуализация эффектов в режиме "Анализатор".
  8. Улучшена динамическая отрисовка шкалы громкости.
  9. Автоматическая подстройка яркости матрицы в зависимости от освещённости.
  10. Переключение источника звука между микрофоном и линейным входом.
Схема сборки анализатора:
schemes_1_5.jpg

Порядок сборки, настройки и прошивки
  1. Соберите анализатор согласно представленной выше схемы.
  2. Скачайте архив скетча и распакуйте его.
  3. Откройте файл Spectrus_esp32.ino в среде разработки Arduino IDE.
  4. Установите все необходимые библиотеки через Менеджер библиотек. Необходимые библиотеки и их проверенные версии:
    Adafruit_GFX версия 1.11.5
    FastLED_NeoMatrix версия 1.1
    arduinoFFT версия 1.6.0
    GyverButton версия 3.8.0
    ESP32Time версия 2.0.0
    IRremote версия 3.5.0 (не используйте версию выше из-за несовместимости версий)
    GyverPortal версия 3.5.3
    NTPClient версия 3.2.1
    ArduinoJson версия 6.20.1
  5. Для русификации шрифтов необходимо скопировать с заменой файл glcdfont.c в папку libraries/Adafruit_GFX_Library/
  6. Для этих же целей скопируйте папку FontRus в папку libraries/Adafruit_GFX_Library/
  7. В Spectrus_esp32.ino установите параметры вашей LED-матрицы (ленты) и, если ширина матрицы не кратна 16, создайте свой массив фильтров частот posOffset.
  8. Если необходимо, откорректируйте другие константы, которые подробно откомментированы в тексте скетча.
  9. Выставите необходимые параметры платы esp32 и com-порт и скомпилируйте скетч. Если компилятор будет ругаться на ошибку в библиотеке GyverPortal, то откройте в текстовом редакторе соответствующий файл библиотеки и закомментируйте строку, на которую ругается компилятор.
  10. Для управления анализатора через web-интерфейс найдите в настройках wi-fi вашего гаджета сеть SPECRUS, подключитесь к ней введя пароль по умолчанию "12345678". Далее откройте web-браузер и введите в строке адреса url: "192.168.4.1".
Если всё собрано и настроено правильно, то результат не заставит себя ждать.

Управление
Устройство может управляться через кнопку, через ИК-пульт, через wi-fi (напрямую и через роутер локальной сети), через облачный сервис "Розетка" (http://www.memorandum.ru/Rozetka/). Каждый способ управления реализован в отдельных файлах скетча и подробно там же описан.

Для управления через облачный сервис необходимо зарегистрироваться в сервисе и получить API-key для вашего устройства. Этот ключ необходимо прописать в соответствующем поле настроек через web-интерфейс. Пример управления см. в папке Web Control, файл spectrus.html. Отредактируйте в этом файле строку var api_key = {"api_key": "############"};, указав API-key своего устройства.


Быстродействие
Тестирование устройства производилось на матрицах 16x16, 32x16 и 48x16.
Были показаны следующие результаты скорости обработки и визуализации звука в fps (фреймов в секунду):
16x16 - 32-34;
32x16 - 28-30;
48x16 - 20-21.

Видео
Прошу прощения за качество видео. Записывал на старый планшет, откуда и небольшое отставание изображения от звука.

Скриншоты
image1.5_01.pngimage1.5_02.pngimage1.5_03.pngimage1.5_04.pngimage1.7_06.pngimage1.5_05.png


Скетч


Благодарности
Алексу Гайверу и Скотту Марли за базис проекта.
Касьянову Владимиру Александровичу за тестирование и интересные идеи.
 

Вложения

Изменено:

Avatar

✩✩✩✩✩✩✩
20 Фев 2023
7
2
Спасибо за разработку. Заказал сегодня на Алиэкспресс модуль ESP32, микрофон, инфракрасный модуль, ардуино нано и одну матрицу 16х16. Как придет, буду пробовать собирать сначала старую версию на ардуино нано, потом эту новую. Я новичек в микроконтроллерах, поэтому буду пробовать, надеюсь получится. Пока жду детали.
 
  • Лойс +1
Реакции: Олег Поляков

Sergey Petrov

✩✩✩✩✩✩✩
13 Ноя 2021
10
2
Спасибо Олегу Полякову за отличный проект и огромную работу! Повторил его, очень понравилось! И анализатор аудиоспектра и лампа и часы, всё в одном устройстве. Много настроек ,можно подстроить для себя. Собрал на трёх матрицах 16х16,огонь! У меня не получалось скомпилировать скетч, Олег очень помог .
 

Avatar

✩✩✩✩✩✩✩
20 Фев 2023
7
2
@Sergey Petrov, Поздравляю с успешным повторением проекта. 🙂 А я пока жду детали. Надеюсь, что в течении месяца придут. Тоже буду повторять.
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,799
579
44
Судя по видео, уровень пиков рассчитывается линейно, а не по логарифму. Поэтому такой эффект их резкого возрастания, тихий сигнал совсем слабый, и затем очень резко возрастает.
 

Vaqtincha

★✩✩✩✩✩✩
14 Ноя 2022
134
20
Uzbekistan, Fergana
Esp8266 опять мимо. Неужели он не справится с анализом звука. Неужели он хуже тот же atmega328p который прекрасно это делает имея 10 раз меньше ресурсов.
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,799
579
44
Esp8266 опять мимо.
Просто автор пошел по довольно простому и логичному пути: тяжелый анализ аудиоспектра на одно ядро, все остальное на второе. Это решает кучу головняков с оптимизацией кода, да и ESP32 не на много дороже.
Можно было бы и на ESP8266 запустить, если бы у нее был аппаратный блок как у ESP32, который может выводить данные на адресную ленту практически не используя процессор.

Неужели он хуже тот же atmega328p который прекрасно это делает имея 10 раз меньше ресурсов.
Посмотрим как атмега будет анализировать вывод на 48 каналов с той же частотой обновления. :)
 
Изменено:
  • Лойс +1
Реакции: Олег Поляков

Олег Поляков

★★✩✩✩✩✩
18 Янв 2022
77
88
www.1812.ru
Выложил новую версию 1.5.
Добавлено:
  1. Автоматическая подстройка яркости матрицы в зависимости от освещённости.
  2. Переключение источника звука между микрофоном и линейным входом (управляется с ИК-пульта и через web-интерфейс)
 

00zzz00

✩✩✩✩✩✩✩
14 Янв 2023
8
5
От себя добавлю пару строк.
Выкладываю таблицу массива от Скотта Марли. Мы с Олегом Поляковым долго бились над алгоритмом расчета массива, пока не наткнулись на этого англичанина. https://cloud.mail.ru/public/kppT/ykf7TQwRG
Ну и наконец-то вышла прошивка с линейным входом. Настраивать с микрофона массив, только время терять. Много внешних факторов влияющих на работу массива при подаче сигнала на анализатора от микрофона. Так что берем звуковой генератор, выставляем 0,775 мВ, а это стандартные для аудиотехники 0 дБ, считаем свои столбы, выставляем края диапазона (слишком высоко как оказалось не стоит задирать, а также ниже 100 гц. достаточно 100гц --- 8-10кгц) и вбиваем нужные цифры, прошиваемся и смотрим. И так раз..не знаю сколько...пока не добьетесь четкого подъема столбов при проходе генератором всего диапазона) Генераторы можно использовать любые, как программные, так и онлайн. Особое внимание на коэффицент Frequency mulitplier per band и столбец Center bin. Цифры в нем не должны повторяться.

А пока едет лента для формата 32х16, потренируюсь на формате 14х16, потому как уже нарезаны акриловые ячейки под этот формат.
Ну и всем удачи и терпения в повторении этой конструкции.
 
Изменено:

Олег Поляков

★★✩✩✩✩✩
18 Янв 2022
77
88
www.1812.ru
Заменил видео-ролик демонстрации различных режимов визуализации.
На нём виден, пожалуй, самый бюджетный вариант корпуса для экрана спектро-анализатора: деревянная рамка, покрашенная автомобильной матовой чёрной нитроэмалью; 1.5 мм стекло; автомобильная тонировочная плёнка с прозрачностью в 15%; матовая тонировочная плёнка; задник из покрашенного оргалита; подставка из чёрного пластика с креплением к задней стенке на круглых неодимовых магнитах 20x3.
 
  • Лойс +1
Реакции: Avatar

Pasha_ZP_UA

✩✩✩✩✩✩✩
18 Окт 2019
15
2
Здравствуйте, подскажите, как в Arduino во вкладке Инструменты выставить правильно настройки???
 

vortigont

★★★★★✩✩
24 Апр 2020
852
461
Saint-Petersburg, Russia
Выглядит очень интересно. А почему бы не создать репозиторий на гитхабе/гитлабе?
Отдельно анализатор в виде библиотеки оформить мысли не было?
 

Олег Поляков

★★✩✩✩✩✩
18 Янв 2022
77
88
www.1812.ru
@Pasha_ZP_UA,
достаточно правильно установить тип платы и ком-порт.
Остальные настройки - по умолчанию.
Core Debug Level: None
Flash Frequency: 80 MHz
Partition Scheme: Default
Upload Speed: 921600
 

Олег Поляков

★★✩✩✩✩✩
18 Янв 2022
77
88
www.1812.ru
@vortigont,
репозиторий создавать просто лень. Здесь на форуме оформить тему сил едва хватило. :)

А есть ли смысл оформлять в виде библиотеки прикладной скетч с кучей настроек и завязок на периферию? У меня большие сомнения.
 

vortigont

★★★★★✩✩
24 Апр 2020
852
461
Saint-Petersburg, Russia
@Олег Поляков,
создать репозиторий это примерно как залить файлы на клауд меил-ру :) Ну описание можно просто скопипастить из этой же темы.
Тогда появится возможность другим предлагать какие-то улучшения к вашему проекту, отслеживании изменений. Ну это если есть интерес именно к разработке. Если собрали и все устраивает, то это лишнее, согласен.
Про библиотеку я имел ввиду отделить и абстрагировать часть с анализатором спектра, если она у вас хорошо получилась и вы нашли интересные решения в этой области. А какую к ней натянуть "обертку" из скетча с кучей дефайнов это дело третье. Как ни крути - получается вариация "лампы".
Я просто интересуюсь со стороны разработки, сейчас занимаюсь проектом вот этой лампы.
 
  • Лойс +1
Реакции: Олег Поляков

Олег Поляков

★★✩✩✩✩✩
18 Янв 2022
77
88
www.1812.ru
@vortigont, дорогой коллега, очень рад тому, что вы в своих разработках продвигаете линейку esp32, как бюджетную альтернативу 8266 и Ардуино Uno-Nano, ибо реальное разделение задач на два потока (ядра) - очень эффективно и оправдано. Я стараюсь на одно ядро повесить задачи прикладные, а второе зарезервировать под задачи коммуникационные в своих проектах. Эта концепция в сочетании с большим объёмом динамической памяти развязывает руки и позволяет реализовывать даже очень ресурсоёмкие проекты не упираясь в ограничения по железу. ESP-32 действительно значительно расширяет наши творческие, программистские горизонты.

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

Я очень вам благодарен за идеи и просто за интерес к разработке. Каждый такой позитивный отклик даёт импульс к продолжению разработки. Вчера, благодаря вам, исправил эффект "Волна" и значительно улучшил эффект "Кометы". А это значит, что скоро выложу новую версию. Спасибо!
 
  • Лойс +1
Реакции: fatograff и vortigont

vortigont

★★★★★✩✩
24 Апр 2020
852
461
Saint-Petersburg, Russia
@Олег Поляков,

да я писал библиотеки под esp32 IDF, вполне приличный тулкит и документация. С ртосом, конечно сильно сложнее работать чем с голым ардуино фреймворком, но возможностей выше на голову. 8266 уже давно пора списать со счетов, не столько из-за того что слабенькая сколько из-за сильно ограниченного и закрытого апи.

С Фурье-то понятно, тут основной смысл нормально подобрать масштабирование и фильтры что бы разложить на n столбцов, подобрать окно скольжения и пр. Ибо обычно влоб разложенный спектр выглядит убого с несколькими динамичными столбцами с краю и невнятным шумом на большей части столбцов.
На досуге погляжу ваш код более детально.

P.S.
думаю стоит поменять местами привязку потоков по ядрам. В ардуино на 0м ядре как раз висит вся радио, сетевая и системная часть, а на 1м ядре крутится петля ардуино.

если ардуино луп пустой, то его лучше прибить - освободится память под стек, ну и холостой цикл не будет болтаться.
C++:
void loop() { vTaskDelete(NULL); }
со стеком в 30к под ком таску вы явно не пожалели :) столько не нужно. В ардуино под луп выделяется 8к.
 
  • Лойс +1
Реакции: Олег Поляков

vortigont

★★★★★✩✩
24 Апр 2020
852
461
Saint-Petersburg, Russia
Попытался завести ваш проект - не тривиально я вам скажу )
Часть библиотек вы вложили в архив, в их числе зачем-то какую-то кривую библиотеку от ардуино WiFi которая не собирается под есп32.
С другой стороны другие библиотеки вы в архив не положили и в скетче не оставили ссылок на конкретные репозитории откуда их брать. Ну понятно что можно погулить, но можно было и как-то более организованно к этому подойти. Ладно, решаемо, лишнее выкинул, недостающее нашел. Далее собираем... наступаем на кривой гайвер-портал, который не собирается со свежим выпуском ядра есп32. Ну понятно, выпустили недавно, многим все переломали и не все еще обновки сделали. Подхачил, собрал, залил, запустил. И... нас встречает запароленный WiFi...
блин, ну серьёзно? Для тех кто первый раз видит гайвер-портал можно было бы и написать этот пароль где-нибудь в начала скетча.
В общем пока сыровато. Хотя на матрице эффекты бегают, хоть и не в такт микрофону.

дополнение: если рядом положить телефон с музыкой то все выглядит довольно таки красиво! Для варианта из коробки и без каких-либо настроек так вообще прекрасно! Но в отсутсвие музыки, видимо, усиление зашкаливает и картинка начинает "бродить", шумит песками Марса и показывает неведомо что. Выглядит совсем плохо.
 
Изменено:

Олег Поляков

★★✩✩✩✩✩
18 Янв 2022
77
88
www.1812.ru
@vortigont, огромное спасибо за обстоятельный разбор, выявленные косяки и целый ряд полезных советов!
Всегда очень ценна критика товарища по цеху.
По вашим замечаниям:
1. Добавил в инструкцию пункт про wifi и управление через web-интерфейс.
2. Убил пустой loop как процесс.
3. Заменил распределение процессов по ядрам.
4. Переписал часть кода, отвечающего за АРУ и ручную регулировку уровня звука. Стало значительно лучше.

Сторонние библиотеки обязательно "причешу".
 
  • Лойс +1
Реакции: fatograff

vortigont

★★★★★✩✩
24 Апр 2020
852
461
Saint-Petersburg, Russia
@Олег Поляков, да незачт. Проект у вас интересный, хоть и молодой. Анализатор действительно получился неплохой из коробки. Если выделить его в отдельный класс и наделить удобным интерфейсом, то можно будет легко интегрировать с другими проектами и абстрактным устройством вывода. Напр, на rgb матрице 64x32 должно хорошо смотреться. Я как-то работал с ними, намного удобнее для небольших поделок чем гибкие матрицы на адресных диодах.
И заведите репозиторий, начните осваивать git, выкините это убогое ардуино иде, возни с библиотеками и с обновлением будет на порядок меньше.

ошибку в библиотеке GyverPortal, то откройте в текстовом редакторе соответствующий файл библиотеки и закомментируйте строку, на которую ругается компилятор
ой какой плохой совет :))) обычно от этого станет только хуже )
 
  • Лойс +1
Реакции: Олег Поляков

Олег Поляков

★★✩✩✩✩✩
18 Янв 2022
77
88
www.1812.ru
Выложил новую версию 1.6 скетча. Благодаря помощи vortigont внесен целый ряд исправлений и улучшений. А именно:
  1. Добавлена недостающая библиотека Adafruit_GFX_Library.
  2. Исправлен эффект "Волна".
  3. Модифицирован эффект "Кометы".
  4. К списку настроенных эффектов спектроанализатора добавлены 2 новых эффекта типа "Кометы".
  5. Выгружен из памяти пустой loop как процесс.
  6. Заменено распределение процессов по ядрам.
  7. Значительно улучшена обработка настроек при включённой и выключенной АРУ звука. Ручная настройка чувствительности (ослабление, усиление звука) стала более плавной.
  8. Исправлена ошибка выключения анализатора при включённой автоматической подстройке яркости экрана.
  9. На кнопки 8 и 9 ИК-пульта повешено отображение бегущей строкой текущих времени и даты соответственно.
  10. Улучшено отображение бегущей строки.
 
Изменено:
  • Лойс +1
Реакции: vortigont

Олег Поляков

★★✩✩✩✩✩
18 Янв 2022
77
88
www.1812.ru
Выложил новую версию 1.7.
В ней:
1. Сделано управление бегущей строкой через web-интерфейс.
2. Добавлен фильтр тонов для 24 столбиков индикации частот.
3. Заставка при включении адаптированна к разным размерам экрана.
4. Улучшено отображение бегущей строки даты, времени, ip-адреса по запросу с ИК-пульта.
5. Уменьшен размер статической памяти с 10 до 4 Кб, выделяемый под процессы анализа и отображения звука.
6. Улучшен эффект "Два канала: цветовая дорожка".
7. Добавлено 14 преднастроенных эффектов отображения звукового спектра:
"Классика" - 1,
"Волна" - 2,
"Зебра" - 1,
"Костёр" - 1,
"Радуга" - 2,
"Два канала: цветовая дорожка" - 1,
"Два канала: радуга" - 2.
"Два канала: синус" - 4.
8. Добавлен двуцветный фон для эффектов анализатора.
 
Изменено:
  • Лойс +1
Реакции: Divin, vortigont и Avatar

Vaqtincha

★✩✩✩✩✩✩
14 Ноя 2022
134
20
Uzbekistan, Fergana
Немного оффтопа: не подскажете почему у вас конденсаторы подключены в цепи только для линейного входа а на микрофона нет.

А на других прохожих проектах наоборот (или 10нф для aux и микрофона а электролит только для микрофона)
В чем вообще их предназначение? Что будет если заменю 10нф на 100нф?
 

Forgetweb

★✩✩✩✩✩✩
8 Май 2022
61
20
@Vaqtincha,
тут тоже бездумная схемотехника. Два последовательных конденсатора на 100мкф и 10нФ это шедеврально. Едва ли кто сможет объяснить зачем это сделано. Еще шедевральней то, что после них идет вход микроконтроллера. Что там меряется - загадка. Схемотехника Гайвера заразна смотрю.
У микрофона выход имеет постоянную составляющую в 1,25В. Его можно конденсатором не отвязывать, но смещение по постоянке надо учесть в программе.
 
  • Лойс +1
Реакции: Vaqtincha