Taula de continguts:

Àudio Bluetooth i processament de senyals digitals: un framework Arduino: 10 passos
Àudio Bluetooth i processament de senyals digitals: un framework Arduino: 10 passos

Vídeo: Àudio Bluetooth i processament de senyals digitals: un framework Arduino: 10 passos

Vídeo: Àudio Bluetooth i processament de senyals digitals: un framework Arduino: 10 passos
Vídeo: Tirando ideias do papel com Node-RED 2024, De novembre
Anonim
Image
Image
Àudio Bluetooth i processament de senyals digitals: un framework Arduino
Àudio Bluetooth i processament de senyals digitals: un framework Arduino

Resum

Quan penso en el Bluetooth, penso en la música, però malauradament la majoria dels microcontroladors no poden reproduir música mitjançant Bluetooth. El Raspberry Pi pot, però això és un ordinador. Vull desenvolupar un framework basat en Arduino perquè els microcontroladors reprodueixin àudio mitjançant Bluetooth. Per flexionar completament els músculs del microcontrolador, afegiré processament de senyal digital en temps real (DSP) a l'àudio (filtratge de pas alt, filtratge de pas baix i compressió de rang dinàmic). Per a la cirera a la part superior, afegiré un servidor web que es pot utilitzar per configurar el DSP sense fils. El vídeo incrustat mostra els conceptes bàsics de l’àudio Bluetooth en acció. També em mostra fer servir el servidor web per realitzar alguns passatges elevats, passatges baixos i compressió de rang dinàmic. El primer ús de la compressió de rang dinàmic provoca distorsions a propòsit com a exemple de males opcions de paràmetres. El segon exemple elimina aquesta distorsió.

Per a aquest projecte, l’ESP32 és el microcontrolador escollit. Costa menys de 10 GBP i inclou funcions amb ADC, DAC, Wifi, Bluetooth Low Energy, Bluetooth Classic i un processador de doble nucli de 240 MHz. El DAC integrat pot reproduir àudio tècnicament, però no sonarà molt bé. En el seu lloc, utilitzaré el descodificador estèreo Adafruit I2S per produir un senyal de sortida de línia. Aquest senyal es pot enviar fàcilment a qualsevol sistema HiFi per afegir instantàniament àudio sense fils al vostre sistema HiFi existent.

Subministraments

Amb sort, la majoria dels fabricants disposaran de taulers d’anàlisi, ponts, cables USB, soldadors de subministrament elèctric i només hauran de gastar 15 lliures en l’ESP32 i el descodificador estèreo. Si no, totes les parts necessàries es mostren a continuació.

  • Un ESP32: provat a ESP32-PICO-KIT i TinyPico: 9,50 £ / 24 £
  • Descodificador estèreo Adafruit I2S: 5,51 £
  • Taula de pa: entre 3 i 5 lliures
  • Cables de pont: 3 lliures esterlines
  • Auriculars per cable / sistema d'alta fidelitat: £££
  • Capçaleres o soldador: 2,10 £ / 30 £
  • Cable micro USB: 2,10 £ / 3 £
  • Connector de 3,5 mm a RCA / presa de 3,5 mm a presa (o el que necessiteu el vostre altaveu): 2,40 GBP / 1,50 GBP
  • Font d'alimentació USB: 5 £

Pas 1: Construcció: el tauler de pa

Construcció: el tauler de pa
Construcció: el tauler de pa

Si heu comprat l’ESP32-PICO-KIT no haureu de soldar cap pin ja que es pre-solda. Simplement poseu-lo a la pissarra.

Pas 2: Construcció: capçaleres / soldadura

Construcció: capçaleres / soldadura
Construcció: capçaleres / soldadura
Construcció: capçaleres / soldadura
Construcció: capçaleres / soldadura

Si teniu un soldador, soldeu els passadors al descodificador estèreo segons les instruccions del lloc web d’Adafruit. En el moment d’escriure això, el soldador estava treballant i estava tancat. No volia pagar un soldador temporal, així que vaig tallar algunes capçaleres de pimoroni. Els vaig tallar perquè s’adaptessin al descodificador estèreo. Aquesta no és la millor solució (i no com es pretenia utilitzar les capçaleres), però és l’alternativa més barata a un soldador. Introduïu la capçalera retallada a la tauleta de suport. Només haureu de necessitar 1 línia de 6 pins per al descodificador. Podeu afegir-ne altres sis a l’altre costat per obtenir estabilitat, però això no és necessari per a aquest sistema de prototips. Els passadors per inserir les capçaleres són vin, 3vo, gnd, wsel, din i bclk.

Pas 3: Construcció: connecteu els passadors d’alimentació

Construcció: connecteu els passadors d’alimentació
Construcció: connecteu els passadors d’alimentació

Col·loqueu el descodificador estèreo a les capçaleres push (vin, 3vo, gnd, wsel, din i bclk pins) i empenyeu-les fermament. De nou, idealment s’hauria de fer amb un soldador, però vaig haver d’improvisar. Notareu que tots els cables d’aquesta instrucció són de color blau. Això és degut a que no tenia cables de pont, així que vaig tallar 1 cable llarg en trossos més petits. A més, sóc daltònic i realment no m’importa el color del filferro. Els pins d'alimentació s'uneixen de la següent manera:

3v3 (ESP32) -> per a vin en un descodificador estèreo

gnd (ESP32) -> a gnd en el descodificador estèreo

Pas 4: Construcció: cablejat I2S

Construcció: cablejat I2S
Construcció: cablejat I2S

Per enviar l'àudio Bluetooth des de l'ESP32 al descodificador estèreo, utilitzarem un mètode de comunicació digital anomenat I2S. El descodificador estèreo agafarà aquest senyal digital i el convertirà en un senyal analògic que es pot connectar a un altaveu o HiFi. I2S només requereix 3 cables i és raonablement senzill d’entendre. La línia de rellotge de bits (bclk) gira alta i baixa per indicar que es transmet un bit nou. La línia de sortida de dades (dout) gira alta o baixa per indicar si aquest bit té un valor de 0 o 1 i la línia de selecció de paraules (wsel) gira alta o baixa per indicar si es transmet el canal esquerre o dret. No tots els microcontroladors admeten I2S, però l’ESP32 té 2 línies I2S. Això fa que sigui una opció òbvia per a aquest projecte.

El cablejat és el següent:

27 (ESP32) -> wsel (descodificador estèreo)

25 (ESP32) -> din (descodificador estèreo)

26 (ESP32) -> bclk (descodificador estèreo)

Pas 5: Instal·lació de la biblioteca BtAudio

Instal·lació de la biblioteca BtAudio
Instal·lació de la biblioteca BtAudio
Instal·lació de la biblioteca BtAudio
Instal·lació de la biblioteca BtAudio

Si encara no els teniu instal·lats, instal·leu l'IDE Arduino i el nucli Arduino per a ESP32. Un cop els tingueu instal·lats, visiteu la meva pàgina de Github i descarregueu-vos el dipòsit. Dins de l’IDE Arduino a Sketch >> Inclou biblioteca >> seleccioneu "Afegeix biblioteca. ZIP". A continuació, seleccioneu el fitxer zip descarregat. Això hauria d'afegir la meva biblioteca btAudio a les vostres biblioteques Arduino. Per utilitzar la biblioteca, haureu d'incloure la capçalera corresponent a l'esbós d'Arduino. Ho veureu al següent pas.

Pas 6: utilitzar la biblioteca BtAudio

Ús de la biblioteca BtAudio
Ús de la biblioteca BtAudio
Ús de la biblioteca BtAudio
Ús de la biblioteca BtAudio

Un cop instal·lat, connecteu l'ESP32 a l'ordinador mitjançant micro USB i, a continuació, connecteu el descodificador estèreo a l'altaveu amb el cable de 3,5 mm. Abans de penjar l'esbós, haureu de canviar algunes coses a l'editor Arduino. Després d'haver seleccionat el tauler, haureu d'editar l'esquema de particions a Eines >> Esquema de particions i seleccionar "Sense OTA (aplicació gran)" o "SPIFFS mínims (APPS grans amb OTA)". Això és necessari perquè aquest projecte utilitza tant WiFi com Bluetooth, que són biblioteques amb molta memòria. Un cop fet això, pengeu el següent esbós a l'ESP32.

#incloure

// Estableix el nom del dispositiu d'àudio btAudio audio = btAudio ("ESP_Speaker"); void setup () {// transmet dades d’àudio a l’SP32 audio.begin (); // envia les dades rebudes a un DAC I2S int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } bucle buit () {}

L’esbós es pot dividir en tres passos:

  1. Creeu un objecte global btAudio que estableixi el "nom Bluetooth" del vostre ESP32
  2. Configureu l’ESP32 per rebre àudio amb el mètode btAudio:: begin
  3. Configureu els pins I2S amb el mètode btAudio:: I2S.

Això és tot pel que fa al programari. Ara tot el que heu de fer és iniciar la connexió Bluetooth al vostre ESP32. Només cal que cerqueu dispositius nous al telèfon / portàtil / reproductor de MP3 i apareixerà "ESP_Speaker". Quan estigueu contents que tot funcioni (la música es reprodueix), podeu desconnectar l’ESP32 de l’ordinador. Enceneu-lo amb la font d'alimentació USB i recordarà l'últim codi que hi heu penjat. D’aquesta manera, podeu deixar el vostre ESP32 amagat darrere del vostre sistema HiFi per sempre.

Pas 7: DSP: filtratge

Ampliació del receptor amb processament de senyal digital

Si heu seguit tots els passos (i no he deixat res de banda), ara teniu un receptor Bluetooth completament funcional per al vostre sistema HiFi. Tot i que és genial, no empeny el microcontrolador fins als seus límits. L'ESP32 té dos nuclis que funcionen a 240 MHz. Això significa que aquest projecte és molt més que un simple receptor. Té la capacitat de ser un receptor Bluetooth amb un processador de senyal digital (DSP). Els DSP realitzen bàsicament operacions matemàtiques en el senyal en temps real. Una operació útil s’anomena filtratge digital. Aquest procés atenua les freqüències d'un senyal per sota o per sobre d'una determinada freqüència de tall, segons si utilitzeu un filtre de pas alt o baix.

Filtres de pas alt

Els filtres de pas alt atenuen les freqüències per sota d’una determinada banda. He creat una biblioteca de filtres per als sistemes Arduino basada en el codi de earlevel.com. La principal diferència és que he canviat l’estructura de la classe per permetre la construcció de filtres d’ordre superior amb més facilitat. Els filtres d’ordre superior suprimeixen les freqüències més enllà del límit de manera més eficaç, però requereixen molt més càlcul. Tot i això, amb la implementació actual, fins i tot podeu utilitzar filtres de sisè ordre per obtenir àudio en temps real.

L'esbós és el mateix que es va trobar al pas anterior, tret que hem canviat el bucle principal. Per habilitar els filtres utilitzem el mètode btAudio:: createFilter. Aquest mètode accepta 3 arguments. El primer és el nombre de cascades de filtres. El nombre de cascades de filtres és la meitat de l'ordre del filtre. Per a un filtre de 6è ordre, el primer argument hauria de ser 3. Per a un filtre de 8è ordre, seria 4. El segon argument és el tall del filtre. Ho he definit a 1000Hz perquè tingui un efecte realment espectacular sobre les dades. Finalment, especifiquem el tipus de fitxer amb el tercer argument. Aquest hauria de ser pas alt per a un filtre de pas alt i pas baix per a un filtre de pas baix. El guió següent canvia el límit d'aquesta freqüència entre 1000Hz i 2Hz. Hauríeu d’escoltar un efecte espectacular sobre les dades.

#incloure

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); retard (5000); audio.createFilter (3, 2, pas alt); }

Filtres de pas baix

Els filtres de pas baix fan el contrari que els filtres de pas alt i suprimeixen les freqüències superiors a una freqüència determinada. Es poden implementar de la mateixa manera que els filtres de pas alt, excepte que requereixen canviar el tercer argument a pas baix. Per a l'esbós següent, alterno el tall de pas baix entre 2000Hz i 20000Hz. Amb sort, sentireu la diferència. Hauria de sonar bastant esmorteït quan el filtre de pas baix està a 2000Hz.

#incloure

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, lowpass); retard (5000); audio.createFilter (3, 20000, lowpass); }

Pas 8: DSP: compressió de rang dinàmic

Antecedents

La compressió de rang dinàmic és un mètode de processament de senyal que intenta igualar la intensitat de l'àudio. Comprimeix els sons forts, que superen un llindar determinat, fins al nivell dels silenciosos i, posteriorment, amplifica tots dos. El resultat és una experiència d’escolta molt més uniforme. Va ser molt útil mentre estava veient un programa amb música de fons molt forta i veus molt tranquil·les. En aquest cas, només augmentar el volum no ajudava, ja que això només amplificava la música de fons. Amb la compressió de rang dinàmic, podria reduir la música de fons forta al nivell de la veu i escoltar-ho tot correctament.

El codi

La compressió de rang dinàmic no implica només reduir el volum ni llindar el senyal. És una mica més intel·ligent que això. Si baixeu el volum, es reduiran els sons silenciosos i els forts. Una manera d’evitar-ho és llindar el senyal, però això provoca una distorsió severa. La compressió de rang dinàmic implica una combinació de llindars suaus i filtrat per minimitzar la distorsió que obtindríeu si limiteu / retalleu el senyal. El resultat és un senyal on els sons forts es "retallen" sense distorsió i els silenciosos es deixen tal com són. El codi següent canvia entre tres nivells de compressió diferents.

  1. Compressió amb distorsió
  2. Compressió sense distorsió
  3. Sense compressió

#incloure

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

La compressió de rang dinàmic és complicada i els mètodes btAudio:: compress tenen molts paràmetres. Intentaré explicar-los (per ordre) aquí:

  1. Llindar: nivell en què es redueix l'àudio (mesurat en decibels)
  2. Temps d'atac: el temps que triga el compressor a començar a funcionar un cop superat el llindar
  3. Temps de llançament: el temps que triga el compressor a deixar de funcionar.
  4. Ràtio de reducció: el factor pel qual es comprimeix l'àudio.
  5. Amplada del genoll: l'amplada (en decibels) al voltant del llindar en què el compressor funciona parcialment (so més natural).
  6. El guany (decibels) afegit al senyal després de la compressió (augment / disminució del volum)

La distorsió molt audible en el primer ús de compressió es deu al fet que el llindar és molt baix i el temps d’atac i el temps de llançament són molt curts de manera efectiva, donant lloc a un comportament de llindar dur. Això es resol clarament en el segon cas augmentant el temps de llançament. Això provoca essencialment que el compressor actuï d'una manera molt més suau. Aquí només he demostrat com canviar un paràmetre pot tenir un efecte espectacular a l’àudio. Ara és el vostre torn d’experimentar amb diferents paràmetres.

La implementació (les matemàtiques màgiques - opcional)

Vaig trobar que la implementació ingènua de la compressió de rang dinàmic era difícil. L’algorisme requereix convertir un enter de 16 bits a decibels i després tornar-lo a convertir en un enter de 16 bits un cop s’hagi processat el senyal. Em vaig adonar que una línia de codi trigava 10 microsegons a processar dades estèreo. Com que l'àudio estèreo mostrat a 44,1 KHz deixa només 11,3 microsegons per al DSP, això és inacceptablement lent … No obstant això, combinant una petita taula de cerca (400 bytes) i un procediment d'interpolació basat en les diferències dividides de Netwon, podem obtenir una precisió de gairebé 17 bits en 0,2 microsegons.. He adjuntat un document pdf amb totes les matemàtiques per als més interessats. És complicat, us han avisat!

Pas 9: la interfície Wifi

La interfície Wifi
La interfície Wifi
La interfície Wifi
La interfície Wifi

Ara teniu un receptor Bluetooth capaç d’executar DSP en temps real. Malauradament, si voleu canviar algun dels paràmetres DSP, haureu de desconnectar-vos del vostre equip HiFi, pengeu un esbós nou i torneu-lo a connectar. Això és maldestre. Per solucionar-ho, he desenvolupat un servidor web que podeu utilitzar per editar tots els paràmetres DSP sense tornar a connectar-vos al vostre ordinador. A continuació es mostra l’esbós per utilitzar el servidor web.

#incloure

#include btAudio audio = btAudio ("ESP_Speaker"); webDSP web; configuració nul·la () {Serial.begin (115200); audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); // substituïu el vostre ID WiFi i contrasenya const char * ssid = "SSID"; const char * password = "CONTRASENYA"; web.begin (ssid, contrasenya i àudio); } void loop () {web._server.handleClient (); }

El codi assigna una adreça IP al vostre ESP32 que podeu utilitzar per accedir a la pàgina web. La primera vegada que executeu aquest codi, hauríeu de tenir-lo connectat a l'ordinador. D’aquesta manera podeu veure l’adreça IP assignada al vostre ESP32 al vostre monitor sèrie. Si voleu accedir a aquesta pàgina web, simplement introduïu aquesta adreça IP a qualsevol navegador web (provat a Chrome).

A hores d’ara hauríem de conèixer el mètode d’activació de Bluetooth i I2S. La diferència clau és l’ús d’un objecte webDSP. Aquest objecte pren el vostre SSID i contrasenya Wifi com a arguments, a més d’un punter cap a l’objecte btAudio. Al bucle principal, obtenim contínuament l'objecte webDSP per escoltar les dades entrants de la pàgina web i, a continuació, actualitzar els paràmetres DSP. Com a punt final, cal tenir en compte que tant Bluetooth com Wifi utilitzen la mateixa ràdio a l’ESP32. Això significa que és possible que hagueu d'esperar fins a 10 segons des que introduïu paràmetres a la pàgina web fins que la informació arriba realment a l'ESP32.

Pas 10: Plans de futur

Amb sort, heu gaudit d’aquest instructiu i ara heu afegit àudio i DSP Bluetooth al vostre equip HiFi. Tot i això, crec que hi ha molt marge de creixement en aquest projecte i només volia assenyalar algunes indicacions futures que podria prendre.

  • Activa la transmissió d'àudio a través de Wifi (per obtenir la millor qualitat d'àudio)
  • Utilitzeu un micròfon I2S per habilitar les ordres de veu
  • desenvolupar un equalitzador controlat per WiFi
  • Feu-lo bonic (la taula de treball no crida el disseny del producte)

Quan em posi en pràctica per implementar aquestes idees, faré més instructius. O potser algú altre implementarà aquestes funcions. Aquesta és l’alegria de fer que tot sigui de codi obert.

Recomanat: