Tartalomjegyzék:

Bluetooth audio- és digitális jelfeldolgozás: Arduino keretrendszer: 10 lépés
Bluetooth audio- és digitális jelfeldolgozás: Arduino keretrendszer: 10 lépés

Videó: Bluetooth audio- és digitális jelfeldolgozás: Arduino keretrendszer: 10 lépés

Videó: Bluetooth audio- és digitális jelfeldolgozás: Arduino keretrendszer: 10 lépés
Videó: STM32F103 Blue Pill Sztereo spektrum analizátor és VU meter 2024, November
Anonim
Image
Image
Bluetooth audio és digitális jelfeldolgozás: Arduino keretrendszer
Bluetooth audio és digitális jelfeldolgozás: Arduino keretrendszer

Összefoglaló

Amikor a Bluetooth -ra gondolok, a zenére gondolok, de sajnos a legtöbb mikrokontroller nem tud zenét lejátszani Bluetooth -on keresztül. A Raspberry Pi képes, de ez egy számítógép. Szeretnék kifejleszteni egy Arduino alapú keretrendszert a mikrokontrollerek számára, hogy Bluetooth -on keresztül játsszák le a hangot. A mikrokontroller izmainak teljes megfeszítése érdekében valós idejű digitális jelfeldolgozást (DSP) adok hozzá az audióhoz (felüláteresztő szűrés, aluláteresztő szűrés és dinamikus tartomány-tömörítés). A tetején lévő cseresznyéhez hozzáadok egy webszervert, amellyel vezeték nélkül konfigurálható a DSP. A beágyazott videó bemutatja a Bluetooth audio működésének alapjait. Azt is mutatja, hogy a webszervert használom néhány felüláteresztő szűrésre, aluláteresztő szűrésre és dinamikus tartomány-tömörítésre. A dinamikus tartomány -tömörítés első használata szándékosan torzulást okoz a rossz paraméterválasztás példájaként. A második példa kiküszöböli ezt a torzítást.

Ebben a projektben az ESP32 a választott mikrokontroller. Kevesebb, mint 10 fontba kerül, és tele van ADC-kkel, DAC-okkal, Wifivel, Bluetooth Low Energy, Bluetooth Classic és 240 MHz-es kétmagos processzorral. A fedélzeti DAC technikailag képes hangot lejátszani, de nem hangzik nagyszerűen. Ehelyett az Adafruit I2S sztereó dekódert használom a vonalkimeneti jel előállításához. Ez a jel könnyen elküldhető bármely HiFi rendszerre, hogy azonnal vezeték nélküli hangot adjon hozzá a meglévő HiFi rendszerhez.

Kellékek

Remélhetőleg a legtöbb gyártó rendelkezik deszkával, jumperrel, USB -kábellel, tápegység forrasztópákaival, és csak 15 fontot kell költenie az ESP32 -re és a sztereó dekódolóra. Ha nem, akkor az összes szükséges alkatrészt felsoroljuk.

  • ESP32 - ESP32 -PICO -KIT és TinyPico készülékeken tesztelve - 9,50 £/ 24 £
  • Adafruit I2S sztereó dekódoló - £ 5.51
  • Kenyérlap - egyenként 3-5 font
  • Jumper vezetékek - £ 3
  • Vezetékes fejhallgató/Hi -Fi rendszer - £ £ £
  • Nyomófej vagy forrasztópáka - 2,10 £ / 30 £
  • Micro USB kábel - 2,10 £/ 3 £
  • 3,5 mm - RCA csatlakozó/ 3,5 mm jack csatlakozó (vagy bármi, amire a hangszórónak szüksége van) - 2,40 £/ 1,50 £
  • USB tápegység - 5 font

1. lépés: Építés - a Breadboard

Építőipar - a Breadboard
Építőipar - a Breadboard

Ha megvásárolta az ESP32-PICO-KIT-et, akkor nem kell forrasztania a csapokat, mivel előre be van forrasztva. Egyszerűen helyezze a kenyértáblára.

2. lépés: Építés - Nyomófej/forrasztás

Felépítés - Nyomófej/forrasztás
Felépítés - Nyomófej/forrasztás
Felépítés - Nyomófej/forrasztás
Felépítés - Nyomófej/forrasztás

Ha van forrasztópáka, forrasztja a csapokat a sztereó dekódolóhoz az Adafruit webhelyén található utasítások szerint. Az írás idején a forrasztópáka dolgozott, ami zárva volt. Nem akartam fizetni egy ideiglenes forrasztópákaért, ezért felvágtam néhány tolófejet a pimoroniból. Felvágtam őket, hogy illeszkedjenek a sztereó dekódolóhoz. Ez nem a legjobb megoldás (és nem a fejlécek felhasználásának módja), de a forrasztópáka legolcsóbb alternatívája. Rögzítse a levágott fejlécet a kenyértáblára. A dekóderhez csak 1 sor 6 tűre van szüksége. A stabilitás érdekében további hatot hozzáadhat a másik oldalhoz, de ez nem szükséges ehhez a prototípus -rendszerhez. A fejlécek behelyezésére szolgáló csapok a vin, 3vo, gnd, wsel, din és bclk.

3. lépés: Építés - Kösse be a hálózati csatlakozókat

Építés - Kösse be a hálózati csatlakozókat
Építés - Kösse be a hálózati csatlakozókat

Helyezze a sztereó dekódert a nyomófejre (vin, 3vo, gnd, wsel, din és bclk csapok), és erősen nyomja össze őket. Ismét ideális esetben ezt forrasztópáka segítségével kell elvégezni, de improvizálnom kellett. Észre fogja venni, hogy ebben az utasításban az összes vezeték kék. Ez azért van, mert nem volt jumper vezetékem, így 1 hosszú vezetéket kisebb darabokra vágtam. Emellett színvak vagyok, és nem igazán érdekel a huzal színe. A tápcsapokat az alábbiak szerint rögzítik:

3v3 (ESP32) -> vin sztereó dekódolón

gnd (ESP32) -> gnd sztereó dekódolóra

4. lépés: Építés - I2S huzalozás

Építés - I2S Wiring
Építés - I2S Wiring

Ahhoz, hogy a Bluetooth hangot az ESP32 -ről a sztereó dekódolóra küldjük, az I2S nevű digitális kommunikációs módszert fogjuk használni. A sztereó dekódoló átveszi ezt a digitális jelet, és analóg jellé alakítja, amelyet hangszóróhoz vagy HiFi -hez csatlakoztathat. Az I2S csak 3 vezetéket igényel, és meglehetősen egyszerű megérteni. A bitóra (bclk) vonal magasra és alacsonyra fordul, jelezve, hogy új bit kerül továbbításra. Az adatkimeneti vonal (dout) magasra vagy alacsonyra fordul, jelezve, hogy a bit értéke 0 vagy 1, a szóválasztó sor (wsel) pedig magasra vagy alacsonyra fordul, jelezve, hogy a bal vagy a jobb csatorna kerül továbbításra. Nem minden mikrokontroller támogatja az I2S -t, de az ESP32 két I2S vonallal rendelkezik. Ez nyilvánvaló választássá teszi ezt a projektet.

A huzalozás a következő:

27 (ESP32) -> wsel (sztereó dekódoló)

25 (ESP32) -> din (sztereó dekódoló)

26 (ESP32) -> bclk (sztereó dekódoló)

5. lépés: A BtAudio könyvtár telepítése

A BtAudio könyvtár telepítése
A BtAudio könyvtár telepítése
A BtAudio könyvtár telepítése
A BtAudio könyvtár telepítése

Ha még nincs telepítve, telepítse az Arduino IDE -t és az Arduino magot az ESP32 számára. Miután telepítette őket, keresse fel a Github oldalamat, és töltse le a tárolót. Az Arduino IDE -n belül a Vázlat >> Könyvtár felvétele >> területen válassza a ". ZIP könyvtár hozzáadása" lehetőséget. Ezután válassza ki a letöltött zip fájlt. Ennek hozzá kell adnia a btAudio könyvtáramat az Arduino könyvtáraihoz. A könyvtár használatához bele kell foglalnia a megfelelő fejlécet az Arduino vázlatába. Ezt látni fogja a következő lépésben.

6. lépés: A BtAudio könyvtár használata

A BtAudio könyvtár használata
A BtAudio könyvtár használata
A BtAudio könyvtár használata
A BtAudio könyvtár használata

A telepítés után csatlakoztassa az ESP32 -t a számítógéphez mikro -USB -n keresztül, majd csatlakoztassa a sztereó dekódolót a hangszóróhoz a 3,5 mm -es vezetékkel. A vázlat feltöltése előtt meg kell változtatnia néhány dolgot az Arduino szerkesztőben. Miután kiválasztotta a táblát, szerkesztenie kell a partíciós sémát az Eszközök >> Partícióséma részben, és ki kell választania a "No OTA (Large APP)" vagy a "Minimal SPIFFS (Large APPS with OTA)" lehetőséget. Erre azért van szükség, mert ez a projekt WiFi -t és Bluetooth -ot is használ, amelyek mind nagyon memóriaigényes könyvtárak. Miután ezt megtette, töltse fel az alábbi vázlatot az ESP32 -be.

#befoglalni

// Beállítja az audioeszköz nevét btAudio audio = btAudio ("ESP_Speaker"); void setup () {// audioadatokat továbbít az ESP32 audio.begin (); // a kapott adatokat egy I2S DAC -nek adja ki int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } void loop () {}

A vázlat nagyjából 3 lépésre osztható:

  1. Hozzon létre egy globális btAudio objektumot, amely beállítja az ESP32 "Bluetooth nevét"
  2. Állítsa be az ESP32 -t, hogy hangot fogadjon a btAudio:: begin metódussal
  3. Állítsa be az I2S csapokat a btAudio:: I2S metódussal.

Szoftveresen ennyi! Most már csak annyit kell tennie, hogy kezdeményezi a Bluetooth -kapcsolatot az ESP32 készülékkel. Csak keresse meg az új eszközöket a telefonján/laptopján/MP3 -lejátszóján, és megjelenik az "ESP_Speaker". Ha elégedett azzal, hogy minden működik (zene szól), válassza le az ESP32 -t a számítógépről. Táplálja az USB tápegységgel, és emlékezni fog a legutóbb feltöltött kódra. Így örökre elrejtheti ESP32 készülékét a HiFi -rendszer mögött.

7. lépés: DSP - szűrés

A vevő bővítése digitális jelfeldolgozással

Ha követte az összes lépést (és nem hagytam ki semmit), akkor most van egy teljesen működőképes Bluetooth vevőkészüléke a HiFi rendszerhez. Bár ez hűvös, nem igazán tolja a mikrokontrollert a határai közé. Az ESP32 két maggal rendelkezik, amelyek 240 MHz -en működnek. Ez azt jelenti, hogy ez a projekt sokkal több, mint egy vevő. Lehetősége van arra, hogy digitális vevőkészülék legyen digitális jelfeldolgozóval (DSP). A DSP-k lényegében valós időben hajtanak végre matematikai műveleteket a jellel. Az egyik hasznos művelet az úgynevezett digitális szűrés. Ez a folyamat gyengíti a jel frekvenciáit egy bizonyos határfrekvencia alatt vagy felett, attól függően, hogy felül- vagy aluláteresztő szűrőt használ.

Felüláteresztő szűrők

A felüláteresztő szűrők csökkentik a frekvenciákat egy bizonyos sáv alatt. Az auslevel.com kódja alapján szűrőkönyvtárat építettem az Arduino rendszerekhez. A fő különbség az, hogy megváltoztattam az osztálystruktúrát, hogy könnyebb legyen magasabb rendű szűrőket építeni. A magasabb rendű szűrők hatékonyabban elnyomják a határértékeket meghaladó frekvenciákat, de sokkal több számítást igényelnek. A jelenlegi megvalósítás mellett azonban akár 6. rendű szűrőket is használhat a valós idejű hangzáshoz!

A vázlat ugyanaz, mint az előző lépésben, kivéve, hogy megváltoztattuk a fő hurkot. A szűrők engedélyezéséhez a btAudio:: createFilter metódust használjuk. Ez a módszer 3 érvet fogad el. Az első a szűrő kaszkádok száma. A szűrő kaszkádok száma fele a szűrő sorrendjének. Egy hatodik rendű szűrő esetén az első argumentumnak 3 -asnak kell lennie. Egy nyolcadik rendű szűrő esetén ez a 4. A második argumentum a szűrő levágása. Ezt 1000 Hz -re állítottam be, hogy igazán drámai hatással legyenek az adatokra. Végül a harmadik argumentummal adjuk meg a filer típusát. Ennek felüláteresztőnek kell lennie a felüláteresztő szűrőnél, és aluláteresztőnek az aluláteresztő szűrőnél. Az alábbi szkript ennek a frekvenciának a határértékét 1000 Hz és 2 Hz között kapcsolja. Drámai hatást kell hallania az adatokra.

#befoglalni

btAudio audio = btAudio ("ESP_Speaker"); void setup () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } void loop () {delay (5000); audio.createFilter (3, 1000, felüljáró); késleltetés (5000); audio.createFilter (3, 2, felüljáró); }

Aluláteresztő szűrők

Az aluláteresztő szűrők az ellenkezőjét teszik a felüláteresztő szűrőknek, és elnyomják a frekvenciákat egy bizonyos frekvencia felett. Ezeket ugyanúgy lehet megvalósítani, mint a felüláteresztő szűrőket, kivéve, hogy a harmadik argumentumot aluláteresztésre kell változtatni. Az alábbi vázlathoz váltakozom az aluláteresztő határértékkel 2000Hz és 20000Hz között. Remélhetőleg hallani fogja a különbséget. Elég halknak kell lennie, ha az aluláteresztő szűrő 2000 Hz-en van.

#befoglalni

btAudio audio = btAudio ("ESP_Speaker"); void setup () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } void loop () {delay (5000); audio.createFilter (3, 2000, aluláteresztő); késleltetés (5000); audio.createFilter (3, 20000, aluláteresztő); }

8. lépés: DSP - dinamikus tartomány tömörítése

Háttér

A dinamikus tartomány tömörítése olyan jelfeldolgozási módszer, amely megpróbálja kiegyenlíteni a hang hangerejét. A hangokat, amelyek egy bizonyos küszöb felett emelkednek, a csendes hangok szintjéig tömöríti, majd opcionálisan mindkettőt felerősíti. Az eredmény sokkal egyenletesebb hallgatási élmény. Ez nagyon hasznos volt, miközben egy műsort néztem, nagyon hangos háttérzenével és nagyon halk énekkel. Ebben az esetben csak a hangerő növelése nem segített, mivel ez csak felerősítette a háttérzenét. Dinamikus tartomány -tömörítéssel a hangos háttérzenét az ének szintjére csökkenthetném, és mindent újra jól hallhatnék.

A kód

A dinamikus tartomány tömörítése nem csak a hangerő csökkentését vagy a jel küszöbértékét foglalja magában. Kicsit okosabb ennél. Ha csökkenti a hangerőt, a csendes hangok és a hangosak is csökkennek. Ennek egyik módja a jel küszöbértékének csökkentése, de ez súlyos torzulást eredményez. A dinamikus tartomány tömörítése magában foglalja a lágy küszöbértékek és a szűrés kombinációját, hogy minimálisra csökkentse a torzítást, amelyet a jel küszöbölése/vágása okozna. Az eredmény egy jel, ahol a hangos hangokat torzítás nélkül "nyírják le", a csendeseket pedig úgy hagyják, ahogy vannak. Az alábbi kód három különböző tömörítési szint között vált.

  1. Tömörítés torzítással
  2. Tömörítés torzítás nélkül
  3. Nincs tömörítés

#befoglalni

btAudio audio = btAudio ("ESP_Speaker"); void setup () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } void loop () {delay (5000); audio.compress (30, 0,0001, 0,0001, 10, 10, 0); késleltetés (5000); audio.compress (30, 0,0001, 0,1, 10, 10, 0); késleltetés (5000); audio.decompress (); }

A dinamikus tartomány tömörítése bonyolult, és a btAudio:: compress módszerek számos paraméterrel rendelkeznek. Itt megpróbálom elmagyarázni őket (sorrendben):

  1. Küszöb - Az a szint, amelyen a hang csökken (decibelben mérve)
  2. Támadási idő - Az az idő, ameddig a kompresszor működni kezd a küszöbérték túllépése után
  3. Kiadási idő - Az az idő, ameddig a kompresszor leáll.
  4. Csökkentési arány - a hang tömörítésének tényezője.
  5. Térd szélessége - Az a szélesség (decibelben) a küszöb körül, amelynél a kompresszor részben működik (természetesebb hang).
  6. A tömörítés után a jelhez hozzáadott erősítés (decibel) (hangerő növelése/csökkentése)

A tömörítés első használatakor a nagyon hallható torzítás annak köszönhető, hogy a küszöb nagyon alacsony, és mind a támadási idő, mind a felszabadulási idő nagyon rövid, ami hatékony küszöbérték -viselkedést eredményez. Ez a második esetben egyértelműen megoldható a kiadási idő növelésével. Ez lényegében a kompresszor sokkal simább működését eredményezi. Itt csak azt mutattam be, hogy az 1 paraméter megváltoztatása milyen hatással lehet a hangra. Most rajtad a sor, hogy különböző paraméterekkel kísérletezzen.

A megvalósítás (a varázslatos matematika - opcionális)

Azt tapasztaltam, hogy a dinamikus tartomány tömörítésének naiv megvalósítása kihívást jelent. Az algoritmus megköveteli, hogy egy 16 bites egész számot decibelre alakítsanak át, majd a jel feldolgozása után alakítsák vissza 16 bites egész számgá. Észrevettem, hogy egy kódsor 10 mikroszekundumot vesz igénybe a sztereó adatok feldolgozásához. Mivel a 44,1 KHz -en mintavételezett sztereó hang csak 11,3 mikroszekundumot hagy a DSP számára, ez elfogadhatatlanul lassú… Azonban egy kis keresési táblázat (400 bájt) és a Netwon megosztott különbségein alapuló interpolációs eljárás kombinálásával közel 17 bites pontosságot érhetünk el 0,2 mikroszekundum alatt. Csatoltam egy pdf dokumentumot az összes matematikával az igazán érdeklődők számára. Bonyolult, figyelmeztettek!

9. lépés: A Wifi interfész

A Wifi interfész
A Wifi interfész
A Wifi interfész
A Wifi interfész

Most van egy Bluetooth vevője, amely képes valós idejű DSP futtatására. Sajnos, ha meg akarja változtatni a DSP paramétereit, akkor le kell választania a HiFi -ről, fel kell töltenie egy új vázlatot, majd újra csatlakoznia kell. Ez ügyetlen. Ennek kijavítására kifejlesztettem egy webszervert, amellyel szerkesztheti az összes DSP paramétert anélkül, hogy újra csatlakozna a számítógéphez. A webszerver használatának vázlata az alábbiakban található.

#befoglalni

#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); // cserélje WiFi azonosítójával és jelszavával const char* ssid = "SSID"; const char* password = "JELSZÓ"; web.begin (ssid, jelszó és hang); } void loop () {web._szerver.handleClient (); }

A kód IP -címet rendel az ESP32 készülékhez, amellyel elérheti a weboldalt. A kód első futtatásakor csatolni kell a számítógéphez. Így láthatja az ESP32 -hez rendelt IP -címet a soros monitoron. Ha szeretné elérni ezt a weboldalt, egyszerűen írja be ezt az IP -címet bármely böngészőbe (tesztelve a Chrome -on).

Mostanra ismernünk kell a Bluetooth és az I2S engedélyezésének módját. A legfontosabb különbség a webDSP objektum használata. Ez az objektum a Wifi SSID azonosítóját és jelszavát használja argumentumként, valamint a btAudio objektumra mutató mutatóként. A fő ciklusban folyamatosan arra késztetjük a webDSP objektumot, hogy figyelje a weboldalról érkező adatokat, majd frissítse a DSP paramétereket. Zárásként meg kell jegyezni, hogy mind a Bluetooth, mind a Wifi ugyanazt a rádiót használja az ESP32 készüléken. Ez azt jelenti, hogy akár 10 másodpercet kell várnia a weboldal paramétereinek megadásától az ESP32 érték eléréséig.

10. lépés: Jövőbeli tervek

Remélhetőleg élvezte ezt az oktatható lehetőséget, és mostantól Bluetooth -audio és DSP -t kapott a HiFi -hez. Úgy gondolom azonban, hogy ebben a projektben sok a fejlődési lehetőség, és csak néhány jövőbeli irányt akartam rámutatni.

  • Engedélyezze a Wifi hangáramlást (a legjobb hangminőség érdekében)
  • Használjon I2S mikrofont a hangutasítások engedélyezéséhez
  • fejleszteni egy WiFi által vezérelt hangszínszabályozót
  • Legyen szép (a kenyértábla nem sikít a nagyszerű dizájnnal)

Amikor hozzáérek ezeknek az ötleteknek a megvalósításához, több tanulsággal szolgálok. Vagy talán valaki más is megvalósítja ezeket a funkciókat. Ez az öröm, ha mindent nyílt forráskódúvá teszünk!

Ajánlott: