ESP32 mit Arduino IDE, Probleme mit Speicherplatz

Hallo,

ich versuche mithilfe der Bibliothek “DacAudio Library” eine Audiodatei mit einem ESP32 auszugeben. Es funktioniert soweit auch perfekt, den Ton an einem Aktivlaufsprecher auszugeben, was die Tonqualität usw. betrifft bin ich sehr zufrieden, allerdings habe ich Probleme mit größeren Dateien.

Durch Testen habe ich herausgefunden, dass Wave-Dateien mit Größen von 65 KB noch funktionieren (das sind 3 Sekunden mit 22050 hz u. 8-Bit Samplingtiefe), die nächst größere, die ich getestet habe, mit 5 Sekunden und ca. 110 KB funktioniert aber nicht mehr. Im Anhang ist ein Screenshot mit der Fehlermeldung, die ich nicht verstehe.

Weiterhin fällt mir auf, dass die Audio-Datei anscheinend nur in den dynamischen Speicher geladen wird, der in der Arduino IDE mit einer Größe von 294.912 Bytes angegeben wird. Beim Laden meiner 3 Sekunden-Datei mit 67.376 Bytes sind dann noch 72%, also 212.244 Bytes frei. Rechnerisch komme ich dann auf eine maximale Laufzeit von 12 Sekunden, falls tatsächlich nur der dynamische Speicher genutzt werden kann.

Der Autor der Bibliothek schreibt, dass er davon ausgeht dass man auf einem ESP32 mit 4MB Flashspeicher ungefähr 100 Sekunden Audiomaterial speichern könnte, und ca. 1,3MB des Speichers genutzt werden können. Trotz dieser Aussage zeigt er in seinen Beispielen (auf Youtube), genau wie praktisch alle anderen Youtuber immer nur sehr kurze Audiobeispiele, wie z.B. ein Soundeffekt für ein Lichtschwert oder im bei der Bibliothek mitgelieferten Beispiel eine Datei mit ca. 41 KB.

Meine Fragen sind also: Kann der Flash-Speicher nicht zu diesem Zweck verwendet werden? Wieso kommt es zu einer Fehlermeldung, selbst wenn die Wave-Datei wesentlich kleiner als der freie dynamische Speicher ist?

Hier ist ein Link zu der Bibliothek:

Nachtrag: Ich habe gerade etwas über Progmem gelesen, vielleicht kann das Problem damit gelöst werden. Werde ich später ausprobieren, ich muss erstmal schlafen…

Die Lösung war, dass ich die Zeile, die den String mit den Daten festlegt verändert habe. Aus

unsigned char rawData[918952] = {

wurde

const unsigned char rawData[918952] = {

Somit konnte ich immerhin eine 900 KB Wave-Datei (20 Sekunden Laufzeit) abspielen, damit werden 87% des Speicherplatzes belegt.
Mit PROGMEM habe ich keine Verbesserung bemerkt.

Sagamihara:
Die Lösung war, dass ich die Zeile, die den String mit den Daten festlegt verändert habe.

Danke für die Rückmeldung :slight_smile:

Es gibt verschiedene Wege, mit dem ESP32 "Lärm" zu machen. Da ich Deine Anwendung nicht kenne, kann ich Dir leider keinen Tipp geben.

agmue:
Danke für die Rückmeldung :slight_smile:

Es gibt verschiedene Wege, mit dem ESP32 "Lärm" zu machen. Da ich Deine Anwendung nicht kenne, kann ich Dir leider keinen Tipp geben.

Ich hätte viele Ideen wozu ich den Lärm gebrauchen könnte. Aktuell möchte ich lediglich auf Knopfdruck verschiedene kurze Audio-Dateien ausgeben und mit einem aktiv verstärktem Lautsprecher ausgeben. Wenn die Speicher-Kapazität ein wenig größer wäre, wäre das schön (1-2 Minuten würden reichen), aber zur Not kann ich auch damit leben.

Mir ist bekannt, dass man die Dateien auch von einer SD-Karte lesen kann, zumindest hat der Autor der verlinkten Internetseite auch ein entsprechendes Projekt vorgestellt, aber wie gesagt ist das hier nicht unbedingt nötig und ich müsste dazu erstmal weitere Teile besorgen. Als weitere Möglichkeiten den Speicherplatz zu erweitern ist mir bekannt, dass man die Partitionierung ändern kann, womit man vermutlich ein paar hundert Kilobyte gewinnen kann, außerdem gibt es den ESP32 auch mit mehr RAM (z.B. WROVER mit 8MB PSRAM). Weißt du, ob die Verwaltung des zusätzlichen RAM dann problemlos/automatisch vonstatten gehen würde (bei Nutzung der Arduino IDE), wieviel Speicher tatsächlich zur Verfügung stehen würde (bzw. ob man den zu den 4 MB Flash addieren kann)?

Für ein weiteres Projekt wäre es mir wichtig, dass die Audioausgabe zeitlich möglichst präzise und ohne Verzögerung ausgeführt werden würde. Dabei sollen mehrere Wave-Dateien hintereinander abgespielt werden, ohne dass eine hörbare Pause dazwischen entsteht (wie beispielsweise beim Simulieren eines durchgehenden Motorgeräuschs). Ich habe gelesen, dass man in dem Fall lieber auf Speicherkarten verzichten solle, würdest du dem zustimmen?

Meine ersten Audio-Erfahrungen habe ich übrigens mit dem DFPlayer Mini gemacht, aber da habe ich es nie geschafft, die typischen Störgeräusche zu entfernen.

Noch eine Frage zum Lautsprecher: In meiner Schaltung wird das Ausgangssignal per Spannungsteiler auf maximal 0,3 V verringert, weil das für den Verstärker in dem Tutorial so nötig war. Weißt du (oder jemand anderes), welche Spannung ideal wäre, wenn man einen handelsüblichen Aktivlautsprecher verwendet, den man per 3,5mm-Klingenstecker anschließt?

Hallo Sagamihara,

von welchen typischen Störgeräuschen beim DFPlayer sprichst du ?

Für die notwendige Einstellung der Lautstärke kannst du ein Trimmpoti nehmen, da lässt sich die Spannung individuell anpassen.
Und wenn du doch später Festwiderstände verwenden willst, einfach die eingestellten Werte nachmessen und passende Widerstände einsetzen.

Sagamihara:
Weißt du, ob die Verwaltung des zusätzlichen RAM dann problemlos/automatisch vonstatten gehen würde (bei Nutzung der Arduino IDE), wieviel Speicher tatsächlich zur Verfügung stehen würde (bzw. ob man den zu den 4 MB Flash addieren kann)?

Ich habe ein ESP32 Dev Module im Einsatz, mit dem WROVER mit 8MB PSRAM habe ich keine Erfahrung. Aber Du kannst in der IDE auch nicht angeschlossene ESP32 Varianten einstellen und ausprobieren, die boards.txt kann die Auswahl erleichtern. Beispielsweise bei M5Stack-FIRE mit "Default (2 x 6.5 MB app, 3.6 MB SPIFFS)" führt Blink zu:

"Der Sketch verwendet 253477 Bytes (3%) des Programmspeicherplatzes. Das Maximum sind 6553600 Bytes.
Globale Variablen verwenden 15276 Bytes (0%) des dynamischen Speichers, 4506708 Bytes für lokale Variablen verbleiben. Das Maximum sind 4521984 Bytes."

Sagamihara:
Für ein weiteres Projekt wäre es mir wichtig, dass die Audioausgabe zeitlich möglichst präzise und ohne Verzögerung ausgeführt werden würde.

Für ein anderes Thema "sprechende Uhr" habe ich ein paar kurze Tests mit der selben Anforderung gemacht.

Sagamihara:
Meine ersten Audio-Erfahrungen habe ich übrigens mit dem DFPlayer Mini gemacht, aber da habe ich es nie geschafft, die typischen Störgeräusche zu entfernen.

Beim Lesen einer Methode wie isPlaying() (DFPlayerMini_Fast) kann es trotz 1 kΩ Widerstandes an RX zu Störungen (Knacken) kommen. Ich habe das durch Nutzung des BUSY-Pins umgehen können. Für mich hörte sich das dann ganz ordentlich an, also "fünf" "Uhr" "zwei und dreißig" in drei Dateien.

Danke für die Antwort! Das Füllhorn sieht für mich relativ kompliziert aus, ich denke ich werde mich erstmal weiter in Möglichkeit 2 einarbeiten, weil das bisher schon relativ gut funktioniert, und probiere vielleicht noch einen ESP32 mit 8MB aus…

Beim DFPlayer habe ich mehr ein Brummen, aber RX hatte ich garnicht angeschlossen, sondern ihn Standalone verwendet. Vor einigen Monaten/Jahren hatte ich ihn aber auf diverse andere Arten getestet. Zu den Störgeräuschen habe ich einiges in anderen Foren gelesen, da wurden Widerstände umgelötet und alle möglichen anderen Änderungen vorgenommen und dennoch ist die Community zu dem Ergebnis gekommen, dass man es nie wirklich gut hinbekommt, bzw. dass die Module auch eine große Serienstreuung in der Hinsicht haben. Es wurde dort auch viel von An- und Abschaltploppen gesprochen, wenn ich mich richtig erinnere.

Ich habe noch einen Teensy 3.2, der nach meiner Erinnerung besseren “Lärm” macht. Da steht auch der komplette Speicher dem Programm zur Verfügung. Teensy 3.5 und 3.6 haben einen SD-Kartenhalter drauf.

Metronom mit Display und Speicher

Sagamihara:
....
Beim DFPlayer habe ich mehr ein Brummen, aber RX hatte ich garnicht angeschlossen, sondern ihn Standalone verwendet.
.....

Ein Brummen deutet mehr auf fehlerhafte NF-Verbindungen, wie eine sog. Brummschleife hin.
Man kann auch bei der "einfachen" Verkabelung Fehler machen.

Ich habe mehrere Projekte am Arduino damit gelöst. Sehr hilfreich ist dabei, wenn man für den DFPlayer einen eigenen Spannungszeig (5V mit eigenem linearen Spannungsregler) aufbaut. Dann hat man schon eine saubere Versorgung ohne Störungen aus dem Controller.