Obsah:
- Zásoby
- Krok 1: Konštrukcia - Breadboard
- Krok 2: Konštrukcia - Zatlačte hlavičky/spájkovanie
- Krok 3: Konštrukcia - zapojte napájacie kolíky
- Krok 4: Výstavba - Elektroinštalácia I2S
- Krok 5: Inštalácia knižnice BtAudio
- Krok 6: Použitie knižnice BtAudio
- Krok 7: DSP - filtrovanie
- Krok 8: DSP - kompresia dynamického rozsahu
- Krok 9: Rozhranie Wifi
- Krok 10: Plány do budúcnosti
Video: Spracovanie zvuku a digitálneho signálu Bluetooth: Rámec Arduino: 10 krokov
2024 Autor: John Day | [email protected]. Naposledy zmenené: 2024-01-30 11:57
Zhrnutie
Keď myslím na Bluetooth, myslím na hudbu, ale bohužiaľ väčšina mikrokontrolérov nemôže prehrávať hudbu cez Bluetooth. Raspberry Pi môže, ale je to počítač. Chcem vyvinúť rámec založený na Arduine pre mikrokontroléry na prehrávanie zvuku cez Bluetooth. Aby som úplne natiahol svaly svojho mikrokontroléra, pridám do zvuku digitálne spracovanie signálu (DSP) v reálnom čase (filtrovanie horného priechodu, filtrovanie dolného priechodu a kompresia dynamického rozsahu). Ako čerešničku na vrch pridám webový server, ktorý je možné použiť na bezdrôtovú konfiguráciu DSP. Vložené video ukazuje základy zvuku Bluetooth v prevádzke. Ukazuje mi to tiež používanie webového servera na vykonávanie niektorých vysokofrekvenčných filtrov, nízkopriepustných filtrov a kompresie dynamického rozsahu. Prvé použitie kompresie dynamického rozsahu účelovo spôsobuje skreslenie ako príklad zlých volieb parametrov. Druhý príklad eliminuje toto skreslenie.
Pre tento projekt je ESP32 zvoleným mikrokontrolérom. Stojí menej ako 10 GBP a je vybavený funkciami ADC, DAC, Wifi, Bluetooth Low Energy, Bluetooth Classic a dvojjadrového procesora 240 MHz. Vstavaný DAC môže technicky prehrávať zvuk, ale nebude znieť skvele. Namiesto toho použijem stereofónny dekodér Adafruit I2S na vytvorenie signálu výstupného signálu. Tento signál je možné ľahko odoslať do akéhokoľvek HiFi systému a okamžite tak pridať bezdrôtový zvuk do vášho existujúceho HiFi systému.
Zásoby
Našťastie väčšina výrobcov bude mať doštičky, prepojky, káble USB, spájkovačky napájania a bude musieť minúť iba 15 libier na ESP32 a stereo dekodér. Ak nie, všetky požadované diely sú uvedené nižšie.
- ESP32 - testované na súpravách ESP32 -PICO -KIT a TinyPico - 9,50 GBP/ 24 GBP
- Stereo dekodér Adafruit I2S - 5,51 GBP
- Breadboard - 3 - 5 libier za kus
- Prepojovacie káble - 3 libry
- Káblové slúchadlá/Hi -Fi systém - £$$
- Push hlavičky alebo spájkovačka - 2,10 GBP / 30 GBP
- Micro USB kábel - 2,10 GBP/ 3 GBP
- Konektor 3,5 mm na RCA/ 3,5 mm konektor na konektor (alebo čokoľvek, čo váš reproduktor potrebuje) - 2,40 GBP/ 1,50 GBP
- USB napájací zdroj - 5 GBP
Krok 1: Konštrukcia - Breadboard
Ak ste si kúpili súpravu ESP32-PICO-KIT, nebudete musieť spájkovať žiadne kolíky, pretože sú predspájkované. Jednoducho ho umiestnite na dosku.
Krok 2: Konštrukcia - Zatlačte hlavičky/spájkovanie
Ak máte spájkovačku, spájkujte kolíky do stereo dekodéra podľa pokynov na webovej stránke Adafruit. V čase písania bola moja spájkovačka v práci, ktorá bola uzamknutá. Nechcel som platiť za dočasnú spájkovačku, a tak som odrezal niekoľko tlačných hlavičiek od pimoroni. Rozrezal som ich, aby sa zmestili do stereo dekodéra. Toto nie je najlepšie riešenie (a nie ako boli určené hlavičky, ktoré sa majú použiť), ale je to najlacnejšia alternatíva k spájkovačke. Narežte rozrezanú hlavičku na dosku na chlieb. Na dekodér by vám mal stačiť 1 rad 6 pinov. Na druhú stranu môžete kvôli stabilite pridať ďalších šesť, ale to nie je potrebné pre tento prototypový systém. Kolíky, do ktorých je možné vložiť hlavičky, sú vin, 3vo, gnd, wsel, din a bclk.
Krok 3: Konštrukcia - zapojte napájacie kolíky
Umiestnite stereofónny dekodér na kolíky (vin, 3vo, gnd, wsel, din a bclk) a pevne ich pritlačte k sebe. Opäť by sa to v ideálnom prípade malo vykonať pomocou spájkovačky, ale musel som improvizovať. Všimnite si, že všetky vodiče v tomto návode sú modré. To preto, že som nemal žiadne prepojovacie vodiče, a tak som 1 dlhý drôt nastrihal na menšie kúsky. Tiež som farboslepý a farba drôtu ma veľmi nezaujíma. Napájacie kolíky sú pripevnené nasledovne:
3v3 (ESP32) -> vin na stereo dekodéri
gnd (ESP32) -> až gnd na stereo dekodéri
Krok 4: Výstavba - Elektroinštalácia I2S
Na odoslanie zvuku Bluetooth z ESP32 do stereo dekodéra použijeme spôsob digitálnej komunikácie s názvom I2S. Stereo dekodér zachytí tento digitálny signál a zmení ho na analógový signál, ktorý je možné zapojiť do reproduktora alebo HiFi. I2S vyžaduje iba 3 vodiče a je pomerne jednoduché ho pochopiť. Bitová čiara (bclk) sa otáča vysoko a nízko, čo znamená, že sa prenáša nový bit. Dátový výstupný riadok (dout) sa zmení na vysoký alebo nízky, aby indikoval, či má tento bit hodnotu 0 alebo 1, a riadok na výber slova (wsel) sa zmení na vysoký alebo nízky, aby indikoval, či sa vysiela ľavý alebo pravý kanál. Nie každý mikrokontrolér podporuje I2S, ale ESP32 má 2 linky I2S. To z neho robí jasnú voľbu pre tento projekt.
Zapojenie je nasledovné:
27 (ESP32) -> wsel (stereo dekodér)
25 (ESP32) -> din (Stereo dekodér)
26 (ESP32) -> bclk (stereo dekodér)
Krok 5: Inštalácia knižnice BtAudio
Ak ich ešte nemáte nainštalované, nainštalujte Arduino IDE a jadro Arduino pre ESP32. Akonáhle ich budete mať nainštalované, navštívte moju stránku Github a stiahnite si úložisko. V rámci IDE Arduino v časti Skica >> Zahrnúť knižnicu >> zvoľte "Pridať. ZIP knižnicu". Potom vyberte stiahnutý súbor zip. To by malo pridať moju knižnicu btAudio do vašich knižníc Arduino. Ak chcete používať knižnicu, musíte do náčrtu Arduino zahrnúť príslušnú hlavičku. Uvidíte to v nasledujúcom kroku.
Krok 6: Použitie knižnice BtAudio
Po inštalácii pripojte svoj ESP32 k počítaču pomocou micro USB a potom pripojte stereofónny dekodér k reproduktoru pomocou 3,5 mm kábla. Pred nahraním náčrtu budete musieť zmeniť niektoré veci v editore Arduino. Potom, čo ste vybrali svoju dosku, budete musieť upraviť schému oddielov v časti Nástroje >> Schéma oddielov a vybrať buď „Žiadny OTA (veľký APP)“, alebo „Minimálny SPIFFS (veľký APPS s OTA)“. Je to nevyhnutné, pretože tento projekt používa WiFi aj Bluetooth, čo sú knižnice veľmi náročné na pamäť. Akonáhle to urobíte, nahrajte nasledujúci náčrt do ESP32.
#zahrnúť
// Nastaví názov zvukového zariadenia btAudio audio = btAudio ("ESP_Speaker"); void setup () {// streamuje zvukové dáta do ESP32 audio.begin (); // vydá prijaté dáta do I2S DAC int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } prázdna slučka () {}
Náčrt je možné v zásade rozdeliť do 3 krokov:
- Vytvorte globálny objekt btAudio, ktorý nastaví „názov Bluetooth“vášho ESP32
- Nakonfigurujte ESP32 na príjem zvuku pomocou metódy btAudio:: begin
- Piny I2S nastavte metódou btAudio:: I2S.
To je po softvérovej stránke všetko! Teraz všetko, čo musíte urobiť, je nadviazať spojenie Bluetooth s vašim ESP32. Stačí v telefóne/prenosnom počítači/prehrávači MP3 vyhľadať nové zariadenia a zobrazí sa „ESP_Speaker“. Akonáhle ste radi, že všetko funguje (prehráva hudba), môžete odpojiť ESP32 od počítača. Napájajte ho napájaním USB a pamätá si posledný kód, ktorý ste doň nahrali. ESP32 tak môžete navždy nechať skrytý za svojim HiFi systémom.
Krok 7: DSP - filtrovanie
Rozšírenie prijímača o spracovanie digitálneho signálu
Ak ste dodržali všetky kroky (a nič som nevynechal), teraz máte pre svoj HiFi systém plne funkčný prijímač Bluetooth. Aj keď je to skvelé, mikrokontrolér v skutočnosti neposúva na svoje hranice. ESP32 má dve jadrá pracujúce na 240 MHz. To znamená, že tento projekt je oveľa viac než len prijímač. Má kapacitu byť prijímačom Bluetooth s procesorom digitálneho signálu (DSP). DSP v zásade vykonávajú matematické operácie so signálom v reálnom čase. Jedna užitočná operácia sa nazýva digitálne filtrovanie. Tento proces zoslabuje frekvencie v signáli pod alebo nad určitou medznou frekvenciou, v závislosti od toho, či používate hornopriepustný alebo dolnopriepustný filter.
High-pass filtre
Filtre High Pass prepúšťajú frekvencie pod určitým pásmom. Vybudoval som knižnicu filtrov pre systémy Arduino na základe kódu z webu earlevel.com. Hlavný rozdiel je v tom, že som zmenil štruktúru triedy, aby bolo možné jednoduchšie vytvárať filtre vyššieho rádu. Filtre vyššieho radu účinnejšie potláčajú frekvencie nad hranicou, ale vyžadujú oveľa viac výpočtu. Pri súčasnej implementácii však môžete dokonca používať filtre 6. rádu na zvuk v reálnom čase!
Náčrt je rovnaký ako ten, ktorý bol nájdený v predchádzajúcom kroku, okrem toho, že sme zmenili hlavnú slučku. Na povolenie filtrov používame metódu btAudio:: createFilter. Táto metóda akceptuje 3 argumenty. Prvým je počet kaskád filtrov. Počet filtračných kaskád je polovičný v porovnaní s filtrom. V prípade filtra 6. rádu by prvý argument mal byť 3. V prípade filtra 8. rádu by to bolo 4. Druhým argumentom je prerušenie filtra. Nastavil som to na 1 000 Hz, aby to malo na údaje skutočne dramatický vplyv. Nakoniec tretím argumentom špecifikujeme typ zakladača. Toto by malo byť horný priechod pre hornopriepustný filter a dolný priechod pre dolnopriepustný filter. Nasledujúci skript prepína hranicu tejto frekvencie medzi 1 000 Hz a 2 Hz. Mali by ste počuť dramatický vplyv na údaje.
#zahrnúť
btAudio audio = btAudio ("ESP_Speaker"); neplatné nastavenie () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } void loop () {oneskorenie (5000); audio.createFilter (3, 1000, horný priechod); oneskorenie (5 000); audio.createFilter (3, 2, horný priechod); }
Nízkopriepustné filtre
Nízkopriepustné filtre robia opak vysokofrekvenčných filtrov a potláčajú frekvencie nad určitou frekvenciou. Môžu byť implementované rovnakým spôsobom ako hornopriepustné filtre, okrem toho, že vyžadujú zmenu tretieho argumentu na dolný priechod. Pre nižšie uvedenú skicu striedam dolnopriepustnú hranicu medzi 2000 Hz a 20 000 Hz. Našťastie budete počuť rozdiel. Malo by to znieť dosť tlmene, keď je dolnopriepustný filter na 2000 Hz.
#zahrnúť
btAudio audio = btAudio ("ESP_Speaker"); neplatné nastavenie () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } void loop () {oneskorenie (5000); audio.createFilter (3, 2000, dolný priechod); oneskorenie (5 000); audio.createFilter (3 20000, dolný priechod); }
Krok 8: DSP - kompresia dynamického rozsahu
Pozadie
Kompresia dynamického rozsahu je metóda spracovania signálu, ktorá sa pokúša vyrovnať hlasitosť zvuku. Komprimuje hlasné zvuky, ktoré stúpajú nad určitú prahovú hodnotu, na úroveň tichých a potom voliteľne zosilňuje oba. Výsledkom je oveľa rovnomernejší zážitok z počúvania. Toto bolo veľmi užitočné, keď som sledoval show s veľmi hlasnou hudbou na pozadí a veľmi tichými vokálmi. V tomto prípade nepomohlo iba zvýšenie hlasitosti, pretože to len zosilnilo hudbu na pozadí. Vďaka kompresii dynamického rozsahu som mohol znížiť hlasnú hudbu na pozadí na úroveň vokálov a znova všetko poriadne počuť.
Kód
Kompresia dynamického rozsahu nezahŕňa iba zníženie hlasitosti alebo prahovanie signálu. Je to o niečo múdrejšie. Ak znížite hlasitosť, stlmia sa tiché aj hlasné zvuky. Jedným zo spôsobov, ako to obísť, je prah signálu, ale to má za následok vážne skreslenie. Kompresia dynamického rozsahu zahŕňa kombináciu jemného prahovania a filtrovania, aby sa minimalizovalo skreslenie, aké by ste dosiahli, keby ste prahovali/orezávali signál. Výsledkom je signál, kde sú hlasné zvuky „orezané“bez skreslenia a tiché sú ponechané tak, ako sú. Nasledujúci kód prepína medzi tromi rôznymi úrovňami kompresie.
- Kompresia so skreslením
- Kompresia bez skreslenia
- Žiadna kompresia
#zahrnúť
btAudio audio = btAudio ("ESP_Speaker"); neplatné nastavenie () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } void loop () {oneskorenie (5000); audio.compress (30, 0,0001, 0,0001, 10, 10, 0); oneskorenie (5 000); audio.compress (30, 0,0001, 0,1, 10, 10, 0); oneskorenie (5 000); audio.decompress (); }
Kompresia dynamického rozsahu je komplikovaná a metódy btAudio:: compress majú mnoho parametrov. Pokúsim sa ich vysvetliť (v poradí) tu:
- Prah - Úroveň, na ktorej sa zvuk zníži (merané v decibeloch)
- Attack time - Čas potrebný na spustenie kompresora po prekročení prahu
- Čas uvoľnenia - čas, ktorý trvá, kým kompresor prestane fungovať.
- Redukčný pomer - faktor, pomocou ktorého je zvuk komprimovaný.
- Šírka kolena - šírka (v decibeloch) okolo prahu, pri ktorom kompresor čiastočne pracuje (prirodzenejší zvuk).
- Zisk (decibely) pridaný k signálu po kompresii (zvýšenie/zníženie hlasitosti)
Veľmi počuteľné skreslenie pri prvom použití kompresie je preto, že prah je veľmi nízky a čas útoku aj čas uvoľnenia sú veľmi krátke, čo má za následok tvrdé prahové správanie. To je v druhom prípade jasne vyriešené predĺžením času vydania. To v podstate spôsobuje, že kompresor pracuje oveľa plynulejšie. Tu som len ukázal, ako zmena 1 parametra môže mať dramatický vplyv na zvuk. Teraz ste na rade experimentovať s rôznymi parametrami.
Implementácia (magická matematika - voliteľné)
Zistil som, že naivne implementovať kompresiu dynamického rozsahu je náročné. Algoritmus vyžaduje konverziu 16-bitového celého čísla na decibely a potom ho spracovajte späť na 16-bitové celé číslo. Všimol som si, že jeden riadok kódu potreboval na spracovanie stereo údajov 10 mikrosekúnd. Pretože stereofónny zvuk vzorkovaný pri 44,1 kHz ponecháva DSP iba 11,3 mikrosekúnd, je to neprijateľne pomalé … Avšak kombináciou malej vyhľadávacej tabuľky (400 bajtov) a postupu interpolácie na základe rozdelených rozdielov spoločnosti Netwon môžeme získať presnosť takmer 17 bitov za 0,2 mikrosekundy. Pripojil som dokument vo formáte pdf so všetkými matematikami pre skutočných záujemcov. Je to komplikované, boli ste varovaní!
Krok 9: Rozhranie Wifi
Teraz máte prijímač Bluetooth, ktorý dokáže prevádzkovať DSP v reálnom čase. Je smutné, že ak chcete zmeniť niektorý z parametrov DSP, budete sa musieť odpojiť od svojho HiFi, nahrať nový náčrt a potom znova pripojiť. Toto je neohrabané. Aby som to vyriešil, vyvinul som webový server, ktorý môžete použiť na úpravu všetkých parametrov DSP bez opätovného pripojenia k počítaču. Skica na používanie webového servera je uvedená nižšie.
#zahrnúť
#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); // nahraďte svojim WiFi ID a heslom const char* ssid = "SSID"; const char* heslo = "HESLO"; web.begin (ssid, heslo a zvuk); } void loop () {web._server.handleClient (); }
Kód priradí vášmu ESP32 adresu IP, ktorú môžete použiť na prístup na webovú stránku. Pri prvom spustení tohto kódu by ste ho mali mať pripojený k počítaču. Tak budete môcť vidieť IP adresu priradenú vášmu ESP32 na vašom sériovom monitore. Ak chcete získať prístup na túto webovú stránku, zadajte túto adresu IP do ľubovoľného webového prehliadača (testované na chrome).
Teraz by sme už mali poznať spôsob povoľovania Bluetooth a I2S. Kľúčovým rozdielom je použitie objektu webDSP. Tento objekt považuje vaše SSID a heslo Wifi za argumenty a tiež ako ukazovateľ na objekt btAudio. V hlavnej slučke neustále dostávame objekt webDSP, aby počúval prichádzajúce údaje z webovej stránky a potom aktualizujeme parametre DSP. Na záver je potrebné poznamenať, že Bluetooth aj Wifi používajú na ESP32 rovnaké rádio. To znamená, že od zadania parametrov na webovej stránke do okamihu, keď sa informácie skutočne dostanú do systému ESP32, budete možno musieť počkať až 10 sekúnd.
Krok 10: Plány do budúcnosti
Našťastie ste si tento návod užili a teraz ste do svojho HiFi zariadenia pridali Bluetooth Audio a DSP. Myslím si však, že v tomto projekte je veľký priestor na rast a chcel som len poukázať na niektoré budúce smery, ktorými by som sa mohol uberať.
- Povoliť streamovanie zvuku cez Wifi (pre najlepšiu kvalitu zvuku)
- Na zapnutie hlasových príkazov použite mikrofón I2S
- vyvinúť ekvalizér ovládaný WiFi
- Nech je to pekné (doska na pečenie nekričí skvelý dizajn produktu)
Keď sa dostanem k implementácii týchto myšlienok, urobím ďalšie pokyny. Alebo možno niekto iný implementuje tieto funkcie. To je radosť z toho, že je všetko open source!
Odporúča:
Svetelný rámec Constellation: 11 krokov
Svetelný rám súhvezdia: V tomto návode ukazujem, ako vytvoriť jednoduché konštelačné svetlo s LED pásikmi a arduinom! Rozhodol som sa, že urobím menšiu ursu. Tu je materiál, ktorý som použil na vytvorenie súhvezdia: Nástenný rám Čierny kartón 5v LED pás (144 LED na meter) Arduin
Indikátor úrovne zvuku/zvuku: 10 krokov
Indikátor úrovne zvuku/zvuku: V tomto projekte vám ukážem, ako vytvoriť jednoduchý indikátor hladiny zvuku pomocou operačných zosilňovačov. Poznámka: Ak chcete položiť otázky, navštívte moju stránku Opýtajte sa odborníka. Užitočné doplnkové videá: Simulovaný obvod nastavený na doske s chlebom (proto
Dynaframe - fotografický / video rámec bohatý na funkcie!: 6 krokov
Dynaframe - fotografický / video rámček bohatý na funkcie !: Poznámka: Rozhodol som sa to zadať do obsahu remixu! Prosím, zvážte ma, ak vás tento projekt bude baviť! Hej! Dynaframe je digitálny fotorámik, ktorého cieľom je byť odlišný. Pozrel som sa na desiatky implementácií, ktoré boli k dispozícii, ale
Moje prvé perie: Konvertor analógovo-digitálneho signálu: 5 krokov
Moje prvé perie: Konvertor analógovo-digitálneho signálu: Dobrý deň, kolegovia tvorcovia! Dnešný návod je o niečom skutočne špeciálnom. Toto zariadenie je MOJE PRVÉ POTREBOVANIE - podľa formálneho faktoru spoločnosti Adafruit. Je to tiež môj PRVÝ POVRCH MONTOVANÝ DPS! Moje najprominentnejšie použitie tohto štítu je v zariadení, ktoré som
Na vylepšenie signálu 3G širokopásmového signálu použite satelitnú anténu: 4 kroky
Vylepšite svoj bezdrôtový širokopásmový signál 3G pomocou satelitnej paraboly: Pri hľadaní rýchlejšej alternatívy k telefonickému pripojeniu (to je všetko, čo môžete v mieste bydliska v západnom New Yorku nájsť) som našiel poskytovateľa bezdrôtových služieb, ktorý dodáva bezdrôtový modem 3G a nbsp; tvrdil rýchlosť sťahovania 1,5 Mbps. Teraz som si myslel, že je to skvelé, pokiaľ