Sisukord:

Bluetoothi heli- ja digitaalsignaali töötlemine: Arduino raamistik: 10 sammu
Bluetoothi heli- ja digitaalsignaali töötlemine: Arduino raamistik: 10 sammu

Video: Bluetoothi heli- ja digitaalsignaali töötlemine: Arduino raamistik: 10 sammu

Video: Bluetoothi heli- ja digitaalsignaali töötlemine: Arduino raamistik: 10 sammu
Video: CS50 Live, серия 003 2024, November
Anonim
Image
Image
Bluetoothi heli ja digitaalsignaali töötlemine: Arduino raamistik
Bluetoothi heli ja digitaalsignaali töötlemine: Arduino raamistik

Kokkuvõte

Kui ma mõtlen Bluetoothile, mõtlen ma muusikale, kuid kahjuks ei saa enamik mikrokontrollereid Bluetoothi kaudu muusikat esitada. Raspberry Pi saab, kuid see on arvuti. Tahan arendada Arduino -põhise raamistiku mikrokontrolleritele heli esitamiseks Bluetoothi kaudu. Mikrokontrolleri lihaste täielikuks painutamiseks lisan helile reaalajas digitaalse signaalitöötluse (DSP) (kõrgpääsfiltreerimine, madalpääsfiltreerimine ja dünaamilise vahemiku tihendamine). Peal oleva kirsi jaoks lisan veebiserveri, mida saab kasutada DSP juhtmevabaks konfigureerimiseks. Sisseehitatud video näitab Bluetooth -heli põhitõdesid tegevuses. Samuti näitab see, et kasutan veebiserverit mõne kõrgepääsfiltri, madalpääsfiltri ja dünaamilise vahemiku tihendamiseks. Dünaamilise ulatuse tihendamise esmakordne kasutamine põhjustab sihipäraselt moonutusi halva parameetrite valiku näitel. Teine näide kõrvaldab selle moonutuse.

Selle projekti jaoks on ESP32 valitud mikrokontroller. See maksab vähem kui 10 naela ja on varustatud ADC-de, DAC-de, Wifi, Bluetooth Low Energy, Bluetooth Classic ja 240MHz kahetuumalise protsessoriga. Pardal olev DAC suudab tehniliselt heli esitada, kuid see ei kõla suurepäraselt. Selle asemel kasutan Adafruit I2S stereodekoodrit, et tekitada line-out signaal. Selle signaali saab hõlpsasti saata mis tahes HiFi -süsteemi, et lisada kohe olemasolevale HiFi -süsteemile traadita heli.

Tarvikud

Loodetavasti on enamikul tegijatest leivaplaadid, džemprid, USB -kaablid, toiteploki jootekolvid ja nad peavad kulutama ainult 15 naela ESP32 -le ja stereodekoodrile. Kui ei, siis on kõik vajalikud osad loetletud allpool.

  • ESP32 - testitud mudelitel ESP32 -PICO -KIT ja TinyPico - 9,50 £/ 24 £
  • Adafruit I2S stereodekooder - 5,51 naela
  • Leivalaud - 3–5 naela
  • Jumperi juhtmed - 3 naela
  • Juhtmega kõrvaklapid/Hi -Fi süsteem - £ £ £
  • Tõukurpead või jootekolb - 2,10 £ / 30 £
  • Mikro -USB -kaabel - 2,10 £/ 3 £
  • 3,5 mm kuni RCA -pistikupesa/ 3,5 mm pistikupesa (või mis iganes teie kõlar vajab) - 2,40 £/ 1,50 £
  • USB toiteallikas - 5 naela

Samm: ehitus - leivaplaat

Ehitus - leivalaud
Ehitus - leivalaud

Kui ostsite ESP32-PICO-KIT, ei pea te jootma ühtegi tihvti, kuna see on eelnevalt joodetud. Asetage see lihtsalt leivaplaadile.

2. samm: ehitamine - tõukurpead/jootmine

Ehitus - tõukurpead/jootmine
Ehitus - tõukurpead/jootmine
Ehitus - tõukurpead/jootmine
Ehitus - tõukurpead/jootmine

Kui teil on jootekolb, jootke tihvtid stereodekoodrisse vastavalt Adafruit'i veebisaidi juhistele. Kirjutamise ajal oli minu jootekolb tööl, mis oli lukus. Ma ei tahtnud ajutise jootekolvi eest maksta, nii et lõikasin pimoronist mõned tõukepead. Lõikasin need nii, et need sobiksid stereodekoodrile. See ei ole parim lahendus (ja mitte see, kuidas päiseid kavatseti kasutada), kuid see on odavaim alternatiiv jootekolbile. Lükake lõigatud päis leivaplaadile. Dekoodri jaoks vajate ainult 1 rida 6 tihvti. Stabiilsuse tagamiseks võite teisele küljele lisada veel kuus, kuid see pole selle prototüübisüsteemi jaoks vajalik. Nööpnõelad päiste sisestamiseks on vin, 3vo, gnd, wsel, din ja bclk.

3. samm: ehitamine - ühendage toitenupud juhtmetega

Ehitus - ühendage toitenupud juhtmetega
Ehitus - ühendage toitenupud juhtmetega

Asetage stereodekooder tõukepeadele (vin, 3vo, gnd, wsel, din ja bclk tihvtid) ja suruge need kindlalt kokku. Jällegi tuleks seda ideaalis teha jootekolbiga, kuid ma pidin improviseerima. Märkate, et kõik selles juhendis olevad juhtmed on sinised. Seda seetõttu, et mul ei olnud hüppajajuhtmeid, nii et lõikasin 1 pika traadi väiksemateks tükkideks. Lisaks olen ma värvipime ega huvita tegelikult traadi värvi. Toitepoldid on kinnitatud järgmiselt:

3v3 (ESP32) -> stereo -dekoodril vin

gnd (ESP32) -> gnd stereodekoodril

4. samm: ehitus - I2S juhtmestik

Ehitus - I2S juhtmestik
Ehitus - I2S juhtmestik

Bluetooth -heli saatmiseks ESP32 -st stereodekoodrisse kasutame digitaalse suhtluse meetodit I2S. Stereodekooder võtab selle digitaalse signaali ja muudab selle analoogsignaaliks, mille saab ühendada kõlari või HiFi -ga. I2S vajab ainult 3 juhtmest ja on mõistetavalt lihtne. Bittkella (bclk) joon muutub kõrgeks ja madalaks, et näidata uue bitti edastamist. Andmeväljundi rida (dout) muutub kõrgeks või madalaks, et näidata, kas sellel bitil on väärtus 0 või 1, ja sõna valimise rida (wsel) muutub kõrgeks või madalaks, et näidata, kas edastatakse vasakut või paremat kanalit. Mitte iga mikrokontroller ei toeta I2S -i, kuid ESP32 -l on 2 I2S -liini. See teeb selle projekti jaoks ilmselge valiku.

Juhtmestik on järgmine:

27 (ESP32) -> wsel (stereodekooder)

25 (ESP32) -> din (stereodekooder)

26 (ESP32) -> bclk (stereodekooder)

Samm: BtAudio kogu installimine

BtAudio raamatukogu installimine
BtAudio raamatukogu installimine
BtAudio raamatukogu installimine
BtAudio raamatukogu installimine

Kui teil pole neid veel installitud, installige Arduino IDE ja Arduino tuum ESP32 jaoks. Kui olete need installinud, külastage minu Githubi lehte ja laadige hoidla alla. Arduino IDE raames visandis >> Kaasa raamatukogu >> valige "Lisa. ZIP -kogu". Seejärel valige allalaaditud zip -fail. See peaks lisama minu btAudio raamatukogu teie Arduino raamatukogudesse. Raamatukogu kasutamiseks peate Arduino visandisse lisama vastava päise. Seda näete järgmises etapis.

6. samm: BtAudio raamatukogu kasutamine

BtAudio raamatukogu kasutamine
BtAudio raamatukogu kasutamine
BtAudio raamatukogu kasutamine
BtAudio raamatukogu kasutamine

Pärast installimist ühendage oma ESP32 mikro -USB kaudu arvutiga ja seejärel ühendage stereodekooder kõlariga oma 3,5 mm juhtmega. Enne visandi üleslaadimist peate Arduino redaktoris mõnda asja muutma. Kui olete oma plaadi valinud, peate jaotises Tööriistad >> jaotusskeem muutma jaotusskeemi ja valima kas "No OTA (Large APP)" või "Minimal SPIFFS (Large APPS with OTA)". See on vajalik, kuna see projekt kasutab nii WiFi kui ka Bluetoothi, mis on mõlemad väga mälumahukad teegid. Kui olete selle teinud, laadige järgmine visand ESP32 -sse üles.

#kaasake

// Määrab heliseadme nime btAudio audio = btAudio ("ESP_Speaker"); void setup () {// voogesitab heliandmeid ESP32 audio.begin (); // väljastab vastuvõetud andmed I2S DAC -ile int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } void loop () {}

Eskiisi võib laias laastus jagada kolmeks etapiks:

  1. Looge üldine btAudio objekt, mis määrab teie ESP32 Bluetooth -nime
  2. Seadistage ESP32 heli vastu võtma meetodiga btAudio:: begin
  3. Seadke I2S tihvtid meetodiga btAudio:: I2S.

See on tarkvara poole pealt! Nüüd pole vaja teha muud, kui luua ESP32 -ga Bluetooth -ühendus. Lihtsalt otsige oma telefonist/sülearvutist/MP3 -mängijast uusi seadmeid ja ilmub "ESP_Speaker". Kui olete rahul, et kõik töötab (muusika mängib), saate ESP32 arvutist lahti ühendada. Lülitage see sisse USB -toiteallikaga ja see mäletab viimast sellele üles laaditud koodi. Nii saate oma ESP32 igavesti HiFi süsteemi taha peita.

Samm 7: DSP - filtreerimine

Vastuvõtja laiendamine digitaalse signaalitöötlusega

Kui järgisite kõiki samme (ja ma ei jätnud midagi välja), on teil nüüd HiFi -süsteemi jaoks täiesti toimiv Bluetooth -vastuvõtja. Kuigi see on lahe, ei suru see mikrokontrollerit tegelikult oma piiridesse. ESP32 -l on kaks tuuma, mis töötavad sagedusel 240 MHz. See tähendab, et see projekt on palju enamat kui lihtsalt vastuvõtja. See on võimeline olema digitaalse signaaliprotsessoriga (DSP) Bluetooth -vastuvõtja. DSP-d teostavad sisuliselt signaaliga matemaatilisi toiminguid reaalajas. Üks kasulik toiming on digitaalne filtreerimine. See protsess nõrgendab signaali sagedusi alla või üle teatud piirsageduse, sõltuvalt sellest, kas kasutate kõrg- või madalpääsfiltrit.

Kõrgpääsfiltrid

Kõrgpääsfiltrid nõrgendavad sagedusi alla teatud riba. Olen ehitanud Arduino süsteemidele filtriteegi, mis põhineb saidil earlevel.com esitatud koodil. Peamine erinevus seisneb selles, et olen muutnud klassi struktuuri, et hõlbustada kõrgema järgu filtrite ehitamist. Kõrgema astme filtrid summutavad tõhusamalt sagedusi, mis ületavad teie piire, kuid need nõuavad palju rohkem arvutamist. Kuid praeguse rakenduse korral saate reaalajas heli jaoks kasutada isegi kuuenda järgu filtreid!

Visand on sama, mis eelmises etapis, välja arvatud see, et oleme muutnud põhiahelat. Filtrite lubamiseks kasutame meetodit btAudio:: createFilter. See meetod aktsepteerib 3 argumenti. Esimene on filtrite kaskaadide arv. Filtri kaskaadide arv on pool filtri järjekorrast. Kuuenda järjekorra filtri puhul peaks esimene argument olema 3. Kaheksanda järgu filtri puhul oleks see 4. Teine argument on filtri katkestus. Olen seadistanud selle sagedusele 1000 Hz, et avaldada andmetele tõeliselt dramaatilist mõju. Lõpuks määrame kolmanda argumendiga failija tüübi. See peaks olema kõrgpääsfiltri jaoks ülemine ja madalpääsfiltri jaoks madalpääs. Allpool olev skript lülitab selle sageduse piirväärtuse vahemikku 1000 Hz ja 2 Hz. Te peaksite kuulda andmetele dramaatilist mõju.

