Radio-Bastler-Forum (RBF)

Normale Version: Das einfachste Internetradio mit dem neuen ESP32 Audio
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2 3 4 5 6 7
Der neue ESP32 Audio ist da!

Der neue ESP32 Audio kommt völlig ohne zusätzliche Komponenten aus. 5 Volt und einen Lautprecher, mehr braucht er nicht.

[attachment=114403]

Vom anlegen der Spannung bis zum abspielen des Internetstream braucht er nur 1 Sekunde, wenn das WLAN mitspielt.
Bis auf die Anschlüsse GPIO 25, 26 und 27 ist er kompatibel mit den Standart Espressif Boards. Die GPIO 25,26 und 27 sind intern auf den I2S verdrahtet. Dafür kann an diese Pins außen direkt ein Lautsprecher angeschlossen werden. Alle weiteren Pins können frei belegt werden, zum Beispiel mit Displays, Reglern oder Tastern. Die beiden Seriellen Schnittstellen stehen natürlich auch zur Verfügung. Bei größerer Lautstärke sollte das modul mit der 5 Volt Vin versorgt werden, da die Stromaufnahme grenzwertig für einen USB Anschluss ist.

[attachment=114404]

Oben: ESP32 Audio
Unten: Standart Espressif ESP32

Der Unterschied zum normalen ESP32 Modul:
  • I2S Decoder und kräftige 3 Watt Class D Mono Endstufe auf dem Board.
    So lassen sich schnell kleine Internetradios bauen. Auch das abspielen von SD Karte oder vom internen SPIFFS ist möglich.
  • 8 MB statt 4 MB Speicher.
    So kann man aufwendige Grafiken für Displays oder Musik aus dem internen Speicher ermöglichen. Anwendungen wären zum Beispiel eine elektronische Zeitansage mit Uhrzeit aus dem Internet, eine Türklingel mit mehreren Liedern und vieles andere. Dank SPIFFS kann man ein echtes Dateiensystem mit mp3- oder Grafikdateien aufbauen.
  • CH340 als USB-Serial Converter.
    Das macht ihn kompatibler, auch zu sehr alten Betriebssystemen.

Hier ein einfaches Internetradio:
Code:
#include "Arduino.h"
#include "WiFi.h"
#include "Audio.h"
Audio audio;
const char* ssid =     "ssid";
const char* password = "passwort";
void setup() {
    Serial.begin(115200);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) delay(1500);
    audio.setPinout(27,26,25);
    audio.setVolume(10); // Lautstärke 0 bis 21
    audio.connecttohost("http://stream.ffn.de/energybremen/mp3-192/livestream.mp3");
}
void loop() {
    audio.loop();
}
void audio_info(const char *info){
    Serial.println(info);
}

Arduino Einstellungen:
Board: ESP32 Dev Module
Flash Size: 8Mb
PSRAM: Enabled
Alle anderen Einstellung können so bleiben.

Das Teil kostet 14 Euro (+ Versand) und kann notfalls über mich bezogen werden. Die Stiftleisten sind dabei, aber nicht angelötet. Das macht einen noch flacheren Gehäuseaufbau möglich.
Moin Jens,

wo kann man das Teil denn bestellen? Hast du einen Link?

Danke, Joe
hab auch schon gesucht, aber noch nicht gefunden. Das wäre wieder ein schönes Spielzeug. Würde ich direkt ein paar Stück bestellen wollen.
Danke für den Hinweis, Jens!
Hallo, Jens,
Ich danke für die Info. Sicherlich um ein vollständiges Gerät zu fertigen ist noch einiges zu machen, aber als Basis dafür - Thumbs_up
Bestellen werde ich auch, mal sehen was daraus mache.
Hallo  Jens,
wo finde ich den Link?

Mit freundlichem Gruß, Heiko
Es gibt (noch) keinen Link, ich habe die ersten Prototypen aus China. Sie funktionieren super.
Sie sind mit https://github.com/schreibfaul1/ESP32-audioI2S kompatibel.
[attachment=114494]

Ich habe den ESP32 Audio jetzt 2 Tage getestet. Die wichtigste Erkenntnis ist, dass man für den Betrieb eine stabile 5 Volt / 1 Ampere Spannungsversorgung braucht. Diese muss über den Vin eingespeist werden. Programmieren kann man ihn aber auch ohne diese Spannung wie gewohnt über den USB-Anschluss. Es können auch beide Spannungen auf einmal anliegen, der USB ist mit einer Diode geschützt. Und genau diese Diode ist es, die einen Betrieb mit größerer Lautstärke über die USB-Buchse unmöglich macht. Wer unbedingt nur über USB versorgen möchte, kann diese einfach überlöten.

Ich hatte anfangs ständige Aussetzer bei etwas schlechterer Internetverbindung (habe sie absichtlich verschlechtert, um das zu testen). Das liegt aber nicht am ESP32 Audio, sondern am verwendeten Script. Dort sind die Buffer viel zu klein dimensioniert. Doch mit 8 statt üblichen 4 Mb müssen wir an dieser Stelle nicht sparen. Dafür müssen wir in der Datei Audio.h folgende Werte ändern:
m_buffSizeRAM      = 16000
m_resBuffSizeRAM  = 3200
m_maxBlockSize    = 3200
Zusätzlich fügen wir in den Sketch folgende Zeile ein:
audio.setConnectionTimeout(330,3200);

Mit dieser Änderung läuft es nicht nur gut, sondern perfekt. Während ein Technisat Digitalradio 3 IR nur rumstotterte, lief der ESP sauber ohne Aussetzer durch. Das habe ich über mehrere Stunden getestet. Auch der Klang ist glasklar. Das ist kein Wunder, findet die Digital/Analog Wandlung quasi erst im Lautsprecher statt. Auch mit einer leeren MP3 Datei (ohne Audiosignal) gab es bei voller Lautstärke keinerlei Rauschen. Zwischen einem VS1053B und dem ESP32 Audio liegen klangliche Welten. Nachteilig ist allerdings, dass der ESP nur einen Mono Verstärker hat. Dieser erreicht mit einem 4 Ohm Lautsprecher bei 5 Volt etwa 3 Watt, was für kleinere bis mittlere Radios völlig ausreicht.

Mit dem 3 Band Equalizer kann man den Klang noch etwas auf den Lautsprecher abstimmen.
setTone(int8_t gainLowPass, int8_t gainBandPass, int8_t gainHighPass); // Werte von jeweils -40 bis +6

Neben den beiden Anschlüssen für den Lautsprecher befindet sich ein weiterer Anschluss mit der Bezeichnung GAIN am Board. Mit diesem kann man zur Anpassung des Objektes die Verstärkung senken oder erhöhen. Dazu gibt es folgende Möglichkeiten:
15dB > GAIN mit 100 kOhm nach GND
12db > GAIN direkt mit GND verbinden
9dB > nichts anschließen
6dB > GAIN direkt mit Vin verbinden
3dB > GAIN mit 100 kOhm nach Vin

Natürlich lassen sich auch alle Senderinformationen (Sender, Titel, Interpret...) abgreifen, um diese auf einem Display darzustellen.
Weitere Informationen gibt es hier:
https://github.com/schreibfaul1/ESP32-audioI2S/wiki
ich möchte den derzeitigen Stand meiner Erfahrungen mit dem Modul mitteilen.

- der Democode aus post#1 lief auf Anhieb. Mit den angegeben Änderungen in der Audio.h und dem timeout-Parameter im sketch auch wie versprochen sehr sauber und ohne Abbrüche

Dann ging es an die Auswahl eines größeren Softwarepaketes.

Edzelf V1 und Edison kommen nicht in Frage weil sie nur den VS1053-Codec unterstützen.

KaRadio hat kein passendes template für die benötigte I2S-Belegung. Irgendwann schaffe ich es mal meine eigenen Vorlagen dort einzubinden.

Schreibfaul (schreibfaul1-ESP32-audioI2S-master) bekam ich nicht kompiliert. Das Problem ist vermutlich dass ich mangels Espressif Umgebung mit der Arduino-IDE bastelte.

Zitat:core\core.a(main.cpp.o)Sad.literal._Z8loopTaskPv+0x8): undefined reference to `setup()'
core\core.a(main.cpp.o)Sad.literal._Z8loopTaskPv+0xc): undefined reference to `loop()'
core\core.a(main.cpp.o): In function `loopTask(void*)':
F:\Users\Jupp\Documents\ArduinoData\packages\esp32\hardware\esp32\1.0.6\cores\esp32/main.cpp:18: undefined reference to `setup()'
F:\Users\Jupp\Documents\ArduinoData\packages\esp32\hardware\esp32\1.0.6\cores\esp32/main.cpp:21: undefined reference to `loop()'
collect2.exe: error: ld returned 1 exit status
Mehrere Bibliotheken wurden für "WiFi.h" gefunden
Benutzt: F:\Users\Jupp\Documents\ArduinoData\packages\esp32\hardware\esp32\1.0.6\libraries\WiFi
Nicht benutzt: C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.57.0_x86__mdqgnx93n4wtt\libraries\WiFi
Mehrere Bibliotheken wurden für "SD.h" gefunden
Benutzt: F:\Users\Jupp\Documents\ArduinoData\packages\esp32\hardware\esp32\1.0.6\libraries\SD
Nicht benutzt: C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.57.0_x86__mdqgnx93n4wtt\libraries\SD
exit status 1
Fehler beim Kompilieren für das Board ESP32 Dev Module.

verblieb noch Edzelf V2. Auch hier strickte ich das Paket für die IDE um. Machte eine Grundinstallation mit dem Initialisierungstool Esp32_radio_init und lud den data-Ordner hoch. Hier ein kleiner Tip: im data-Ordner gleich die WiFi Verbindung eintragen, das erspart später das Handy-Gefummel im AP-Mode. Entsprechend den Fehlermeldungen des Compilers lud ich nach und nach die benötigten libraries in den sketch-Ordner.

[attachment=114837]

der ESP konnte nun schon mal ins Netz einbuchen und das webinterface funktionierte. Im config-Bereich musste der Dreh-Encoder deaktiviert (alternativ: umbelegt) werden, weil seine Pin's für I2S benötigt werden

Code:
pin_enc_clk = -1                                     # GPIO Pin number for rotary encoder "CLK"
pin_enc_dt = -1                                      # GPIO Pin number for rotary encoder "DT"
pin_enc_sw = -1                                      # GPIO Pin number for rotary encoder "SW"
pin_i2s_bck = 27                                      # GPIO Pin number for I2S "BCK"
pin_i2s_din = 25                                      # GPIO Pin number for I2S "DIN"
pin_i2s_lck = 26                                     # GPIO Pin number for I2S "L(R)CK"

ein Ton war noch nicht zu hören. Der passende Codec musste noch ausgewählt werden. Dazu ging es wieder in die config.h des source-code. Die passende Auswahl für das Pintel-Board ist hier DEC_HELIX.

Zitat:// Define (just one) type of MP3/AAC decoder
//#define DEC_VS1053                                      // Hardware decoder for MP3, AAC, OGG
//#define DEC_VS1003                                      // Hardware decoder for MP3
#define DEC_HELIX                                      // Software decoder for MP3, AAC. I2S output
//#define DEC_HELIX_AI                                    // Software decoder for AI Audio kip (AC101)
//#define DEC_HELIX_INT                                  // Software decoder for MP3, AAC. DAC output
                                                          // Needs platform = espressif32@3.1.0 !!!!

das Radio spielte jetzt klar und mit großer Lautstärke. Ich war positiv überrascht dass Edzelf endlich die Lautstärke-Einstellung im Griff hat. Der Wert 4 von maximal 100 genügt für eine angenehme Lautstärke auf dem Schreibtisch. Der Pegel insgesamt muss also noch entsprechend der Pintel-Vorgabe abgesenkt werden.

Die nächsten Schritte werden sein: Auswahl und Konfiguration eines Display, Einbau und Konfiguration von Bedienelementen, eine brauchbare playlist. Alles nur noch Fleißarbeit. Für die erste Inbetriebnahme ist noch der DummyTFT eingestellt:

Code:
// Define (just one) type of display.  See documentation.
//#define BLUETFT                                         // Works also for RED TFT 128x160
//#define ST7789                                          // 240x240 TFT
//#define OLED1306                                        // 64x128 I2C OLED SSD1306
//#define OLED1309                                        // 64x128 I2C OLED SSD1309
//#define OLED1106                                        // 64x128 I2C OLED SH1106
#define DUMMYTFT                                        // Dummy display
//#define LCD1602I2C                                      // LCD 1602 display with I2C backpack
//#define LCD2004I2C                                      // LCD 2004 display with I2C backpack
//#define ILI9341                                         // ILI9341 240*320
//#define NEXTION                                         // Nextion display
//
Schön, dass es gut läuft.
(18.11.2022, 16:44)pintel schrieb: [ -> ]
(18.11.2022, 13:30)saarfranzose schrieb: [ -> ]KaRadio hat kein passendes template für die benötigte I2S-Belegung. Irgendwann schaffe ich es mal meine eigenen Vorlagen dort einzubinden.

Kann man das nicht ändern?
https://github.com/karawin/KaRadio32_4/b...ude/gpio.h
ini der README.md ist es beschrieben:

Zitat:To build your own release if you want to do some improvments, you must install the idf https://github.com/espressif/esp-idf and the toolchain. The esp-idf release is the 4.4 minimum

die große Bequemlichkeit bei KaRadio ist das Hochladen fertiger binaries mit einem kleinen tool. Display, WLAN etc. lassen sich mit ser.Monitor/Terminal mit kleinen Anweisungen konfigurieren. Für eigene Boarddefinitionen, die von den Beispieldefinitionen abweichen, benötigt man aber die Espressif-Umgebung.

Die I2S-Belegung liegt bei Karadio bei den meisten Beispiel-Vorlagen auf:

P_I2S_LRCK data u8 25
P_I2S_BCLK data u8 26
P_I2S_DATA data u8 22

für uns knapp daneben. Oder auf komplett anderen gpios.

Damit entfällt der große Vorteil von KaRadio ganz ohne Compiler ein Radio bauen zu können. ADF/IDF hatte ich auf einem kleinen Linux-PC im Zuge von iRadioMini schon mal eingerichtet. Mit KaRadio kam ich dort aber nicht klar. Eigentlich muss die binary nur ein einziges Mal mit einer passenden CSV-Vorlage erzeugt werden. Dann können weniger begabte Bastler mit einfachen Mitteln und ohne Compiler, auch ohne PlatformIO, den Baustein mit KaRadio bespielen und konfigurieren.
Beim KaRadio habe ich mal mit einem Hex-Editor in die standard_adb.bin geschaut und folgendes festgestellt:

[attachment=114866]

Die Pins können in der Datei geändert werden. Original sieht es so aus:
P_I2S_LRCK 25 > HEX 19
P_I2S_BCLK 26 > HEX 1A
P_I2S_DATA 22 > HEX 16

Man müsste also nur die HEX 19 in eine HEX 1A, die HEX 1A in eine HEX 1B und die HEX 16 in eine HEX 19 ändern.
So weit ich weiß, wird GPIO 27 nicht gesondert verwendet, somit gäbe es auch keine Konflikte. Ansonsten müsste man den Übeltäter finden und ihm den GPIO 22 (HEX 16) zuordnen.

Es geht natürlich auch mit der nvs_partition_gen.py, ist aber für manchen wahrscheinlich zu umständlich oder zu kompliziert.
Nur zur Info, das KaRadio32_4 lässt sich ohne Probleme auf dem ESP32 Audio installieren.

[attachment=114878]

Die esp32_audio.bin könnt ihr hier runterladen (oder selbst erstellen):
https://pintel.de/esp32_audio.bin

Alle anderen Dateien bleiben unverändert und befinden im Ordner binaries.

[attachment=114877]

Viel Spaß damit.
sehr gute Idee, Jens! Ich habe die standard_adb.bin entsprechend gepatcht und den Baustein bespielt.

[attachment=114880]

[attachment=114879]

dann das Prcocedere WLAN und Radiostation durchgeführt.

[attachment=114881]

im Monitor sieht man dass der Sender empfangen und abgespielt wird

[attachment=114882]

das wäre dann die Auswahl des Codec im webinterface:

[attachment=114883]

leider nichts zu hören. Es sieht so aus als würde keines der Ausgabegeräte passen.

Da überschneiden sich grade unsere postings. Ich melde mich wieder!
Bei Audio Setting muss der Output auf I2S stehen. Versuche mal meine Binärdatei. Verwendet habe ich https://github.com/karawin/KaRadio32_4.

Und irgendwie hast Du auch ein anderes Flashtool.
es funktioniert! Ich hatte offensichtlich die falsche KaRadio-Version! Die Codec hatte ich alle durchprobiert, deshalb steht meine Hardcopy noch auf SPDIF.

Das Download-Tool habe ich frisch von Espressif. Aber es hat seinen Dienst ja getan

[attachment=114889]

Das finde ich jetzt richtig klasse. Wie lange bastele ich schon an einer passenden binary, aber auf die Idee bin ich nie gekommen eine vorhandene zu patchen. Jetzt kann ich auch weitere Ideen umsetzen die schon seit Monaten in meinem Kopf schwirren.

Danke, Jens, für deine Unterstützung!
Hier eine Anleitung, mit der man auch ohne Kenntnisse das KaRadio auf dem ESP32 Audio installieren kann.

Als erstes ladet euch das Flash Download Tool von Espressif runter (leider nur für Windows).
https://www.espressif.com/en/support/dow...-tools?6&2

Als nächstes braucht ihr die Binärdateien. Um es noch einfacher zu machen, habe ich den kompletten Speicherinhalt zu einer Datei zusammengefasst.
https://pintel.de/esp32_audio_komplett.bin

Nun schließt ihr den ESP32 Audio über USB an den Rechner an. Um herauszufinden, welchen COM-Port der ESP hat, klickt ihr mit der rechten Maustaste auf das Windowssymbol in der Startleiste und öffnet den Geräte-Manager. Unter Anschlüsse (COM % LPT) ermittelt man den COM-Port (hier ist es COM4).

[attachment=114914]

Nun öffnet ihr das Flash Download Tool und stellt im ersten Fenster ESP32 ein.

[attachment=114915]

Nun wählt ihr im ersten Feld die Datei esp32_audio_komplett.bin aus, setzt davor das Häkchen und tragt als Speicheradresse eine 0 ein. Den COM Anschluss haben wir vorhin ermittelt, dieser muss unten eingestellt werden. Die restlichen Einstellungen siehe folgendes Bild. Wenn alles eingestellt ist, dann auf START drücken.

[attachment=114910]

Wenn der Download beendet ist, sind wir eigentlich schon fertig.

[attachment=114909]

Nun beim ESP32 Audio den Resetknopf (EN) drücken. Nach einer Weile baut das KaRadio ein eigenes WLAN-Netz ohne Passwort mit dem Namen WifiKaradio auf. Damit verbinden wir uns jetzt.

[attachment=114911]

Nun öffnen wir den Browser und geben 192.168.4.1 in die Adressleiste ein. Etwas Geduld, es dauert etwas bis die Seite erscheint. Im Bereich Wifi & Network können wir jetzt unser WLAN eintragen. Nun entweder das Häkchen bei Use DHCP detzen, oder eine feste IP vergeben. Das ganze mit Validate bestätigen. Das KaRadio startet nun neu und loggt sich in euer WLAN ein, auch da viel Geduld, es dauert etwas.

[attachment=114912]

Wenn ihr DHCP gewählt habt, müsst ihr die neue IP Adresse im Router suchen. Bei einer Fritz!Box kann ich folgende Einstellungen empfehlen:

[attachment=114913]

Nun ist das Radio unter der neuen Adresse im Heimnetz verfügbar und bedienbar. Es empfielt sich auch die APP für das Handy zu installieren.
https://play.google.com/store/apps/detai...l=de&gl=US

Nun haben wir ein fertiges Internetradio ohne Tasten und Display, aber bedienbar über den Browser oder die APP.
Natürlich kann man auch Tasten, Drehregler, IR-Empfänger oder Displays anschließen. Hier sollte aber nur die Grundinstallation vereinfacht werden. Wie ihr jetzt andere Komponenten anschließt, kann man hier nachlesen:
https://github.com/karawin/KaRadio32_4

Viel Spaß
ich mache mal weiter mit dem Thema Display. Ich wollte wissen ob das ESP32Audio-Board mit den SPI-Definitionen der Vorlagendatei standard_adb.csv, der ja auch die esp_audio.bin zugrunde liegt, ein Display treiben kann.

Ich wählte dieses Display:

[attachment=114952]

die Verdrahtung ist der standard_adb.csv zu entnehmen (A0 entspricht dem Pin DC):

[attachment=114953]

natürlich muss auch noch GND sowie die 3,3V auf Vcc und LED aufgelegt werden. Da es nur einen 3,3V-Pin auf dem Board gibt löte ich dazu eine Drahtbrücke auf die Lötseite des Display.

Die Auswahl des Display erfolgt anhand der Liste in der README.md mit einer einfachen Anweisung im seriellen Monitor. Diesem Display entspricht z.B. der Wert 194:

[attachment=114954]

nach einem reboot ist zu sehen dass das Anbau des Display erfolgreich war:

[attachment=114955]
als nächstes will ich ein I2C-Display zeigen. Wie gehabt ermitteln wir die Verdrahtung des I2C-Bus anhand der standard_adb.csv:

Zitat:P_I2C_SCL,data,u8,14
P_I2C_SDA,data,u8,13

natürlich zuzüglich Masse und 3,3V

dann schlagen wir den Karadio-Typ in der README.md nach. Ich habe hier ein etwas ausgefallenes, aber orginelles kleines Display. Ein 0,91" OLED, Chipsatz SSD1306:

#define LCD_I2C_SSD1306UN 6 //128x32

mit der Anweisung:

Zitat:sys.lcd("6")

im seriellen Monitor wird es aktiviert. Die Demo diesmal als Filmchen:

Ganz große Klasse Jupp. Fällt Dir auch eine einfache Lösung für eine IR Fernbedienung ein?
Seiten: 1 2 3 4 5 6 7