Hallo, Gibt es eine Möglichkeit mit einem Esp32 in der Arduino ide einen USB Stick zu lesen? Ich hatte vor damit mp3 Dateien an ein vs1053 mp3 decoder zu senden und dann abzuspielen.
Beitrag #5754304 wurde von einem Moderator gelöscht.
Sebastian R. schrieb: > Mit nem MAX3421E dazwischen könnte es gehen Vielen dank. Ich dachte eigentlicht, dass nur Mäuse und Tastaturen daran funktioniren. Ich werde mich mal über das Teil ein bisschen schlau mschen. viele Güße Flo S
also der esp32 sollte mp3 auch ohne externen decoder verarbeiten können. für irgendwas müssen 2 cores mit 240mhz doch gut sein
funky schrieb: > also der esp32 sollte mp3 auch ohne externen decoder verarbeiten können. > für irgendwas müssen 2 cores mit 240mhz doch gut sein Ich weiß, ich konnte aber keine vernünftigen Beispiele finden. Ein paar gibt es, die funktionieren aber nicht vernünftig.
:
Bearbeitet durch User
Hallo, ich halte die ESP8266Audio-Lib https://github.com/earlephilhower/ESP8266Audio immernoch für einen guten Ansatz. Leider darf man inzwischen einige Sachen aus den Bugreports selber einpflegen, weil der Programmierer da wohl im Moment nichts gemacht hat. Läuft hier als "WLAN-Lautsprecher" (nur einschalten, spielt fest definierten Stream) und als Stream/SD-Card Player (unvollständige Dauerbastelei). Gruß aus Berlin Michael
Flo S. schrieb: > Ich dachte eigentlicht, dass nur Mäuse und Tastaturen daran > funktioniren. Nö, das ist ein Full-Speed-Host, d.h. alles, was mit USB1.1-Geschwindigkeiten (1.5 MBit/sec und 12 MBit/sec) zurechtkommt, funktioniert damit. Und dazu gehören auch USB-Massenspeicher aller Art. Die sind dann zwar nicht besonders schnell, aber funktionieren tun sie.
Flo S. schrieb: > Hallo, > Gibt es eine Möglichkeit mit einem Esp32 in der Arduino ide einen USB > Stick zu lesen? > Ich hatte vor damit mp3 Dateien an ein vs1053 mp3 decoder zu senden und > dann abzuspielen. Wenn es nur MP3 vom Stick auf den VS1053 sein soll, dann mach es Dir einfach und nimm einen ch376. Damit reicht auch ein AVR als Controller.
Die etwas teurere, aber deutlich besser dokumentierte Alternative zum CH376 ist der VNC1L ("Vinculum") von FTDI.
Flo S. schrieb: > Ich hatte vor damit mp3 Dateien an ein vs1053 mp3 decoder zu senden und > dann abzuspielen. Ich wieder hole meine Frage: > Wie wäre es mit SD Karten? Denn das ist viel einfacher mit dem ESP32 zu machen. Nur ein modifizier Adapter ist nötig.
Arduino Fanboy D. schrieb: > Flo S. schrieb: >> Ich hatte vor damit mp3 Dateien an ein vs1053 mp3 decoder zu senden und >> dann abzuspielen. > > Ich wieder hole meine Frage: >> Wie wäre es mit SD Karten? > Denn das ist viel einfacher mit dem ESP32 zu machen. > Nur ein modifizier Adapter ist nötig. Danke für die Idee. Ich wollte eigentlich nur usb benutzen, da ich Haufenweise usb-Buchsen habe, die noch rumliegen und benutzt werden wollen. Aber wenn das so einfach mit dem Adapter geht, ist das natürlich viel besser. Dann mach ich mir nen Gehäuse dafür aus nem 3d-Drucker und gut is.
Michael U. schrieb: > Hallo, > > ich halte die ESP8266Audio-Lib > https://github.com/earlephilhower/ESP8266Audio > immernoch für einen guten Ansatz . Das funktioniert. Leider bricht der Radiostream nach ein paar Sekunden ab.
Hallo, wie sieht Dein benutzter Source aus? ESP32 oder ESP8266? Wie gibst Du aus? I2S und externer I2S-DAC? Es gibt mehrere bugfixe, die er leider noch nicht eingearbeitet hat. Speziell AudioOutputI2S .h/.cpp, AudioFileSourceBuffer .h/.cpp und AudioFileSourceICYStream.cpp. Ich kann da gern mal nachschauen. Bei wackliger WLAN-Verbindung recht der Buffer trotzdem manchmal nicht, dann stottert er trotzdem kurz beim reconnect. Mit PSRAM sollte das zu überbrücken sein. Ansonsten spielt er hier einen Radiostream stundenlang ohne Probleme. Gruß aus Berlin Michael
Ich benutze einen Esp32 mit dem eingebauten dac. Das ist mein benutzte Code: (der Beispiel code)
1 | #include <Arduino.h>
|
2 | |
3 | #ifdef ESP32
|
4 | #include <WiFi.h>
|
5 | #else
|
6 | #include <ESP8266WiFi.h>
|
7 | #endif
|
8 | #include "AudioFileSourceICYStream.h"
|
9 | #include "AudioFileSourceBuffer.h"
|
10 | #include "AudioGeneratorMP3.h"
|
11 | #include "AudioOutputI2SNoDAC.h"
|
12 | |
13 | // To run, set your ESP8266 build to 160MHz, update the SSID info, and upload.
|
14 | |
15 | // Enter your WiFi setup here:
|
16 | const char *SSID = "MeinWlan"; |
17 | const char *PASSWORD = "MeinPasswort"; |
18 | |
19 | // Randomly picked URL
|
20 | const char *URL="https://wdr-1live-live.icecastssl.wdr.de/wdr/1live/live/mp3/128/stream.mp3"; |
21 | |
22 | AudioGeneratorMP3 *mp3; |
23 | AudioFileSourceICYStream *file; |
24 | AudioFileSourceBuffer *buff; |
25 | AudioOutputI2SNoDAC *out; |
26 | |
27 | // Called when a metadata event occurs (i.e. an ID3 tag, an ICY block, etc.
|
28 | void MDCallback(void *cbData, const char *type, bool isUnicode, const char *string) |
29 | {
|
30 | const char *ptr = reinterpret_cast<const char *>(cbData); |
31 | (void) isUnicode; // Punt this ball for now |
32 | // Note that the type and string may be in PROGMEM, so copy them to RAM for printf
|
33 | char s1[32], s2[64]; |
34 | strncpy_P(s1, type, sizeof(s1)); |
35 | s1[sizeof(s1)-1]=0; |
36 | strncpy_P(s2, string, sizeof(s2)); |
37 | s2[sizeof(s2)-1]=0; |
38 | Serial.printf("METADATA(%s) '%s' = '%s'\n", ptr, s1, s2); |
39 | Serial.flush(); |
40 | }
|
41 | |
42 | // Called when there's a warning or error (like a buffer underflow or decode hiccup)
|
43 | void StatusCallback(void *cbData, int code, const char *string) |
44 | {
|
45 | const char *ptr = reinterpret_cast<const char *>(cbData); |
46 | // Note that the string may be in PROGMEM, so copy it to RAM for printf
|
47 | char s1[64]; |
48 | strncpy_P(s1, string, sizeof(s1)); |
49 | s1[sizeof(s1)-1]=0; |
50 | Serial.printf("STATUS(%s) '%d' = '%s'\n", ptr, code, s1); |
51 | Serial.flush(); |
52 | }
|
53 | |
54 | |
55 | void setup() |
56 | {
|
57 | Serial.begin(115200); |
58 | delay(1000); |
59 | Serial.println("Connecting to WiFi"); |
60 | |
61 | WiFi.disconnect(); |
62 | WiFi.softAPdisconnect(true); |
63 | WiFi.mode(WIFI_STA); |
64 | |
65 | WiFi.begin(SSID, PASSWORD); |
66 | |
67 | // Try forever
|
68 | while (WiFi.status() != WL_CONNECTED) { |
69 | Serial.println("...Connecting to WiFi"); |
70 | delay(1000); |
71 | }
|
72 | Serial.println("Connected"); |
73 | |
74 | file = new AudioFileSourceICYStream(URL); |
75 | file->RegisterMetadataCB(MDCallback, (void*)"ICY"); |
76 | buff = new AudioFileSourceBuffer(file, 2048); |
77 | buff->RegisterStatusCB(StatusCallback, (void*)"buffer"); |
78 | out = new AudioOutputI2SNoDAC(); |
79 | mp3 = new AudioGeneratorMP3(); |
80 | mp3->RegisterStatusCB(StatusCallback, (void*)"mp3"); |
81 | mp3->begin(buff, out); |
82 | }
|
83 | |
84 | |
85 | void loop() |
86 | {
|
87 | static int lastms = 0; |
88 | |
89 | if (mp3->isRunning()) { |
90 | if (millis()-lastms > 1000) { |
91 | lastms = millis(); |
92 | Serial.printf("Running for %d ms...\n", lastms); |
93 | Serial.flush(); |
94 | }
|
95 | if (!mp3->loop()) mp3->stop(); |
96 | } else { |
97 | Serial.printf("MP3 done\n"); |
98 | delay(1000); |
99 | }
|
100 | }
|