Skip to Content

Audio mit PAM8403, PCM5102 und ESP32

Audio mit PAM8403, PCM5102 und ESP32

In diesem Tutorial lernst du, wie du ein Internet-, Bluetooth- oder MP3-Radio mit einem PAM8403-Verstärker, einem PCM5102 DAC und einem ESP32-Mikrocontroller baust.

Während der PCM5102 DAC die Sounderzeugung mit einem ESP32 sehr einfach macht, kann er nur Kopfhörer mit hoher Impedanz und aktive Lautsprecher antreiben. Möchtest du passive Lautsprecher betreiben, benötigst du einen zusätzlichen Verstärker.

Der PAM8403 ist ein sehr kleiner und effizienter Class-D-Verstärker, der passive Lautsprecher mit bis zu 3 Watt antreiben kann. Er benötigt keine separate Stromversorgung, und das gesamte Audiosystem kann mit Batteriestrom betrieben werden. Wenn du ein kleines, tragbares Internet-, Bluetooth- oder MP3-Radio bauen möchtest, ist dieses Tutorial genau richtig für dich.

Benötigte Teile

Du benötigst ein PCM5102 DAC-Modul, ein PAM8403 Verstärkerboard, einen ESP32 und ein Paar passive Lautsprecher. Du kannst auch andere Lautsprecher verwenden – achte nur darauf, dass ihre Leistung etwa 3 Watt beträgt.

Als Mikrocontroller brauchst du einen ESP32. Ich habe einen ESP32 lite gewählt, aber die meisten anderen ESP32-Boards funktionieren ebenfalls.

Um MP3-Dateien von einer SD-Karte abzuspielen, benötigst du außerdem eine SD-Karte und ein SD-Kartenlesermodul. Ein Breadboard und einige Kabel sind für einen Prototypenaufbau ebenfalls praktisch.

PAM8403 Verstärker

PCM5102 DAC

2 x Lautsprecher 3 Watt 8 Ohm

Micro SD Kartenleser

Micro SD Karte 8GB

ESP32 lite Lolin32

ESP32 lite

USB data cable

USB-Datenkabel

Dupont wire set

Dupont-Kabelsatz

Half_breadboard56a

Breadboard

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

Technische Merkmale des PAM8403

Das PAM8403-Modul ist ein kleiner Stereo-Audioverstärker, der auf dem PAM8403-IC basiert und eine Class-D-Verstärkungstopologie verwendet. Für technische Details zum PAM8403 siehe den folgenden Link:

Im Gegensatz zu herkömmlichen Class-AB-Audioverstärkern nutzt die Class-D-Architektur im PAM8403 hochfrequente Pulsweitenmodulation (PWM), um ein analoges Audiosignal in einen hocheffizienten digitalen Antrieb für Lautsprecher umzuwandeln.

Da die Schalttransistoren entweder vollständig ein- oder ausgeschaltet sind, werden Leitungsverluste deutlich reduziert, wodurch der Verstärker unter typischen Betriebsbedingungen Wirkungsgrade von bis zu 90 % erreicht.

Diese Effizienz macht das Modul ideal für batteriebetriebene und mikrocontrollerbasierte Audioanwendungen wie Arduino- oder ESP32-Projekte, bei denen Platz und Stromverbrauch begrenzt sind.

Elektrische Eigenschaften und Leistungsausgabe

Elektrisch akzeptiert das PAM8403-Modul eine einzelne Gleichspannungsversorgung in einem relativ weiten Bereich von etwa 2,5 V bis 5,5 V. Bei der nominalen 5 V Versorgungsspannung und Lautsprechern mit 4 Ω kann jeder Kanal bis zu etwa 3 W Ausgangsleistung liefern.

Signal-Eingänge, Verstärkung und Frequenzgang

Die Audioeingangsschnittstelle eines PAM8403-Moduls besteht aus zwei Line-Level-Eingängen für den linken und rechten Kanal.

Die Verstärkung des Verstärkers ist intern fest auf etwa 24 dB eingestellt, was bedeutet, dass bereits moderate Eingangssignalpegel von einigen hundert Millivolt Spitze-Spitze ausreichen, um die Ausgänge nahezu voll auszusteuern, ohne zu übersteuern.

Das interne Signal-Rausch-Verhältnis (SNR) ist hoch genug, um eine saubere Audiowiedergabe im hörbaren Bereich von etwa 20 Hz bis 20 kHz zu gewährleisten.

Das Bild unten zeigt das Pinout des PAM8403-Moduls. Die Lautsprecherausgänge befinden sich oben, während Audioeingang und Stromversorgung unten am Board sind:

Pinbelegung des PAM8403 Verstärkers

Schutz, thermisches Verhalten und Modul-Layout

Der PAM8403-IC verfügt über mehrere Schutzmechanismen zur Verbesserung der Zuverlässigkeit. Dazu gehören typischerweise thermischer Abschaltschutz, Kurzschlussschutz zur Begrenzung des Stroms bei Überlast an den Lautsprecherausgängen und Unterspannungssperre.

Das passive Bauteilnetzwerk des Moduls unterstützt einen stabilen PWM-Betrieb und unterdrückt elektromagnetische Störungen (EMI) auf akzeptable Werte, ohne dass externe Filterkomponenten erforderlich sind.

Da der Class-D-Chip effizient arbeitet, ist normalerweise kein externer Kühlkörper für typische Lasten notwendig.

Technische Spezifikation

Die folgende Tabelle fasst die technischen Spezifikationen des PAM8403 zusammen:

Parameter Spezifikation
Verstärkertyp Class-D Stereo-Audioverstärker
Anzahl der Kanäle 2 (Links und Rechts)
Versorgungsspannungsbereich 2,5 V bis 5,5 V DC
Typische Ausgangsleistung Bis zu ca. 3 W pro Kanal an 4 Ω bei 5 V, THD+N = 10 %
Ausgangsleistung bei 8 Ω Ca. 1,8 W pro Kanal an 8 Ω bei 5 V, THD+N = 10 %
Gesamtklirrfaktor + Rauschen Ca. 0,15 % bei 1 W an 8 Ω, 5 V Versorgung
Verstärkung (geschlossen) Ca. 24 dB
Signal-Rausch-Verhältnis (SNR) Ca. 80 dB
Ruhe-Stromaufnahme Ca. 8–16 mA bei 5 V
Abschaltstrom < 1 µA
Versorgungs-Ripple-Unterdrückung (PSRR) Ca. -58 dB bei 1 kHz
Wirkungsgrad Ca. 80–90 % je nach Last
Betriebstemperatur -40 °C bis +85 °C
Schutzfunktionen Kurzschlussschutz, thermischer Abschaltschutz
Lastimpedanz 4 Ω bis 8 Ω empfohlen
Typische Schaltfrequenz Ca. 260 kHz

Anschluss des PAM8403 an PCM5102 und ESP32

In diesem Abschnitt verbinden wir den PAM8403-Verstärker mit dem PCM5102 DAC und dem ESP32-Mikrocontroller. Das Bild unten zeigt das vollständige Schaltbild:

Anschluss PAM8403 an PCM5102 und ESP32

Beginne damit, den ESP32 über die I2S-Schnittstelle mit dem PCM5102 zu verbinden. Du kannst im Code andere Pins konfigurieren, aber ich verwende hier LCK=32, BCK=25 und DIN=33. Die folgende Tabelle zeigt die Verbindungen zwischen ESP32 und PCM5102, die du herstellen musst:

PCM5102A ESP32
VIN 3V3
GND G
LRCK 32
BCK 25
DIN 33
SCK G

Wenn du die SCK-Brücke auf dem PCM5102 gelötet hast, benötigst du die SCK-zu-GND-Verbindung eigentlich nicht. Ich empfehle dir dringend, zuerst das Playing Audio with ESP32 and PCM5102A Tutorial zu lesen, falls du den PCM5102 noch nicht konfiguriert oder verwendet hast. Es gibt weitere Brücken, die gelötet werden müssen, damit der PCM5102 funktioniert!

Der PAM8403-Verstärker wird über Line-Out mit dem PCM5102 verbunden. Die folgende Tabelle zeigt die erforderlichen Verbindungen:

PAM8403 PCM5102
L LROUT
AGND
R ROUT

Beachte, dass die Beschriftung der Pins des PCM5102 etwas verwirrend ist. Der linke Kanalausgang sollte eigentlich „ROUT“ heißen, ist aber mit „LROUT“ beschriftet.

Polung der Lautsprecher

Die rechten und linken Lautsprecher werden an die Pins R+, R-, L+ und L- des PAM8403 angeschlossen. Achte darauf, die Polung der Ausgangspins mit der Polung der Lautsprecheranschlüsse abzugleichen. Typischerweise sind die Lautsprecheranschlüsse mit „+“ und „-“ gekennzeichnet oder haben unterschiedlich geformte Pins (dünner für Minus).

Wenn keine Markierungen vorhanden sind, kannst du eine 1,5 V AA-Batterie anschließen. Bewegt sich die Membran nach außen, zeigt der Pluspol der Batterie den Pluspol des Lautsprechers an. Die Lautsprecherpolung ist so definiert, dass eine positive Spannung die Membran nach vorne bewegt.

Verdrahtung auf dem Breadboard

Das folgende Foto zeigt meine Verdrahtung von PAM8403, PCM5102, ESP32 und den zwei Lautsprechern zum Testen:

Da das System weniger als 200 mA verbraucht, kannst du es über den USB-Anschluss (oder eine Batterie) mit Strom versorgen. Eine externe Stromversorgung ist nicht nötig.

Anschluss des SD-Kartenlesers

Wenn du MP3-Dateien abspielen möchtest, musst du einen SD-Kartenleser anschließen, der die Audiodateien von einer SD-Karte liest. Das folgende Schaltbild zeigt, wie du den zusätzlichen SD-Kartenleser anschließt:

Connecting PAM8403 to PCM5102 and ESP32 with SD Card Reader
Anschluss PAM8403 an PCM5102 und ESP32 mit SD-Kartenleser

Der SD-Kartenleser kommuniziert über SPI, und die Standard-SPI-Pins des ESP32 sind CS=5, MOSI=23, CLK=18 und MISO=19. Die folgende Tabelle fasst die Verbindungen zwischen SD-Kartenleser und ESP32 zusammen:

SD-Kartenleser ESP32
3V3 3V
GND G
CS/SS 5
MOSI 23
CLK/SCK 18
MISO 19

Wenn du dir nicht sicher bist, welche Pins die Standard-SPI-Pins deines ESP32 sind, schau dir unser Find I2C and SPI default pins Tutorial an.

Installation der Bibliotheken

Wir verwenden die arduino-audio-tools Bibliothek von Phil Schatzmann, um den Internet-, Bluetooth- und MP3-Player zu bauen. Um diese Bibliothek zu installieren, gehe zum arduino-audio-tools Repo, klicke auf den grünen „<> Code“-Button und dann auf „Download ZIP“, um die Bibliothek als ZIP-Datei herunterzuladen, wie unten gezeigt:

Öffne dann einen Sketch, gehe zu Sketch -> Include Library -> Add .ZIP Library … und installiere die heruntergeladene ZIP-Bibliothek (arduino-audio-tools-main.zip):

Für einige Codebeispiele benötigen wir zwei weitere Bibliotheken von Phil Schatzmann, nämlich die arduino-libhelix Bibliothek und die ESP32-A2DP Bibliothek. Du kannst sie auf die gleiche Weise installieren. Klicke auf den Link, um zum GitHub-Repo zu gelangen, klicke auf den grünen „<> Code“-Button, lade die Bibliotheken (arduino-libhelix-main.zip, ESP32-A2DP-main.zip) herunter und installiere sie.

Wenn du zum ersten Mal ein ESP32-Board mit deiner Arduino IDE programmierst, musst du auch den ESP32-Core installieren. Details findest du im Install ESP32 core in Arduino IDE Tutorial.

Die nächsten drei Abschnitte enthalten den Code für einen Bluetooth-Player, ein Internetradio und einen MP3-Player, die du auf dem PAM8403-, PCM5102- und ESP32-Audiosystem laufen lassen kannst.

Code für einen Bluetooth-Player

Dieses erste Codebeispiel konfiguriert den ESP32 als Bluetooth A2DP Audio-Sink, der Stereo-Audiostreams von einem gekoppelten Gerät wie einem Smartphone empfängt und die digitalen Audiodaten über die I2S-Schnittstelle ausgibt.

/*
www.makerguides.com

Libraries:
- ESP32 Core 3.3.6
- [arduino-audio-tools](https://github.com/pschatzmann/arduino-audio-tools) 
  Version: 1.2.2
- [arduino-libhelix](https://github.com/pschatzmann/arduino-libhelix)
  Version: 0.9.2
- [ESP32-A2DP](https://github.com/pschatzmann/ESP32-A2DP)
  Version: 1.8.8
*/

#include "AudioTools.h"
#include "BluetoothA2DPSink.h"

#define DIN_PIN 33   // serial data
#define LRCK_PIN 32  // word select
#define BCLK_PIN 25  // serial clock

I2SStream i2s;
BluetoothA2DPSink a2dp_sink(i2s);

void setup() {
  Serial.begin(115200);
  AudioLogger::instance().begin(Serial, AudioLogger::Info);

  auto config = i2s.defaultConfig();
  config.pin_bck = BCLK_PIN;
  config.pin_ws = LRCK_PIN;
  config.pin_data = DIN_PIN;  
  i2s.begin(config);

  a2dp_sink.start("MyMusic");
}

void loop() { }

Der Code initialisiert eine I2SStream Schnittstelle mit den zugewiesenen Bit-Clock-, Word-Select- und Seriell-Daten-Pins, die mit einem PCM5102 Digital-Analog-Wandler verbunden sind. Der PCM5102 wandelt das eingehende I2S-Digital-Audiosignal in ein analoges Stereo-Signal um, das dann vom PAM8403-Verstärkermodul verstärkt wird, um zwei angeschlossene Lautsprecher anzutreiben.

Während der Einrichtung initialisiert der ESP32 den I2S-Treiber mit der angegebenen Pin-Konfiguration und startet den Bluetooth A2DP-Sink mit dem Gerätenamen „MyMusic“, wodurch der ESP32 als Bluetooth-Audioempfänger sichtbar wird.

Nach dem Koppeln und Verbinden wird der über Bluetooth gestreamte Ton direkt über die I2S-Schnittstelle zum DAC geleitet und anschließend zur Wiedergabe verstärkt. Die Hauptschleife bleibt leer, da die Audioverarbeitung und Bluetooth-Kommunikation intern von den zugrundeliegenden Bibliotheken asynchron im Hintergrund verwaltet werden.

Wenn du ein klackerndes, „tak“, „tak“ Geräusch hörst und keine Musik, ist die Lautstärke zu hoch. Reduziere die Lautstärke auf deinem Telefon auf Null und erhöhe sie dann langsam.

Code für ein Internetradio

Dieses Codebeispiel verwendet den ESP32 als Wi-Fi-Internetradioempfänger, der einen Online-MP3-Audio-Stream empfängt, in Echtzeit dekodiert und das Audiosignal wieder über I2S an den PCM5102A DAC ausgibt. Das vom DAC erzeugte analoge Signal wird dann vom PAM8403 verstärkt, um die angeschlossenen Lautsprecher anzutreiben.

/*
www.makerguides.com

Libraries:
- ESP32 Core 3.3.6
- [arduino-audio-tools](https://github.com/pschatzmann/arduino-audio-tools) 
  Version: 1.2.2
- [arduino-libhelix](https://github.com/pschatzmann/arduino-libhelix)
  Version: 0.9.2
*/

#include <Arduino.h>
#include <WiFi.h>
#include <Wire.h>
#include "AudioTools.h"
#include "AudioTools/AudioCodecs/CodecMP3Helix.h"
#include "AudioTools/Communication/HTTP/ICYStream.h"

// PCM5102A
#define DIN_PIN 33   // serial data
#define LRCK_PIN 32  // word select
#define BCLK_PIN 25  // serial clock
#define VOLUME 0.05  // Volume

const char* ssid = "ssid";
const char* password = "pwd";
const char* url = "https://jazz.stream.laut.fm/jazz";

ICYStream icystream;
I2SStream i2s;
VolumeStream volume(i2s);
EncodedAudioStream mp3decode(&volume, new MP3DecoderHelix());
StreamCopy copier(mp3decode, icystream);

void callbackMetadata(MetaDataType type, const char* str, int len) {
  Serial.printf("%s: %s\n", toStr(type), str);
}

void setup() {
  Serial.begin(115200);
  AudioLogger::instance().begin(Serial, AudioLogger::Warning);

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }

  auto config = i2s.defaultConfig(TX_MODE);
  config.pin_bck = BCLK_PIN;
  config.pin_ws = LRCK_PIN;
  config.pin_data = DIN_PIN;

  i2s.begin(config);
  volume.begin(config);
  volume.setVolume(VOLUME);
  mp3decode.begin();
  icystream.begin(url);
  icystream.setMetadataCallback(callbackMetadata);
}

void loop() {
  copier.copy();
}

Während der Einrichtung verbindet sich der ESP32 mit einem angegebenen Wi-Fi-Netzwerk unter Verwendung der bereitgestellten SSID und des Passworts. Du musst die Strings „ssid“ und „pwd“ durch deine WLAN-Zugangsdaten ersetzen.

Sobald die drahtlose Verbindung hergestellt ist, initialisiert der Code die I2S-Schnittstelle im Sendemodus und weist die Bit-Clock-, Word-Select- und Seriell-Daten-Pins so zu, dass sie mit der PCM5102-Hardware-Schnittstelle übereinstimmen. Ein VolumeStream Objekt wird über den I2S-Stream gelegt, um eine digitale Lautstärkeregelung anzuwenden, bevor die Audiodaten an den DAC gesendet werden.

Du kannst die Lautstärke über die Konstante VOLUME steuern. Wenn die Lautstärke zu hoch wird, hörst du ein klackerndes Geräusch und musst die Lautstärke reduzieren. Da wir einen 3W-Verstärker verwenden, wird der Klang vor Erreichen der Maximalleistung nicht sehr laut.

Das Programm öffnet eine HTTP-Verbindung zur angegebenen Streaming-URL mit einem ICYStream, der ICY-Metadaten unterstützt, wie sie häufig von Internetradios verwendet werden. Hier ist eine Liste von URLs einiger anderer Internetradiosender, die du ausprobieren kannst:

"https://jazz.stream.laut.fm/jazz"
"http://vis.media-ice.musicradio.com/CapitalMP3";
"http://stream.srg-ssr.ch/m/rsj/mp3_128"
"http://stream.live.vc.bbcmedia.co.uk/bbc_world_service"
"http://icecast.omroep.nl/radio1-bb-mp3"
"http://stream-02-eu.relaxingjazz.com/stream/1/"

Die MP3-kodierten Audiodaten vom Internetradiosender werden an einen EncodedAudioStream weitergeleitet, der mit dem Helix MP3-Decoder konfiguriert ist und die komprimierten Audioframes in Echtzeit in rohe PCM-Samples dekodiert. Diese dekodierten Samples werden dann durch die Lautstärkeregelung geleitet und schließlich über I2S an den DAC übertragen.

Eine Metadaten-Callback-Funktion ist registriert, um Stream-Metadaten wie den aktuellen Titel im seriellen Monitor auszugeben. In der Hauptschleife überträgt das StreamCopy Objekt kontinuierlich Daten vom Netzwerkstream durch den Decoder und die Audiokette, um eine unterbrechungsfreie Wiedergabe zu gewährleisten, solange der Stream verfügbar ist.

Code für einen MP3-Player

Dieses letzte Programm verwendet den ESP32 als eigenständigen MP3-Audioplayer, der Audiodateien von einer SD-Karte liest, in Echtzeit dekodiert und das resultierende PCM-Signal über die I2S-Schnittstelle an den PCM5102A DAC ausgibt.

/*
www.makerguides.com

Libraries:
- ESP32 Core 3.3.6
- [arduino-audio-tools](https://github.com/pschatzmann/arduino-audio-tools) 
  Version: 1.2.2
- [arduino-libhelix](https://github.com/pschatzmann/arduino-libhelix)
  Version: 0.9.2
*/

#include "AudioTools.h"
#include "AudioTools/Disk/AudioSourceSD.h"
#include "AudioTools/AudioCodecs/CodecMP3Helix.h"

// PCM5102A
#define DIN_PIN 33   // serial data
#define LRCK_PIN 32  // word select
#define BCLK_PIN 25  // serial clock
#define VOLUME 0.05   // Volume

#define PATH "/"
#define EXT "mp3"

AudioSourceSD source(PATH, EXT);
I2SStream i2s;
MP3DecoderHelix decoder;
AudioPlayer player(source, i2s, decoder);

void printMetaData(MetaDataType type, const char* str, int len){
  Serial.printf("%s: %s\n", toStr(type), str);
}

void setup() {
  Serial.begin(115200);
  AudioToolsLogger.begin(Serial, AudioToolsLogLevel::Warning);

  auto config = i2s.defaultConfig(TX_MODE);
  config.pin_bck = BCLK_PIN;
  config.pin_ws = LRCK_PIN;
  config.pin_data = DIN_PIN;  
  i2s.begin(config);

  player.setMetadataCallback(printMetaData);
  player.setVolume(VOLUME);
  player.begin();
}

void loop() {
  player.copy();
}

Ein AudioSourceSD Objekt wird initialisiert, um MP3-Dateien im Root-Verzeichnis der SD-Karte zuzugreifen. Die Quelle ist so konfiguriert, dass Dateien mit der Endung „mp3“ ausgewählt werden, sodass das System kompatible Audiodateien auf der Karte durchlaufen kann. Das AudioPlayer Objekt kombiniert die SD-Kartenquelle, einen I2S-Ausgabestream und den Helix MP3-Decoder zu einer einzigen Wiedergabekette.

Während der Einrichtung initialisiert der ESP32 die serielle Kommunikation für Debugging und konfiguriert die I2S-Schnittstelle im Sendemodus mit explizit zugewiesenen Bit-Clock-, Word-Select- und Seriell-Daten-Pins, die mit dem PCM5102 verbunden sind.

Der Audioplayer ist mit einer Metadaten-Callback-Funktion konfiguriert, die Informationen wie Titel oder Künstler im seriellen Monitor ausgibt, wenn verfügbar. Vor der Wiedergabe wird auch eine digitale Lautstärke eingestellt. Setze die VOLUME-Konstante nicht zu hoch, sonst beginnt der Verstärker zu übersteuern und du hörst ein klackerndes Geräusch statt Musik.

In der Hauptschleife verarbeitet die player.copy() Funktion kontinuierlich den Audiostream. Der Player liest MP3-Daten von der SD-Karte, dekodiert sie mit dem Helix-Decoder in rohe PCM-Samples und sendet das verarbeitete Audio über die I2S-Schnittstelle an den DAC zur Wiedergabe. Dieser schleifenbasierte Streaming-Mechanismus sorgt für kontinuierliche Audioausgabe, solange gültige MP3-Dateien auf der SD-Karte vorhanden sind.

Fazit

In diesem Projekt hast du gelernt, wie man Audio mit dem ESP32 und dem PAM8403-Verstärker zusammen mit einem PCM5102 DAC abspielt. Du hast auch gelernt, wie man Internetradio streamt, MP3-Dateien von einer SD-Karte abspielt und Audio über Bluetooth wiedergibt. Für weitere Codebeispiele siehe den Beispielordner der arduino-tools-library Bibliothek.

Dieses Tutorial basiert auf dem PCM5102 DAC. Für mehr Informationen zum PCM5102 siehe das Playing Audio with ESP32 and PCM5102A Tutorial. Ebenso, wenn du mehr Hintergrundwissen zum hier verwendeten SD-Kartenlesermodul brauchst, schau dir das SD Card Module with ESP32 Tutorial an.

Eine Alternative zum PCM5102 und MAX98357 ist der MAX98357, der DAC und Verstärker kombiniert. Für Mono-Ausgabe ist dies die einfachere Lösung. Lies das Playing Audio with ESP32 and MAX98357 Tutorial für mehr Details.

Sowohl der MAX98357 als auch der MAX98357 sind kleine Verstärker mit maximal 3 Watt Ausgangsleistung. Für höhere Leistungen schau dir den TPA31110 XH-A232 an, der 30-Watt-Lautsprecher antreiben kann. Siehe das Stereo Amplifier with TPA31110 XH-A232, PCM5102 and ESP32 Tutorial zur Verwendung.

Bei weiteren Fragen kannst du gerne einen Kommentar hinterlassen.

Viel Spaß beim Tüfteln ; )