ESP32-Projekt: Bluetooth Lautsprecher erstellen

In diesem Tutorial beschreibe ich, den Bau eines Bluetooth-Lautsprechers mit einem ESP32 Mikrocontroller, einem MAX98357 I2S Digital-Analog-Wandler und einem 4 Ohm Lautsprecher.
Der MAX98357 fungiert als externer Digitaler Analog Converter (DAC) mit integriertem Audioverstärker und mischt zwei Audiokanäle zu einem Mono-Ausgang.
Dieser gebaute Lautsprecher kann dann Audio von deinem Smartphone oder anderen Bluetooth fähigen Geräten abspielen.

Im Detail läuft das so ab:

Kopplung mit Bluetooth Sender: Sender sucht per Bluetooth nach ESP32 „Sendenamen“ und koppelt

Bluetooth-Empfang: Der ESP32 empfängt den Audio-Stream von einem Bluetooth-Gerät.

I2S-Datenübertragung: Der ESP32 sendet die digitalen Audiodaten über die I2S-Schnittstelle an den MAX98357 in einem Datenformat , das typischerweise 16, 24 oder 32 Bit pro Audiosample umfasst.

Digital-Analog-Wandlung: Der MAX98357 wandelt die digitalen Audiodaten in analoge Signale um.

Verstärkung: Der MAX98357 verstärkt das analoge Signal.

Audioausgabe: Das verstärkte analoge Signal wird an den 4-Ohm-Lautsprecher gesendet, wodurch der Ton hörbar wird.


Hardware:
ESP32 WROOM —> Belegungsplan
MAX98357A DAC Modul 2,7 V bis 5,5 V
Lautsprecher 4 Ohm (3 W oder mehr empfohlen)
Powerbank oder 5V-Stromversorgung
Jumper-Kabel und Steckbrett
Computer mit installierter Entwicklungsumgebung Arduino IDE

Verdrahtung:

Verbinde den ESP32 mit dem MAX98357:

  • DIN des MAX98357 → IO27 (ESP32)
  • BCLK des MAX98357 → IO25 (ESP32)
  • LRC des MAX98357 → IO26 (ESP32)
  • GND und VCC (3.3V oder 5V) entsprechend verbinden.

Schließe den Lautsprecher an den SPK+ und SPK- des MAX98357 an.
Stelle sicher, dass alle Verbindungen stabil sind, und teste das Setup mit einem Steckbrett, bevor du lötest.

Bibliothek / Library:

Installiere die benötigten Bibliothek DFRobot_MAX98357A von DFRobot in der Arduino IDE 2.x

Öffne den Beispielcode aus der Library, prüfe ob die GPIO PIN passen und laden den Code auf des Entwicklungsboard. Dieser Quellcode Auszug habe ich verwendet:

#include <DFRobot_MAX98357A.h>

DFRobot_MAX98357A amplifier;   // instantiate an object to control the amplifier

void setup(void)
{
  Serial.begin(115200);

  while( !amplifier.begin(/*btName=*/"prilchensBTBox", /*bclk=*/GPIO_NUM_25, /*lrclk=*/GPIO_NUM_26, /*din=*/GPIO_NUM_27) ){
    Serial.println("Initialize failed !");
    delay(3000);
  }
  Serial.println("Initialize succeed!");
}

void loop(void)
{
//kann leer bleiben
}

Danach habe ich an meinem Smartphone nach Bloutooth Geräten gesucht und die dort zu findende prilchensBTBox ausgewählt. Sobald ich nun Audio abspiele höre ich diese aus dem Bluetooth Lautsprecher 🙂


Optionale Erweiterung mit Display
zur Anzeige des Interpreten und Songtitel

Bei mir wird jetzt der Bluetooth Lautsprecher noch um eine OLED Anzeige erweitert, die zwei von drei optionalen Informationen anzeigt.
Bei der I2S-Musikübertragung werden die Audiodaten in einem festen Datenformat übertragen.
Die I2S-Schnittstelle selbst überträgt jedoch keine Metadaten wie Interpret und Songtitel.
Diese Informationen werden über separate Protokolle wie Bluetooth AVRCP (Audio/Video Remote Control Profile) übertragen.
Titel, Artist und Album sind somit möglich, während der Wiedergabe zu sehen.

Weitere Hardware:
OLED Display I2C zB. 0,96 oder 1,3 Zoll

Verdrahtung:

Bibliothek / Library:

Benötigt wird die Library SSD1306 von Adafruit

Quellcode:
Entsprechend des gewählten Display ggf. noch die Pixel weite und Höhe anpassen.

#include <Wire.h>  //für I2C-Kommunikation
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#include <DFRobot_MAX98357A.h>

#define SCREEN_WIDTH 128  // OLED display width
#define SCREEN_HEIGHT 64  // OLED display height
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

DFRobot_MAX98357A amplifier;  // instantiate an object to control the amplifier

void setup(void) {
  Serial.begin(115200);

 display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // Initialisiere I2C mit Addr 0x3C
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  delay(2000);

  while (!amplifier.begin(/*btName=*/"PrilchensBTBox", /*bclk=*/GPIO_NUM_25, /*lrclk=*/GPIO_NUM_26, /*din=*/GPIO_NUM_27)) {
    Serial.println("Initialize failed !");
    delay(3000);
  }
  Serial.println("Initialize succeed!");
}

void loop(void) {
  String Title, Artist, Album;
  /**
   * @brief Get "metadata" through AVRC command
   * @param type - The type of metadata to be obtained, and the parameters currently supported:
   * @n     ESP_AVRC_MD_ATTR_TITLE   ESP_AVRC_MD_ATTR_ARTIST   ESP_AVRC_MD_ATTR_ALBUM
   * @return The corresponding type of "metadata"
   * @note Return "NULL" if timeout occurs when requesting metadata
   */
  Title = amplifier.getMetadata(ESP_AVRC_MD_ATTR_TITLE);
  if (0 != Title.length()) {
    Serial.print("Music title: ");
    Serial.println(Title);
  }
  Artist = amplifier.getMetadata(ESP_AVRC_MD_ATTR_ARTIST);
  if (0 != Artist.length()) {
    Serial.print("Music artist: ");
    Serial.println(Artist);
  }
  Album = amplifier.getMetadata(ESP_AVRC_MD_ATTR_ALBUM);
  if (0 != Album.length()) {
    Serial.print("Music album: ");
    Serial.println(Album);
  }

display.clearDisplay();
  display.setCursor(0, 5);
  display.print("Prilchens BL Box");
  display.setCursor(0, 18);
  display.print("Musik Title: ");
  display.setCursor(0, 27);
  display.print(Title);
  display.setCursor(0, 36);
  display.println("Musik Artist: ");
  display.setCursor(0, 45);
  display.println(Artist);
  display.display();

  delay(3000);
}

Je nach Anwendung, Anbieter oder Musiklösung steht nicht immer unter Titel oder Artist das gewünschte Ergebnis. Auch hatte ich auch schon mal deutlich längere Artistenbezeichnungen die dann eben nicht komplett angezeigt werden. Sollte sich jeder so anpassen wie er mag.

Video:

3D – Druck Vorlagen:

Das im Video zu sehende Gehäuse. Eine einfache, aber doch effektvolle Lösung um aus den kleinen 40mm Lautsprecher deutlich besseren Sound zu erhalten.
Größe: 50x50x50mm, Wandstärke 2mm, Bohrung Durchmesser: 36,8mm

Download bei Makerworld oder bei Thingiverse


Nicht im Video zu sehen:

Hier habe ich aus einen ausrangierten Echo Show mit 5 Zoll, nur das Lautsprechermodul, an diese vorgestellte Bluetooth Lösung angeschlossen, funktioniert sehr gut und hört sich prima an.
Jetzt hat die Box endlich wieder eine Funktion 🙂

,