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:
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.
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
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 ... ?
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
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.
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
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
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
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)?
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
Hallo, ich bekomme leider keinen Ton raus mit der ESP8266Audio Library
in der Arduino IDE. Habe nun schon alles neu installiert, keine
Besserung. Ich sehe zwar die Sample Rate 48 KHz der MP3-Datei auf dem
Oszilloskop, aber da ist nichts "aufmoduliert". Wenn ich die Sample Rate
der Datei "pno-cs.mp3" mit Audacity auf 16 KHz ändere, sehe ich auf dem
Oszilloskop nun die 16 Khz. Laut Serial Monitor läuft auch etwas. Hören
kann man aber nichts.
Ich nutze die Arduino IDE weil das nur ein Teilprojekt ist, welches
später zu einem Arduino Projekt hinzugefügt werden soll.
1
#include<Arduino.h>
2
#if defined(ARDUINO_ARCH_RP2040)
3
voidsetup(){}
4
voidloop(){}
5
#else
6
7
#ifdef ESP32
8
#include<WiFi.h>
9
#include"SPIFFS.h"
10
#else
11
#include<ESP8266WiFi.h>
12
#endif
13
#include"AudioFileSourceSPIFFS.h"
14
#include"AudioFileSourceID3.h"
15
#include"AudioGeneratorMP3.h"
16
#include"AudioOutputI2S.h"
17
18
// To run, set your ESP8266 build to 160MHz, and include a SPIFFS of 512KB or greater.
19
// Use the "Tools->ESP8266/ESP32 Sketch Data Upload" menu to write the MP3 to SPIFFS
20
// Then upload the sketch normally.
21
22
// pno_cs from https://ccrma.stanford.edu/~jos/pasp/Sound_Examples.html
23
24
AudioGeneratorMP3*mp3;
25
AudioFileSourceSPIFFS*file;
26
AudioOutputI2S*out;
27
AudioFileSourceID3*id3;
28
29
30
// Called when a metadata event occurs (i.e. an ID3 tag, an ICY block, etc.
Mir ist nicht ganz klar ob ich AudioOutputI2S() oder
AudioOutputI2SNoDAC() verwenden muss, läuft aber auf beiden nicht.
Es handelt sich um einen PC-Speaker 1.5W, 8 Ohm, mit einem BC547
Transistor und 1k als Basis-Widerstand. Der ist direkt an den internen
8-Bit DAC des NodeMCU ESP32s angeschlossen. Mit einem Test-Ton höre (und
sehe) ich aber etwas.
1
#include<driver/dac.h>
2
3
constintsampleRate=48000;// Sample rate in Hz
4
constintfrequency=1000;// Frequency of the sine wave in Hz
5
constintamplitude=127;// Amplitude of the sine wave
dac_output_voltage(DAC_CHANNEL_1,value+127);// Adjust the offset to output in the range 0-255
15
delayMicroseconds(1000000/sampleRate);// Delay to maintain the desired sample rate
16
}
17
}
An der Sample Rate wird es somit nicht liegen. Die ESP32-audioI2S
Library ist leider mit meinem single-core ESP32s Devboard nicht
kompatibel, bekomme ich auch nicht kompiliert.
Wenn jemand Ahnung hat von Audio und helfen möchte, einen NodeMCU ESP32s
kann ich spenden und per Brief zusenden.
To use the internal DAC on ESP32, instantiate this class as
AudioOutputI2S(0,1), see example PlayMODFromPROGMEMToDAC and code in
AudioOutputI2S.cpp for details.