Innholdsfortegnelse:
- Rekvisita
- Trinn 1: Konstruksjon - brødbrettet
- Trinn 2: Konstruksjon - Trykkhoder/lodding
- Trinn 3: Konstruksjon - Koble til strømnålene
- Trinn 4: Konstruksjon - I2S ledninger
- Trinn 5: Installere BtAudio -biblioteket
- Trinn 6: Bruke BtAudio -biblioteket
- Trinn 7: DSP - Filtrering
- Trinn 8: DSP - Dynamic Range Compression
- Trinn 9: Wifi -grensesnittet
- Trinn 10: Fremtidsplaner
Video: Bluetooth Audio & Digital Signal Processing: an Arduino Framework: 10 Steps
2024 Forfatter: John Day | [email protected]. Sist endret: 2024-01-30 11:21
Sammendrag
Når jeg tenker på Bluetooth, tenker jeg på musikk, men dessverre kan de fleste mikrokontrollere ikke spille musikk via Bluetooth. Raspberry Pi kan, men det er en datamaskin. Jeg vil utvikle et Arduino -basert rammeverk for mikrokontrollere for å spille av lyd via Bluetooth. For å bøye mikrokontrollerens muskler fullt ut kommer jeg til å legge til sanntids digital signalbehandling (DSP) i lyden (høypasfiltrering, lavpasfiltrering og komprimering av dynamisk område). For kirsebæret på toppen, vil jeg legge til en webserver som kan brukes til å konfigurere DSP trådløst. Den innebygde videoen viser det grunnleggende om Bluetooth -lyd i bruk. Det viser meg også at jeg bruker webserveren til å utføre noen høypassfiltrering, lavpassfiltrering og komprimering av dynamisk område. Den første bruken av dynamisk områdekomprimering forårsaker målrettet forvrengning som et eksempel på dårlige parametervalg. Det andre eksemplet eliminerer denne forvrengningen.
For dette prosjektet er ESP32 den foretrukne mikrokontrolleren. Den koster mindre enn £ 10 og er fullpakket med ADC, DAC, Wifi, Bluetooth Low Energy, Bluetooth Classic og en 240 MHz dual-core prosessor. Innebygd DAC kan teknisk spille av lyd, men det høres ikke bra ut. I stedet vil jeg bruke Adafruit I2S stereo dekoder for å produsere et line-out signal. Dette signalet kan enkelt sendes til ethvert HiFi -system for å umiddelbart legge til trådløs lyd til ditt eksisterende HiFi -system.
Rekvisita
Forhåpentligvis vil de fleste produsenter ha brødbrett, hoppere, USB -kabler, loddejern for strømforsyning og trenger bare å bruke £ 15 på ESP32 og stereodekoder. Hvis ikke, er alle nødvendige deler listet nedenfor.
- En ESP32 - testet på ESP32 -PICO -KIT og TinyPico - £ 9,50/ £ 24
- Adafruit I2S Stereo Decoder - £ 5.51
- Breadboard - £ 3 - £ 5 hver
- Stikkledninger - £ 3
- Kablet hodetelefoner/Hi -Fi -system - £ $$$
- Trykkhoder eller loddejern - £ 2,10 / £ 30
- Micro USB -kabel - £ 2,10/ £ 3
- 3,5 mm til RCA -kontakt/ 3,5 mm kontakt til jack (eller hva høyttaleren din trenger) - 2,40 kr/ 1,50 kr
- USB -strømforsyning - £ 5
Trinn 1: Konstruksjon - brødbrettet
Hvis du kjøpte ESP32-PICO-KIT, trenger du ikke å lodde noen pinner da den kommer ferdig loddet. Bare legg den på brødbrettet.
Trinn 2: Konstruksjon - Trykkhoder/lodding
Hvis du har et loddejern, loddes pinnene til stereodekoderen i henhold til instruksjonene på Adafruit -nettstedet. I skrivende stund var loddejernet mitt på jobb som var låst. Jeg ville ikke betale for et midlertidig loddejern, så jeg kuttet opp noen skyvehoder fra pimoroni. Jeg kuttet dem opp slik at de passet til stereodekoderen. Dette er ikke den beste løsningen (og ikke hvordan overskriftene var ment å bli brukt), men det er det billigste alternativet til et loddejern. Fest den oppskårne overskriften på brødbrettet. Du trenger bare 1 linje med 6 pinner for dekoderen. Du kan legge til ytterligere seks på den andre siden for stabilitet, men dette er ikke nødvendig for dette prototypesystemet. Pinnene å sette hodene i er vin, 3vo, gnd, wsel, din og bclk.
Trinn 3: Konstruksjon - Koble til strømnålene
Plasser Stereo -dekoderen på skyvehodene (vin, 3vo, gnd, wsel, din og bclk pins) og skyv dem godt sammen. Igjen, dette bør ideelt sett gjøres med et loddejern, men jeg måtte improvisere. Du vil legge merke til at alle ledningene i denne instruksjonsboken er blå. Det er fordi jeg ikke hadde noen hoppetråder, så jeg kuttet 1 lang ledning i mindre biter. Jeg er også fargeblind og bryr meg egentlig ikke om trådfargen. Strømpinnene er festet som følger:
3v3 (ESP32) -> til vin på stereodekoder
gnd (ESP32) -> til gnd på stereodekoder
Trinn 4: Konstruksjon - I2S ledninger
For å sende Bluetooth -lyden fra ESP32 til stereodekoderen, skal vi bruke en metode for digital kommunikasjon kalt I2S. Stereodekoderen tar dette digitale signalet og gjør det til et analogt signal som kan kobles til en høyttaler eller HiFi. I2S krever bare 3 ledninger og er rimelig grei å forstå. Bitklokke -linjen (bclk) svinger høyt og lavt for å indikere at en ny bit blir overført. Data-out-linjen (dout) svinger høyt eller lavt for å indikere om den biten har en verdi på 0 eller 1 og ordvelgerlinjen (wsel) blir høy eller lav for å indikere om venstre eller høyre kanal overføres. Ikke alle mikrokontroller støtter I2S, men ESP32 har 2 I2S -linjer. Dette gjør det til et åpenbart valg for dette prosjektet.
Kablingene er som følger:
27 (ESP32) -> wsel (Stereo dekoder)
25 (ESP32) -> din (Stereo dekoder)
26 (ESP32) -> bclk (Stereo dekoder)
Trinn 5: Installere BtAudio -biblioteket
Hvis du ikke allerede har dem installert, installer Arduino IDE og Arduino -kjernen for ESP32. Når du har installert dem, kan du gå til Github -siden min og laste ned depotet. I Arduino IDE under Sketch >> Include Library >> velg "Add. ZIP library". Velg deretter den nedlastede zip -filen. Dette bør legge til btAudio -biblioteket mitt i Arduino -bibliotekene dine. For å bruke biblioteket må du inkludere den relevante overskriften i Arduino -skissen. Du ser dette i neste trinn.
Trinn 6: Bruke BtAudio -biblioteket
Når den er installert, kobler du ESP32 til datamaskinen via mikro -USB og kobler deretter stereodekoderen til høyttaleren med en 3,5 mm ledning. Før du laster opp skissen, må du endre noen ting i Arduino -editoren. Etter at du har valgt brettet ditt, må du redigere partisjonsopplegget under Verktøy >> Partisjonsskjema og velge enten "No OTA (Large APP)" eller "Minimal SPIFFS (Large APPS with OTA)". Dette er nødvendig fordi dette prosjektet bruker både WiFi og Bluetooth, som begge er svært minne tunge biblioteker. Når du har gjort dette, last opp følgende skisse til ESP32.
#inkludere
// Angir navnet på lydenheten btAudio audio = btAudio ("ESP_Speaker"); void setup () {// strømmer lyddata til ESP32 audio.begin (); // sender ut mottatte data til en I2S DAC int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } void loop () {}
Skissen kan stort sett deles inn i 3 trinn:
- Lag et globalt btAudio -objekt som angir "Bluetooth -navnet" på ESP32
- Konfigurer ESP32 til å motta lyd med btAudio:: start -metoden
- Sett I2S -pinnene med btAudio:: I2S -metoden.
Det er det på programvaresiden! Alt du trenger å gjøre er å starte Bluetooth -tilkoblingen til ESP32. Bare søk etter nye enheter på telefonen/bærbar PC/MP3 -spiller, og "ESP_Speaker" vises. Når du er glad for at alt fungerer (musikk spilles av) kan du koble ESP32 fra datamaskinen. Slå den på med USB -strømforsyningen, så husker den den siste koden du lastet opp til den. På denne måten kan du la ESP32 være skjult bak HiFi -systemet ditt for alltid.
Trinn 7: DSP - Filtrering
Utvidelse av mottakeren med digital signalbehandling
Hvis du fulgte alle trinnene (og jeg utelot ingenting) har du nå en fullt fungerende Bluetooth -mottaker for HiFi -systemet. Selv om dette er kult, presser det egentlig ikke mikrokontrolleren til sine grenser. ESP32 har to kjerner som opererer ved 240MHz. Det betyr at dette prosjektet er langt mer enn bare en mottaker. Den har kapasitet til å være en Bluetooth -mottaker med en digital signalprosessor (DSP). DSP-er utfører i hovedsak matematiske operasjoner på signalet i sanntid. En nyttig operasjon kalles Digital filtrering. Denne prosessen demper frekvenser i et signal under eller over en viss grensefrekvens, avhengig av om du bruker et høypass- eller lavpassfilter.
Høypassfiltre
Høypass-filtre demper frekvenser under et bestemt bånd. Jeg har bygget et filterbibliotek for Arduino -systemer basert på kode fra earlevel.com. Hovedforskjellen er at jeg har endret klassestrukturen for å gjøre det lettere å bygge filtre av høyere orden. Filtre av høyere rekkefølge undertrykker frekvenser utenfor grenseverdi mer effektivt, men de krever mye mer beregning. Men med den nåværende implementeringen kan du til og med bruke sjette ordens filtre for sanntidslyd!
Skissen er den samme som den som ble funnet i forrige trinn bortsett fra at vi har endret hovedsløyfen. For å aktivere filtrene bruker vi btAudio:: createFilter -metoden. Denne metoden godtar 3 argumenter. Den første er antall filterkaskader. Antall filterkaskader er halvparten av filterets rekkefølge. For et sjette ordens filter, bør det første argumentet være 3. For et filter i åttende orden, vil det være 4. Det andre argumentet er filter cutoff. Jeg har satt dette til 1000Hz for å ha en veldig dramatisk effekt på dataene. Til slutt spesifiserer vi typen filer med det tredje argumentet. Dette bør være høypass for et høypassfilter og lavpass for et lavpassfilter. Skriptet nedenfor bytter avbrudd for denne frekvensen mellom 1000Hz og 2Hz. Du bør høre en dramatisk effekt på dataene.
#inkludere
btAudio audio = btAudio ("ESP_Speaker"); ugyldig oppsett () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } void loop () {delay (5000); audio.createFilter (3, 1000, høypass); forsinkelse (5000); audio.createFilter (3, 2, høypass); }
Lavpassfiltre
Lavpassfiltre gjør det motsatte av høypassfiltre og undertrykker frekvenser over en viss frekvens. De kan implementeres på samme måte som høypasfiltre bortsett fra at de krever endring av det tredje argumentet til lavpass. For skissen nedenfor veksler jeg lavpass-cutoff mellom 2000Hz og 20000Hz. Forhåpentligvis vil du høre forskjellen. Det skal høres ganske dempet ut når lavpassfilteret er på 2000Hz.
#inkludere
btAudio audio = btAudio ("ESP_Speaker"); ugyldig oppsett () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } void loop () {delay (5000); audio.createFilter (3, 2000, lavpass); forsinkelse (5000); audio.createFilter (3, 20000, lavpass); }
Trinn 8: DSP - Dynamic Range Compression
Bakgrunn
Komprimering av dynamisk område er en signalbehandlingsmetode som prøver å jevne ut lydstyrken. Den komprimerer høye lyder, som stiger over en viss terskel, til nivået med stille og forsterker deretter eventuelt begge. Resultatet er en mye jevnere lytteopplevelse. Dette var veldig nyttig mens jeg så på et show med veldig høy bakgrunnsmusikk og veldig stille vokal. I dette tilfellet hjalp det bare å øke volumet, da dette bare forsterket bakgrunnsmusikken. Med komprimering av dynamisk område kunne jeg redusere den høye bakgrunnsmusikken til nivået på vokalen og høre alt ordentlig igjen.
Koden
Komprimering av dynamisk område innebærer ikke bare å senke volumet eller terskle for signalet. Det er litt mer smart enn det. Hvis du senker volumet, vil stille lyder reduseres så vel som de høye. En vei rundt dette er å terskel signalet, men dette resulterer i alvorlig forvrengning. Komprimering av dynamisk område innebærer en kombinasjon av myk terskel og filtrering for å minimere forvrengningen man ville få hvis man skulle terskle/klippe signalet. Resultatet er et signal der de høye lydene "klippes" uten forvrengning og de stille blir stående som de er. Koden nedenfor bytter mellom tre forskjellige komprimeringsnivåer.
- Komprimering med forvrengning
- Komprimering uten forvrengning
- Ingen komprimering
#inkludere
btAudio audio = btAudio ("ESP_Speaker"); ugyldig oppsett () {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); forsinkelse (5000); audio.compress (30, 0,0001, 0,1, 10, 10, 0); forsinkelse (5000); audio.decompress (); }
Komprimering av dynamisk område er komplisert og btAudio:: komprimeringsmetodene har mange parametere. Jeg skal prøve å forklare dem (i rekkefølge) her:
- Terskel - Nivået der lyden reduseres (målt i desibel)
- Angrepstid - Tiden det tar før kompressoren begynner å fungere når terskelen er overskredet
- Slipptid - Tiden det tar før kompressoren slutter å fungere.
- Reduksjonsforhold - faktoren som lyden komprimeres med.
- Knebredde - Bredden (i desibel) rundt terskelen der kompressoren delvis fungerer (mer naturlig lyd).
- Forsterkningen (desibel) lagt til signalet etter komprimering (øk/reduser volum)
Den svært hørbare forvrengningen ved første bruk av komprimering er fordi terskelen er veldig lav og både angrepstiden og frigjøringstiden er veldig kort effektivt, noe som resulterer i en hard terskelatferd. Dette er klart løst i det andre tilfellet ved å øke utgivelsestiden. Dette får kompressoren til å fungere på en mye jevnere måte. Her har jeg bare vist hvordan endring av 1 parameter kan ha en dramatisk effekt på lyden. Nå er det din tur til å eksperimentere med forskjellige parametere.
Implementeringen (den magiske matematikken - valgfritt)
Jeg syntes det var naivt å implementere komprimering av dynamisk område for å være utfordrende. Algoritmen krever konvertering av et 16-bits heltall til desibel og deretter transformere det tilbake til et 16-bits heltall når du har behandlet signalet. Jeg la merke til at en kodelinje tok 10 mikrosekunder for å behandle stereodata. Ettersom stereolyd samplet ved 44,1 KHz bare etterlater 11,3 mikrosekunder for DSP, er dette uakseptabelt tregt … Men ved å kombinere et lite oppslagstabell (400 byte) og en interpoleringsprosedyre basert på Netwons delte forskjeller kan vi oppnå nesten 17 bits presisjon på 0,2 mikrosekunder. Jeg har lagt ved et pdf -dokument med all matematikk for de virkelig interesserte. Det er komplisert, du har blitt advart!
Trinn 9: Wifi -grensesnittet
Nå har du en Bluetooth-mottaker som kan kjøre DSP i sanntid. Dessverre, hvis du vil endre noen av DSP -parameterne, må du koble fra HiFi, laste opp en ny skisse og deretter koble til igjen. Dette er klumpete. For å fikse dette utviklet jeg en webserver som du kan bruke til å redigere alle DSP -parameterne uten å koble til datamaskinen på nytt. Skissen for å bruke webserveren er nedenfor.
#inkludere
#include btAudio audio = btAudio ("ESP_Speaker"); webDSP web; ugyldig oppsett () {Serial.begin (115200); audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); // bytt ut med WiFi -ID og passord const char* ssid = "SSID"; const char* passord = "PASSORD"; web.begin (ssid, passord og lyd); } void loop () {web._server.handleClient (); }
Koden tilordner en IP -adresse til ESP32 som du kan bruke for å få tilgang til websiden. Første gang du kjører denne koden, bør du ha den koblet til datamaskinen din. På den måten kan du se IP -adressen tilordnet ESP32 på den serielle skjermen. Hvis du vil ha tilgang til denne nettsiden, bare skriv inn denne IP -adressen i en hvilken som helst nettleser (testet på chrome).
Nå bør vi være kjent med metoden for å aktivere Bluetooth og I2S. Hovedforskjellen er bruken av et webDSP -objekt. Dette objektet tar Wifi SSID og passord som argumenter, så vel som en peker til btAudio -objektet. I hovedløkken får vi kontinuerlig webDSP -objektet til å lytte etter innkommende data fra nettsiden og deretter oppdatere DSP -parametrene. Som en avslutning må det bemerkes at både Bluetooth og Wifi bruker samme radio på ESP32. Dette betyr at du kanskje må vente i opptil 10 sekunder fra du angir parametere på websiden til informasjonen faktisk når ESP32.
Trinn 10: Fremtidsplaner
Forhåpentligvis har du hatt glede av dette og har nå fått Bluetooth Audio og DSP lagt til HiFi. Imidlertid tror jeg det er mye rom for vekst i dette prosjektet, og jeg ville bare peke på noen retninger jeg kan ta fremover.
- Aktiver Wifi -streaming av lyd (for best lydkvalitet)
- Bruk en I2S -mikrofon for å aktivere talekommandoer
- utvikle en WiFi -kontrollert equalizer
- Gjør det pent (brødbrett skriker ikke godt produktdesign)
Når jeg kommer til å implementere disse ideene, vil jeg lage flere instrukser. Eller kanskje noen andre vil få disse funksjonene implementert. Det er gleden ved å gjøre alt til åpen kildekode!
Anbefalt:
555 Timer to Emit Signal to Interrupt Atmega328: 7 Steps
555 Timer to Emit Signal to Interrupt Atmega328: Hovedmålet med denne kretsen er å spare energi. Så jeg kommer ikke til å snakke om arduino fordi brettet selv har unødvendig kraftoverhead for et sluttprodukt. Det er flott for utvikling. Men, ikke veldig bra for sluttprosjekter som kjører på batt
LibMiletus IoT Framework on DragonBoard: 4 trinn
LibMiletus IoT Framework on DragonBoard: LibMiletus er et interoperabelt rammeverk med åpen kildekode som lar IoT-enheter identifisere seg på et nettverk og dermed kontrolleres av andre enheter på dette nettverket
DIY Arduino Audio Signal Spectrum Analyzer: 3 trinn
DIY Arduino Audio Signal Spectrum Analyzer: Dette er en veldig enkel lydanalysator med visuelle moduser som kan endres
Conexión Serial Arduino a Processing (acelerómetro En Anillo): 5 trinn
Seriekoppling Arduino a Processing (acelerómetro En Anillo): Mye forberedt på en informasjon som kan behandles. Ac á les muestro la manera en que yo lo resuelvo, no es la ú nica, pero es bastante efectiva, ya que en Processing, la recepc
Arduino Processing Graphic Transition: 5 trinn
Arduino Processing Graphic Transition: Hei, dette prosjektet er for å lage synlig grafikk fra usynlige partikler som kan føles av sensorer. I dette tilfellet brukte jeg ultralydsensoren og fotoresistoren for å kontrollere lys og avstand. Jeg visualiserer det ved å lage variablene fra selve