Sisällysluettelo:
- Tarvikkeet
- Vaihe 1: Rakentaminen - Breadboard
- Vaihe 2: Rakentaminen - Työnnä otsikot/juotos
- Vaihe 3: Rakentaminen - Kytke virtajohdot
- Vaihe 4: Rakentaminen - I2S -johdotus
- Vaihe 5: BtAudio -kirjaston asennus
- Vaihe 6: BtAudio -kirjaston käyttö
- Vaihe 7: DSP - suodatus
- Vaihe 8: DSP - dynaamisen alueen pakkaus
- Vaihe 9: Wifi -käyttöliittymä
- Vaihe 10: Tulevaisuuden suunnitelmat
2025 Kirjoittaja: John Day | [email protected]. Viimeksi muokattu: 2025-01-13 06:57
Yhteenveto
Kun ajattelen Bluetoothia, ajattelen musiikkia, mutta valitettavasti useimmat mikro -ohjaimet eivät voi toistaa musiikkia Bluetoothin kautta. Raspberry Pi voi, mutta se on tietokone. Haluan kehittää Arduino -pohjaisen kehyksen mikro -ohjaimille äänen toistamiseksi Bluetoothin kautta. Taivuttaakseni täysin mikrokontrollerini lihakset, aion lisätä ääneen reaaliaikaisen digitaalisen signaalinkäsittelyn (DSP) (ylipäästösuodatus, alipäästösuodatus ja dynaamisen alueen pakkaus). Kirsikan päälle lisään verkkopalvelimen, jolla voidaan määrittää DSP langattomasti. Upotettu video näyttää Bluetooth -äänen perusteet toiminnassa. Se näyttää myös, että käytän verkkopalvelinta joidenkin ylipäästösuodatusten, alipäästösuodatusten ja dynaamisen alueen pakkaamisen suorittamiseen. Dynaamisen alueen pakkauksen ensimmäinen käyttö aiheuttaa tarkoituksella vääristymiä esimerkkinä huonoista parametrivalinnoista. Toinen esimerkki poistaa tämän vääristymän.
Tässä projektissa ESP32 on valittu mikrokontrolleri. Se maksaa alle 10 puntaa ja on täynnä ominaisuuksia, joissa on ADC, DAC, Wifi, Bluetooth Low Energy, Bluetooth Classic ja 240 MHz: n kaksoisydinsuoritin. Sisäänrakennettu DAC voi toistaa teknisesti ääntä, mutta se ei kuulosta hyvältä. Sen sijaan käytän Adafruit I2S -dekooderia linjalähtösignaalin tuottamiseen. Tämä signaali voidaan helposti lähettää mihin tahansa HiFi -järjestelmään langattoman äänen lisäämiseksi heti olemassa olevaan HiFi -järjestelmään.
Tarvikkeet
Toivottavasti useimmilla valmistajilla on leipälaudat, puserot, USB -kaapelit, virtalähteen juotosraudat ja heidän on käytettävä vain 15 puntaa ESP32: een ja stereodekooderiin. Jos ei, kaikki tarvittavat osat on lueteltu alla.
- ESP32 - testattu ESP32 -PICO -KIT- ja TinyPico -laitteilla - 9,50 £/ 24 €
- Adafruit I2S Stereodekooderi - 5,51 €
- Leipälauta - 3–5 puntaa
- Hyppyjohdot - 3 €
- Langalliset kuulokkeet/Hi -Fi -järjestelmä - €€€
- Push -otsikot tai juotosrauta - 2,10 € / 30 €
- Micro -USB -kaapeli - 2,10 €/ 3 €
- 3,5 mm: n RCA -liitin/ 3,5 mm: n liitäntä liittimeen (tai mitä kaiutin tarvitsee) - 2,40 £/ 1,50 £
- USB -virtalähde - 5 €
Vaihe 1: Rakentaminen - Breadboard
Jos ostit ESP32-PICO-KIT-sarjan, sinun ei tarvitse juottaa mitään nastoja, koska se on valmiiksi juotettu. Aseta se yksinkertaisesti leipälaudalle.
Vaihe 2: Rakentaminen - Työnnä otsikot/juotos
Jos sinulla on juotin, juota nastat stereodekooderiin Adafruit -verkkosivuston ohjeiden mukaisesti. Kirjoitushetkellä juotosraudani oli töissä, joka oli lukittu. En halunnut maksaa väliaikaisesta juotosraudasta, joten leikkasin joitakin push -otsikoita pimoronista. Leikkasin ne niin, että ne sopisivat stereodekooderiin. Tämä ei ole paras ratkaisu (eikä se, miten otsikoita oli tarkoitus käyttää), mutta se on halvin vaihtoehto juotosraudalle. Aseta leikattu otsikko leipälevylle. Tarvitset vain 1 rivin 6 nastaa dekooderia varten. Voit lisätä toiselle puolelle vielä kuusi vakauden vuoksi, mutta tämä ei ole välttämätöntä tälle prototyyppijärjestelmälle. Nastat, joihin otsikot voidaan sijoittaa, ovat vin, 3vo, gnd, wsel, din ja bclk.
Vaihe 3: Rakentaminen - Kytke virtajohdot
Aseta stereodekooderi työntöotsikoille (vin, 3vo, gnd, wsel, din ja bclk nastat) ja työnnä ne tiukasti yhteen. Jälleen kerran, tämä olisi hyvä tehdä juotosraudalla, mutta minun piti improvisoida. Huomaat, että kaikki tämän ohjeen johdot ovat sinisiä. Tämä johtuu siitä, että minulla ei ollut hyppyjohtoja, joten leikkasin yhden pitkän langan pienemmiksi paloiksi. Lisäksi olen värisokea enkä välitä langan väristä. Virtatapit kiinnitetään seuraavasti:
3v3 (ESP32) -> viniksi stereodekooderilla
gnd (ESP32) -> gnd stereo -dekooderilla
Vaihe 4: Rakentaminen - I2S -johdotus
Bluetooth -äänen lähettämiseksi ESP32: sta stereodekooderiin aiomme käyttää digitaalisen viestinnän menetelmää nimeltä I2S. Stereodekooderi ottaa tämän digitaalisen signaalin ja muuttaa sen analogiseksi signaaliksi, joka voidaan kytkeä kaiuttimeen tai hifi -laitteeseen. I2S vaatii vain 3 johtoa ja on kohtuullisen helppo ymmärtää. Bittikellon (bclk) linja kääntyy korkealle ja matalalle osoittamaan uuden bitin lähettämistä. Datan ulostulolinja (dout) kääntyy korkeaksi tai matalaksi ilmaistakseen, onko kyseisen bitin arvo 0 tai 1, ja sananvalintarivi (wsel) kääntyy korkeaksi tai matalaksi osoittaakseen, lähetetäänkö vasen vai oikea kanava. Kaikki mikro -ohjaimet eivät tue I2S: ää, mutta ESP32: ssa on 2 I2S -linjaa. Tämä tekee siitä ilmeisen valinnan tälle projektille.
Johdotus on seuraava:
27 (ESP32) -> wsel (Stereodekooderi)
25 (ESP32) -> din (Stereodekooderi)
26 (ESP32) -> bclk (Stereodekooderi)
Vaihe 5: BtAudio -kirjaston asennus
Jos sinulla ei ole niitä vielä asennettuna, asenna Arduino IDE ja Arduino -ydin ESP32: lle. Kun olet asentanut ne, käy Github -sivulla ja lataa arkisto. Valitse Arduino IDE -kohdasta Luonnos >> Sisällytä kirjasto >> valitsemalla "Lisää. ZIP -kirjasto". Valitse sitten ladattu zip -tiedosto. Tämän pitäisi lisätä btAudio -kirjasto Arduino -kirjastoihisi. Jos haluat käyttää kirjastoa, sinun on sisällytettävä vastaava otsikko Arduinon luonnokseen. Näet tämän seuraavassa vaiheessa.
Vaihe 6: BtAudio -kirjaston käyttö
Kun olet asentanut, liitä ESP32 tietokoneeseen mikro -USB: n kautta ja kytke sitten stereodekooderisi kaiuttimeen 3,5 mm: n johdolla. Ennen kuin lataat luonnoksen, sinun on muutettava joitain asioita Arduino -editorissa. Kun olet valinnut piirilevyn, sinun on muokattava osiointimalli kohdassa Työkalut >> Osiointimalli ja valittava joko "No OTA (Large APP)" tai "Minimal SPIFFS (Large APPS with OTA)". Tämä on välttämätöntä, koska tämä projekti käyttää sekä WiFi: tä että Bluetoothia, jotka ovat molemmat erittäin muistia vaativia kirjastoja. Kun olet tehnyt tämän, lataa seuraava luonnos ESP32: een.
#sisältää
// Asettaa äänilaitteen nimen btAudio audio = btAudio ("ESP_Speaker"); void setup () {// suoratoistaa äänidataa ESP32 audio.begin (); // antaa vastaanotetun datan I2S DAC: lle int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } void loop () {}
Luonnos voidaan laajasti jakaa kolmeen vaiheeseen:
- Luo yleinen btAudio -objekti, joka asettaa ESP32 -laitteen "Bluetooth -nimen"
- Määritä ESP32 vastaanottamaan ääntä btAudio:: begin -menetelmällä
- Aseta I2S -nastat btAudio:: I2S -menetelmällä.
Se on se ohjelmistopuolella! Sinun tarvitsee vain aloittaa Bluetooth -yhteys ESP32 -laitteeseesi. Etsi vain uusia laitteita puhelimestasi/kannettavastasi/MP3 -soittimestasi ja "ESP_Speaker" tulee näkyviin. Kun olet tyytyväinen, että kaikki toimii (musiikki soi), voit irrottaa ESP32 -laitteen tietokoneesta. Kytke virta USB -virtalähteellä, ja se muistaa viimeksi lataamasi koodin. Tällä tavalla voit jättää ESP32: n piiloon HiFi -järjestelmän taakse ikuisesti.
Vaihe 7: DSP - suodatus
Vastaanottimen laajentaminen digitaalisella signaalinkäsittelyllä
Jos teit kaikki vaiheet (enkä jättänyt mitään pois), sinulla on nyt täysin toimiva Bluetooth -vastaanotin HiFi -järjestelmääsi varten. Vaikka tämä on siistiä, se ei todellakaan työnnä mikro -ohjainta rajoilleen. ESP32: ssa on kaksi ydintä, jotka toimivat taajuudella 240 MHz. Tämä tarkoittaa, että tämä projekti on paljon enemmän kuin vain vastaanotin. Se voi olla Bluetooth -vastaanotin, jossa on digitaalinen signaaliprosessori (DSP). DSP: t suorittavat olennaisesti matemaattisia operaatioita signaalille reaaliajassa. Yksi hyödyllinen toiminto on nimeltään Digitaalinen suodatus. Tämä prosessi vaimentaa tietyn rajataajuuden alapuolella tai yläpuolella olevan signaalin taajuuksia riippuen siitä, käytätkö ylipäästö- vai alipäästösuodatinta.
Ylipäästösuodattimet
Ylipäästösuodattimet vaimentavat taajuuksia tietyn kaistan alapuolella. Olen rakentanut suodatinkirjaston Arduino -järjestelmille earlevel.com -koodin perusteella. Suurin ero on se, että olen muuttanut luokkarakennetta, jotta korkeamman asteen suodattimet voidaan rakentaa helpommin. Korkeamman asteen suodattimet tukahduttavat taajuudet raja -arvosi ulkopuolella tehokkaammin, mutta ne vaativat paljon enemmän laskentaa. Nykyisellä toteutuksella voit kuitenkin käyttää jopa kuudennen tilauksen suodattimia reaaliaikaiseen ääneen!
Luonnos on sama kuin edellisessä vaiheessa, paitsi että olemme muuttaneet pääsilmukan. Voit ottaa suodattimet käyttöön käyttämällä btAudio:: createFilter -menetelmää. Tämä menetelmä hyväksyy 3 argumenttia. Ensimmäinen on suodattimien kaskadien määrä. Suodattimen kaskadien määrä on puolet suodattimen järjestyksestä. Kuudennen kertaluvun suodattimen ensimmäisen argumentin tulisi olla 3. Kahdeksannen asteen suodattimen kohdalla se olisi 4. Toinen argumentti on suodattimen raja -arvo. Olen asettanut tämän 1000 Hz: iin, jotta minulla olisi todella dramaattinen vaikutus tietoihin. Lopuksi määritämme arkistotyypin kolmannella argumentilla. Tämän pitäisi olla ylipäästö ylipäästösuodattimelle ja alipäästö alipäästösuodattimelle. Alla oleva skripti vaihtaa tämän taajuuden raja -arvon välillä 1000 Hz ja 2 Hz. Sinun pitäisi kuulla dramaattinen vaikutus tietoihin.
#sisältää
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, ylipäästö); viive (5000); audio.createFilter (3, 2, ylipäästö); }
Alipäästösuodattimet
Alipäästösuodattimet toimivat päinvastoin kuin ylipäästösuodattimet ja tukahduttavat tietyn taajuuden ylittävät taajuudet. Ne voidaan toteuttaa samalla tavalla kuin ylipäästösuodattimet, paitsi että ne edellyttävät kolmannen argumentin muuttamista alipäästöksi. Alla olevassa luonnoksessa vaihdan alipäästön raja-arvon 2000 Hz ja 20000 Hz välillä. Toivottavasti kuulet eron. Sen pitäisi kuulostaa melko vaimealta, kun alipäästösuodatin on 2000 Hz: llä.
#sisältää
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, alipäästö); viive (5000); audio.createFilter (3, 20000, alipäästö); }
Vaihe 8: DSP - dynaamisen alueen pakkaus
Tausta
Dynaamisen alueen pakkaus on signaalinkäsittelymenetelmä, joka yrittää tasata äänen voimakkuuden. Se pakkaa kovat äänet, jotka nousevat tietyn kynnyksen yläpuolelle, hiljaisten tasolle ja vahvistaa sitten valinnaisesti molemmat. Tuloksena on paljon tasaisempi kuuntelukokemus. Tästä oli todella hyötyä, kun katselin ohjelmaa, jossa oli erittäin kova taustamusiikki ja erittäin hiljainen laulu. Tässä tapauksessa vain äänenvoimakkuuden lisääminen ei auttanut, koska tämä vain vahvisti taustamusiikkia. Dynaamisen alueen pakkauksella voisin vähentää kovan taustamusiikin laulun tasolle ja kuulla kaiken oikein uudelleen.
Koodi
Dynaamisen alueen pakkaus ei tarkoita pelkästään äänenvoimakkuuden alentamista tai signaalin kynnyksen asettamista. Se on vähän fiksumpaa kuin se. Jos pienennät äänenvoimakkuutta, hiljaiset äänet ja kovat äänet vähenevät. Yksi tapa kiertää tämä on rajata signaali, mutta tämä johtaa vakaviin vääristymiin. Dynaamisen alueen pakkaus sisältää pehmeän kynnyksen ja suodatuksen yhdistelmän minimoidaksesi vääristymän, joka aiheutuisi, jos kynnettäisiin/leikattaisiin signaali. Tuloksena on signaali, jossa kovat äänet "leikataan" ilman vääristymiä ja hiljaiset jätetään sellaisiksi. Alla oleva koodi vaihtaa kolmen eri pakkausasteen välillä.
- Pakkaus ja vääristymä
- Pakkaus ilman vääristymiä
- Ei pakkaus
#sisältää
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); viive (5000); audio.compress (30, 0,0001, 0,1, 10, 10, 0); viive (5000); audio.decompress (); }
Dynaamisen alueen pakkaus on monimutkaista ja btAudio:: compress -menetelmillä on monia parametreja. Yritän selittää ne (järjestyksessä) täällä:
- Kynnys - taso, jolla ääni vähenee (mitattu desibeleinä)
- Hyökkäysaika - Aika, joka kuluu kompressorin käynnistymiseen kynnyksen ylittymisen jälkeen
- Vapautusaika - Aika, joka kuluu kompressorin lakkaamiseen.
- Vähennyssuhde - tekijä, jolla ääni pakataan.
- Polven leveys - Leveys (desibeleinä) kynnyksen ympärillä, jolla kompressori toimii osittain (luonnollisempi ääni).
- Vahvistus (desibelit) lisätään signaaliin pakkauksen jälkeen (äänenvoimakkuuden lisääminen/vähentäminen)
Erittäin kuultava vääristymä pakkauksen ensimmäisessä käytössä johtuu siitä, että kynnys on hyvin alhainen ja hyökkäys- ja vapautumisaika ovat erittäin lyhyitä, mikä johtaa tehokkaaseen kynnyskäyttäytymiseen. Tämä ratkaistaan selvästi toisessa tapauksessa lisäämällä julkaisuaikaa. Tämä saa kompressorin toimimaan olennaisesti paljon tasaisemmin. Tässä olen vain osoittanut, kuinka yhden parametrin muuttaminen voi vaikuttaa dramaattisesti ääneen. Nyt on sinun vuorosi kokeilla erilaisia parametreja.
Toteutus (maaginen matematiikka - valinnainen)
Huomasin, että dynaamisten alueiden pakkaamisen toteuttaminen naiivisti on haastavaa. Algoritmi edellyttää 16-bittisen kokonaisluvun muuntamista desibeleiksi ja sen muuttamisen takaisin 16-bittiseksi kokonaisluvuksi, kun olet käsitellyt signaalin. Huomasin, että yksi koodirivi kesti 10 mikrosekuntia stereotietojen käsittelyyn. Koska 44,1 KHz: n näytteenotolla otettu stereoääni jättää DSP: lle vain 11,3 mikrosekuntia, tämä on kohtuuttoman hidasta… Yhdistämällä kuitenkin pieni hakutaulukko (400 tavua) ja Netwonin jaettuihin eroihin perustuva interpolointimenettely voimme saavuttaa lähes 17 bitin tarkkuuden 0,2 mikrosekunnissa. Olen liittänyt pdf -asiakirjan, jossa on kaikki todella kiinnostuneiden matematiikka. Se on monimutkaista, sinua on varoitettu!
Vaihe 9: Wifi -käyttöliittymä
Nyt sinulla on Bluetooth-vastaanotin, joka pystyy suorittamaan reaaliaikaisen DSP: n. Valitettavasti, jos haluat muuttaa jotakin DSP -parametria, sinun on katkaistava yhteys HiFi -laitteeseen, lähetä uusi luonnos ja muodosta sitten yhteys uudelleen. Tämä on kömpelöä. Tämän korjaamiseksi kehitin verkkopalvelimen, jonka avulla voit muokata kaikkia DSP -parametreja muodostamatta yhteyttä tietokoneeseen. Luonnos verkkopalvelimen käytöstä on alla.
#sisältää
#include btAudio audio = btAudio ("ESP_Speaker"); webDSP -verkko; void setup () {Serial.begin (115200); audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); // korvaa WiFi -tunnuksellasi ja salasanallasi const char* ssid = "SSID"; const char* password = "SALASANA"; web.begin (ssid, salasana ja ääni); } void loop () {web._server.handleClient (); }
Koodi määrittää ESP32: lle IP -osoitteen, jonka avulla voit käyttää verkkosivua. Kun käytät tätä koodia ensimmäisen kerran, se on liitettävä tietokoneeseen. Näin voit nähdä ESP32: lle määritetyn IP -osoitteen sarjamonitorissasi. Jos haluat käyttää tätä verkkosivua, kirjoita tämä IP -osoite mihin tahansa verkkoselaimeen (testattu kromilla).
Tähän mennessä meidän pitäisi tuntea tapa ottaa Bluetooth ja I2S käyttöön. Keskeinen ero on webDSP -objektin käyttö. Tämä objekti käyttää Wifi -SSID -tunnusta ja salasanaa argumentteina sekä osoittimena btAudio -objektiin. Pääsilmukassa saamme jatkuvasti webDSP -objektin kuuntelemaan verkkosivulta tulevaa dataa ja päivittämään sitten DSP -parametrit. Lopuksi on huomattava, että sekä Bluetooth että Wifi käyttävät samaa radiota ESP32: ssa. Tämä tarkoittaa, että saatat joutua odottamaan jopa 10 sekuntia parametrien syöttämisestä verkkosivulle siihen saakka, kun tiedot todella saavuttavat ESP32: n.
Vaihe 10: Tulevaisuuden suunnitelmat
Toivottavasti olet nauttinut tästä ohjeesta ja nyt Bluetooth -ääni ja DSP on lisätty hifi -laitteeseesi. Luulen kuitenkin, että tässä projektissa on paljon kasvunvaraa, ja halusin vain tuoda esiin joitain tulevia suuntiin, joita voisin ottaa.
- Ota äänen Wifi -suoratoisto käyttöön (paras äänenlaatu)
- Käytä äänikomentoja I2S -mikrofonin avulla
- kehittää WiFi -ohjattu taajuuskorjain
- Tee siitä kaunis (leipälauta ei huuda upeaa tuotesuunnittelua)
Kun pääsen toteuttamaan näitä ideoita, teen enemmän ohjattavia asioita. Tai ehkä joku muu saa nämä ominaisuudet käyttöön. Se on ilo tehdä kaikesta avoimen lähdekoodin!