ESP32 - Doppelherz

Auch wenn der Schwerpunkt im Maker-Blog aktuell eher in Richtung Gestaltung geht, möchte ich heute etwas über ein ESP32 Projekt schreiben.

Auf Anhieb denkt jeder bei einem ESP8266 an "Arduino mit WLAN" und beim ESP32 an "Arduino mit WLAN, Bluetooth und irgendwie mehr Power".


Dass der ESP32 noch viel mehr Features hat, wird oft vergessen.

Unter anderem: Dualcore. Das ist ein ESP mit 2 separaten Kernen. Und die lassen sich parallel nutzen.


Squix78 hat genau das gebraucht, ohne es vorher zu wissen.

Sein Projekt ist ein Bluetooth-Lautsprecher mit Spectrum-Analyzer. Also Musik und Bling-Bling.


[Externes Medium: https://youtu.be/1UpbtE98OBA]


Nachdem der Teil mit der Musik gut funktionierte, hat die hinzugefügte LED-Steuerung zu Problemen geführt.

Der Ton wurde verzerrt und brach auch mal ab. Zu viel für den ESP.

Als er dann mit dem Weg über den zweiten Kern angefangen hat, dachte er erst, dass der ja eigentlich schon mit Kommunikation ausgelastet sein müßte.

Dem ist offensichtlich nicht so.


Als Basis wurde die Bibliothek von Schatzmann verwendet:

-> https://github.com/pschatzmann/ESP32-A2DP

Damit alleine kann man schon mal eben einen ESP32 in einen BT-Client oder Sender versetzen.


Auf der Suche nach einem Zugang zu den Musikdaten um diese letzten Endes zu zerlegen und die LEDs damit zu füttern, hatte er einige Hürden zu nehmen.

Die A2DP Bibliothek mußte erweitert werden. Diese ist im Grunde eine abgespeckte Variante der Befehle aus dem Espressifs Audio Dev Framework (ADF).

Es ist ihm gelungen über die Registrierung eines eigenen Callbacks:

void audio_data_callback(const uint8_t *data, uint32_t len)

an den Datenstrom zu kommen. So weit so gut.


Methode:
Eine gängige Methode zur Visualisierung von Musik besteht darin,

Abschnitte zu nehmen und diese in den Frequenzbereich zu konvertieren.

Blöcke mit einer Länge von ein paar Millisekunden zeigen dann an, welche Frequenzen gerade aktiv sind.

Der Prozess der Konvertierung von Daten aus dem Zeitbereich in den Frequenzbereich erfordert eine ganze Reihe von Berechnungen.

Ein Algorithmus, der dies relativ effizient erledigen kann, ist die Fast Fourier Transformationoder kurz FFT.


Daraus hat er einen Code geschrieben, der Musikdaten sammelt, bis ein Puffer voll ist.

Dann würde der Code den FFT-Algorithmus ausführen, um den Inhalt des Puffers als ein Array diskreter Frequenzen zu erhalten.

Das funktionierte, aber die Musik klang furchtbar. :(

Offenbar brauchte der FFT-Algorithmus zu viel Zeit, um die Daten zu verarbeiten, und die Ausgabe stotterte.


Tja. Da hat man den stärksten ESP und noch immer nicht genug Power.


Es sei denn...Doppelherz:

Der ESP32 hat zwei Tensilica Xtensa Kerne.

Warum nicht einen Versuch wagen und die Fast Fourier-Verarbeitung auf dem anderen Kern durchführen?


Der überarbeitete Code füllt den Puffer wie zuvor auf Kern 0.

Aber sobald der Puffer voll ist, hört er auf, Daten zu sammeln und benachrichtigt eine auf Kern 1 laufende Task, dass er mit der FFT-Verarbeitung auf dem Puffer beginnen kann.

Sobald die FFT-Verarbeitung abgeschlossen ist, teilt der Code die Frequenzinformationen in 8 Bänder.

Zu diesem Zeitpunkt teilt der Task auf Kern 1 dem anderen Task auf Kern 0 mit,dass er wieder beginnen kann, den Puffer zu füllen.

Kern 1 braucht die Daten im Puffer nicht mehr.Jetzt muss Kern 1 nur noch die 8 Frequenz-Bänder in LED Lichter visualisieren.


Hut ab. Es läuft!


GitHub:

-> https://github.com/thingpulse/esp32-icon64-a2dp


Webseite:

-> https://blog.squix.org/2020/12…r-to-bluetooth-audio.html


Ich habe noch nichts davon getestet. Aber das Projekt reizt mich auf jeden Fall.Ausreichend dokumentiert und ein tolles Ergebnis.

Kommentare 1

  • Formatierung erneuert. Da war ein inline-code-tag dazwischengekommen