Hier möchte ich heute mal dieses VS1003/VS1053 Board vorstellen, um damit ein günstiges Webradio zu erstellen.
Es kann unter anderen MP3, AAC, WMA, Ogg Vorbis und WAV Audiodateien dekodieren, so das es mir bei diesem Projekt ermöglicht, die von dem ESP32 empfangenen Web Radio Sender Streams auf einem kleinen Lautsprecher auszugeben.
Zusätzlich kann der Chip auch Audiodaten im MIDI-Format abspielen und unterstützt Sprachaufzeichnungen in verschiedenen Formaten.
Somit können auch einfache Mikrocontroller, die I2S nicht unterstützen oder nicht genug Leistung und Ressourcen haben, Audiodateien zu dekodieren, Audioinformationen ausgeben.

Aufbau und Funktionsweise
Das Board mit seinem VS1053 Audio-Codierungs- und Dekodierungschip (Codec), liefert eine hohe Audioqualität bei geringem Stromverbrauch. Es enthält folgende Hauptkomponenten:
- Decoder: Der VS1053 kann verschiedene komprimierte Audioformate (wie MP3 oder AAC) dekodieren, um diese in PCM (Pulse Code Modulation) zu konvertieren, das vom Digital-Analog-Wandler (DAC) verarbeitet wird.
- Digital-Analog-Wandler (DAC): Dieser Teil des Chips wandelt die digitalen Audiodaten in analoge Signale um, die an einen aktiven Lautsprecher oder Kopfhörer gesendet werden können.
- Prozessor: Ein integrierter Prozessor übernimmt die Dekodierung der Audioformate und das Verarbeiten der Audiodatenströme in Echtzeit.
- Schnittstellen: Der VS1053 kommuniziert mit externen Mikrocontrollern oder Mikroprozessoren über serielle Schnittstellen wie SPI (Serial Peripheral Interface). Diese Schnittstelle ermöglicht es dem Mikrocontroller, Audiodaten zu senden, Befehle zu erteilen und den Status des Chips abzufragen.
- Equalizer und Soundeffekte: Der Chip bietet erweiterte Funktionen wie einen parametrischen Equalizer, Bass- und Höhenverstärkung sowie Hall- und Stereoeffekte.
- Kopfhörer-Ausgang: Der Chip hat eine dedizierte Ausgangsstufe, die direkt an Kopfhörer oder einen Verstärker angeschlossen werden kann.
- Mikrofon für Aufnahme, unterstützt das Aufnahmekodierungsformat IMA ADPCM (Mono);
Weitere mögliche Anwendungen
- MP3-Player
- Audiowiedergabegeräte für Embedded-Systeme
- Sprachaufzeichnungsgeräte
- Digitalen Audioplayer in Embedded-Projekten (z. B. Arduino)
Was codiert und decodiert werden kann, kann hier eingesehen werden.
Benötigte Materialien:
Aktiver Lautsprecher oder Kopfhörer
Jumper-Kabel
USB-Kabel
Powerbank (optional für mobile Stromversorgung)
Computer mit installierter Entwicklungsumgebung Arduino IDE
WLAN-Zugang
Verdrahtung:
Verbinde das VS1053 Board mit dem ESP32 über den SPI-Bus:
- MOSI (VS1053) an GPIO 23 (ESP32)
- MISO (VS1053) an GPIO 19 (ESP32)
- SCK (VS1053) an GPIO 18 (ESP32)
- CS (VS1053) an GPIO 5 (ESP32)
- DCS (VS1053) an GPIO 16 (ESP32)
- REQ (VS1053) an GPIO 4 (ESP32)
- RST (VS1053) an EN (ESP32)

Was ist der SPI Bus:
SPI steht für Serial Peripheral Interface und wurde 1987 von Motorola entwickelt.
Ein Standard für einen synchronen seriellen Datenbus (Synchronous Serial Port) mit dem digitale Schaltungen nach dem Master-Slave-Prinzip miteinander verbunden werden können.
- Es gibt drei gemeinsamen Leitungen, an die jeder Teilnehmer angeschlossen ist:
- SLK (Serial Clock) auch SCK oder SCLK, wird vom Controller zur Synchronisation ausgegeben
- MISO (Master Input, Slave Output)
- MOSI (Master Output, Slave Input)
- Um den richten Slave anzusprechen gibt es eine oder mehrere mit logisch-0 aktive Chip-Select-Leitungen mit Bezeichnung CS (Chip Select oder auch SS für Slave Select)

Quelle: SPI-Text und Bild als Auszug aus der Wiki
Bibliothek:
Gehe zu Library und Beispiel Code von PSchatzmann auf GitHub.
Lade die ZIP-Datei herunter.
Importiere die Bibliothek in die Arduino IDE: Sketch -> Include Library -> Add .ZIP Library
Quellcode:
Verwende diesen Sketch in der Arduino IDE und ändere WLAN-SSID und das Passwort passend zu deinem Router.
Ändere oder ergänze den Stream Dienst nach deiner Wahl.
Download auf GitHub oder hier:
#include <VS1053Driver.h>
#define UNDEFINED -1
#ifdef ARDUINO_ARCH_ESP8266
#include <ESP8266WiFi.h>
#define VS1053_CS D1
#define VS1053_DCS D0
#define VS1053_DREQ D3
#endif
#ifdef ARDUINO_ARCH_ESP32
#include <WiFi.h>
#define VS1053_CS 5
#define VS1053_DCS 16
#define VS1053_DREQ 4
#endif
// Lautstärke:
#define VOLUME 80 // maximal 99
VS1053 player(VS1053_CS, VS1053_DCS, VS1053_DREQ, UNDEFINED, SPI);
WiFiClient client;
// WiFi hier eintragen:
const char *ssid = "euer SSID Name";
const char *password = "SSID Passwort";
//Erfolgreich getestete Sender:
const char *host = "ic.radiomonster.fm";
const char *path = "/tophits.ultra"; //Tophits Kanal
//const char *path = "/dance.ultra"; //Dance Kanal
//const char *path = "/evergreens.ultra"; //Evergreens Kanal
//const char *path = "/schlager.ultra"; //Schlager Kanal
int httpPort = 80;
//const char *host = "icecast.omroep.nl";
//const char *path = "/radio6-bb-mp3";
//int httpPort = 80;
//const char *host = "puma.streemlion.com";
//const char *path = "/stream";
//int httpPort = 1960;
// Die Puffergröße 64 scheint optimal zu sein. Bei 32 und 128 könnte der Klang blechern klingen
uint8_t mp3buff[64];
void setup() {
Serial.begin(115200);
// 3 Sekunden Pause, bis VS1053 eingeschaltet sind
// sonst startet das System möglicherweise nicht richtig
delay(3000);
// This can be set in the IDE no need for ext library
// system_update_cpu_freq(160);
Serial.println("\n\nEinfaches Wifi Radio startet");
SPI.begin();
player.beginOutput();
player.setVolume(VOLUME);
Serial.print("Connecting to SSID ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
Serial.print("connecting to ");
Serial.println(host);
if (!client.connect(host, httpPort)) {
Serial.println("Connection failed");
return;
}
Serial.print("Requesting stream: ");
Serial.println(path);
client.print(String("GET ") + path + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
}
void loop() {
if (!client.connected()) {
Serial.println("Reconnecting...");
if (client.connect(host, httpPort)) {
client.print(String("GET ") + path + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
}
}
if (client.available() > 0) {
// Die Puffergröße 64 scheint optimal zu sein. Bei 32 und 128 könnte der Klang blechern klingen
uint8_t bytesread = client.read(mp3buff, 64);
player.playChunk(mp3buff, bytesread);
}
}
Kompilieren und Hochladen
Schließe den ESP32 an deinen Computer an.
Wähle das richtige Board und den Port in der Arduino IDE aus.
Klicke auf Sketch -> Upload, um den Code auf den ESP32 hochzuladen
Öffne den seriellen Monitor in der Arduino IDE: Tools -> Serial Monitor.
Überprüfe die Ausgabe, um sicherzustellen, dass der ESP32 eine Verbindung zum WLAN herstellt
und den Webradio-Stream abspielt.
Viel Spaß beim Radio hören 🙂
Video Tutorial:
In der nächsten Folge wird das WebRadio erweitert:
Das WebRadio wird um ein Display zur Anzeige von Senderinformationen erweitert.
Ein Regler zur Senderauswahl, der auch die Lautstärke regeln kann, wird hinzugefügt.
Ein Gehäuse für den 3D-Druck wird erstellt und damit der finale Einbau in das 3D-Druck-Gehäuse gezeigt. Das Gehäuse wird selbstverständlich auch als Download zur Verfügung gestellt.
Benötigte Hardware:
Drehimpuls Regler
OLED Display 128×64 SSD1306