#kaasake

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

Madalpääsfiltrid

Madalpääsfiltrid toimivad vastupidiselt kõrgpääsfiltritele ja summutavad teatud sagedusest kõrgemaid sagedusi. Neid saab rakendada samamoodi nagu kõrgpääsfiltreid, välja arvatud see, et nad peavad kolmanda argumendi muutma madalpääsuks. Allpool oleva visandi puhul vaheldan madalpääsulüliti vahemikus 2000 Hz kuni 20000 Hz. Loodetavasti kuulete erinevust. See peaks kõlama üsna summutatult, kui madalpääsfilter on sagedusel 2000 Hz.

#kaasake

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, madalpääs); viivitus (5000); audio.createFilter (3, 20000, madalpääs); }

8. samm: DSP - dünaamilise ulatuse tihendamine

Taust

Dünaamilise ulatuse tihendamine on signaalitöötlusmeetod, mis üritab heli valjust ühtlustada. See surub valjud helid, mis tõusevad üle teatud läve, vaiksete helide tasemele ja võimendab seejärel mõlemat. Tulemuseks on palju ühtlasem kuulamiskogemus. See tuli tõesti kasuks, kui vaatasin väga valju taustamuusika ja väga vaikse vokaaliga saadet. Sel juhul ei aidanud lihtsalt helitugevuse suurendamine, kuna see võimendas ainult taustamuusikat. Dünaamilise ulatuse kokkusurumisega saaksin valju taustamuusika taandada vokaali tasemele ja kuulda kõike uuesti korralikult.

Kood

Dünaamilise ulatuse kokkusurumine ei hõlma ainult helitugevuse vähendamist ega signaali lävendamist. See on natuke targem kui see. Kui vähendate helitugevust, vähenevad nii vaiksed helid kui ka valjud. Üks võimalus sellest on signaali lävendamine, kuid see põhjustab tõsiseid moonutusi. Dünaamilise vahemiku kokkusurumine hõlmab pehme lävepakkumise ja filtreerimise kombinatsiooni, et minimeerida moonutusi, mis tekiksid signaali lävendamisel/lõikamisel. Tulemuseks on signaal, kus valjud helid "kärbitakse" ilma moonutusteta ja vaiksed jäetakse selliseks, nagu nad on. Allpool olev kood lülitub kolme erineva tihendustaseme vahel.

  1. Tihendamine moonutustega
  2. Tihendamine ilma moonutusteta
  3. Kompressioon puudub

#kaasake

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

Dünaamilise vahemiku tihendamine on keeruline ja btAudio:: compress meetoditel on palju parameetreid. Proovin neid selgitada (järjekorras) siin:

  1. Lävi - tase, mille juures heli väheneb (mõõdetakse detsibellides)
  2. Rünnakuaeg - aeg, mis kulub kompressori tööle hakkamiseks pärast läve ületamist
  3. Vabastusaeg - aeg, mis kulub kompressori töö lõpetamiseks.
  4. Vähendusaste - tegur, mille võrra heli kokku surutakse.
  5. Põlve laius - laius (detsibellides) ümber läve, mille juures kompressor osaliselt töötab (loomulikum heli).
  6. Pärast tihendamist signaalile lisatud võimendus (detsibellid) (helitugevuse suurendamine/vähendamine)

Kompressiooni esmakordsel kasutamisel on väga kuuldav moonutus tingitud sellest, et lävi on väga madal ning nii rünnakuaeg kui ka vabastamisaeg on väga lühikesed, mille tulemuseks on karm läviv käitumine. See lahendatakse teisel juhul selgelt, suurendades vabastamisaega. Põhimõtteliselt paneb kompressor toimima palju sujuvamalt. Siin olen näidanud ainult seda, kuidas 1 parameetri muutmine võib helile dramaatiliselt mõjuda. Nüüd on teie kord katsetada erinevate parameetritega.

Rakendus (maagiline matemaatika - valikuline)

Leidsin, et dünaamilise vahemiku tihendamise naiivne rakendamine on keeruline. Algoritm nõuab 16-bitise täisarvu teisendamist detsibellideks ja pärast signaali töötlemist selle teisendamist 16-bitiseks täisarvuks. Märkasin, et üks koodirida võttis stereoandmete töötlemiseks 10 mikrosekundit. Kuna 44,1 KHz juures proovitud stereoheli jätab DSP -le vaid 11,3 mikrosekundit, on see lubamatult aeglane … Kuid väikese otsingutabeli (400 baiti) ja Netwoni jagatud erinevustel põhineva interpolatsiooniprotseduuri kombineerimisel saame 0,2 mikrosekundiga ligi 17 bitti. Lisasin pdf -dokumendi koos kõigi matemaatikaga tõeliselt huvitatud inimestele. See on keeruline, teid on hoiatatud!

Samm: Wifi liides

Wifi liides
Wifi liides
Wifi liides
Wifi liides

Nüüd on teil Bluetooth-vastuvõtja, mis on võimeline töötama reaalajas DSP-d. Kahjuks, kui soovite mõnda DSP parameetrit muuta, peate oma HiFi -ühenduse katkestama, laadima üles uue visandi ja seejärel uuesti ühenduse looma. See on kohmakas. Selle parandamiseks töötasin välja veebiserveri, mida saate kasutada kõigi DSP parameetrite muutmiseks ilma arvutiga uuesti ühendamata. Visand veebiserveri kasutamiseks on allpool.

#kaasake

#include btAudio audio = btAudio ("ESP_Speaker"); webDSP veeb; void setup () {Serial.begin (115200); audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); // asenda oma WiFi ID ja parooliga const char* ssid = "SSID"; const char* parool = "PASSWORD"; web.begin (ssid, parool ja heli); } void loop () {web._server.handleClient (); }

Kood määrab teie ESP32 -le IP -aadressi, mille abil saate veebilehele juurde pääseda. Selle koodi esmakordsel käivitamisel peaksite selle oma arvutisse kinnitama. Nii näete oma jaemonitoril ESP32 -le määratud IP -aadressi. Kui soovite sellele veebilehele juurde pääseda, sisestage see IP -aadress lihtsalt mis tahes veebibrauserisse (testitud Chrome'is).

Nüüdseks peaksime olema tuttavad Bluetoothi ja I2S -i lubamise meetodiga. Peamine erinevus on webDSP objekti kasutamine. See objekt kasutab teie Wifi SSID -d ja parooli argumentidena ning ka kursorina btAudio objektile. Põhiahelas saame pidevalt webDSP objekti veebilehelt saabuvaid andmeid kuulama ja seejärel DSP parameetreid värskendama. Lõpetuseks tuleb märkida, et nii Bluetooth kui ka Wifi kasutavad ESP32 raadiot. See tähendab, et peate võib -olla ootama kuni 10 sekundit alates veebilehel parameetrite sisestamisest kuni hetkeni, mil teave jõuab ESP32 -ni.

10. samm: tulevikuplaanid

Loodetavasti on teile see juhendatav meeldinud ja nüüd on teie HiFi -le lisatud Bluetooth Audio ja DSP. Siiski arvan, et selles projektis on palju arenguruumi ja tahtsin lihtsalt välja tuua mõned suunad, mida võiksin tulevikus võtta.

  • Luba heli Wifi voogesitus (parima helikvaliteedi saavutamiseks)
  • Kasutage häälkäskluste lubamiseks I2S -mikrofoni
  • arendage WiFi juhitav ekvalaiser
  • Tehke see ilusaks (leivaplaat ei hüüa suurepärast tootekujundust)

Kui hakkan neid ideid ellu viima, teen rohkem juhiseid. Või äkki rakendab keegi teine need funktsioonid. See on rõõm teha kõike avatud lähtekoodiga!

Soovitan: