Kazalo:
- Zaloge
- 1. korak: Gradnja - plošča
- 2. korak: Konstrukcija - potisne glave/spajkanje
- 3. korak: Konstrukcija - ožičite napajalne zatiče
- 4. korak: Gradnja - ožičenje I2S
- 5. korak: Namestitev knjižnice BtAudio
- 6. korak: Uporaba knjižnice BtAudio
- 7. korak: DSP - filtriranje
- 8. korak: DSP - stiskanje dinamičnega razpona
- 9. korak: Vmesnik Wifi
- 10. korak: Načrti za prihodnost
Video: Obdelava avdio in digitalnega signala Bluetooth: okvir Arduino: 10 korakov
2024 Avtor: John Day | [email protected]. Nazadnje spremenjeno: 2024-01-30 12:03
Povzetek
Ko pomislim na Bluetooth, pomislim na glasbo, žal večina mikrokrmilnikov ne more predvajati glasbe prek Bluetootha. Raspberry Pi lahko, a to je računalnik. Želim razviti ogrodje, ki temelji na Arduinu, za mikrokrmilnike za predvajanje zvoka prek Bluetootha. Za popolno razgibavanje mišic mikrokrmilnika bom zvoku dodal digitalno obdelavo signalov v realnem času (DSP), visokofrekvenčno filtriranje, nizkoprepustno filtriranje in stiskanje dinamičnega obsega. Za češnjo na vrhu bom dodal spletni strežnik, s katerim lahko brezžično konfigurirate DSP. Vdelani videoposnetek prikazuje osnove zvoka Bluetooth v akciji. Prikaže mi tudi uporabo spletnega strežnika za izvajanje nekaj visokoprepustnega filtriranja, nizkoprepustnega filtriranja in stiskanja dinamičnega obsega. Prva uporaba stiskanja dinamičnega obsega namerno povzroči popačenje kot primer slabe izbire parametrov. Drugi primer odpravlja to popačenje.
Za ta projekt je ESP32 izbrani mikrokrmilnik. Stane manj kot 10 funtov in je opremljen z ADC-ji, DAC-ji, Wifi, Bluetooth Low Energy, Bluetooth Classic in dvojedrnim procesorjem 240 MHz. Vgrajeni DAC lahko tehnično predvaja zvok, vendar se ne sliši odlično. Namesto tega bom za izdelavo signala linijskega izhoda uporabil stereo dekoder Adafruit I2S. Ta signal lahko preprosto pošljete v kateri koli sistem HiFi, da takoj dodate brezžični zvok obstoječemu sistemu HiFi.
Zaloge
Upajmo, da bo večina proizvajalcev imela plošče, skakalce, kable USB, spajkalnike za napajanje in bodo morali porabiti le 15 funtov za ESP32 in stereo dekoder. Če ne, so spodaj navedeni vsi potrebni deli.
- ESP32 - preizkušeno na ESP32 -PICO -KIT in TinyPico - 9,50 £/ 24 £
- Stereo dekoder Adafruit I2S - 5,51 £
- Okvir - 3 £ 5 £ vsak
- Mostične žice - 3 £
- Ožičene slušalke/Hi -Fi sistem - £$$
- Potisne glave ali spajkalnik - 2,10 £ / 30 £
- Kabel mikro USB - 2,10 £/ 3 £
- Priključek 3,5 mm na RCA/ 3,5 mm priključek v vtičnico (ali karkoli drugega, kar vaš zvočnik potrebuje) - 2,40 £/ 1,50 £
- Napajanje USB - 5 funtov
1. korak: Gradnja - plošča
Če ste kupili ESP32-PICO-KIT, vam ne bo treba spajkati nožic, saj je vnaprej spajkan. Preprosto ga postavite na mizo.
2. korak: Konstrukcija - potisne glave/spajkanje
Če imate spajkalnik, spajajte nožice na stereo dekoder v skladu z navodili na spletnem mestu Adafruit. V času pisanja je deloval moj spajkalnik, ki je bil zaklenjen. Nisem hotel plačati začasnega spajkalnika, zato sem iz pimoronov odrezal nekaj potisnih glav. Izrezala sem jih, da se prilegajo stereo dekoderju. To ni najboljša rešitev (in ne to, kako so bile glave namenjene uporabi), je pa najcenejša alternativa spajkalniku. Izrezano glavo vstavite na ploščo. Za dekodiranje potrebujete le 1 vrstico s 6 zatiči. Za stabilnost lahko na drugo stran dodate še šest, vendar to ni nujno za ta prototipni sistem. Zatiči, v katere lahko vstavite glave, so vin, 3vo, gnd, wsel, din in bclk.
3. korak: Konstrukcija - ožičite napajalne zatiče
Stereo dekoder postavite na potisne glave (vin, 3vo, gnd, wsel, din in bclk) in jih trdno potisnite skupaj. Še enkrat, v idealnem primeru bi to morali narediti s spajkalnikom, vendar sem moral improvizirati. Opazili boste, da so vse žice v tem navodilu modre. To je zato, ker nisem imel nobenih mostičnih žic, zato sem 1 dolgo žico razrezal na manjše kose. Prav tako sem slep za barve in mi ni vseeno za barvo žice. Napajalni zatiči so pritrjeni na naslednji način:
3v3 (ESP32) -> za vin na stereo dekoderju
gnd (ESP32) -> za gnd na stereo dekoderju
4. korak: Gradnja - ožičenje I2S
Za pošiljanje zvoka Bluetooth iz ESP32 v stereo dekoder bomo uporabili metodo digitalne komunikacije, imenovano I2S. Stereo dekoder bo sprejel ta digitalni signal in ga spremenil v analogni signal, ki ga je mogoče priključiti na zvočnik ali HiFi. I2S potrebuje le 3 žice in je razumljivo preprost za razumevanje. Vrstica bitne ure (bclk) se obrne visoko in nizko, kar kaže na prenos novega bita. Vrstica za izhod podatkov (dout) se obrne visoko ali nizko, da pokaže, ali ima ta bit vrednost 0 ali 1, vrstica za izbiro besede (wsel) pa visoko ali nizko, da označi, ali se prenaša levi ali desni kanal. Vsak mikrokrmilnik ne podpira I2S, vendar ima ESP32 2 liniji I2S. Zaradi tega je očitna izbira za ta projekt.
Ožičenje je naslednje:
27 (ESP32) -> wsel (stereo dekoder)
25 (ESP32) -> din (stereo dekoder)
26 (ESP32) -> bclk (stereo dekoder)
5. korak: Namestitev knjižnice BtAudio
Če še nimate nameščenih, namestite Arduino IDE in jedro Arduino za ESP32. Ko jih namestite, obiščite mojo stran Github in prenesite skladišče. V Arduino IDE pod Sketch >> Include Library >> izberite "Add. ZIP library". Nato izberite preneseno datoteko zip. To bi moralo dodati mojo knjižnico btAudio v vaše knjižnice Arduino. Če želite uporabljati knjižnico, morate v skico Arduino vključiti ustrezno glavo. To boste videli v naslednjem koraku.
6. korak: Uporaba knjižnice BtAudio
Ko je nameščen, povežite svoj ESP32 z računalnikom prek mikro USB -ja in nato s 3,5 -milimetrskim kablom povežite stereo dekoder z zvočnikom. Preden naložite skico, boste morali nekaj spremeniti v urejevalniku Arduino. Ko izberete svojo ploščo, boste morali urediti shemo particij pod Orodja >> Shema particij in izbrati "No OTA (Large APP)" ali "Minimal SPIFFS (Large APPS with OTA)". To je potrebno, ker ta projekt uporablja WiFi in Bluetooth, ki sta zelo težki knjižnici. Ko to storite, naložite naslednjo skico v ESP32.
#vključi
// Nastavi ime zvočne naprave btAudio audio = btAudio ("ESP_Speaker"); void setup () {// pretaka zvočne podatke v ESP32 audio.begin (); // oddaja prejete podatke v I2S DAC int bck = 26; int ws = 27; int dout = 25; avdio. I2S (bck, dout, ws); } void loop () {}
Skico lahko na splošno razdelimo v 3 korake:
- Ustvarite globalni objekt btAudio, ki nastavi "ime Bluetooth" vašega ESP32
- Konfigurirajte ESP32 za sprejemanje zvoka z metodo btAudio:: begin
- Zatiče I2S nastavite z metodo btAudio:: I2S.
To je to na strani programske opreme! Zdaj morate le vzpostaviti povezavo Bluetooth z vašim ESP32. Samo poiščite nove naprave v telefonu/prenosnem računalniku/MP3 predvajalniku in prikazal se bo "ESP_Speaker". Ko ste zadovoljni, da vse deluje (predvaja glasba), lahko ESP32 odklopite iz računalnika. Napajajte ga z napajalnikom USB in zapomnil si bo zadnjo kodo, ki ste jo naložili vanj. Tako lahko svoj ESP32 za vedno pustite skrit za sistemom HiFi.
7. korak: DSP - filtriranje
Razširitev sprejemnika z digitalno obdelavo signalov
Če ste sledili vsem korakom (in nisem ničesar izpustil), imate zdaj popolnoma delujoč sprejemnik Bluetooth za vaš sistem HiFi. Čeprav je to kul, mikrokontrolerja v resnici ne premika do meja. ESP32 ima dve jedri, ki delujeta pri 240 MHz. To pomeni, da je ta projekt veliko več kot le sprejemnik. Zmogljiv je kot sprejemnik Bluetooth z digitalnim procesorjem signalov (DSP). DSP v bistvu izvajajo matematične operacije nad signalom v realnem času. Ena uporabna operacija se imenuje digitalno filtriranje. Ta proces oslabi frekvence v signalu pod ali nad določeno mejno frekvenco, odvisno od tega, ali uporabljate visokoprepustni ali nizkoprepustni filter.
Visokoprepustni filtri
Visokoprepustni filtri oslabijo frekvence pod določenim pasom. Knjižnico filtrov za sisteme Arduino sem izdelal na podlagi kode iz earlevel.com. Glavna razlika je v tem, da sem spremenil strukturo razredov, da sem olajšal izdelavo filtrov višjega reda. Filtri višjega reda učinkoviteje zavirajo frekvence, ki presegajo vašo mejo, vendar zahtevajo veliko več izračuna. Vendar pa lahko pri trenutni izvedbi uporabite celo filtre 6. reda za zvok v realnem času!
Skica je enaka tisti, ki smo jo našli v prejšnjem koraku, le da smo spremenili glavno zanko. Za omogočanje filtrov uporabljamo metodo btAudio:: createFilter. Ta metoda sprejema 3 argumente. Prvi je število filtrirnih kaskad. Število kaskad filtrov je polovica vrstnega reda filtra. Za filter šestega reda bi moral biti prvi argument 3. Za filter osmega reda bi bil 4. Drugi argument je mejna vrednost filtra. To sem nastavil na 1000Hz, da bo imel res dramatičen učinek na podatke. Nazadnje s tretjim argumentom določimo vrsto vložka. To bi moralo biti visokoprepustni filter za visokoprepustni filter in nizkoprehodni za nizkoprepustni filter. Spodnji skript preklopi mejo te frekvence med 1000Hz in 2Hz. Morali bi slišati dramatičen učinek na podatke.
#vključi
btAudio audio = btAudio ("ESP_Speaker"); void setup () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; avdio. I2S (bck, dout, ws); } void loop () {delay (5000); audio.createFilter (3, 1000, visoki prehod); zamuda (5000); audio.createFilter (3, 2, visoke pasove); }
Nizkoprepustni filtri
Nizkoprepustni filtri delujejo nasprotno od visokofrekvenčnih filtrov in zavirajo frekvence nad določeno frekvenco. Izvajajo se lahko na enak način kot visokoprepustni filtri, le da potrebujejo spremembo tretjega argumenta v nizkoprepustni. Za skico spodaj zamenjam nizkoprepustno mejo med 2000Hz in 20000Hz. Upajmo, da boste slišali razliko. Ko je nizkoprepustni filter na 2000Hz, bi se moral slišati precej prigušeno.
#vključi
btAudio audio = btAudio ("ESP_Speaker"); void setup () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; avdio. I2S (bck, dout, ws); } void loop () {delay (5000); audio.createFilter (3, 2000, nizki prehod); zamuda (5000); audio.createFilter (3, 20000, nizkoprepustni); }
8. korak: DSP - stiskanje dinamičnega razpona
Ozadje
Stiskanje dinamičnega obsega je metoda obdelave signala, ki poskuša izravnati glasnost zvoka. Stisne glasne zvoke, ki se dvignejo nad določen prag, na raven tihih in nato po želji ojača oba. Rezultat je veliko bolj enakomerna izkušnja poslušanja. To je bilo zelo koristno, ko sem gledal predstavo z zelo glasno glasbo v ozadju in zelo tihim vokalom. V tem primeru samo povečanje glasnosti ni pomagalo, saj je to samo še povečalo glasbo v ozadju. S stiskanjem dinamičnega obsega bi lahko glasno glasbo v ozadju znižal na raven vokala in spet vse pravilno slišal.
Kodeks
Stiskanje dinamičnega območja ne vključuje le zmanjšanja glasnosti ali praga signala. To je nekoliko bolj pametno. Če zmanjšate glasnost, se bodo tihi zvoki in glasni zmanjšali. Eden od načinov za to je prag signala, vendar to povzroči močno popačenje. Stiskanje dinamičnega območja vključuje kombinacijo mehkega praga in filtriranja, da bi zmanjšali popačenje, ki bi ga dobili, če bi prag/izrezali signal. Rezultat je signal, kjer se glasni zvoki "postrižejo" brez popačenja, tihi pa ostanejo takšni, kot so. Spodnja koda preklaplja med tremi različnimi stopnjami stiskanja.
- Stiskanje s popačenjem
- Stiskanje brez popačenja
- Brez stiskanja
#vključi
btAudio audio = btAudio ("ESP_Speaker"); void setup () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; avdio. I2S (bck, dout, ws); } void loop () {delay (5000); avdio.kompresija (30, 0,0001, 0,0001, 10, 10, 0); zamuda (5000); avdio.kompresija (30, 0,0001, 0,1, 10, 10, 0); zamuda (5000); audio.decompress (); }
Stiskanje dinamičnega obsega je zapleteno in metode btAudio:: compress imajo številne parametre. Poskušal jih bom razložiti (po vrstnem redu) tukaj:
- Prag - raven, pri kateri se zvok zmanjša (merjeno v decibelih)
- Čas napada - čas, ko kompresor začne delovati, ko je prag presežen
- Čas sproščanja - čas, ki traja, da kompresor preneha delovati.
- Reduction Ratio - faktor, zaradi katerega se zvok stisne.
- Širina kolena - Širina (v decibelih) okoli praga, pri katerem kompresor delno deluje (bolj naraven zvok).
- Dobiček (decibeli), dodan signalu po stiskanju (povečanje/zmanjšanje glasnosti)
Zelo slišno popačenje pri prvi uporabi stiskanja je zato, ker je prag zelo nizek, čas napada in čas sproščanja pa sta zelo kratka, kar ima za posledico trdo obnašanje praga. To se v drugem primeru očitno reši s podaljšanjem časa sproščanja. To v bistvu povzroči, da kompresor deluje veliko bolj gladko. Tukaj sem samo pokazal, kako lahko sprememba enega parametra dramatično vpliva na zvok. Zdaj ste na vrsti, da preizkusite različne parametre.
Izvajanje (čarobna matematika - neobvezno)
Ugotovil sem, da je naivno izvajanje stiskanja dinamičnega razpona zahtevno. Algoritem zahteva pretvorbo 16-bitnega celega števila v decibele in nato pretvorbo nazaj v 16-bitno celo število, ko obdelate signal. Opazil sem, da ena vrstica kode potrebuje 10 mikrosekund za obdelavo stereo podatkov. Ker stereo zvok, vzorčen pri 44,1 KHz, pusti le 11,3 mikrosekund za DSP, je to nesprejemljivo počasno … Vendar pa s kombinacijo majhne iskalne tabele (400 bajtov) in interpolacijskega postopka, ki temelji na deljenih razlikah Netwona, lahko v 0,2 mikrosekundah dosežemo skoraj 17 -bitno natančnost. Priložil sem pdf dokument z vso matematiko za resnično zainteresirane. Komplicirano je, opozorili ste!
9. korak: Vmesnik Wifi
Zdaj imate sprejemnik Bluetooth, ki lahko izvaja DSP v realnem času. Na žalost, če želite spremeniti katerega koli parametra DSP, boste morali prekiniti povezavo s HiFi, naložiti novo skico in se nato znova povezati. To je neumno. Da bi to odpravil, sem razvil spletni strežnik, ki ga lahko uporabite za urejanje vseh parametrov DSP brez ponovne povezave z računalnikom. Skica za uporabo spletnega strežnika je spodaj.
#vključi
#include btAudio audio = btAudio ("ESP_Speaker"); webDSP splet; void setup () {Serial.begin (115200); audio.begin (); int bck = 26; int ws = 27; int dout = 25; avdio. I2S (bck, dout, ws); // zamenjajte z vašim ID -jem WiFi in geslom const char* ssid = "SSID"; const char* geslo = "GESO"; web.begin (ssid, geslo in zvok); } void loop () {web._server.handleClient (); }
Koda vašemu ESP32 dodeli naslov IP, s katerim lahko dostopate do spletne strani. Ko prvič zaženete to kodo, jo morate priložiti računalniku. Tako lahko na svojem serijskem monitorju vidite naslov IP, dodeljen vašemu ESP32. Če želite dostopati do te spletne strani, preprosto vnesite ta naslov IP v kateri koli spletni brskalnik (preizkušeno na Chromu).
Doslej bi morali biti že seznanjeni z načinom omogočanja Bluetootha in I2S. Ključna razlika je uporaba predmeta webDSP. Ta predmet vzame vaš SSID in geslo Wifi kot argumente ter kazalec na objekt btAudio. V glavni zanki neprestano pridobivamo objekt webDSP, da posluša dohodne podatke s spletne strani in nato posodobi parametre DSP. Kot zaključno točko je treba opozoriti, da Bluetooth in Wifi uporabljata isti radio na ESP32. To pomeni, da boste morda morali počakati do 10 sekund od vnosa parametrov na spletno stran do trenutka, ko podatki dejansko dosežejo ESP32.
10. korak: Načrti za prihodnost
Upajmo, da ste uživali v tem navodilu, zdaj pa imate v HiFi dodani Bluetooth Audio in DSP. Vendar menim, da je v tem projektu veliko prostora za rast in želel sem le opozoriti na nekatere prihodnje smernice, ki bi jih lahko sprejel.
- Omogoči pretakanje zvoka Wifi (za najboljšo kakovost zvoka)
- Za omogočanje glasovnih ukazov uporabite mikrofon I2S
- razviti izenačevalnik z nadzorom WiFi
- Naj bo lepo (plošča ne kriči odličnega oblikovanja izdelka)
Ko se bom lotil izvajanja teh idej, bom naredil več navodil. Ali pa bo morda kdo drug izvedel te funkcije. To je veselje, da je vse odprtokodno!
Priporočena:
Bluetooth zvočnik DIY z baterijo // Kako zgraditi - obdelava lesa: 14 korakov (s slikami)
Bluetooth zvočnik DIY z baterijo // Kako zgraditi-obdelava lesa: Ta prenosni zvočnik s tipkovnico Bluetooth za polnjenje, ki se napaja iz baterije, sem izdelal z uporabo kompleta zvočnikov Parts Express C-Note plus njihove ojačevalne plošče KAB (povezave do vseh delov spodaj). To je bila moja prva izdelava zvočnikov in iskreno sem presenečen nad tem, kako super
Bluetooth in IMU s ploščo Tactigon - obdelava: 7 korakov
Bluetooth in IMU s ploščo Tactigon - Obdelava: Ta serija člankov bo razložila, kako uporabiti integrirane senzorje in komunikacijske vmesnike Tactigon za ustvarjanje preprostega krmilnika kretenj. Koda vira, ki je na voljo tukaj na GitHub -u V tem članku se bomo naučili, kako uporabiti simptom
Napajanje prek digitalnega USB C napajanja Bluetooth: 8 korakov (s slikami)
Napajanje z digitalnim USB -jem C z napajanjem: Ste si kdaj želeli napajanje, ki ga lahko uporabljate na poti, tudi brez stenske vtičnice v bližini? In ali ne bi bilo kul, če bi bilo tudi zelo natančno, digitalno in nadzorovano prek računalnika in telefona? V tem navodilu vam bom pokazal, kako natančno zgraditi
Avdio kopalniški grafitni okvir: 8 korakov
Avdio kopalnica Graffitti Box: to je navodilo, kako ustvariti škatlo z majhnim modulom za snemanje/predvajanje, ki ustreza notranjosti javne kopalnice
3D AIR miška - Arduino + obdelava: 5 korakov
3D AIR miška | Arduino + Obdelava: 3D AIR miška | Arduino + Processing Sem študent industrijskega oblikovanja in lani v okviru predmeta z naslovom "Tehnologija kot RAW material" Ta projekt sem naredil kot svoje zadnje delo. Večino časa delam s programom SolidWorks, CAD programsko opremo za