Съдържание:

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

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

Видео: Bluetooth аудио и цифрова обработка на сигнали: рамка на Arduino: 10 стъпки
Видео: Уроки Arduino #5 - работа с цифровыми портами и подключение кнопки 2024, Ноември
Anonim
Image
Image
Bluetooth аудио и цифрова обработка на сигнали: рамка на Arduino
Bluetooth аудио и цифрова обработка на сигнали: рамка на Arduino

Резюме

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

За този проект ESP32 е избраният микроконтролер. Той струва по-малко от £ 10 и е оборудван с ADC, DAC, Wifi, Bluetooth Low Energy, Bluetooth Classic и двуядрен процесор на 240MHz. Вграденият ЦАП може технически да възпроизвежда аудио, но няма да звучи страхотно. Вместо това ще използвам стереодекодера Adafruit I2S за генериране на сигнал за линеен изход. Този сигнал може лесно да бъде изпратен до всяка HiFi система за незабавно добавяне на безжично аудио към съществуващата HiFi система.

Консумативи

Надяваме се, че повечето производители ще имат макети, джъмпери, USB кабели, поялници за захранване и ще трябва да похарчат само 15 паунда за ESP32 и стерео декодера. Ако не, всички необходими части са изброени по -долу.

  • ESP32 - тестван на ESP32 -PICO -KIT и TinyPico - £ 9.50/ £ 24
  • Adafruit I2S стерео декодер - £ 5.51
  • Брендборд - £ 3 £ £ 5 всеки
  • Кабелни проводници - 3 паунда
  • Кабелни слушалки/Hi -Fi система - £$$
  • Бутални хедери или поялник - £ 2.10 / £ 30
  • Микро 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: Конструкция - Свържете захранващите щифтове

Конструкция - Свържете захранващите щифтове
Конструкция - Свържете захранващите щифтове

Поставете стерео декодера върху бутоните за натискане (vin, 3vo, gnd, wsel, din и bclk щифтове) и ги натиснете здраво заедно. Отново, в идеалния случай това трябва да се направи с поялник, но трябваше да импровизирам. Ще забележите, че всички проводници в тази инструкция са сини. Това е така, защото нямах джъмперни проводници, затова нарязах 1 дълъг проводник на по -малки парчета. Освен това съм далтоник и не ми пука за цвета на проводника. Захранващите щифтове са прикрепени, както следва:

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

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

Стъпка 4: Конструкция - I2S окабеляване

Строителство - I2S окабеляване
Строителство - I2S окабеляване

За да изпратим Bluetooth аудио от ESP32 към стерео декодера, ще използваме метод за цифрова комуникация, наречен I2S. Стерео декодерът ще приеме този цифров сигнал и ще го превърне в аналогов сигнал, който може да бъде включен в високоговорител или HiFi. 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 и изтеглете хранилището. В IDE на Arduino под Sketch >> Include Library >> изберете „Add. ZIP library“. След това изберете изтегления zip файл. Това трябва да добави моята библиотека btAudio към вашите библиотеки на Arduino. За да използвате библиотеката, ще трябва да включите съответната заглавка в скицата на Arduino. Ще видите това в следващата стъпка.

Стъпка 6: Използване на библиотеката BtAudio

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

След като инсталирате, свържете вашия ESP32 към компютъра си чрез микро USB и след това свържете вашия стерео декодер към вашия високоговорител с вашия 3,5 мм проводник. Преди да качите скицата, ще трябва да промените някои неща в редактора на Arduino. След като сте избрали вашата дъска, ще трябва да редактирате схемата на дяловете в Инструменти >> Схема на дяловете и да изберете или „No OTA (Large APP)“или „Minimal SPIFFS (Large APPS with OTA)“. Това е необходимо, тъй като този проект използва както WiFi, така и Bluetooth, които са библиотеки с много памет. След като направите това, качете следната скица в ESP32.

#включва

// Задава името на аудио устройството btAudio audio = btAudio ("ESP_Speaker"); void setup () {// предава аудио данни към ESP32 audio.begin (); // извежда получените данни към I2S DAC int bck = 26; int ws = 27; int dout = 25; аудио. 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 скрит зад вашата HiFi система завинаги.

Стъпка 7: DSP - Филтриране

Разширяване на приемника с цифрова обработка на сигнали

Ако сте изпълнили всички стъпки (и не съм пропуснал нищо), сега имате напълно функциониращ Bluetooth приемник за вашата HiFi система. Въпреки че това е готино, това всъщност не изтласква микроконтролера до границите му. ESP32 има две ядра, работещи на 240MHz. Това означава, че този проект е много повече от приемник. Той има капацитет да бъде Bluetooth приемник с процесор за цифров сигнал (DSP). DSP по същество извършват математически операции върху сигнала в реално време. Една полезна операция се нарича Цифрово филтриране. Този процес намалява честотите в сигнал под или над определена гранична честота, в зависимост от това дали използвате високочестотен или нискочестотен филтър.

Високочестотни филтри

Високочестотните филтри затихват честоти под определен диапазон. Изградих библиотека за филтри за системи Arduino въз основа на код от earlevel.com. Основната разлика е, че промених структурата на класа, за да позволя по-лесно изграждането на филтри от по-висок ред. Филтрите от по -висок ред по -ефективно потискат честотите отвъд границата, но изискват много повече изчисления. Въпреки това, с настоящата реализация, можете дори да използвате филтри от шести ред за аудио в реално време!

Скицата е същата като тази, намерена в предишната стъпка, с изключение на това, че сме променили основния цикъл. За да активираме филтрите, използваме метода btAudio:: createFilter. Този метод приема 3 аргумента. Първият е броят на филтърните каскади. Броят на филтърните каскади е половината от реда на филтъра. За филтър от 6 -ти ред първият аргумент трябва да бъде 3. За филтър от 8 -ми ред той ще бъде 4. Вторият аргумент е прекъсването на филтъра. Зададох това на 1000Hz, за да има наистина драматичен ефект върху данните. И накрая, ние посочваме типа на пълнителя с третия аргумент. Това трябва да е високочестотен за високочестотен филтър и нискочестотен за нискочестотен филтър. Скриптът по -долу превключва границата на тази честота между 1000Hz и 2Hz. Трябва да чуете драматичен ефект върху данните.

#включва

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

Нискочестотни филтри

Нискочестотните филтри правят обратното на високочестотните филтри и потискат честоти над определена честота. Те могат да бъдат реализирани по същия начин като високочестотните филтри, с изключение на това, че изискват промяна на третия аргумент на нискочестотен. За скицата по-долу редувам нискочестотната прекъсване между 2000Hz и 20000Hz. Надяваме се, че ще чуете разликата. Трябва да звучи доста приглушено, когато нискочестотният филтър е на 2000Hz.

#включва

btAudio аудио = btAudio ("ESP_Speaker"); void setup () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; аудио. I2S (bck, dout, ws); } void loop () {забавяне (5000); audio.createFilter (3, 2000, нискочестотен); забавяне (5000); audio.createFilter (3, 20000, нискочестотен); }

Стъпка 8: DSP - Компресия на динамичен обхват

Заден план

Компресията на динамичния обхват е метод за обработка на сигнал, който се опитва да изравнява силата на звука. Той компресира силни звуци, които се издигат над определен праг, до нивото на тихи и след това, по избор усилва и двете. Резултатът е много по -равномерно изживяване при слушане. Това беше много полезно, докато гледах шоу с много силна фонова музика и много тих вокал. В този случай просто увеличаването на силата на звука не помогна, тъй като това само усили фоновата музика. С компресирането на динамичен обхват бих могъл да намаля силната фонова музика до нивото на вокалите и да чуя отново всичко правилно.

Кодът

Компресията на динамичния обхват не включва само намаляване на силата на звука или праг на сигнала. Това е малко по -умно от това. Ако намалите силата на звука, тихите звуци ще бъдат намалени, както и силните. Един от начините да се заобиколи това е прагът на сигнала, но това води до силно изкривяване. Компресията на динамичния обхват включва комбинация от мек праг и филтриране, за да се сведе до минимум изкривяванията, които бихте получили, ако пределите/изрежете сигнала. Резултатът е сигнал, при който силните звуци се „подрязват“без изкривяване, а тихите се оставят такива, каквито са. Кодът по -долу превключва между три различни нива на компресия.

  1. Компресия с изкривяване
  2. Компресия без изкривяване
  3. Без компресия

#включва

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

Компресирането на динамичен диапазон е сложно и методите на btAudio:: compress имат много параметри. Ще се опитам да ги обясня (по ред) тук:

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

Силно чуваемите изкривявания при първото използване на компресия се дължат на това, че прагът е много нисък, а времето за атака и времето за освобождаване са много кратки, което ефективно води до твърдо поведение на праговете. Това ясно се решава във втория случай чрез увеличаване на времето за освобождаване. Това по същество кара компресора да действа по много по -плавен начин. Тук само показах как промяната на 1 параметър може да има драматичен ефект върху звука. Сега е ваш ред да експериментирате с различни параметри.

Изпълнението (магическата математика - по избор)

Открих, че наивно прилагането на компресията на динамичния диапазон е предизвикателство. Алгоритъмът изисква преобразуване на 16-битово цяло число в децибели и след това обратно превръщането му в 16-битово цяло число, след като обработите сигнала. Забелязах, че един ред код отнема 10 микросекунди за обработка на стерео данни. Тъй като стерео аудиото, дискретизирано на 44,1 KHz, оставя само 11,3 микросекунди за DSP, това е неприемливо бавно … Въпреки това, комбинирайки малка таблица за търсене (400 байта) и интерполационна процедура, базирана на разделените разлики на Netwon, можем да получим близо 17 бита точност за 0,2 микросекунди. Приложих pdf документ с цялата математика за истински заинтересованите. Сложно е, предупредиха ви!

Стъпка 9: Wifi интерфейсът

Wifi интерфейс
Wifi интерфейс
Wifi интерфейс
Wifi интерфейс

Сега имате Bluetooth приемник, способен да изпълнява DSP в реално време. За съжаление, ако искате да промените някой от DSP параметрите, ще трябва да прекъснете връзката с вашия HiFi, да качите нова скица и след това да се свържете отново. Това е тромаво. За да поправя това, разработих уеб сървър, който можете да използвате за редактиране на всички параметри на DSP, без да се свързвате отново с вашия компютър. Скицата за използване на уеб сървъра е по -долу.

#включва

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

Кодът присвоява IP адрес на вашия ESP32, който можете да използвате за достъп до уеб страницата. При първото стартиране на този код трябва да го свържете към компютъра си. По този начин можете да видите IP адреса, присвоен на вашия ESP32 на вашия сериен монитор. Ако искате да получите достъп до тази уеб страница, просто въведете този IP адрес във всеки уеб браузър (тестван на chrome).

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

Стъпка 10: Бъдещи планове

Надяваме се, че сте се насладили на тази инструкция и сега сте добавили Bluetooth Audio и DSP към вашия HiFi. Мисля обаче, че има много място за растеж в този проект и просто исках да посоча някои бъдещи насоки, които бих могъл да предприема.

  • Активирайте Wifi поточно предаване на аудио (за най -добро качество на звука)
  • Използвайте I2S микрофон, за да активирате гласови команди
  • разработете еквалайзер, управляван от WiFi
  • Направете го красив (чертежът не крещи страхотен продуктов дизайн)

Когато успея да приложа тези идеи, ще направя още инструкции. Или може би някой друг ще реализира тези функции. Това е радостта да направите всичко с отворен код!

Препоръчано: