Оглавление:

Bluetooth-аудио и обработка цифровых сигналов: платформа Arduino: 10 шагов
Bluetooth-аудио и обработка цифровых сигналов: платформа Arduino: 10 шагов

Видео: Bluetooth-аудио и обработка цифровых сигналов: платформа Arduino: 10 шагов

Видео: Bluetooth-аудио и обработка цифровых сигналов: платформа Arduino: 10 шагов
Видео: Блютуз модуль HM-10 и Ардуино. Управление с телефона 2024, Ноябрь
Anonim
Image
Image
Bluetooth-аудио и обработка цифровых сигналов: платформа Arduino
Bluetooth-аудио и обработка цифровых сигналов: платформа Arduino

Резюме

Когда я думаю о Bluetooth, я думаю о музыке, но, к сожалению, большинство микроконтроллеров не могут воспроизводить музыку через Bluetooth. Raspberry Pi может, но это компьютер. Я хочу разработать фреймворк на основе Arduino для микроконтроллеров для воспроизведения звука через Bluetooth. Чтобы полностью размять мускулы моего микроконтроллера, я собираюсь добавить к аудио в реальном времени цифровую обработку сигналов (DSP) (фильтрация высоких частот, фильтрация низких частот и сжатие динамического диапазона). В качестве вишенки я добавлю веб-сервер, который можно использовать для беспроводной настройки DSP. Встроенное видео демонстрирует основы работы со звуком Bluetooth в действии. Здесь также показано, как я использую веб-сервер для выполнения некоторой высокочастотной фильтрации, низкочастотной фильтрации и сжатия динамического диапазона. Первое использование сжатия динамического диапазона целенаправленно вызывает искажения, как пример неправильного выбора параметров. Второй пример устраняет это искажение.

Для этого проекта предпочтительным микроконтроллером является ESP32. Он стоит менее 10 фунтов стерлингов и оснащен АЦП, ЦАП, Wi-Fi, Bluetooth с низким энергопотреблением, Bluetooth Classic и двухъядерным процессором 240 МГц. Встроенный ЦАП может технически воспроизводить звук, но это не будет звучать хорошо. Вместо этого я использую стереодекодер Adafruit I2S для создания сигнала линейного выхода. Этот сигнал можно легко отправить в любую систему Hi-Fi, чтобы мгновенно добавить беспроводной звук к существующей системе Hi-Fi.

Запасы

Будем надеяться, что у большинства производителей будут макеты, перемычки, USB-кабели, паяльники для блоков питания, и им придется потратить всего 15 фунтов стерлингов на ESP32 и стереодекодер. Если нет, то все необходимые детали перечислены ниже.

  • ESP32 - протестирован на ESP32-PICO-KIT и TinyPico - 9,50 фунтов стерлингов / 24 фунта стерлингов
  • Стереодекодер Adafruit I2S - 5,51 фунта стерлингов
  • Макетная плата - от 3 до 5 фунтов стерлингов за штуку
  • Провода перемычки - 3 фунта стерлингов
  • Проводные наушники / Hi-Fi система - $$$
  • Заглушки или паяльник - 2,10 фунтов стерлингов / 30 фунтов стерлингов
  • Кабель Micro USB - 2,10 фунта стерлингов / 3 фунта стерлингов
  • 3,5 мм для разъема RCA / разъем 3,5 мм для разъема (или любого другого динамика) - 2,40 фунтов стерлингов / 1,50 фунтов стерлингов
  • Блок питания USB - 5 фунтов стерлингов

Шаг 1: Строительство - Макет

Строительство - Макет
Строительство - Макет

Если вы купили ESP32-PICO-KIT, вам не придется паять контакты, так как он уже припаян. Просто поместите его на макетную плату.

Шаг 2: Строительство - вставные разъемы / пайка

Конструкция - нажимные разъемы / пайка
Конструкция - нажимные разъемы / пайка
Конструкция - толкатели / пайка
Конструкция - толкатели / пайка

Если у вас есть паяльник, припаяйте контакты к стереодекодеру в соответствии с инструкциями на сайте Adafruit. На момент написания статьи мой паяльник был заблокирован. Я не хотел платить за временный паяльник, поэтому вырезал несколько нажимных заголовков от пиморони. Я разрезал их, чтобы они подходили к стереодекодеру. Это не лучшее решение (и не то, как предполагалось использовать разъемы), но это самая дешевая альтернатива паяльнику. Проденьте разрезанный заголовок на макетную плату. Для декодера вам понадобится только 1 линия из 6 контактов. Вы можете добавить еще шесть к другой стороне для стабильности, но это не обязательно для этой системы-прототипа. Контакты для вставки заголовков: vin, 3vo, gnd, wsel, din и bclk.

Шаг 3: Строительство - Подключите выводы питания

Конструкция - Подключение силовых выводов
Конструкция - Подключение силовых выводов

Поместите стереодекодер на разъемы push (контакты vin, 3vo, gnd, wsel, din и bclk) и плотно прижмите их друг к другу. Опять же, в идеале это должно быть сделано с помощью паяльника, но мне пришлось импровизировать. Вы заметите, что все провода в этой инструкции синие. Это потому, что у меня не было перемычек, поэтому я разрезал один длинный провод на более мелкие кусочки. Кроме того, я дальтоник и не особо забочусь о цвете проводов. Контакты питания прикреплены следующим образом:

3v3 (ESP32) -> вин на стерео декодер

gnd (ESP32) -> для gnd на стереодекодере

Шаг 4: Строительство - Подключение I2S

Строительство - I2S Wiring
Строительство - I2S Wiring

Чтобы отправить звук Bluetooth с ESP32 на стереодекодер, мы собираемся использовать метод цифровой связи, называемый I2S. Стереодекодер принимает этот цифровой сигнал и превращает его в аналоговый сигнал, который можно подключить к динамику или Hi-Fi. I2S требует всего 3 провода и достаточно прост для понимания. Линия битовых часов (bclk) переключается на высокий и низкий уровень, указывая на то, что передан новый бит. Линия вывода данных (dout) становится высокой или низкой, чтобы указать, имеет ли этот бит значение 0 или 1, а линия выбора слова (wsel) становится высокой или низкой, чтобы указать, левый или правый канал передается. Не каждый микроконтроллер поддерживает I2S, но ESP32 имеет 2 линии I2S. Это делает его очевидным выбором для этого проекта.

Электропроводка следующая:

27 (ESP32) -> wsel (Стерео декодер)

25 (ESP32) -> din (стерео декодер)

26 (ESP32) -> bclk (Стереодекодер)

Шаг 5: Установка библиотеки BtAudio

Установка библиотеки BtAudio
Установка библиотеки BtAudio
Установка библиотеки BtAudio
Установка библиотеки BtAudio

Если они еще не установлены, установите Arduino IDE и ядро Arduino для ESP32. После их установки посетите мою страницу Github и загрузите репозиторий. В среде Arduino IDE в разделе «Скетч >> Включить библиотеку >> выберите« Добавить библиотеку. ZIP ». Затем выберите загруженный zip-файл. Это должно добавить мою библиотеку btAudio в ваши библиотеки Arduino. Чтобы использовать библиотеку, вам необходимо включить соответствующий заголовок в эскиз Arduino. Вы увидите это на следующем шаге.

Шаг 6: Использование библиотеки BtAudio

Использование библиотеки BtAudio
Использование библиотеки BtAudio
Использование библиотеки BtAudio
Использование библиотеки BtAudio

После установки подключите ESP32 к компьютеру через micro USB, а затем подключите стереодекодер к динамику с помощью провода 3,5 мм. Перед загрузкой скетча вам нужно будет изменить некоторые вещи в редакторе Arduino. После того, как вы выбрали свою плату, вам нужно будет отредактировать схему разделов в меню «Инструменты»> «Схема разделов» и выбрать «Без OTA (большое приложение)» или «Минимальный SPIFFS (большие приложения с OTA)». Это необходимо, потому что в этом проекте используются как Wi-Fi, так и Bluetooth, библиотеки с очень большим объемом памяти. Как только вы это сделаете, загрузите следующий скетч в ESP32.

#включают

// Устанавливаем имя аудиоустройства btAudio audio = btAudio ("ESP_Speaker"); void setup () {// передает аудиоданные в ESP32 audio.begin (); // выводит полученные данные на I2S DAC int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } void loop () {}

Эскиз можно условно разделить на 3 этапа:

  1. Создайте глобальный объект btAudio, который устанавливает "имя Bluetooth" вашего ESP32.
  2. Настройте ESP32 для приема звука с помощью метода btAudio:: begin
  3. Установите контакты I2S с помощью метода btAudio:: I2S.

Что касается программного обеспечения! Теперь все, что вам нужно сделать, это установить соединение Bluetooth с вашим ESP32. Просто найдите новые устройства на своем телефоне / ноутбуке / MP3-плеере, и появится «ESP_Speaker». Убедившись, что все работает (играет музыка), вы можете отключить ESP32 от компьютера. Включите его от источника питания USB, и он запомнит последний код, который вы загрузили в него. Таким образом, вы можете навсегда оставить ESP32 скрытым за вашей системой Hi-Fi.

Шаг 7: DSP - Фильтрация

Расширение приемника с помощью цифровой обработки сигналов

Если вы выполнили все шаги (и я ничего не пропустил), у вас теперь есть полностью работающий Bluetooth-приемник для вашей системы Hi-Fi. Хотя это круто, но на самом деле не доводит микроконтроллер до предела. ESP32 имеет два ядра, работающих на частоте 240 МГц. Это означает, что этот проект - гораздо больше, чем просто приемник. Он может быть приемником Bluetooth с цифровым сигнальным процессором (DSP). DSP, по сути, выполняют математические операции с сигналом в реальном времени. Одна полезная операция называется цифровой фильтрацией. Этот процесс ослабляет частоты в сигнале ниже или выше определенной частоты среза, в зависимости от того, используете ли вы фильтр высоких или низких частот.

Фильтры высоких частот

Фильтры высоких частот ослабляют частоты ниже определенной полосы. Я создал библиотеку фильтров для систем Arduino на основе кода с сайта earlevel.com. Основное отличие состоит в том, что я изменил структуру классов, чтобы упростить создание фильтров более высокого порядка. Фильтры более высокого порядка более эффективно подавляют частоты за пределами среза, но для них требуется гораздо больше вычислений. Однако с текущей реализацией вы даже можете использовать фильтры 6-го порядка для звука в реальном времени!

Эскиз такой же, как и на предыдущем шаге, за исключением того, что мы изменили основной цикл. Для включения фильтров мы используем метод btAudio:: createFilter. Этот метод принимает 3 аргумента. Первый - это количество каскадов фильтров. Количество каскадов фильтров составляет половину порядка фильтра. Для фильтра 6-го порядка первый аргумент должен быть 3. Для фильтра 8-го порядка это будет 4. Второй аргумент - это отсечка фильтра. Я установил его на 1000 Гц, чтобы существенно повлиять на данные. Наконец, мы указываем тип фильтра с помощью третьего аргумента. Это должен быть фильтр верхних частот для фильтра верхних частот и фильтр нижних частот для фильтра нижних частот. Приведенный ниже скрипт переключает срезку этой частоты между 1000 Гц и 2 Гц. Вы должны услышать драматический эффект на данные.

#включают

btAudio audio = btAudio ("ESP_Speaker"); пустая настройка () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } void loop () {задержка (5000); audio.createFilter (3, 1000, фильтр верхних частот); задержка (5000); audio.createFilter (3, 2, фильтр верхних частот); }

Фильтры нижних частот

Фильтры нижних частот действуют противоположно фильтрам верхних частот и подавляют частоты выше определенной. Их можно реализовать так же, как фильтры верхних частот, за исключением того, что они требуют изменения третьего аргумента на фильтр нижних частот. Для скетча ниже я чередую частоту среза низких частот между 2000 Гц и 20000 Гц. Надеюсь, вы почувствуете разницу. Он должен звучать довольно приглушенно, когда фильтр нижних частот установлен на 2000 Гц.

#включают

btAudio audio = btAudio ("ESP_Speaker"); пустая настройка () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } void loop () {задержка (5000); audio.createFilter (3, 2000, фильтр нижних частот); задержка (5000); audio.createFilter (3, 20000, фильтр нижних частот); }

Шаг 8: DSP - сжатие динамического диапазона

Фон

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

Код

Сжатие динамического диапазона включает не только уменьшение громкости или пороговое значение сигнала. Это немного умнее. Если вы уменьшите громкость, тихие звуки будут уменьшаться так же, как и громкие. Один из способов обойти это - установить порог сигнала, но это приводит к серьезным искажениям. Сжатие динамического диапазона включает в себя сочетание мягкого определения порога и фильтрации для минимизации искажений, которые могут возникнуть при пороговом / ограничении сигнала. В результате получается сигнал, в котором громкие звуки «обрезаются» без искажений, а тихие остаются без изменений. Приведенный ниже код переключается между тремя различными уровнями сжатия.

  1. Сжатие с искажением
  2. Сжатие без искажений
  3. Без сжатия

#включают

btAudio audio = btAudio ("ESP_Speaker"); пустая настройка () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } void loop () {задержка (5000); audio.compress (30, 0,0001, 0,0001, 10, 10, 0); задержка (5000); audio.compress (30, 0,0001, 0,1, 10, 10, 0); задержка (5000); audio.decompress (); }

Сжатие динамического диапазона сложно, а методы btAudio:: compress имеют много параметров. Я постараюсь объяснить их (по порядку) здесь:

  1. Порог - уровень, при котором звук уменьшается (измеряется в децибелах).
  2. Время атаки - время, необходимое компрессору для начала работы после превышения порогового значения.
  3. Время отпускания - время, необходимое компрессору, чтобы перестать работать.
  4. Коэффициент сжатия - коэффициент сжатия звука.
  5. Ширина колена - ширина (в децибелах) около порога, при котором компрессор частично работает (более естественный звук).
  6. Усиление (децибелы), добавленное к сигналу после сжатия (увеличение / уменьшение громкости)

Очень слышимое искажение при первом использовании сжатия связано с тем, что порог очень низкий, а время атаки и время восстановления очень короткие, что приводит к жесткому пороговому поведению. Во втором случае это явно решается увеличением времени высвобождения. По сути, это заставляет компрессор работать более плавно. Здесь я только показал, как изменение одного параметра может иметь драматический эффект на звук. Теперь ваша очередь поэкспериментировать с разными параметрами.

Реализация (волшебная математика - по желанию)

Я обнаружил, что наивная реализация сжатия динамического диапазона является сложной задачей. Алгоритм требует преобразования 16-битного целого числа в децибелы, а затем преобразования его обратно в 16-битное целое число после обработки сигнала. Я заметил, что одна строка кода обрабатывала стереоданные за 10 микросекунд. Поскольку стереозвук, дискретизированный с частотой 44,1 кГц, оставляет для DSP всего 11,3 микросекунды, это неприемлемо медленно … Однако, объединив небольшую таблицу поиска (400 байтов) и процедуру интерполяции, основанную на разделенных разностях Netwon, мы можем получить точность почти 17 бит за 0,2 микросекунды.. Я приложил PDF-документ со всей математикой для действительно заинтересованных. Это сложно, вас предупреждали!

Шаг 9: интерфейс Wi-Fi

Интерфейс Wi-Fi
Интерфейс Wi-Fi
Интерфейс Wi-Fi
Интерфейс Wi-Fi

Теперь у вас есть Bluetooth-приемник, способный запускать DSP в реальном времени. К сожалению, если вы хотите изменить какой-либо из параметров DSP, вам нужно будет отключиться от Hi-Fi, загрузить новый скетч и затем снова подключиться. Это неуклюже. Чтобы исправить это, я разработал веб-сервер, который вы можете использовать для редактирования всех параметров DSP без повторного подключения к вашему компьютеру. Схема использования веб-сервера приведена ниже.

#включают

#include btAudio audio = btAudio ("ESP_Speaker"); webDSP web; void setup () {Serial.begin (115200); audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); // замените на свой идентификатор WiFi и пароль const char * ssid = "SSID"; const char * password = "ПАРОЛЬ"; web.begin (ssid, пароль и аудио); } недействительный цикл () {web._server.handleClient (); }

Код присваивает вашему ESP32 IP-адрес, который вы можете использовать для доступа к веб-странице. При первом запуске этого кода он должен быть подключен к вашему компьютеру. Таким образом, вы можете увидеть IP-адрес, назначенный вашему ESP32, на вашем последовательном мониторе. Если вы хотите получить доступ к этой веб-странице, просто введите этот IP-адрес в любой веб-браузер (проверено на Chrome).

К настоящему времени мы должны быть знакомы с методом включения Bluetooth и I2S. Ключевое отличие - использование объекта webDSP. Этот объект принимает ваш SSID Wi-Fi и пароль в качестве аргументов, а также указатель на объект btAudio. В основном цикле мы постоянно заставляем объект webDSP прослушивать входящие данные с веб-страницы, а затем обновляем параметры DSP. В заключение следует отметить, что и Bluetooth, и Wi-Fi используют одно и то же радио на ESP32. Это означает, что вам, возможно, придется подождать до 10 секунд с момента ввода параметров на веб-странице до момента, когда информация действительно достигнет ESP32.

Шаг 10: планы на будущее

Надеюсь, вам понравилось это руководство, и теперь к вашему Hi-Fi добавлены Bluetooth Audio и DSP. Тем не менее, я думаю, что у этого проекта есть много возможностей для роста, и я просто хотел указать некоторые направления, в которых я мог бы двигаться в будущем.

  • Включите потоковую передачу звука по Wi-Fi (для наилучшего качества звука)
  • Используйте микрофон I2S для включения голосовых команд
  • разработать эквалайзер, управляемый Wi-Fi
  • Сделайте это красиво (макетная плата не кричит о отличном дизайне продукта)

Когда я дойду до реализации этих идей, я сделаю больше инструкций. Или, может быть, кто-то другой реализует эти функции. Это радость делать все с открытым исходным кодом!

Рекомендуемые: