Indholdsfortegnelse:
- Forbrugsvarer
- Trin 1: Konstruktion - brødbrættet
- Trin 2: Konstruktion - Push Headers/lodning
- Trin 3: Konstruktion - Tilslut Power Pins
- Trin 4: Konstruktion - I2S ledninger
- Trin 5: Installation af BtAudio -biblioteket
- Trin 6: Brug af BtAudio -biblioteket
- Trin 7: DSP - Filtrering
- Trin 8: DSP - Dynamic Range Compression
- Trin 9: Wifi -grænsefladen
- Trin 10: Fremtidsplaner
Video: Bluetooth -lyd og digital signalbehandling: en Arduino -ramme: 10 trin
2024 Forfatter: John Day | [email protected]. Sidst ændret: 2024-01-30 08:26
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
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
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
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
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
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
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:
- Opret et globalt btAudio -objekt, der angiver "Bluetooth -navnet" på din ESP32
- Konfigurer ESP32 til at modtage lyd med btAudio:: begin -metoden
- 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.
- Kompression med forvrængning
- Kompression uden forvrængning
- 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:
- Tærskel - Det niveau, hvor lyden reduceres (målt i decibel)
- Angrebstid - Den tid, det tager for kompressoren at begynde at arbejde, når tærsklen er overskredet
- Frigivelsestid - Den tid det tager for kompressoren at stoppe med at fungere.
- Reduktionsforhold - den faktor, hvormed lyden komprimeres.
- Knæbredde - Bredden (i decibel) omkring tærsklen, hvor kompressoren delvist arbejder (mere naturlig lyd).
- 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
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:
Sådan rives en digital tykkelse ned, og hvordan fungerer en digital tykkelse: 4 trin
Sådan rives en digital tykkelse ned, og hvordan fungerer en digital tykkelse: Mange mennesker ved, hvordan man bruger målepunkter. Denne vejledning lærer dig, hvordan du river en digital tykkelse og en forklaring på, hvordan den digitale tykkelse fungerer
Akustisk levitation med Arduino Uno trin for trin (8 trin): 8 trin
Akustisk levitation med Arduino Uno Step-by Step (8-trin): ultralyds lydtransducere L298N Dc kvindelig adapter strømforsyning med en han-DC-pin Arduino UNOBreadboard Sådan fungerer det: Først uploader du kode til Arduino Uno (det er en mikrokontroller udstyret med digital og analoge porte til konvertering af kode (C ++)
Claqueta Digital Con Arduino (Digital Clapperboard With Arduino): 7 trin
Claqueta Digital Con Arduino (Digital Clapperboard With Arduino): Crea tu propia claqueta digital, también puedes convertir una claqueta no digital en una, utilizando Arduino.MATERIALER Display de 7 segmenter MAX7219 de 8 digitos compatible with arduino.Modulo de Reloj RTC model DS3231 con arduino.Arduin
Arduino -baseret digital dørlås ved hjælp af GSM og Bluetooth: 4 trin
Arduino -baseret digital dørlås ved hjælp af GSM og Bluetooth: ABSTRAKT: Tænk på situationen, hvor du kom helt træt hjem og fandt ud af, at du mistede din dørnøgle. Hvad vil du gøre? Du skal enten bryde din lås eller ringe til en nøglemekaniker. Så at lave en nøglefri lås er en interessant idé at gemme fra
Iron Man Reactor for Fun (Digital joystick til digital bevægelse): 7 trin (med billeder)
Iron Man Reactor for Fun (Digital Motion Processor Joystick): Hej kære! Dette er min første instruktion, så håber på din fordel og feedback! Projektet er en interaktiv platform til hjemmefester, konkurrencer, events - bare for sjov. Disse er to bevægelsessensorer fremstillet i designet af jernmandsreaktoren. Det