Obsah:
- Zásoby
- Krok 1: Konstrukce - prkénko
- Krok 2: Konstrukce - zatlačte záhlaví/pájení
- Krok 3: Konstrukce - Zapojte napájecí kolíky
- Krok 4: Výstavba - I2S Wiring
- Krok 5: Instalace knihovny BtAudio
- Krok 6: Použití knihovny BtAudio
- Krok 7: DSP - filtrování
- Krok 8: DSP - komprese dynamického rozsahu
- Krok 9: Rozhraní Wifi
- Krok 10: Plány do budoucna
Video: Zpracování zvuku a digitálního signálu Bluetooth: Rámec Arduino: 10 kroků
2024 Autor: John Day | [email protected]. Naposledy změněno: 2024-01-30 08:20
souhrn
Když přemýšlím o Bluetooth, myslím na hudbu, ale bohužel většina mikrokontrolérů neumí přehrávat hudbu přes Bluetooth. Raspberry Pi může, ale to je počítač. Chci vyvinout rámec založený na Arduinu pro mikrokontroléry pro přehrávání zvuku přes Bluetooth. Abych plně natáhl svaly svého mikrokontroléru, přidám do zvuku digitální zpracování signálu (DSP) v reálném čase (filtrování horního průchodu, filtrování nízkého průchodu a komprese dynamického rozsahu). Jako třešničku nahoře přidám webový server, pomocí kterého lze bezdrátově konfigurovat DSP. Vložené video ukazuje základy zvuku Bluetooth v akci. Také mi ukazuje, že pomocí webového serveru provádím filtrování horní propusti, filtrování dolní propusti a kompresi dynamického rozsahu. První použití komprese dynamického rozsahu záměrně způsobuje zkreslení jako příklad špatných voleb parametrů. Druhý příklad eliminuje toto zkreslení.
Pro tento projekt je ESP32 zvoleným mikrokontrolérem. Stojí méně než 10 GBP a je vybaven funkcemi ADC, DAC, Wifi, Bluetooth Low Energy, Bluetooth Classic a dvoujádrového procesoru 240 MHz. Integrovaný DAC může technicky přehrávat zvuk, ale nebude to znít skvěle. Místo toho použiji stereo dekodér Adafruit I2S k vytvoření signálu line-out. Tento signál lze snadno odeslat do jakéhokoli HiFi systému a okamžitě přidat bezdrátový zvuk do vašeho stávajícího HiFi systému.
Zásoby
Naštěstí většina výrobců bude mít prkénka, propojky, USB kabely, páječky napájecích zdrojů a bude muset utratit pouze 15 GBP za ESP32 a stereo dekodér. Pokud ne, všechny požadované součásti jsou uvedeny níže.
- ESP32 - testováno na ESP32 -PICO -KIT a TinyPico - 9,50 GBP/ 24 GBP
- Stereo dekodér Adafruit I2S - 5,51 GBP
- Breadboard - 3–5 £ za kus
- Propojovací vodiče - 3 £
- Kabelová sluchátka/Hi -Fi systém - £$$
- Záhlaví nebo páječka - 2,10 GBP / 30 GBP
- Micro USB kabel - 2,10 GBP/ 3 GBP
- Konektor 3,5 mm na RCA/ 3,5 mm konektor na konektor (nebo cokoli, co váš reproduktor potřebuje) - 2,40 GBP/ 1,50 GBP
- USB napájecí zdroj - 5 liber
Krok 1: Konstrukce - prkénko
Pokud jste si zakoupili ESP32-PICO-KIT, nebudete muset pájet žádné piny, protože jsou předpájeny. Jednoduše jej položte na prkénko.
Krok 2: Konstrukce - zatlačte záhlaví/pájení
Pokud máte páječku, připájejte piny k stereo dekodéru podle pokynů na webu Adafruit. V době psaní byla moje páječka v práci, která byla zamčená. Nechtěl jsem platit za dočasnou páječku, a tak jsem odřízl pár tlačných hlaviček od pimoroni. Rozřezal jsem je, aby se vešly do stereo dekodéru. Toto není nejlepší řešení (a ne, jak byly hlavičky určeny k použití), ale je to nejlevnější alternativa k páječce. Umístěte rozřezanou hlavičku na prkénko. Pro dekodér byste měli potřebovat pouze 1 řádek 6 pinů. Můžete přidat dalších šest na druhou stranu kvůli stabilitě, ale to není nutné pro tento prototypový systém. Kolíky, do kterých lze zasunout záhlaví, jsou vin, 3vo, gnd, wsel, din a bclk.
Krok 3: Konstrukce - Zapojte napájecí kolíky
Umístěte dekodér Stereo na kolíky (vin, 3vo, gnd, wsel, din a bclk piny) a pevně je přitlačte k sobě. Opět by to ideálně mělo být provedeno pomocí páječky, ale musel jsem improvizovat. Všimnete si, že všechny vodiče v tomto návodu jsou modré. To proto, že jsem neměl žádné propojovací vodiče, a tak jsem 1 dlouhý drát nastříhal na menší kousky. Také jsem barvoslepý a barva drátu mě opravdu nezajímá. Napájecí kolíky jsou připevněny následovně:
3v3 (ESP32) -> vin na stereo dekodéru
gnd (ESP32) -> gnd na stereo dekodéru
Krok 4: Výstavba - I2S Wiring
K odeslání zvuku Bluetooth z ESP32 do stereo dekodéru použijeme metodu digitální komunikace zvanou I2S. Stereo dekodér převezme tento digitální signál a převede jej na analogový signál, který lze zapojit do reproduktoru nebo HiFi. I2S vyžaduje pouze 3 vodiče a je rozumné ho snadno pochopit. Linka bitových hodin (bclk) se otáčí vysoko a nízko, což indikuje, že je vyslán nový bit. Datová výstupní linka (dout) se změní na vysokou nebo nízkou, aby indikovala, zda má tento bit hodnotu 0 nebo 1, a řádek pro výběr slova (wsel) se změní na vysokou nebo nízkou, aby indikoval, zda se přenáší levý nebo pravý kanál. Ne každý mikrokontrolér podporuje I2S, ale ESP32 má 2 linky I2S. To z něj činí jasnou volbu pro tento projekt.
Zapojení je následující:
27 (ESP32) -> wsel (stereo dekodér)
25 (ESP32) -> din (Stereo dekodér)
26 (ESP32) -> bclk (stereo dekodér)
Krok 5: Instalace knihovny BtAudio
Pokud je ještě nemáte nainstalované, nainstalujte Arduino IDE a jádro Arduino pro ESP32. Jakmile je budete mít nainstalované, navštivte moji stránku Github a stáhněte si úložiště. V Arduino IDE v části Sketch >> Include Library >> vyberte "Add. ZIP library". Poté vyberte stažený soubor zip. To by mělo přidat moji knihovnu btAudio do vašich knihoven Arduino. Abyste mohli knihovnu používat, musíte do skici Arduina zahrnout příslušné záhlaví. Uvidíte to v dalším kroku.
Krok 6: Použití knihovny BtAudio
Po instalaci připojte ESP32 k počítači pomocí micro USB a poté připojte stereofonní dekodér k reproduktoru pomocí 3,5 mm kabelu. Než nahrajete skicu, budete muset v editoru Arduino změnit některé věci. Poté, co vyberete svou desku, budete muset upravit schéma oddílů v části Nástroje >> Schéma oddílů a vybrat buď „Žádný OTA (velká APP)“, nebo „Minimální SPIFFS (velká APPS s OTA)“. Je to nutné, protože tento projekt využívá WiFi i Bluetooth, což jsou knihovny velmi náročné na paměť. Jakmile to uděláte, nahrajte následující skicu do ESP32.
#zahrnout
// Nastaví název zvukového zařízení btAudio audio = btAudio ("ESP_Speaker"); void setup () {// streamuje zvuková data do ESP32 audio.begin (); // vydá přijatá data do I2S DAC int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } void loop () {}
Skicu lze obecně rozdělit do 3 kroků:
- Vytvořte globální objekt btAudio, který nastaví „název Bluetooth“vašeho ESP32
- Pomocí metody btAudio:: begin nakonfigurujte ESP32 pro příjem zvuku
- Nastavte piny I2S pomocí metody btAudio:: I2S.
To je po softwarové stránce! Nyní vše, co musíte udělat, je zahájit připojení Bluetooth k vašemu ESP32. Stačí v telefonu/notebooku/MP3 přehrávači vyhledat nová zařízení a objeví se „ESP_Speaker“. Jakmile jste rádi, že vše funguje (hraje hudba), můžete ESP32 odpojit od počítače. Napájejte jej pomocí napájecího zdroje USB a pamatuje si poslední kód, který jste do něj nahráli. Tímto způsobem můžete svůj ESP32 nechat navždy skrytý za svým HiFi systémem.
Krok 7: DSP - filtrování
Rozšíření přijímače o zpracování digitálního signálu
Pokud jste dodrželi všechny kroky (a nic jsem nevynechal), máte nyní plně funkční Bluetooth přijímač pro váš HiFi systém. I když je to skvělé, ve skutečnosti to neposouvá mikrokontrolér na své hranice. ESP32 má dvě jádra pracující na 240 MHz. To znamená, že tento projekt je mnohem víc než jen přijímač. Má kapacitu být přijímačem Bluetooth s procesorem digitálního signálu (DSP). DSP v podstatě provádějí matematické operace se signálem v reálném čase. Jedna užitečná operace se nazývá digitální filtrování. Tento proces zeslabuje frekvence v signálu pod nebo nad určitou mezní frekvencí, v závislosti na tom, zda používáte horní propust nebo dolní propust.
High-pass filtry
High-Pass filtry tlumí frekvence pod určitým pásmem. Postavil jsem knihovnu filtrů pro systémy Arduino na základě kódu z earlevel.com. Hlavní rozdíl je v tom, že jsem změnil strukturu třídy, aby bylo možné snáze vytvářet filtry vyššího řádu. Filtry vyššího řádu efektivněji potlačují frekvence nad hranicí, ale vyžadují mnohem více výpočtu. Při současné implementaci však můžete dokonce použít filtry 6. řádu pro zvuk v reálném čase!
Skica je stejná jako ta, která byla nalezena v předchozím kroku, kromě toho, že jsme změnili hlavní smyčku. K povolení filtrů používáme metodu btAudio:: createFilter. Tato metoda přijímá 3 argumenty. První je počet kaskád filtrů. Počet kaskád filtrů je poloviční oproti pořadí filtru. U filtru 6. řádu by měl být první argument 3. U filtru 8. řádu by to byl 4. Druhým argumentem je omezení filtru. Nastavil jsem to na 1000 Hz, aby to mělo na data opravdu dramatický účinek. Nakonec specifikujeme typ archivátoru třetím argumentem. To by mělo být horní propust pro horní propust a dolní propust pro dolní propust. Níže uvedený skript přepíná mezní hodnotu této frekvence mezi 1 000 Hz a 2 Hz. Měli byste slyšet dramatický účinek na data.
#zahrnout
btAudio audio = btAudio ("ESP_Speaker"); neplatné nastavení () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } void loop () {zpoždění (5000); audio.createFilter (3, 1000, horní propust); zpoždění (5000); audio.createFilter (3, 2, horní propust); }
Nízkoprůchodové filtry
Filtry s nízkým průchodem dělají opak filtrů s vysokým průchodem a potlačují frekvence nad určitou frekvencí. Mohou být implementovány stejným způsobem jako filtry s vysokým průchodem, kromě toho, že vyžadují změnu třetího argumentu na dolní propust. Pro níže uvedený náčrt střídám dolní propust mezi 2000 Hz a 20 000 Hz. Snad ten rozdíl uslyšíte. Mělo by to znít dost tlumeně, když je dolní propust na 2000 Hz.
#zahrnout
btAudio audio = btAudio ("ESP_Speaker"); neplatné nastavení () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } void loop () {zpoždění (5000); audio.createFilter (3, 2000, dolní propust); zpoždění (5000); audio.createFilter (3, 20 000, dolní propust); }
Krok 8: DSP - komprese dynamického rozsahu
Pozadí
Komprese dynamického rozsahu je metoda zpracování signálu, která se snaží vyrovnat hlasitost zvuku. Komprimuje hlasité zvuky, které vystoupají nad určitou prahovou hodnotu, na úroveň tichých a poté případně zesílí oba. Výsledkem je mnohem rovnoměrnější zážitek z poslechu. To přišlo opravdu užitečné, když jsem sledoval show s velmi hlasitou hudbou na pozadí a velmi tichými vokály. V tomto případě nepomohlo pouhé zvýšení hlasitosti, protože to jen zesílilo hudbu na pozadí. S kompresí dynamického rozsahu jsem mohl snížit hlasitou hudbu na pozadí na úroveň vokálů a znovu všechno pořádně slyšet.
Kód
Komprese dynamického rozsahu nezahrnuje pouze snížení hlasitosti nebo práh signálu. Je to o něco chytřejší. Pokud snížíte hlasitost, ztlumí se tiché i hlasité zvuky. Jedním ze způsobů, jak to obejít, je prah signálu, ale to má za následek vážné zkreslení. Komprese dynamického rozsahu zahrnuje kombinaci měkkého prahování a filtrování, aby se minimalizovalo zkreslení, které by se dostalo, kdybyste prahovali/ořezávali signál. Výsledkem je signál, kde jsou hlasité zvuky „oříznuty“bez zkreslení a ty tiché jsou ponechány tak, jak jsou. Níže uvedený kód přepíná mezi třemi různými úrovněmi komprese.
- Komprese se zkreslením
- Komprese bez zkreslení
- Žádná komprese
#zahrnout
btAudio audio = btAudio ("ESP_Speaker"); neplatné nastavení () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } void loop () {zpoždění (5000); audio.compress (30, 0,0001, 0,0001, 10, 10, 0); zpoždění (5000); audio.compress (30, 0,0001, 0,1, 10, 10, 0); zpoždění (5000); audio.decompress (); }
Komprese dynamického rozsahu je komplikovaná a metody btAudio:: compress mají mnoho parametrů. Pokusím se je vysvětlit (v pořadí) zde:
- Threshold - Úroveň, na které se zvuk snižuje (měřeno v decibelech)
- Attack time - Doba, po kterou kompresor začne pracovat, jakmile bude překročena prahová hodnota
- Čas uvolnění - doba, po kterou kompresor přestane fungovat.
- Redukční poměr - faktor, o který je zvuk komprimován.
- Šířka kolena - Šířka (v decibelech) kolem prahu, při kterém kompresor částečně pracuje (přirozenější zvuk).
- Zisk (decibely) přidaný k signálu po kompresi (zvýšení/snížení hlasitosti)
Velmi slyšitelné zkreslení při prvním použití komprese je proto, že práh je velmi nízký a jak doba útoku, tak doba uvolnění jsou velmi krátké, což má za následek tvrdé prahové chování. To je v druhém případě jasně vyřešeno prodloužením doby vydání. To v podstatě způsobuje, že kompresor působí mnohem plynuleji. Zde jsem pouze ukázal, jak změna 1 parametru může mít dramatický účinek na zvuk. Nyní je řada na vás experimentovat s různými parametry.
Implementace (magická matematika - volitelně)
Zjistil jsem, že naivně implementovat kompresi dynamického rozsahu je náročné. Algoritmus vyžaduje převést 16bitové celé číslo na decibely a poté jej zpracovat zpět na 16bitové celé číslo. Všiml jsem si, že jeden řádek kódu trval 10 mikrosekund na zpracování stereo dat. Protože stereofonní zvuk vzorkovaný na 44,1 KHz ponechává DSP pouhých 11,3 mikrosekundy, je to nepřijatelně pomalé … Kombinací malé vyhledávací tabulky (400 bajtů) a postupu interpolace založeného na dělených rozdílech společnosti Netwon můžeme získat přesnost téměř 17 bitů za 0,2 mikrosekundy. Pro opravdové zájemce jsem připojil dokument ve formátu pdf se všemi matematikami. Je to složité, byli jste varováni!
Krok 9: Rozhraní Wifi
Nyní máte přijímač Bluetooth, který dokáže spouštět DSP v reálném čase. Je smutné, že pokud chcete změnit některý z parametrů DSP, budete se muset odpojit od HiFi, nahrát nový náčrt a poté znovu připojit. To je neohrabané. Abych to vyřešil, vytvořil jsem webový server, který můžete použít k úpravě všech parametrů DSP bez opětovného připojení k počítači. Skica k použití webového serveru je níže.
#zahrnout
#include btAudio audio = btAudio ("ESP_Speaker"); webDSP web; neplatné nastavení () {Serial.begin (115200); audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); // nahraďte svým WiFi ID a heslem const char* ssid = "SSID"; const char* heslo = "HESLO"; web.begin (ssid, heslo a zvuk); } void loop () {web._server.handleClient (); }
Kód přiřadí vašemu ESP32 IP adresu, kterou můžete použít pro přístup na webovou stránku. Při prvním spuštění tohoto kódu byste jej měli mít připojený k počítači. Tímto způsobem můžete vidět IP adresu přiřazenou vašemu ESP32 na vašem sériovém monitoru. Chcete -li se dostat na tuto webovou stránku, jednoduše zadejte tuto IP adresu do libovolného webového prohlížeče (testováno na chromu).
Nyní bychom měli být obeznámeni se způsobem povolení Bluetooth a I2S. Klíčovým rozdílem je použití objektu webDSP. Tento objekt bere SSID a heslo Wifi jako argumenty a také jako ukazatel na objekt btAudio. V hlavní smyčce neustále získáváme objekt webDSP, aby naslouchal příchozím datům z webové stránky a poté aktualizoval parametry DSP. Na závěr je třeba poznamenat, že Bluetooth i Wifi používají na ESP32 stejné rádio. To znamená, že budete muset počkat až 10 sekund od zadání parametrů na webové stránce do okamžiku, kdy se informace skutečně dostanou do ESP32.
Krok 10: Plány do budoucna
Doufejme, že se vám tento návod líbil a nyní máte do HiFi přidané Bluetooth Audio a DSP. Myslím si však, že v tomto projektu je velký prostor pro růst a jen jsem chtěl poukázat na některé budoucí směry, kterými bych se mohl ubírat.
- Povolit Wifi streamování zvuku (pro nejlepší kvalitu zvuku)
- Pomocí mikrofonu I2S povolte hlasové příkazy
- vyvinout WiFi řízený ekvalizér
- Udělejte to hezky (prkénko nekřičí skvělý design produktu)
Až se dostanu k implementaci těchto myšlenek, udělám další instruktážní materiály. Nebo možná někdo jiný implementuje tyto funkce. To je radost ze všeho dělat open source!
Doporučuje:
Bluetooth reproduktor s vlastním napájením z baterie // Jak stavět - zpracování dřeva: 14 kroků (s obrázky)
Bluetooth reproduktor napájený bateriemi // Jak stavět-zpracování dřeva: Postavil jsem tento dobíjecí, bateriově napájený, přenosný reproduktor Bluetooth boombox pomocí sady reproduktorů Parts Express C-Note a jejich desky zesilovače KAB (odkazy na všechny části níže). Toto byla moje první sestava reproduktorů a jsem upřímně ohromen tím, jak úžasně
Indikátor úrovně zvuku/zvuku: 10 kroků
Indikátor úrovně zvuku/zvuku: V tomto projektu vám ukážu, jak pomocí operačních zesilovačů vytvořit jednoduchý indikátor úrovně zvuku. Poznámka: Chcete-li se zeptat, navštivte mé stránky Ask the Expert. Užitečná doplňková videa: Simulovaný obvod nastavený na prkénku (proto
Projekt digitálního kódového zámku Arduino pomocí maticové klávesnice: 9 kroků
Arduino Digital Code Lock Project using Matrix Keypad: Build a digital code lock device with Arduino and Qwiic system using Zio M Uno and a Hex 4x3 Matrix Keyboard. Přehled projektu Pro tento projekt postavíme jednoduchý digitální kódový zámek, do kterého mohou uživatelé zadávat a zadávat klíč v. V tomto tutoriálu si ukážeme použití
Bluetooth a IMU s deskou Tactigon - zpracování: 7 kroků
Bluetooth a IMU s deskou Tactigon - zpracování: Tato série článků vysvětlí, jak pomocí integrovaných senzorů a komunikačních rozhraní Tactigon vytvořit jednoduchý ovladač gest. Zdrojový kód dostupný zde na GitHub V tomto článku se naučíme, jak používat simp
Volič zvuku z mincovny: 3,5 mm přepínač zvuku: 6 kroků
Volič zvuku Mint Boxu: 3,5 mm Přepínač zvuku: Problém: Často na ploše musím používat sluchátka pro hry nebo poslech hudby, když jsou v místnosti jiní lidé, a pak se chci přepnout na reproduktory, pokud se chci pochlubit vtipným video nebo uskutečnit internetový hovor se vzdáleným příbuzným. Th