INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
ESP32 und mp3 via SD
04.11.2019, 23:11 (Dieser Beitrag wurde zuletzt bearbeitet: 04.11.2019 23:39 von biologist.)
Beitrag #1
ESP32 und mp3 via SD
Durch Zufall bin ich auf das Tonuino-Projekt (https://www.voss.earth/tonuino/) gestoßen und würde das Ganze gerne auf einem ESP32 zum Laufen bringen. Einerseits deshalb, damit ich OTA nutzen kann und andererseits würde ich neue mp3s gerne via WLAN auf die Karte laden.

Um das Ganze zu bewerkstelligen verwende ich ein ESP32-devBoard (Wroom32) und habe einen SD-Card-Reader (https://www.az-delivery.com/products/cop...-arduino), der per SPI angebunden ist. Der externe DAC (Adafruit MAX98357A) ist per i2s an den ESP32 angebunden und treibt einen 13cm-Lautsprecher von Visaton (4 Ohm) an. Nachdem ich Probleme hatte, den RFID-Reader (ebenfalls SPI) am gleichen SPI (mit anderem CS-Pin) zu betreiben, habe ich anfänglich andere SPI-Pins benutzt für SD (HSPI), musste jedoch feststellen, dass Pin 14 nicht nutzbar ist, da es für das Flash-Mgmt des Devboards verwendet wird. Ich habe es letztlich mit alternativen Pins dann zum Laufen gebracht, bin jedoch auf Probleme gestoßen, die ich nachfolgend beschreibe. Um auszuschließen, dass die alternative Pin-Konfiguration daran Schuld ist, verwende ich nun die SPI/i2s-Standard-Pins und habe RFID zum weiteren Testen erstmal ausgeklammert. Also mit anderen Worten: Die Probleme sind mit beiden Anschlussvarianten die gleichen. Die Verdrahtung sieht also exakt so aus: https://github.com/schreibfaul1/ESP32-au...57A%20.JPG


Um nun mp3s abspielen zu können, habe ich zwei unterschiedliche Libs verwendet:

1) https://github.com/schreibfaul1/ESP32-audioI2S
Lief direkt out-of-the-box.

2) https://github.com/earlephilhower/ESP8266Audio
Diese Lib scheint mir nur in einem bedingt guten Zustand zu sein. Damit ich den Code kompilieren konnte, musste ich erstmal die Includes vervollständigen, die Methoden einer Klasse in die korrekte Reihenfolge bringen und mir ein Beispiel für das Abspielen von SD erstmal zusammenbasteln. Webstreams habe ich nicht zum Laufen gebracht, auch wenn hierfür ein Beispiel vorhanden war.


Nun, ein Problem, das ich bei beiden Libs habe: Der Sound, wenn ich einen Track von SD-Karte abspiele, wird nur sehr verzerrt ausgegeben. Das verstehe ich schon insofern nicht, weil es mit der ersten Lib bei Webstreams keinerlei Probleme gibt.

Bei der ersten Lib kann man die Lautstärke von 1 bis 21 setzen. Via Webstream habe Werte bis 18 ausprobiert; hat an einem USB-Port von meinem Mac keine Probleme gemacht. Via SD ist es auch bei 1 bereits verzerrt. Ich habs auch testweise mal an das Ladenetzteil von meinem Samsung-Handy gehängt; das hat auch nix geändert. Auch das hardware-mäßige Anpassen des Gains am MAX98357A von 9dB (default) auf 3dB (das niedrigste, was im Adafruit-Handbuch beschrieben ist) hat nichts geändert.

Card-Reader (besitzt einen Spannungsregler auf 3.3V) und MAX98357A sind beide mit 5V angeschlossen, dh sie hängen zwar am DevBoard, allerdings vor dem Spannungsregler. Mit nem einfachen Multimeter gemessen liegt die Spannung so bei 4,5V etwa und unterscheidet sich auch nicht, ob via WLAN oder SD gelesen wird.

Ein Beispiel-Sketch von Espressif besitzt einen i/o-Test für SD. Da hat das Schreiben von 10 Mb ca. 4,5s gedauert. Also ein Problem mit dem Durchsatz kann es auch nicht sein.

Was ich jetzt noch nicht gemacht habe, ist die Stromstärke des SD-Readers zu messen und mir das i2s-Signal mit nem Analyzer mal anzuschauen.

Ansonsten gehen mir jetzt langsam die Ideen aus, nach was ich noch schauen kann. Hat jmd. vielleicht ne Idee oder gar Erfahrungen damit?

Nachtrag: Mit wav habe ich es mit https://github.com/nhatuan84/esp32-i2s-s...d_wav_.ino auch mal probiert. Habe nur aus mySD.h SD.h gemacht und die Pins für i2s angepasst. Das Ergebnis ist das Gleiche wie auch bei mp3.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.11.2019, 10:43
Beitrag #2
RE: ESP32 und mp3 via SD
Hallo,

(04.11.2019 23:11)biologist schrieb:  2) https://github.com/earlephilhower/ESP8266Audio
Diese Lib scheint mir nur in einem bedingt guten Zustand zu sein. Damit ich den Code kompilieren konnte, musste ich erstmal die Includes vervollständigen, die Methoden einer Klasse in die korrekte Reihenfolge bringen und mir ein Beispiel für das Abspielen von SD erstmal zusammenbasteln. Webstreams habe ich nicht zum Laufen gebracht, auch wenn hierfür ein Beispiel vorhanden war.

Ich benutze die ESP8266Audio-Lib öfter, auch in meinem Player-Projekt.
Ich hoffe, ich werde nicht erschlagen, ich möchte das nicht alles wahllos hierher kopieren:
https://www.mikrocontroller.net/topic/460228#new
Wir können gern hier mit dem Thread bleiben, die meisten suchen ja "Nachbauprojekte" und das ist mit dem ESP32 durchaus etwas problematisch.

Es ist bei mir eher eine Dauerbastelstelle als ein fertiges Projekt...
Deine Probleme mit der ESP8266Audio-Lib hatte ich bisher nicht, sie ist leider nicht wirklich aktuell gepflegt, lief bisher aber immer durch den Compiler, ein paar Warnings könnte er mal beheben, stören aber die Funktion bisher nicht.
Die Beispiele sind etwas spartanisch, einzige (nur bei mir?) zwingende Änderung ist bisher in der AudioOutputI2S.h:
Code:
AudioOutputI2S(int port=0, int output_mode=EXTERNAL_I2S, int dma_buf_count = 32, int use_apll=APLL_DISABLE);
die Anzahl DMA-buffer als default von 8 auf 32 zu setzen. Könnte man auch beim Aufruf, vergesse ich aber dann immer gern.

Anmerkungen: Der Buffer bei WLAN-Streamplaying ist recht knapp, gibt gern Aussetzer wenn das WLAN wie hier gut ausgelastet ist. Ich nehme meist nur noch ESP32-Versionen mit zusätchlichem PSRAM.
OTA habe ich sowieso immer drauf, ein Webserver nicht, hier läuft auf einem RasPi ein lokaler IceCast-Stream, da brauche ich die Titel nur am PC in den Ordner packen.

Gruß aus Berlin
Michael
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.11.2019, 11:59
Beitrag #3
RE: ESP32 und mp3 via SD
Hallo Michael,

danke für deine Nachricht. Tatsächlich bin ich auf deinen Post schon mehrfach gestoßen, hatte mir nur, da ganz am Ende schon seit langem eine Frage offen ist, keine Chancen ausgerechnet, dass ich da eine Antwort kriege :-) Hatte tatsächlich auch schon mit Teilen deines Codes experimentiert aber am End war das Problem halt immer das Gleiche. Und wenn ich sehe, dass das auch mit wav passiert, scheint das ja irgendwie ein tieferliegendes Problem zu sein. Einen neuen Thread wollte ich da nicht aufmachen; ich schätze das Forum sehr und da lernt man auch viel, aber ich habe latent immer den Eindruck, dass Arduino dort als Noob-Kram angesehen wird und man damit nicht genervt werden will. Das ist jetzt bissl oberflächlich betrachtet, aber so ne gewisse Wahrheit liegt da (denke ich) schon drin.

Seltsam auf jeden Fall, dass ich offenbar der Einzige bin, der mit diesen Problemen zu kämpfen hat. Also zumindest habe ich im Netz trotz Recherche nix gefunden. Aber ich werde die von dir genannten Übergabeparameter mal testen.

Der ESP32 ist tatsächlich als Plattform nicht ganz so einfach, wie es aussieht. Ich habe ein größeres PRojekt mit ner Gartenbewässerung gemacht, bei dem der ESP32 via Ethernet angebunden ist, zudem auch verschiedene Sensoren besitzt - Datenaustausch via MQTT. Da bin ich auch im Verlaufe des Projekts auf viele Probleme gestoßen. Irgendwie habe ich es auch immer gelöst bekommen, aber beim nun Beschriebenen bin ich etwas ratlos.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.11.2019, 21:59
Beitrag #4
RE: ESP32 und mp3 via SD
Hallo,

(05.11.2019 11:59)biologist schrieb:  Seltsam auf jeden Fall, dass ich offenbar der Einzige bin, der mit diesen Problemen zu kämpfen hat. Also zumindest habe ich im Netz trotz Recherche nix gefunden. Aber ich werde die von dir genannten Übergabeparameter mal testen.

Ich habe zum Test mal eine portableIDE 1.8.10 installiert. Boardmanager ESP32 1.0.4
Dazu die ESP8266Audio-Lib und das eine Demo mal für SD-Card angepasst:
Code:
#include <Arduino.h>
#ifdef ESP32
  #include <WiFi.h>
#else
  #include <ESP8266WiFi.h>
#endif
#include "SPI.h"
//#include "FS.h"
#include "SD.h"

#include "AudioFileSourceSD.h"
#include "AudioFileSourceID3.h"
#include "AudioGeneratorMP3.h"
#include "AudioOutputI2S.h"

// To run, set your ESP8266 build to 160MHz, and include a SPIFFS of 512KB or greater.
// Use the "Tools->ESP8266/ESP32 Sketch Data Upload" menu to write the MP3 to SPIFFS
// Then upload the sketch normally.  

// pno_cs from https://ccrma.stanford.edu/~jos/pasp/Sound_Examples.html

AudioGeneratorMP3 *mp3;
AudioFileSourceSD *filesd;
AudioOutputI2S *out;
AudioFileSourceID3 *id3;

String filename = "/Banana Boat Song - Harry Belafonte.mp3";

// Called when a metadata event occurs (i.e. an ID3 tag, an ICY block, etc.
void MDCallback(void *cbData, const char *type, bool isUnicode, const char *string)
{
  (void)cbData;
  Serial.printf("ID3 callback for: %s = '", type);

  if (isUnicode) {
    string += 2;
  }
  
  while (*string) {
    char a = *(string++);
    if (isUnicode) {
      string++;
    }
    Serial.printf("%c", a);
  }
  Serial.printf("'\n");
  Serial.flush();
}


void setup()
{
  WiFi.mode(WIFI_OFF);
  Serial.begin(115200);
  delay(1000);
  Serial.printf("Sample MP3 playback begins...\n");

    if(!SD.begin(16))    // (CLK,MISO,MOSI,SS)) 18,19,23,16
  {
    Serial.println(F("Card Mount Failed"));
    while(1)
    {
      yield;
    }      
  }

  filesd = new AudioFileSourceSD(filename.c_str());
  id3 = new AudioFileSourceID3(filesd);
  id3->RegisterMetadataCB(MDCallback, (void*)"ID3TAG");
  out = new AudioOutputI2S();
  out->SetPinout(33,32,15);  //int bclkPin, int wclkPin, int doutPin

  mp3 = new AudioGeneratorMP3();
  mp3->begin(id3, out);
}

void loop()
{
  if (mp3->isRunning()) {
    if (!mp3->loop()) mp3->stop();
  } else {
    Serial.printf("MP3 done\n");
    delay(1000);
  }
}
Compiliert und spielt den Titel aus dem Root der SD, der oben angegeben wird einmal und stoppt dann.
Die Warnings zu i2s_write_bytes() habe ich ignoriert, noch ist die Funktion ja so drin, nur als deprecated gekennzeichnet. Vielleicht passt er das mal an, ich habe da jetzt weder Zeit noch Lust dazu.
Läuft hier so zumindest zuverlässig ohne irgendwelche Eingriffe in der Lib.

Gruß aus Berlin
Michael
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.11.2019, 17:57
Beitrag #5
RE: ESP32 und mp3 via SD
Hatte ganz vergessen zu antworten.
Der Code, den du gepostet hast, führt exakt zu dem Problem, das ich schon beschrieben hatte: Verzerrter Output. Wobei an dieser Stelle anzumerken ist, dass ich für CS nicht 16 nehmen konnte, weil das auf meinem Board die serielle Schnittstelle belegt hätte. Habe 5 benutzt.

So langsam verliere ich auch den Bock, damit weiter meine Zeit zu verplempern. Zur Not benutze ich halt dieses Modul hier https://www.dfrobot.com/product-1121.html. Das habe ich auch noch daheim liegen. Bringt halt den Nachteil mit sich, dass ich auf die SD-Karte im eingebauten Zustand nix schreiben kann. Aber mei, dann ist es halt so.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.11.2019, 20:47
Beitrag #6
RE: ESP32 und mp3 via SD
Hallo,

(07.11.2019 17:57)biologist schrieb:  Der Code, den du gepostet hast, führt exakt zu dem Problem, das ich schon beschrieben hatte: Verzerrter Output. Wobei an dieser Stelle anzumerken ist, dass ich für CS nicht 16 nehmen konnte, weil das auf meinem Board die serielle Schnittstelle belegt hätte. Habe 5 benutzt.

Gut, dann fehlen mir die Ideen. CS ist eigentlich egal, ich habe hier3 Aufbauten, wo die SD-Card an einem anderen Pin mit CS ist, das gab hier noch nie Probleme.
Ist das Format der MP3s vielleicht so, daß der MP3-Decoder nicht damit klarkommt?
Ich habe hier auf der Karte nur 16Bit 44100Samplerate und 128k Bitrate drauf, allerdings habe ich aber auch schon mit höheren Bitraten ohne Probleme rumgespielt.

Gruß aus Berlin
Michael
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.11.2019, 22:49
Beitrag #7
RE: ESP32 und mp3 via SD
Ja ich gehe auch davon aus, dass CS keine Rolle spielt.
Zu den Files selbst: Ich habe verschiedene probiert mit 128 oder 320 kBit/s. Weiterhin habe ich zB bei der wav-Lib exakt das wav benutzt, welches dort als Beispiel runtergeladen werden kann. Am End wars immer das gleiche Problem. Ich haben eben auch mal mit wget nen Webstream aufgenommen, ihn auf die SD kopiert und abgespielt:

info SampleRate=44100
info BitsPerSample=16
info Bitrate=128000

Gleiches Problem. Also ich kann machen was ich will, ich komme mit dem Mist hier einfach auf keinen grünen Zweig. Wenn ich dich richtig verstehe, dann hast du es mit nem MAX98537A doch schon zum Laufen gebracht, oder?
Ich habe auch schon überlegt, ob ich mal nicht den Cardreader benutze und stattdessen die Drähte auf den SD-Kartenadapter auflöte. Adapter habe ich genügend hier rumliegen, aber keine Ahnung, ob das irgendwas ändern könnte. Kotz.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.11.2019, 13:32
Beitrag #8
RE: ESP32 und mp3 via SD
Hallo,

(07.11.2019 22:49)biologist schrieb:  Gleiches Problem. Also ich kann machen was ich will, ich komme mit dem Mist hier einfach auf keinen grünen Zweig. Wenn ich dich richtig verstehe, dann hast du es mit nem MAX98537A doch schon zum Laufen gebracht, oder?

Ich habe inzwischen mein WLAN wieder überredet hier am Bastelplatz richtig zu gehen und das Projekt mit dem MAX98537A rausgekramt.

Sowohl mein IceCastStream als auch SD-Card werden stabil und problemlos auch mit der ESP32-audioI2S Lib abgespielt, die Lib gefällt mir immer besser.
Lautsprecher am MAX ist irgendwas mit wohl 8 Ohm, Volume größer als 14 wird hier erwartungsgemäß kritisch, egal ob Stream oder SD-Card. Da ist die momentane Stromversorgung vom USB am Ende, der AX zieht da einfach zu hohe Spitzenströme. Normalerweise hängt ein 5V 2A USB-Netzteil als Versorgung dran.
CS ist bei dem Teil hier jetzt auch GPIO5, I2S habe ich auch woanders, spielt alles keine Rolle.
Also von meiner Seite weiterhin keine Idee...

Gruß aus Berlin
Michael
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  ESP32 hängt -> reset per Attiny85 hYtas 84 1.285 Heute 15:57
Letzter Beitrag: amithlon
  Sketch von einen ESP8266 auf ein ESP32 portieren (hagelt Fehlermeldung) magnum1795 23 382 Gestern 14:38
Letzter Beitrag: magnum1795
  esp32 wifi - new Client als Unterproramm georg1010 5 114 Gestern 12:10
Letzter Beitrag: Tommy56
  ESP32 - an mobile hotspot anmelden georg1010 3 124 12.11.2019 08:39
Letzter Beitrag: hotsystems
  ESP32 Pakete installieren unter Ubuntu Gerdchen03 0 171 01.11.2019 15:37
Letzter Beitrag: Gerdchen03
  Frage zu App für Esp32 goofy15 4 377 29.10.2019 08:46
Letzter Beitrag: volvodani
  ESP32 "SPIFFS initialisation failed!" Gerdchen03 1 291 18.10.2019 17:34
Letzter Beitrag: hotsystems
  Display am ESP32 - kein Bild Gerdchen03 17 1.321 13.10.2019 16:56
Letzter Beitrag: Gerdchen03
  ESP32 Dateien zum Download anbieten Sonny354 11 413 11.10.2019 11:59
Letzter Beitrag: Tommy56
  ESP32 Serial Bluetooth Connect Nach_Sound 0 442 04.10.2019 13:47
Letzter Beitrag: Nach_Sound

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste