Espressif Arduino Libraries für I2S Audio Ausgabe am built-in DAC

alecxs

Mitglied
28. Juni 2020
41
5
8
Für den ESP32 gibt es verschiedene Möglichkeiten eine MP3-Datei abzuspielen. Ich habe es mit der Arduino IDE und der ESP8266Audio Library versucht, bekomme aber kein Ton heraus.

Die ESP32-audioI2S Library ist mit dem NodeMCU ESP32s Dev Kit C V1 nicht kompatibel, da diese für Multikernprozessor vorgesehen ist.

Der Code zum Abspielen einer MP3-Datei von der SPIFFS Partition kompiliert zwar, aber außer der Sample Rate kommt auf dem Oszilloskop nichts an.

Die direkte Ausgabe eines Testtones über den built-in DAC funktioniert. Es muss also am I2S liegen.

Gibt es noch Alternativen für die Arduino IDE die ich noch ausprobieren kann?
 
Ich bin jetzt etwas weiter mit der ESP8266Audio Library. Die Ausgabe über den internen DAC erfolgt gemäß der Dokumentation mit AudioOutputI2S(0, 1)
C++:
out = new AudioOutputI2S(0, 1);

Lade ich das Sketch allein, läuft es auch und ich höre den Song. Sobald ich es aber in das Gesamtprojekt integriere gibt es Probleme mit Dateien die länger als 5 Sekunden spielen. Ich vermute es steht nicht genügend RAM zur Verfügung.
 
Ich habe nun das LittleFS statt dem SPIFFS Dateisystem verwendet, und die Stack Größe des Hintergrund-Tasks erhöht, jetzt läuft es.
C++:
TaskHandle_t mp3Task;

void playMP3Task(void *pvParameters) {
  mp3 = new AudioGeneratorMP3();
  mp3->begin(file, out);
  isMP3Playing = true;
  while (mp3->isRunning()) {
    if (!mp3->loop()) {
      mp3->stop();
      break;
    }
  }
  isMP3Playing = false;
  delete mp3;
  vTaskDelete(NULL);
}

void playMP3(const char *mp3File) {
  out = new AudioOutputI2S(0, 1);   // built-in DAC
//  out = new AudioOutputI2S();       // MAX98357A I2S
//  out->SetPinout(BCLK_PIN, WCLK_PIN, DOUT_PIN);
  out->SetGain(1.0);
  file = new AudioFileSourceLittleFS(mp3File);
  if (!isMP3Playing) {
    xTaskCreatePinnedToCore(
    playMP3Task,   // Task function.
    "MP3Task",     // name of task.
    6144,          // Stack size of task
    NULL,          // parameter of the task
    1,             // priority of the task
    &mp3Task,      // Task handle to keep track of created task
    1);            // pin task to core 1
  }
}
 
Mit dem Arduino esp32 Core v3.x hat sich die API für den built-in DAC geändert, es ist nun ein weiteres Include <AudioOutputInternalDAC.h> vorgesehen. Der alte Code mit AudioOutputI2S(0, 1) kompiliert zwar noch ohne Fehlermeldung, aber es kommt kein Ton mehr heraus. Diese Zeile ist zu ersetzen:
C++:
out = new AudioOutputInternalDAC();

Allerdings leider nun neu, die ersten 100 ms werden von der Initialisierung quasi "verschluckt" und es kommt kein Ton. Das war bei mir besonders fies da ich meine Funktion beep(300, 100) nicht mehr gehört habe.

Alles in allem eine Verschlechterung. Aber dafür gibt es für den ESP32 inzwischen eine eigene Library namens BackgroundAudio.
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu