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, Studeni
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 glazbu, ali nažalost većina mikrokontrolera ne može reproducirati glazbu putem Bluetootha. Raspberry Pi može, ali to je računalo. Želim razviti okvir zasnovan na Arduinu za mikrokontrolere za reprodukciju zvuka putem Bluetootha. Kako 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 uporaba kompresije dinamičkog raspona namjerno uzrokuje izobličenja kao primjer lošeg izbora parametara. Drugi primjer uklanja to izobličenje.

Za ovaj projekt, ESP32 je mikrokontroler po izboru. Košta manje od 10 funti, a opremljen je ADC-ovima, DAC-ovima, Wifi-jem, Bluetooth Low Energy, Bluetooth Classic i dvojezgrenim procesorom od 240 MHz. Ugrađeni DAC tehnički može reproducirati zvuk, ali neće zvučati sjajno. Umjesto toga, upotrijebit ću stereo dekoder Adafruit I2S za stvaranje signala linijskog izlaza. Ovaj se signal može lako poslati u bilo koji HiFi sustav za trenutno dodavanje bežičnog zvuka u vaš postojeći HiFi sustav.

Pribor

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

  • ESP32 - testirano na ESP32 -PICO -KIT i TinyPico - 9,50 £/ 24 £
  • Adafruit I2S stereo dekoder - 5,51 GBP
  • Oglasna ploča - 3 £ 5 £ svaki
  • Kratkospojne žice - 3 GBP
  • Ožičene slušalice/Hi -Fi sustav - £$$
  • Push glave ili lemilica - 2,10 £ / 30 £
  • Mikro USB kabel - 2,10 £/ 3 £
  • 3,5 mm na RCA konektor/ 3,5 mm priključnica na utičnicu (ili što god vašem zvučniku treba) - 2,40 £/ 1,50 £
  • USB napajanje - 5 GBP

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 vrijeme 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 namjeravala koristiti), ali je najjeftinija alternativa lemilici. Umetnite izrezano zaglavlje na ploču za kruh. Za dekoder vam treba samo 1 linija sa 6 pinova. Za stabilnost možete dodati još šest na drugu stranu, ali to nije potrebno za ovaj prototipni sustav. Igle za umetanje zaglavlja su vin, 3vo, gnd, wsel, din i bclk.

Korak 3: Konstrukcija - Ožičite utikače 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 gurnite zajedno. 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 izrezao 1 dugu žicu na manje komade. Također, nisam daltonist 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: Izgradnja - 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 nazvanu 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) okreće se visoko i nisko kako bi označila prijenos novog bita. 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 označila prenosi li se lijevi ili desni kanal. Ne podržava svaki mikrokontroler I2S, ali ESP32 ima 2 I2S linije. Zbog toga je očigledan izbor za ovaj projekt.

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 knjižnice

Instaliranje BtAudio knjižnice
Instaliranje BtAudio knjižnice
Instaliranje BtAudio knjižnice
Instaliranje BtAudio knjižnice

Ako ih još nemate instalirane, 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 knjižnicu u vaše Arduino knjižnice. Da biste koristili knjižnicu, morate uključiti odgovarajuće zaglavlje u Arduino skicu. To ćete vidjeti u sljedećem koraku.

Korak 6: Korištenje biblioteke BtAudio

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

Nakon instaliranja, povežite svoj ESP32 s računalom putem mikro USB -a, a zatim spojite svoj stereo dekoder sa zvučnikom sa žicom od 3,5 mm. Prije nego što učitate skicu, morate promijeniti neke stvari u Arduino uređivaču. Nakon što odaberete svoju ploču, morat ćete urediti particijsku shemu u odjeljku 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.

#uključi

// 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 () {} {100} {101}

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

  1. Izradite globalni btAudio objekt koji postavlja "Bluetooth naziv" vašeg ESP32
  2. Konfigurirajte ESP32 za primanje 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/prijenosnom računaru/MP3 playeru i pojavit će se "ESP_Speaker". Nakon što ste sretni što sve radi (svira glazba), možete odspojiti ESP32 s računala. Uključite ga USB napajanjem i zapamtit će zadnji kôd koji ste na njega učitali. Na ovaj način možete zauvijek ostaviti svoj ESP32 skriven iza svog HiFi sustava.

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 sustav. Iako je ovo super, mikrokontroler ne gura do krajnjih granica. ESP32 ima dvije jezgre koje rade na 240MHz. To znači da je ovaj projekt daleko više od prijemnika. Ima sposobnost da bude Bluetooth prijemnik s 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 pojasa. Napravio sam biblioteku filtera za Arduino sustave na temelju koda 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 učinkovitije 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 filtar 6. reda, prvi argument trebao bi biti 3. Za filter 8. reda, to bi bio 4. Drugi argument je prekid filtra. Postavio sam ovo na 1000Hz kako bih imao zaista dramatičan učinak na podatke. Na kraju, trećim argumentom specificiramo vrstu filatora. To bi trebao biti highpass za visokopropusni filtar i niskopropusni 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.

#uključi

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, visoki prolaz); }

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.

#uključi

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 metoda je obrade signala koja pokušava izjednačiti glasnoću zvuka. Komprimira glasne zvukove, koji se izdižu iznad određenog praga, na razinu tihih, a zatim, po želji, pojačava oboje. Rezultat je mnogo ravnomjernije iskustvo slušanja. Ovo mi je postalo jako korisno dok sam gledao emisiju s vrlo glasnom pozadinskom glazbom i vrlo tihim vokalom. U ovom slučaju samo povećanje glasnoće nije pomoglo jer je to samo pojačalo glazbu u pozadini. Kompresijom dinamičkog raspona mogao bih smanjiti glasnu pozadinsku glazbu na razinu vokala i ponovno sve čuti ispravno.

Kod

Kompresija dinamičkog raspona ne uključuje samo smanjenje glasnoće ili postavljanje praga signala. To je malo pametnije od toga. Ako smanjite glasnoću, tihi će se zvukovi smanjiti, kao i glasni. Jedan od načina za to je prag 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 "ošišaju" bez izobličenja, a tihi ostaju takvi kakvi jesu. Donji kod prebacuje se između tri različite razine kompresije.

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

#uključi

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

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

  1. Prag - Razina na kojoj se zvuk smanjuje (mjereno u decibelima)
  2. Vrijeme napada - Vrijeme potrebno za rad kompresora nakon prekoračenja praga
  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 uporabi kompresije je zato što je prag vrlo nizak, a vrijeme napada i vrijeme otpuštanja vrlo su kratki što učinkovito rezultira oštrim 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 (čarobna matematika - izborno)

Otkrio sam da je naivno uvođenje kompresije dinamičkog raspona izazovno. Algoritam zahtijeva pretvorbu 16-bitnog cijelog broja u decibele, a zatim ga nakon pretvaranja signala natrag u 16-bitni cijeli broj. Primijetio sam da je jednom retku koda potrebno 10 mikrosekundi za obradu stereo podataka. Budući da 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 interpolacijskog postupka temeljenog na podijeljenim razlikama Netwona, možemo dobiti preciznost od gotovo 17 bita u 0,2 mikrosekunde. Priložio sam pdf dokument sa svom matematikom za istinski zainteresirane. Komplicirano je, upozoreni ste!

Korak 9: Wifi sučelje

Wifi sučelje
Wifi sučelje
Wifi sučelje
Wifi sučelje

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 -ja, prenijeti novu skicu, a zatim se ponovno povezati. Ovo je nespretno. Da bih to ispravio, 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 poslužitelja nalazi se u nastavku.

#uključi

#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* lozinka = "LOZINKA"; 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. Kad prvi put pokrenete ovaj kôd, trebali biste ga staviti na računalo. 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 chromu).

Do sada bismo trebali biti upoznati s načinom omogućavanja Bluetootha i I2S -a. Ključna razlika je uporaba webDSP objekta. Ovaj objekt uzima vaš Wifi SSID i lozinku kao argumente, kao i pokazivač na objekt btAudio. U glavnoj petlji neprestano dobivamo objekt webDSP da sluša dolazne podatke s web stranice, a zatim ažurira parametre DSP -a. 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 najbolju kvalitetu zvuka)
  • Za omogućavanje glasovnih naredbi upotrijebite I2S mikrofon
  • razviti ekvilajzer s WiFi kontrolom
  • Učinite to lijepo (ploča ne vrišti sjajan dizajn proizvoda)

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

Preporučeni: