mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Audio-Ansage-Player mit Esp8266


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Frank E. (Firma: Q3) (qualidat)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bastele an einer Audio-Ansage (ca. 1 Min), die von einem ESP8266 auf 
Knopfdruck per PWM abgespielt werden soll. Ich kenne die Beispiele mit 
externen MP3-Chips oder wenigstens einer SD-Karte, aber ...

Auf dem Wege zu einer möglichst minimalistischen Lösung, versuche ich 
gerade mal ein binäres Array mit den 8-Bit-PCM-Werten in PROGMEM 
unterzubringen. Meine Daten sind ca. 850k groß und ich habe mir ein Tool 
programmiert, was mir die in diese Form bringt:
const byte data[] PROGMEM = {0x80,0x80,0x80, ... ,0x80,0x7F,0x80}

Zum Lesen der Bytes verwende ich diese Syntax, die auch problemlos durch 
den Compiler (Arduino IDE) läuft:
myChar =  pgm_read_byte(data[pos]);
Serial.println(myChar);

Leider zeigt der serielle Monitor nicht testweise die gelesenen Werte 
an, sondern (für mich) sofort nach dem Hochladen wilde Fehlermeldungen:
Exception (3):
epc1=0x40201c32 epc2=0x00000000 epc3=0x00000000 excvaddr=0x4022e6cc depc=0x00000000

ctx: cont 
sp: 3ffef1c0 end: 3ffef390 offset: 01a0

>>>stack>>>
3ffef360:  3fffdad0 00000000 3ffee35c 40201c27  
3ffef370:  feefeffe feefeffe 3ffee35c 4020201c  
3ffef380:  feefeffe feefeffe 3ffee370 40100114  
<<<stack<<<

Ist das ein Syntax-Problem oder hängt das mit dem zu großen Datenblock 
im PROGMEM zusammen? Die IDE ziegt nach dem Compilieren, dass (nur) 70% 
belegt wären ... Danke für Tips.

: Bearbeitet durch User
Autor: Joachim B. (jar)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Serial.println(myChar);

ist denn myChar printable oder wolltest du HEX Werte ausgeben?

Serial.print(78, HEX) gives "4E"

: Bearbeitet durch User
Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

wenn es ein ESP8266-12 mit 4MB Flash ist, pack den Kram doch als 
passendes Wave in das SPIFFS.
Ansonsten schau Dir die ESP8266Audio-Lib an, die enthält eigentlich 
alles schon.

Gruß aus Berlin
Michael

Autor: Frank E. (Firma: Q3) (qualidat)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael U. schrieb:
> Hallo,
>
> wenn es ein ESP8266-12 mit 4MB Flash ist, pack den Kram doch als
> passendes Wave in das SPIFFS.
> Ansonsten schau Dir die ESP8266Audio-Lib an, die enthält eigentlich
> alles schon.
>
> Gruß aus Berlin
> Michael

Ok, danke für den Hinweis ... "SPIFFS" war mir bisher nicht so richtig 
ein Begriff, werde mich damit beschäftigen. Kann man von dort aus 
byteweise lesen?

Es ist ein "Wemos D1 Mini", ist das der genannte ESP8266-12 ... ?

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Frank E. schrieb:
> Ok, danke für den Hinweis ... "SPIFFS" war mir bisher nicht so richtig
> ein Begriff, werde mich damit beschäftigen. Kann man von dort aus
> byteweise lesen?

File öffnen und dann eben readBytes() usw.
Mein Vorschlag zur ESP8266Audio kam nur deshalb, weil Du da in den 
Beispielen vermutlich schon passendes für alles findest.
Ausgabe vom Flash, vom SPIFFS, von SD-Card, von Webstream. Format wave, 
flac, mp3 usw. in Software (MP3 besser mit einem ESP32), Ausgabe per 
I2S, Software-DAC usw.

https://github.com/earlephilhower/ESP8266Audio

Ist nur ein Vorschlag, kann man natürlich auch "zu Fuß" selber machen.
Vor Jahren habe ich ähnliches mal für einen Bekannten auf einem Mega88 
mit externem SPI-Flash und DAC gemacht, 22kHz/16Bit WAV-Files. Hatte ich 
auch mit 8Bit Samples und PWM-Ausgabe auf einem Tiny85 bei 64MHz 
PLL-Takt laufen, der hat 4 kurze Sounds aus dem Flash gespielt.
Oha, ich sehe gerade: das ist ja schon 10 Jahre her...

Gruß aus Berlin
Michael

Autor: Frank E. (Firma: Q3) (qualidat)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, in der Audio.Lib gibt es ein Beispiel "PlayWavefromProgmem", was 
meiner Absicht recht nahe kommt.

Allerdings konnte ich eine Info nirgendwo im Web finden: Wie groß dürfen 
Daten im Progmem des ESP8266 (Wemos D1 Mini) eigentlich sein? Trial & 
Error ist mir zu mühselig, weil ja auch das Compilieren richtig lange 
dauert ...

Danke für Info.

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

mehr als 1MB hast Du als Programmflash und damit auch als Progmem nicht 
zur Verfügung. Davon belegen die Standardroutinen ohnehin schon rund 
250kB.
Leg Deine Daten als Datei ins SPIFFS, da hast Du knapp 3MB als Filegröße 
verfügbar. Beispiel müßte in der Lib auch dabei sein, zumindest ist es 
kein größeres Problem, die Komponenten der Lib passend 
zusammenzustellen.

Compilieren: Was ist bei Dir "richtig lange"? Ich habe gerade mal meinen 
Webserver compiliert, mit OTA, SPIFFS usw., Durchlauf 1m 5s, geflasht 
habe ich jetzt nicht, mache ich generell mit 921600 bei den ESP8266.

Gruß aus Berlin
Michael

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit plattform io ist das Kompilieren in ein paar Sekunden durch. Arduino 
IDE ist arg lahm. Gerade mal Tasmota kompilieren lassen, das dauert 
keine 30 Sekunden.
Wenn du dann noch das example vom ESP8266webserver einbindest kannst du 
deine Wav-Files bequem via webinterface ins SPIFFS hochladen

: Bearbeitet durch User
Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

30s oder hut 1min ist doch "jammern auf hohem Niveau" ;-).
Ich frage mal meinen Bekannten, wie lange so ein Linux-Kernel 
compiliert...

Timmo H. schrieb:
> Wenn du dann noch das example vom ESP8266webserver einbindest kannst du
> deine Wav-Files bequem via webinterface ins SPIFFS hochladen

Genau das wäre mein Ansatz. Zumal die ESP8266Audio die üblichen Formate 
direkt lesen und ausgeben kann.

Gruß aus Berlin
Michael

Autor: Frank E. (Firma: Q3) (qualidat)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Threat ist schon älter, ich weiss, aber ich habe noch eine (neue) 
Frage dazu:

Ich habe das oben genannte Projekt mit der Audio-Lib (MP3 in SPIFFS) 
umgesetzt und es funktioniert auch ganz grundsätzlich. Zur Soundausgabe 
benutze ich den RX-Pin ("fake DAC").

Was auf die Dauer doch ein wenig nervt, sind die enormen Störgeräusche 
(auch wenn gerade kein File gespielt wird). Die Audio-Ausgabe klingt, 
wie neben einem Lagerfeuer am Bach. Also ständiges Kinstern, Zischeln 
etc., obwohl ich ein RC-Glied (10k in Reihe, 100nF nach Masse) zumm 
Verstärker dran habe und sämtliche WLAN-Funktionen (soweit das mit der 
Arduino-Lib möglich ist), deaktivert sind.

Aus Gründen der Dateigröße habe ich meine MP3-Files nur mono mit 22kHz 
codiert. Aber das ist es nicht. Höre ich mir die auf dem PC an, klingen 
sie zwar nicht besonders brilliant - logisch - aber sind frei von 
Störgeräuschen.

Was könnte man noch tun (abgesehen von externem DAC oder 
MP3-Player-Chip)?

: Bearbeitet durch User
Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Frank E. schrieb:
> Ich habe das oben genannte Projekt mit der Audio-Lib (MP3 in SPIFFS)
> umgesetzt und es funktioniert auch ganz grundsätzlich. Zur Soundausgabe
> benutze ich den RX-Pin ("fake DAC").

ich habe die Ausgabe damals nur kurz getestet und auch keine anhörbaren 
Ergebnisse erziehlt. Allerdings nur kurz weil ohnehin ein I2S-DAC bei 
mir dranhängt. Wenn es in Dein Projkt passt, nimm sowas und gebe über 
I2S aus:
https://www.amazon.de/s?k=B01GFNYKK6

Die MAX98357A Module sind leider nicht ganz so super billig.

Gruß aus Berlin
Michael

: Bearbeitet durch User

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.