Sadržaj:

Bluetooth audio i digitalna obrada signala: Arduino okvir: 10 koraka
Bluetooth audio i digitalna obrada signala: Arduino okvir: 10 koraka

Video: Bluetooth audio i digitalna obrada signala: Arduino okvir: 10 koraka

Video: Bluetooth audio i digitalna obrada signala: Arduino okvir: 10 koraka
Video: CS50 2015 – 10-я неделя 2024, Novembar
Anonim
Image
Image
Bluetooth audio i digitalna obrada signala: Arduino okvir
Bluetooth audio i digitalna obrada signala: Arduino okvir

Sažetak

Kad pomislim na Bluetooth, mislim na muziku, ali nažalost većina mikrokontrolera ne može puštati muziku putem Bluetootha. Raspberry Pi može, ali to je računar. Želim razviti okvir zasnovan na Arduinu za mikrokontrolere za reprodukciju zvuka putem Bluetootha. Da bih u potpunosti savio mišiće svog mikrokontrolera, zvuku ću dodati digitalnu obradu signala u realnom vremenu (DSP) (visokopropusno filtriranje, niskopropusno filtriranje i kompresija dinamičkog raspona). Za trešnju na vrhu, dodat ću web poslužitelj koji se može koristiti za bežično konfiguriranje DSP -a. Ugrađeni video prikazuje osnove Bluetooth zvuka na djelu. Prikazuje mi i korištenje web poslužitelja za izvođenje filtriranja visokog prolaza, filtriranja niskih frekvencija i kompresije dinamičkog raspona. Prva upotreba kompresije dinamičkog raspona namjerno uzrokuje izobličenja kao primjer lošeg izbora parametara. Drugi primjer eliminira ovu distorziju.

Za ovaj projekt, ESP32 je mikrokontroler po izboru. Košta manje od 10 funti i opremljen je ADC-ovima, DAC-ovima, Wifi-jem, Bluetooth-om sa niskom potrošnjom energije, klasičnim Bluetooth-om i dvojezgrenim procesorom od 240 MHz. Ugrađeni DAC tehnički može reproducirati zvuk, ali neće zvučati sjajno. Umjesto toga, ja ću koristiti Adafruit I2S stereo dekoder za proizvodnju signala linijskog izlaza. Ovaj signal se može lako poslati na bilo koji HiFi sistem za trenutno dodavanje bežičnog zvuka u vaš postojeći HiFi sistem.

Supplies

Nadajmo se da će većina proizvođača imati matične ploče, kratkospojnike, USB kablove, lemilice za napajanje i da će morati potrošiti samo 15 funti na ESP32 i stereo dekoder. Ako nije, dolje su navedeni svi potrebni dijelovi.

  • ESP32 - testirano na ESP32 -PICO -KIT i TinyPico - 9,50 £/ 24 £
  • Adafruit I2S stereo dekoder - 5,51 £
  • Oglasna ploča - 3 £ 5 £ svaki
  • Žice za kratkospojnike - 3 GBP
  • Žičane slušalice/Hi -Fi sistem - £$$
  • Pritisne glave ili lemilice - 2,10 £ / 30 £
  • Mikro USB kabel - 2,10 £/ 3 £
  • 3,5 mm na RCA konektor/ 3,5 mm priključak na utičnicu (ili šta god vašem zvučniku treba) - £ 2,40/ £ 1,50
  • USB napajanje - £ 5

Korak 1: Konstrukcija - Breadboard

Konstrukcija - Breadboard
Konstrukcija - Breadboard

Ako ste kupili ESP32-PICO-KIT, nećete morati lemiti iglice jer dolazi prethodno lemljen. Jednostavno ga postavite na ploču.

Korak 2: Konstrukcija - Push Headers/lemljenje

Konstrukcija - Push Headers/lemljenje
Konstrukcija - Push Headers/lemljenje
Konstrukcija - Push Headers/lemljenje
Konstrukcija - Push Headers/lemljenje

Ako imate lemilicu, lemite iglice na stereo dekoder prema uputama na web stranici Adafruit. U vreme pisanja moje lemilice je radilo i bilo je zaključano. Nisam htio platiti privremeno lemilicu pa sam odrezao nekoliko potisnih glava iz pimorona. Izrezao sam ih kako bi odgovarali stereo dekoderu. Ovo nije najbolje rješenje (a ne kako su se zaglavlja trebala koristiti), ali je najjeftinija alternativa lemilici. Umetnite izrezano zaglavlje u matičnu ploču. Za dekoder vam treba samo 1 linija sa 6 pinova. Možete dodati još šest na drugu stranu radi stabilnosti, ali to nije potrebno za ovaj prototipni sistem. Igle za umetanje zaglavlja su vin, 3vo, gnd, wsel, din i bclk.

Korak 3: Konstrukcija - Ožičite igle za napajanje

Konstrukcija - Ožičite utikače za napajanje
Konstrukcija - Ožičite utikače za napajanje

Postavite stereo dekoder na potisne zaglavlje (vin, 3vo, gnd, wsel, din i bclk igle) i čvrsto ih spojite. Opet, ovo bi idealno trebalo biti učinjeno lemilicom, ali morao sam improvizirati. Primijetit ćete da su sve žice u ovom uputstvu plave. To je zato što nisam imao prespojne žice pa sam 1 dugu žicu izrezao na manje komade. Takođe, ja ne poznajem boje i baš me briga za boju žice. Igle za napajanje su pričvršćene na sljedeći način:

3v3 (ESP32) -> za vin na stereo dekoderu

gnd (ESP32) -> za gnd na stereo dekoderu

Korak 4: Konstrukcija - I2S ožičenje

Konstrukcija - I2S ožičenje
Konstrukcija - I2S ožičenje

Za slanje Bluetooth zvuka s ESP32 u stereo dekoder koristit ćemo metodu digitalne komunikacije koja se zove I2S. Stereo dekoder će uzeti ovaj digitalni signal i pretvoriti ga u analogni signal koji se može priključiti na zvučnik ili HiFi. I2S zahtijeva samo 3 žice i razumljivo je jednostavan za razumijevanje. Linija takta bita (bclk) se okreće visoko i nisko kako bi označila da se prenosi novi bit. Linija za izlaz podataka (dout) okreće se visoko ili nisko kako bi pokazala ima li taj bit vrijednost 0 ili 1, a linija za odabir riječi (wsel) postaje visoka ili niska kako bi pokazala da li se prenosi lijevi ili desni kanal. Ne podržava svaki mikrokontroler I2S, ali ESP32 ima 2 I2S linije. Zbog toga je očigledan izbor za ovaj projekat.

Ožičenje je sljedeće:

27 (ESP32) -> wsel (Stereo dekoder)

25 (ESP32) -> din (Stereo dekoder)

26 (ESP32) -> bclk (Stereo dekoder)

Korak 5: Instaliranje BtAudio biblioteke

Instaliranje BtAudio biblioteke
Instaliranje BtAudio biblioteke
Instaliranje BtAudio biblioteke
Instaliranje BtAudio biblioteke

Ako ih još niste instalirali, instalirajte Arduino IDE i Arduino jezgru za ESP32. Nakon što ih instalirate, posjetite moju stranicu Github i preuzmite spremište. Unutar Arduino IDE -a pod Sketch >> Include Library >> odaberite "Add. ZIP library". Zatim odaberite preuzetu zip datoteku. Ovo bi trebalo dodati moju btAudio biblioteku u vaše Arduino biblioteke. Da biste koristili biblioteku, morate uključiti odgovarajuće zaglavlje u Arduino skicu. To ćete vidjeti u sljedećem koraku.

Korak 6: Upotreba BtAudio biblioteke

Korištenje BtAudio biblioteke
Korištenje BtAudio biblioteke
Korištenje BtAudio biblioteke
Korištenje BtAudio biblioteke

Nakon instaliranja, povežite svoj ESP32 s računarom putem mikro USB -a, a zatim povežite svoj stereo dekoder sa zvučnikom sa žicom od 3,5 mm. Prije nego što postavite skicu, morat ćete promijeniti neke stvari u Arduino uređivaču. Nakon što odaberete svoju ploču, morat ćete urediti particijsku shemu pod Alati >> Shema particija i odabrati "Nema OTA (velika aplikacija)" ili "Minimalni SPIFFS (velike aplikacije s OTA)". To je potrebno jer ovaj projekt koristi i WiFi i Bluetooth koji su jako velike memorije. Nakon što to učinite, prenesite sljedeću skicu na ESP32.

#include

// Postavlja naziv audio uređaja btAudio audio = btAudio ("ESP_Speaker"); void setup () {// struji audio podatke na ESP32 audio.begin (); // šalje primljene podatke u I2S DAC int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } void loop () {}

Skica se općenito može podijeliti u 3 koraka:

  1. Kreirajte globalni btAudio objekt koji postavlja "Bluetooth ime" vašeg ESP32
  2. Konfigurirajte ESP32 za prijem zvuka pomoću metode btAudio:: begin
  3. Postavite I2S pinove pomoću metode btAudio:: I2S.

To je to sa softverske strane! Sada sve što trebate učiniti je pokrenuti Bluetooth vezu s vašim ESP32. Samo potražite nove uređaje na svom telefonu/laptopu/MP3 plejeru i pojavit će se "ESP_Speaker". Kad budete sretni što sve radi (svira muzika), možete isključiti ESP32 sa računara. Napajajte ga USB napajanjem i pamtit će zadnji kôd koji ste na njega učitali. Na ovaj način možete zauvijek ostaviti svoj ESP32 skriven iza svog HiFi sistema.

Korak 7: DSP - Filtriranje

Proširenje prijemnika digitalnom obradom signala

Ako ste slijedili sve korake (a ja ništa nisam izostavio), sada imate potpuno funkcionalan Bluetooth prijemnik za svoj HiFi sistem. Iako je ovo super, mikrokontroler ne dolazi do krajnjih granica. ESP32 ima dvije jezgre koje rade na 240MHz. To znači da je ovaj projekt daleko više od prijemnika. Ima kapacitet da bude Bluetooth prijemnik sa procesorom digitalnog signala (DSP). DSP-ovi u osnovi izvode matematičke operacije nad signalom u stvarnom vremenu. Jedna korisna operacija naziva se digitalno filtriranje. Ovaj proces smanjuje frekvencije u signalu ispod ili iznad određene granične frekvencije, ovisno o tome koristite li visokopropusni ili niskopropusni filter.

Visokopropusni filteri

Visokopropusni filteri prigušuju frekvencije ispod određenog opsega. Napravio sam biblioteku filtera za Arduino sisteme zasnovanu na kodu sa earlevel.com. Glavna razlika je u tome što sam promijenio strukturu klasa kako bih omogućio lakšu izgradnju filtera višeg reda. Filtri višeg reda efikasnije potiskuju frekvencije izvan granica, ali zahtijevaju mnogo više računanja. Međutim, s trenutnom implementacijom, čak možete koristiti filtere 6. reda za audio u stvarnom vremenu!

Skica je ista kao ona u prethodnom koraku, osim što smo promijenili glavnu petlju. Za omogućavanje filtera koristimo metodu btAudio:: createFilter. Ova metoda prihvaća 3 argumenta. Prvi je broj kaskada filtera. Broj kaskada filtera je pola reda filtera. Za filter 6. reda, prvi argument bi trebao biti 3. Za filter 8. reda, to bi bio 4. Drugi argument je prekid filtera. Postavio sam ovo na 1000Hz kako bih imao zaista dramatičan učinak na podatke. Konačno, trećim argumentom specificiramo tip filera. Ovo bi trebao biti highpass za visokopropusni filter i lowpass za niskopropusni filter. Donja skripta prebacuje graničnu vrijednost ove frekvencije između 1000Hz i 2Hz. Trebali biste čuti dramatičan učinak na podatke.

#include

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, highpass); kašnjenje (5000); audio.createFilter (3, 2, highpass); }

Niskopropusni filteri

Niskopropusni filtri rade suprotno od visokopropusnih i potiskuju frekvencije iznad određene frekvencije. Mogu se implementirati na isti način kao i visokopropusni filtri, osim što zahtijevaju promjenu trećeg argumenta u niskopropusni. Za donju skicu izmjenjujem niskopropusni prekid između 2000Hz i 20000Hz. Nadajmo se da ćete čuti razliku. Trebalo bi zvučati prilično prigušeno kada je niskopropusni filter na 2000Hz.

#include

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, niskopropusni); kašnjenje (5000); audio.createFilter (3, 20000, niskopropusni); }

Korak 8: DSP - Kompresija dinamičkog raspona

Pozadina

Kompresija dinamičkog raspona je metoda obrade signala koja pokušava izjednačiti glasnoću zvuka. Komprimira glasne zvukove, koji se uzdižu iznad određenog praga, do nivoa tihih, a zatim, po želji, pojačava oba. Rezultat je mnogo ujednačenije iskustvo slušanja. Ovo mi je postalo jako korisno dok sam gledao emisiju s vrlo glasnom pozadinskom muzikom i vrlo tihim vokalom. U ovom slučaju samo povećanje glasnoće nije pomoglo jer je to samo pojačalo pozadinsku muziku. Sa kompresijom dinamičkog opsega, mogao bih smanjiti glasnu pozadinsku muziku na nivo vokala i ponovo čuti sve kako treba.

Kodeks

Kompresija dinamičkog raspona ne uključuje samo smanjenje glasnoće ili graničenje signala. To je malo pametnije od toga. Ako smanjite jačinu zvuka, tihi zvukovi će se smanjiti, kao i glasni. Jedan od načina da se to zaobiđe je ograničavanje signala, ali to dovodi do ozbiljnih izobličenja. Kompresija dinamičkog raspona uključuje kombinaciju mekog praga i filtriranja kako bi se smanjila izobličenja koja bi se pojavila ako biste prag/isjekli signal. Rezultat je signal gdje se glasni zvukovi "isjecaju" bez izobličenja, a tihi ostaju takvi kakvi jesu. Donji kod prebacuje se između tri različita nivoa kompresije.

  1. Kompresija s izobličenjem
  2. Kompresija bez izobličenja
  3. Bez kompresije

#include

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); kašnjenje (5000); audio.compress (30, 0,0001, 0,1, 10, 10, 0); kašnjenje (5000); audio.decompress (); }

Kompresija dinamičkog raspona je komplicirana i metode btAudio:: compress imaju mnoge parametre. Pokušat ću ih objasniti (redom) ovdje:

  1. Prag - Nivo na kojem se zvuk smanjuje (mjereno u decibelima)
  2. Vrijeme napada - Vrijeme potrebno da kompresor počne raditi nakon što je prag premašen
  3. Vrijeme otpuštanja - vrijeme potrebno za prestanak rada kompresora.
  4. Reduction Ratio - faktor kompresije zvuka.
  5. Širina koljena - Širina (u decibelima) oko praga na kojem kompresor djelomično radi (prirodniji zvuk).
  6. Pojačanje (decibeli) dodano signalu nakon kompresije (povećanje/smanjenje glasnoće)

Vrlo čujno izobličenje pri prvoj upotrebi kompresije je zato što je prag vrlo nizak, a vrijeme napada i vrijeme oslobađanja su vrlo kratki, što efektivno rezultira teškim ponašanjem praga. To se u drugom slučaju jasno rješava povećanjem vremena otpuštanja. To u osnovi uzrokuje da kompresor djeluje na mnogo glatkiji način. Ovdje sam samo pokazao kako promjena jednog parametra može imati dramatičan učinak na zvuk. Sada je vaš red da eksperimentirate s različitim parametrima.

Implementacija (magična matematika - izborno)

Otkrio sam da je naivno uvođenje kompresije dinamičkog raspona izazov. Algoritam zahtijeva pretvaranje 16-bitnog cijelog broja u decibele, a zatim ga nakon pretvaranja signala natrag u 16-bitni cijeli broj. Primijetio sam da je jednoj liniji koda potrebno 10 mikrosekundi za obradu stereo podataka. Kako stereo zvuk uzorkovan na 44,1 KHz ostavlja samo 11,3 mikrosekundi za DSP, to je neprihvatljivo sporo … Međutim, kombiniranjem male tablice za pretraživanje (400 bajtova) i interpolacijske procedure zasnovane na podijeljenim razlikama Netwona, možemo dobiti preciznost od gotovo 17 bita za 0,2 mikrosekunde. Priložio sam pdf dokument sa svom matematikom za istinski zainteresovane. Komplikovano je, upozoreni ste!

Korak 9: Wifi sučelje

Wifi interfejs
Wifi interfejs
Wifi interfejs
Wifi interfejs

Sada imate Bluetooth prijemnik sposoban za pokretanje DSP-a u stvarnom vremenu. Nažalost, ako želite promijeniti bilo koji od DSP parametara, morat ćete se odspojiti s HiFi -a, postaviti novu skicu, a zatim se ponovo povezati. Ovo je nespretno. Da bih to riješio, razvio sam web poslužitelj koji možete koristiti za uređivanje svih parametara DSP -a bez ponovnog povezivanja s računalom. Skica za korištenje web servera nalazi se ispod.

#include

#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); // zamijenite svojim WiFi ID -om i lozinkom const char* ssid = "SSID"; const char* password = "PASSWORD"; web.begin (ssid, lozinka i audio); } void loop () {web._server.handleClient (); }

Kôd dodjeljuje IP adresu vašem ESP32 -u koju možete koristiti za pristup web stranici. Prilikom prvog pokretanja ovog koda trebali biste ga staviti na računar. Na taj način možete vidjeti IP adresu dodijeljenu vašem ESP32 na svom serijskom monitoru. Ako želite pristupiti ovoj web stranici, jednostavno unesite ovu IP adresu u bilo koji web preglednik (testirano na chromeu).

Do sada bismo trebali biti upoznati s načinom omogućavanja Bluetooth -a i I2S -a. Ključna razlika je upotreba webDSP objekta. Ovaj objekt uzima vaš Wifi SSID i lozinku kao argumente, kao i pokazivač na btAudio objekt. U glavnoj petlji neprestano dobivamo objekt webDSP da sluša dolazne podatke s web stranice, a zatim ažurira DSP parametre. Kao završnu točku valja napomenuti da i Bluetooth i Wifi koriste isti radio na ESP32. To znači da ćete možda morati pričekati do 10 sekundi od trenutka kada unesete parametre na web stranici do trenutka kada informacije dopiru do ESP32.

Korak 10: Planovi za budućnost

Nadamo se da ste uživali u ovom uputstvu i da ste sada dodali Bluetooth Audio i DSP na svoj HiFi. Međutim, mislim da u ovom projektu postoji mnogo prostora za rast i samo sam htio ukazati na neke buduće smjerove koje bih mogao poduzeti.

  • Omogući Wifi streaming zvuka (za najbolji kvalitet zvuka)
  • Za omogućavanje glasovnih komandi koristite I2S mikrofon
  • razviti ekvilajzer s WiFi kontrolom
  • Učinite to lijepo (ploča ne vrišti odličan dizajn proizvoda)

Kad počnem primjenjivati ove ideje, napravit ću više instrukcija. Ili će možda neko drugi implementirati ove funkcije. To je radost učiniti sve otvorenim kodom!

Preporučuje se: