Donnerstag, 4. August 2022

ESP32 Audio Kit Grundlagen

 


 

 Bernhard hatte das ESP32 Audio Kit hier vorgestellt:

ESP32 Boards für Internetradio und Audioanwendungen

und ich hatte bemerkt dass ich auch welche bestellt habe und mich damit beschäftigen wolle.

Dass ich heute erste Erfolge damit vermelden kann verdanke ich vor allem einer Diskussion zwischen verschiedenen Programmierern (u.a. Wolle/Schreibfaul) und einem Entwickler/Distributor (?) aus ShenZhen.

hier nachzulesen:

Ai-Thinker-Open / ESP32-A1S-AudioKit

dabei klärten sich all meine Probleme für eine erste Tonausgabe. Das erste Problem ist dass der verwendete DAC, der nicht einsichtbar unter der ESP32-Haube steckt, sich bei neueren boards bei gleicher Rev.Nr. 2.2 von einem AC101 auf einen ES8388 geändert hat und daher eine andere library benötigt. Dann gibt es bei den boards unterschiedliche pinouts. Und letztendlich gibt es auch noch einen Aktivierungs-Pin um die NF aus dem "deep sleep" zu holen.

hier beschreibe ich mal speziell meine boards, andere build-Nummern können abweichen!

meine boards tragen die Bezeichnung "ESP32 Audio Kit V2.2 / 3318" Wobei die 3318 massgeblich für eine eindeutige Indentifizierung ist.

Hersteller des board ist AI Thinker. Die genaue Bezeichnung des ESP-Modules lautet "ESP32-A1S", wobei der Zusatz A1S nur aussagt dass ein per I2S angesteuerter DAC eingebaut ist, aber nicht welcher chip dafür verwendet wurde. In meinem Fall ein ES8388. Der ESP ist eine WROVER Ausführung, was bedeutet dass er mit 4 MB SPI RAM und 8 MB PSRAM ausgestattet ist. Das ist wichtig bei der Baustein-Definition in der Entwicklungsumgebung und bringt den Vorteil eines Puffers bei streaming-Anwendungen. Der chip ist weiterhin mit bluetooth und 2,4GHz-WLAN ausgestattet.

Hier das Pinout:

Code:
#define SD_CS        21

// GPIOs for SPI
#define SPI_MOSI      13
#define SPI_MISO      12
#define SPI_SCK      14

// I2S GPIOs
#define I2S_SDOUT    26
#define I2S_BCLK      5
#define I2S_LRCK      25

ausser der boot- und reset-Taste gibt es noch 6 weitere programmierbare Microtasten. Dabei ist es wichtig zu wissen dass diese mit Kondensatoren zur Entprellung versehen sind, was zu berücksichtigen ist wenn man die dazugehörigen gpio's zweckentfremden will.
Das board beinhaltet weiterhin 2 Mikrofone, einen line-out, einen line-in, 2 Stück Class D Audio Amplifier vom Typ NS4150, einen SD-card reader und eine Ladeschaltung für eine 3,7 Lithium Zelle. Ein 5fach Dip-Schalter ist zwar per Platinenaufdruck näher spezifiziert, aber eine richtige Erklärung über den Zweck konnte ich noch nicht finden. Ladebuchse und UART-Buchse (beides Micro-USB) laden ein zum Verwechseln!

Die boards sind bei ebay unter dem Suchbegriff "Audio Kit ESP32 Audio Entwicklungs Platine" für unter 20 Euro/Stk. zu bekommen inkl. kostenlosem Versand aus China.

Software:

erste Versuche, um das board kennenzulernen, habe ich mit einem Sketch von Schreibfaul unter der Arduino IDE und deren seriellem Monitor erfolgreich durchgeführt. Schreibfaul gibt im Quellcode auch die links für die benötigten libraries an. Bzw. mein erster erfolgreicher Sketch ist ein example einer library. Hier zu finden:

schreibfaul1 / es8388 

es wird einfach nur ein webradio-stream abgespielt. Jetzt wo ich die hardware kenne will ich demnächst weitermachen mit dem Audio Development Framework (ESP-ADF) und der toolchain. 

Zitat Bernhard:

Das ist halt ein typischer uC mit WiFi an dem für Audiozwecke ein paar unterschiedliche Codecs + Class D Verstärker adaptiert wurden. Das ist ein typisches Bastelboard der Maker- und IoT Szene (offenes Design, die PCB kann man sich selbst herstellen (lassen), das Design ist im Netz) . Vergleichbares gibt es auch für andere Anwendungsbereiche als Audio. Als Grundlage gar für industrielle Internetradios waren diese Bord nicht gedacht. Was die Maker-Szene mit diesen Boards eher im Sinn hat, sind diese Dienste die auch von SDKs unterstützt werden: Voice recognition and integration with online services such as Alexa, DuerOS, ... + KI Integration in Audioanwendung. Da spielt die Musik, nicht bei "popeligem" Internetradio mit denen wir uns beschäftigen. Das ist fast schon eine "Abfallanwendung".

Klar das bei solchen offenen Projekten die Chinesen mit verschiedenen fertigen Boards den Markt überschwemmen. Das findet man auch in der Arduinowelt wieder.
Alles was irgendwie auf Arduino (ATmega) war wird nochmal auf ESP32 aufgewärmt und selbiges nochmal für STM32. 

Zitat-Ende

ich hab festgestellt dass meine obige pinout-Tabelle nur für den I2S-Bereich passt. Mehr hab ich ja auch für die einfache Ausgabe eines webstreams nicht gebraucht.
Nun wollte ich das Abspielen von SD-Karte testen. Ich stellte dann fest dass die pin's für MISO, MOSI, CD_CS und PA_EN nicht stimmten.

Mit dieser Kombination funktioniert sowohl Radio als auch SD-card. I2C hab ich mal noch weggelassen weil noch nicht gegengeprüft:
 

Code:
#define SD_CS         13

// GPIOs for SPI
#define SPI_MOSI      15
#define SPI_MISO      2
#define SPI_SCK       14

// I2S GPIOs
#define I2S_SDOUT     26
#define I2S_BCLK       5
#define I2S_LRCK      25

was jetzt auch funktioniert ist das Vorlesen eines Textes mit der connecttospeech-Funktion:

Zitat Norbert:

nach viel Lesen, ausgiebigem Programmieren / Testen und letztendlich auch Löten, ist es mir gelungen ein TFT_Display zum Mitspielen zu bewegen.
Als Vorlage dienen Programme und Bibliotheken von Wolles GitHub - Seiten, speziell sein Simple Webradio und sein ES8388 Beispielprojekt.
Danke für die sehr gute Arbeit!
Aufgrund der o. a. Dokumentation habe ich in einem ersten Schritt ein Webradio "nachgebaut", bei welchem mit den 4 Tasten KEY3 bis KEY6 eine
Senderwahl bzw. Verstellung der Lautstärke möglich ist.
Es stellte sich ausserdem heraus, dass es Unterschiede bei gleicher Platinen V2.2 und Revisionsnummer 3378 für die GPIO Belegung des I2C Bus gibt.
Jupps Version benutzt GPIO 18 und 23 während GPIO 32 und 33 bei meiner Version zum Einsatz kommen.
Es ist also Vorsicht beim Nachbau (besser Messen / Testen) angesagt.
Im zweiten Schritt ging es an den Anschluß eines TFT-Displays. Hier habe ich mich ebenfalls an Wolles Vorgehensweise orientiert, da sie plausibel ist.
Im Unterschied zu dessen Projekt kommt hier ein Display mit ILI9341 Controller zum Einsatz.

Anbei ein paar Bilder:
 


 

Zitat-Ende

ich fasse mal den aktuellen Stand zusammen.

Aufgrund der unterschiedlichen gpio-Belegungen hat sich eine Tabelle als sehr hilfreich erwiesen. Die erste Spalte zeigt die Belegung meiner beiden Platinen, die 2. Spalte die Belegung der Platinen von Norbert. Die weiteren Spalten zeigen die Belegung von unterschiedlichen fertigen templates von Karadio. Keine davon passt zu unseren Platinen. Also mit Karadio kommen wir nur weiter wenn wir selbst boards definieren können. So weit bin zumindest ich immer noch nicht.


.pdf   audiokit-karadio.pdf (Größe: 35,75 KB / Downloads: 28)

meine Versuche mit Edzelf, der in der Version V2.0 ja mittlerweile I2S-Unterstützung eingebaut hat, verliefen stumm. Möglich dass unser DAC, der ES8388, von der Helix-Library nicht unterstützt wird.

Zitat Edzelf:

Zitat:..Works with MAX98357A (3 Watt amplifier with DAC), connected three lines (DOUT, BLCK, LRC) to I2S. For stereo are two MAX98357A necessary. AudioI2S works with UDA1334A (Adafruit I2S Stereo Decoder Breakout Board) and PCM5102A. Other HW may work but not tested. Plays also icy-streams and GoogleTTS..


Ich fand aber auch keine Möglichkeit bei Edzelf V2.0 die I2S-gpios zu definieren. Trotzdem an der Stelle noch ein Hinweis wie man das webinterface ins spiffs lädt, wenn man so wie ich immer noch die Arduino IDE benutzt:

Arduino ESP32 filesystem uploader

Was funktioniert bis jetzt überhaupt?

zum Laufen hatte ich bis jetzt nur einen schreibfaul Beispielcode sowie den weiter oben gezeigten code von Norbert. Beide aktuell noch mit fest eincodierter Radiostation und Lautstärke. Die Umlöterei auf ein SPI-Display erspare ich mir. Meine Variante des Audio-Kit hat zumindest noch die I2C-Ports zugänglich, die Variante von Norbert leider nicht.

Noch Hinweise zum upload des code aus der IDE. Als board sollte ein wrover Modul definiert sein, und falls zu wenig Speicherplatz gemeldet wird als partition scheme: Huge App

Danke an Norbert, alleine hätte ich das nicht so erarbeiten können. 

Zitat Norbert:

Hallo Josef, Jupp und Mitleser,
Wolfgang entwickelt in den letzten Wochen/Monaten sehr aktiv an der Software und hat so "Einiges" geändert.
Die neueste Version eines Testprogramms findet man hier.
Ich würde als Erstes Wolle's Sketch mit dem Board Typ 3378 ausprobieren.

Halt - noch etwas:
aktuell benutzt Du Pin 23 und 18 für den I2C
#define IIC_CLK      23
#define IIC_DATA      18
während in "meinem" Sketch Pin 32 / 33 verwendet werden
  I2C GPIOs
#define IIC_CLK      32   
#define IIC_DATA    33   
Teste das bitte.  

Zutat Ende

wir wissen dass es trotz gleicher Bezeichnung mindestens 2 Hardware-Varianten gibt:

Norbert und Bernhard haben die 32/33-Variante und ich und Josef die 18/23 Version. Beide Platinenausführungen nennen sich 3378. 


 


 

Keine Kommentare:

Kommentar veröffentlichen