Indholdsfortegnelse:

Bluetooth -lyd og digital signalbehandling: en Arduino -ramme: 10 trin
Bluetooth -lyd og digital signalbehandling: en Arduino -ramme: 10 trin

Video: Bluetooth -lyd og digital signalbehandling: en Arduino -ramme: 10 trin

Video: Bluetooth -lyd og digital signalbehandling: en Arduino -ramme: 10 trin
Video: Домашняя автоматизация: как использовать 7 программ от 0,1 с до 9999 минут, релейный таймер XY-LJ02 2024, November
Anonim
Image
Image
Bluetooth Audio & Digital Signal Processing: en Arduino Framework
Bluetooth Audio & Digital Signal Processing: en Arduino Framework

Resumé

Når jeg tænker på Bluetooth, tænker jeg på musik, men desværre kan de fleste mikrokontrollere ikke afspille musik via Bluetooth. Raspberry Pi kan, men det er en computer. Jeg vil udvikle en Arduino -baseret ramme for mikrokontrollere til at afspille lyd via Bluetooth. For fuldt ud at bøje min mikrocontrollers muskler vil jeg tilføje real-time Digital Signal Processing (DSP) til lyden (højpasfiltrering, lavpasfiltrering og dynamisk områdekomprimering). Til kirsebær på toppen tilføjer jeg en webserver, der kan bruges til at konfigurere DSP trådløst. Den integrerede video viser det grundlæggende ved Bluetooth -lyd i aktion. Det viser mig også, at jeg bruger webserveren til at udføre noget højpasfiltrering, lavpasfiltrering og komprimering af dynamisk område. Den første brug af dynamisk områdekomprimering forårsager målrettet forvrængning som et eksempel på dårlige parametervalg. Det andet eksempel eliminerer denne forvrængning.

For dette projekt er ESP32 den foretrukne mikrokontroller. Det koster mindre end £ 10 og er fyldt med ADC'er, DAC'er, Wifi, Bluetooth Low Energy, Bluetooth Classic og en 240MHz dual-core processor. Den indbyggede DAC kan teknisk afspille lyd, men det lyder ikke godt. I stedet vil jeg bruge Adafruit I2S stereo dekoder til at producere et line-out signal. Dette signal kan let sendes til ethvert HiFi -system for øjeblikkeligt at tilføje trådløs lyd til dit eksisterende HiFi -system.

Forbrugsvarer

Forhåbentlig vil de fleste producenter have brødbrætter, jumpere, USB -kabler, strømforsyning loddejern og kun skulle bruge £ 15 på ESP32 og stereo dekoder. Hvis ikke, er alle de nødvendige dele angivet nedenfor.

  • En ESP32 - testet på ESP32 -PICO -KIT og TinyPico - £ 9,50/ £ 24
  • Adafruit I2S Stereo Decoder - 5,51 £
  • Breadboard - £ 3- £ 5 hver
  • Jumperwires - £ 3
  • Kablet hovedtelefoner/Hi -Fi -system - £ $$$
  • Skubberhoveder eller loddejern - 2,10 £ / 30 £
  • Micro USB -kabel - £ 2,10/ £ 3
  • 3,5 mm til RCA -stik/ 3,5 mm jack til jack (eller hvad din højttaler har brug for) - 2,40 £/ 1,50 £
  • USB -strømforsyning - £ 5

Trin 1: Konstruktion - brødbrættet

Konstruktion - brødbrættet
Konstruktion - brødbrættet

Hvis du har købt ESP32-PICO-KIT, behøver du ikke at lodde nogen stifter, da den kommer før loddet. Placer det ganske enkelt på brødbrættet.

Trin 2: Konstruktion - Push Headers/lodning

Konstruktion - Push Headers/lodning
Konstruktion - Push Headers/lodning
Konstruktion - Push Headers/lodning
Konstruktion - Push Headers/lodning

Hvis du har et loddejern, loddes stifterne til stereodekoderen i henhold til instruktionerne på Adafruit -webstedet. I skrivende stund var mit loddejern på arbejde, som var låst. Jeg ville ikke betale for et midlertidigt loddejern, så jeg skar nogle skubberhoveder fra pimoroni. Jeg skar dem op, så de ville passe til stereodekoderen. Dette er ikke den bedste løsning (og ikke hvordan overskrifterne var beregnet til at blive brugt), men det er det billigste alternativ til et loddejern. Sæt det udskårne overskrift på brødbrættet. Du skal kun bruge 1 linje med 6 ben til dekoderen. Du kan tilføje yderligere seks til den anden side for stabilitet, men dette er ikke nødvendigt for dette prototypesystem. Stifterne til at sætte hovedet i er vin, 3vo, gnd, wsel, din og bclk.

Trin 3: Konstruktion - Tilslut Power Pins

Konstruktion - Tilslut Power Pins
Konstruktion - Tilslut Power Pins

Placer Stereo -dekoderen på skubberhovederne (vin, 3vo, gnd, wsel, din og bclk pins) og skub dem fast sammen. Igen skulle dette ideelt set gøres med et loddejern, men jeg var nødt til at improvisere. Du vil bemærke, at alle ledninger i denne instruerbare er blå. Det er fordi jeg ikke havde nogen jumperwires, så jeg skar 1 lang ledning i mindre stykker. Jeg er også farveblind og er ligeglad med trådfarven. Power pins er fastgjort som følger:

3v3 (ESP32) -> til vin på stereodekoder

gnd (ESP32) -> til gnd på stereodekoder

Trin 4: Konstruktion - I2S ledninger

Konstruktion - I2S ledninger
Konstruktion - I2S ledninger

For at sende Bluetooth -lyden fra ESP32 til stereodekoderen vil vi bruge en metode til digital kommunikation kaldet I2S. Stereodekoderen tager dette digitale signal og gør det til et analogt signal, der kan tilsluttes en højttaler eller HiFi. I2S kræver kun 3 ledninger og er rimelig ligetil at forstå. Biturlinjen (bclk) går højt og lavt for at angive, at en ny bit sendes. Data-out-linjen (dout) drejer højt eller lavt for at angive, om den bit har en værdi på 0 eller 1, og ordvalglinjen (wsel) bliver høj eller lav for at angive, om den venstre eller højre kanal transmitteres. Ikke alle mikrokontroller understøtter I2S, men ESP32 har 2 I2S -linjer. Dette gør det til et oplagt valg til dette projekt.

Ledningerne er som følger:

27 (ESP32) -> wsel (Stereo dekoder)

25 (ESP32) -> din (Stereo dekoder)

26 (ESP32) -> bclk (Stereo dekoder)

Trin 5: Installation af BtAudio -biblioteket

Installation af BtAudio -biblioteket
Installation af BtAudio -biblioteket
Installation af BtAudio -biblioteket
Installation af BtAudio -biblioteket

Hvis du ikke allerede har dem installeret, skal du installere Arduino IDE og Arduino -kernen til ESP32. Når du har installeret dem, skal du besøge min Github -side og downloade depotet. Inden for Arduino IDE under Skitse >> Inkluder bibliotek >> vælg "Tilføj. ZIP -bibliotek". Vælg derefter den downloadede zip -fil. Dette skulle tilføje mit btAudio -bibliotek til dine Arduino -biblioteker. For at bruge biblioteket skal du inkludere det relevante overskrift i Arduino -skitsen. Du vil se dette i det næste trin.

Trin 6: Brug af BtAudio -biblioteket

Brug af BtAudio -biblioteket
Brug af BtAudio -biblioteket
Brug af BtAudio -biblioteket
Brug af BtAudio -biblioteket

Når den er installeret, skal du slutte din ESP32 til din computer via micro USB og derefter tilslutte din stereodekoder til din højttaler med din 3,5 mm ledning. Inden du uploader skitsen, skal du ændre nogle ting i Arduino -editoren. Når du har valgt dit board, skal du redigere partitionsskemaet under Værktøjer >> Partitionsskema og vælge enten "No OTA (Large APP)" eller "Minimal SPIFFS (Large APPS with OTA)". Dette er nødvendigt, fordi dette projekt bruger både WiFi og Bluetooth, som begge er meget hukommelsestunge biblioteker. Når du har gjort dette, skal du uploade følgende skitse til ESP32.

#omfatte

// Indstiller navnet på lydenheden btAudio audio = btAudio ("ESP_Speaker"); void setup () {// streamer lyddata til ESP32 audio.begin (); // udsender de modtagne data til en I2S DAC int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } void loop () {}

Skitsen kan stort set opdeles i 3 trin:

  1. Opret et globalt btAudio -objekt, der angiver "Bluetooth -navnet" på din ESP32
  2. Konfigurer ESP32 til at modtage lyd med btAudio:: begin -metoden
  3. Indstil I2S -benene med btAudio:: I2S -metoden.

Det er det på softwaresiden! Det eneste du skal gøre er at starte Bluetooth -forbindelsen til din ESP32. Bare søg efter nye enheder på din telefon/bærbare/MP3 -afspiller, og "ESP_Speaker" vises. Når du er glad for, at alt fungerer (musik afspilles), kan du afbryde ESP32 fra din computer. Tænd for den med USB -strømforsyningen, og den husker den sidste kode, du uploadede til den. På denne måde kan du forlade din ESP32 skjult bag dit HiFi -system for evigt.

Trin 7: DSP - Filtrering

Udvidelse af modtageren med digital signalbehandling

Hvis du fulgte alle trin (og jeg ikke efterlod noget) har du nu en fuldt fungerende Bluetooth -modtager til dit HiFi -system. Selvom dette er sejt, skubber det ikke rigtigt mikrokontrolleren til sine grænser. ESP32 har to kerner, der arbejder ved 240MHz. Det betyder, at dette projekt er langt mere end bare en modtager. Det har kapacitet til at være en Bluetooth -modtager med en digital signalprocessor (DSP). DSP'er udfører i det væsentlige matematiske operationer på signalet i realtid. En nyttig operation kaldes Digital filtrering. Denne proces dæmper frekvenser i et signal under eller over en bestemt afbrydelsesfrekvens, afhængigt af om du bruger et højpas- eller lavpasfilter.

Højpasfiltre

Højpasfiltre dæmper frekvenser under et bestemt bånd. Jeg har bygget et filterbibliotek til Arduino -systemer baseret på kode fra earlevel.com. Den største forskel er, at jeg har ændret klassestrukturen for lettere at konstruere filtre af højere orden. Filtre af højere orden undertrykker frekvenser ud over din afbrydelse mere effektivt, men de kræver meget mere beregning. Men med den nuværende implementering kan du endda bruge filtre i 6. orden til lyd i realtid!

Skitsen er den samme som den, der blev fundet i det foregående trin, bortset fra at vi har ændret hovedsløjfen. For at aktivere filtrene bruger vi btAudio:: createFilter -metoden. Denne metode accepterer 3 argumenter. Den første er antallet af filterkaskader. Antallet af filterkaskader er halvdelen af filterets rækkefølge. For et 6. ordens filter skal det første argument være 3. For et filter i 8. orden ville det være 4. Det andet argument er filter cutoff. Jeg har indstillet dette til 1000Hz for at have en virkelig dramatisk effekt på dataene. Endelig angiver vi typen af filer med det tredje argument. Dette bør være højpas for et højpasfilter og lavpas for et lavpasfilter. Scriptet herunder skifter afbrydelsen af denne frekvens mellem 1000Hz og 2Hz. Du bør høre en dramatisk effekt på dataene.

#omfatte

btAudio audio = btAudio ("ESP_Speaker"); ugyldig opsætning () {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øjpas); forsinkelse (5000); audio.createFilter (3, 2, højpas); }

Lavpasfiltre

Lavpasfiltre gør det modsatte af højpasfiltre og undertrykker frekvenser over en bestemt frekvens. De kan implementeres på samme måde som højpasfiltre, bortset fra at de kræver ændring af det tredje argument til lavpas. Til skitsen herunder skifter jeg lavpasafbrydelsen mellem 2000Hz og 20000Hz. Forhåbentlig vil du høre forskellen. Det skal lyde ganske dæmpet, når lavpasfilteret er ved 2000Hz.

#omfatte

btAudio audio = btAudio ("ESP_Speaker"); tomrumsopsætning () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } void loop () {delay (5000); audio.createFilter (3, 2000, lavpas); forsinkelse (5000); audio.createFilter (3, 20000, lavpas); }

Trin 8: DSP - Dynamic Range Compression

Baggrund

Dynamisk rækkeviddekomprimering er en signalbehandlingsmetode, der forsøger at udjævne lydstyrken. Det komprimerer høje lyde, der stiger over en bestemt tærskel, til niveauet for stille og forstærker derefter eventuelt begge. Resultatet er en meget mere jævn lytteoplevelse. Dette kom virkelig til nytte, mens jeg så et show med meget høj baggrundsmusik og meget stille vokal. I dette tilfælde hjalp det bare ikke at øge lydstyrken, da dette kun forstærkede baggrundsmusikken. Med komprimering af dynamisk område kunne jeg reducere den høje baggrundsmusik til vokalens niveau og høre alt ordentligt igen.

Koden

Dynamisk områdekomprimering indebærer ikke kun at sænke volumen eller tærskel for signalet. Det er lidt mere klogt end det. Hvis du sænker lydstyrken, reduceres stille lyde såvel som de høje. En vej udenom dette er at tærskel for signalet, men dette resulterer i alvorlig forvrængning. Dynamisk områdekomprimering indebærer en kombination af blød tærskelværdi og filtrering for at minimere den forvrængning, man ville få, hvis man skulle tærskle/klippe signalet. Resultatet er et signal, hvor de høje lyde "klippes" uden forvrængning, og de stille bliver efterladt, som de er. Koden herunder skifter mellem tre forskellige kompressionsniveauer.

  1. Kompression med forvrængning
  2. Kompression uden forvrængning
  3. Ingen komprimering

#omfatte

btAudio audio = btAudio ("ESP_Speaker"); ugyldig opsætning () {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 (); }

Dynamisk rækkeviddekomprimering er kompliceret, og btAudio:: komprimeringsmetoderne har mange parametre. Jeg vil prøve at forklare dem (i rækkefølge) her:

  1. Tærskel - Det niveau, hvor lyden reduceres (målt i decibel)
  2. Angrebstid - Den tid, det tager for kompressoren at begynde at arbejde, når tærsklen er overskredet
  3. Frigivelsestid - Den tid det tager for kompressoren at stoppe med at fungere.
  4. Reduktionsforhold - den faktor, hvormed lyden komprimeres.
  5. Knæbredde - Bredden (i decibel) omkring tærsklen, hvor kompressoren delvist arbejder (mere naturlig lyd).
  6. Forstærkningen (decibel) tilføjet til signalet efter komprimering (forøg/sænk volumen)

Den meget hørbare forvrængning i den første brug af kompression skyldes, at tærsklen er meget lav, og både angrebstiden og frigivelsestiden er meget korte effektivt, hvilket resulterer i en hård tærskeladfærd. Dette løses klart i det andet tilfælde ved at øge frigivelsestiden. Dette får i det væsentlige kompressoren til at fungere på en meget glattere måde. Her har jeg kun vist, hvordan ændring af 1 parameter kan have en dramatisk effekt på lyden. Nu er det din tur til at eksperimentere med forskellige parametre.

Implementeringen (den magiske matematik - valgfri)

Jeg fandt ud af, at naivt at implementere den dynamiske rækkeviddekomprimering var udfordrende. Algoritmen kræver konvertering af et 16-bit heltal til decibel og derefter transformere det tilbage til et 16-bit heltal, når du har behandlet signalet. Jeg bemærkede, at en kodelinje tog 10 mikrosekunder for at behandle stereodata. Da stereolyd samplet ved 44,1 KHz kun efterlader 11,3 mikrosekunder for DSP, er dette uacceptabelt langsomt … Men ved at kombinere en lille opslagstabel (400 bytes) og en interpolationsprocedure baseret på Netwons delte forskelle kan vi opnå næsten 17 bits præcision på 0,2 mikrosekunder. Jeg har vedhæftet et pdf -dokument med al matematik for de virkelig interesserede. Det er kompliceret, du er blevet advaret!

Trin 9: Wifi -grænsefladen

Wifi -grænsefladen
Wifi -grænsefladen
Wifi -grænsefladen
Wifi -grænsefladen

Nu har du en Bluetooth-modtager, der kan køre DSP i realtid. Desværre, hvis du vil ændre nogen af DSP -parametrene, skal du afbryde forbindelsen til dit HiFi, uploade en ny skitse og derefter oprette forbindelse igen. Det her er klodset. For at løse dette udviklede jeg en webserver, som du kan bruge til at redigere alle DSP -parametrene uden at oprette forbindelse til din computer igen. Skitsen til at bruge webserveren er nedenfor.

#omfatte

#include btAudio audio = btAudio ("ESP_Speaker"); webDSP web; ugyldig opsætning () {Serial.begin (115200); audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); // udskift med dit WiFi -id og adgangskode const char* ssid = "SSID"; const char* password = "PASSWORD"; web.begin (ssid, adgangskode og lyd); } void loop () {web._server.handleClient (); }

Koden tildeler en IP -adresse til din ESP32, som du kan bruge til at få adgang til websiden. Første gang du kører denne kode, skal du have den knyttet til din computer. På den måde kan du se IP -adressen, der er tildelt din ESP32 på din serielle skærm. Hvis du vil have adgang til denne webside, skal du blot indtaste denne IP -adresse i en hvilken som helst webbrowser (testet på chrome).

På nuværende tidspunkt burde vi være bekendt med metoden til at aktivere Bluetooth og I2S. Den største forskel er brugen af et webDSP -objekt. Dette objekt tager dit Wifi SSID og din adgangskode som argumenter samt en markør til btAudio -objektet. I hovedsløjfen får vi løbende webDSP -objektet til at lytte efter indgående data fra websiden og derefter opdatere DSP -parametrene. Som slutpunkt skal det bemærkes, at både Bluetooth og Wifi bruger den samme radio på ESP32. Det betyder, at du muligvis skal vente i op til 10 sekunder, fra du indtaster parametre på websiden, til informationen faktisk når ESP32.

Trin 10: Fremtidsplaner

Forhåbentlig har du nydt dette instruerbare og nu har Bluetooth Audio og DSP tilføjet til dit HiFi. Jeg synes dog, at der er meget plads til vækst i dette projekt, og jeg ville bare påpege nogle fremtidige retninger, jeg kan tage.

  • Aktiver Wifi -streaming af lyd (for den bedste lydkvalitet)
  • Brug en I2S -mikrofon til at aktivere stemmekommandoer
  • udvikle en WiFi -kontrolleret equalizer
  • Gør det smukt (brødbræt skriger ikke godt produktdesign)

Når jeg når at implementere disse ideer, laver jeg flere instruktioner. Eller måske vil en anden få disse funktioner implementeret. Det er glæden ved at gøre alt open source!

Anbefalede: