Forum: Mikrocontroller und Digitale Elektronik Esp32 usb host


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.
von Flo S. (flos6323)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Arduino Fanboy D. (ufuf)


Bewertung
0 lesenswert
nicht lesenswert
USB Host?
Eher nicht so einfach.

Wie wäre es mit SD Karten?

von Sebastian R. (sebastian_r569)


Bewertung
0 lesenswert
nicht lesenswert
Mit nem MAX3421E dazwischen könnte es gehen

Beitrag #5754304 wurde von einem Moderator gelöscht.
von Flo S. (flos6323)


Bewertung
0 lesenswert
nicht lesenswert
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

von funky (Gast)


Bewertung
0 lesenswert
nicht lesenswert
also der esp32 sollte mp3 auch ohne externen decoder verarbeiten können. 
für irgendwas müssen 2 cores mit 240mhz doch gut sein

von Flo S. (flos6323)


Bewertung
0 lesenswert
nicht lesenswert
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
von Michael U. (amiga)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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

von Flo S. (flos6323)


Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank, ich werde es mir anschauen.

von Rufus Τ. F. (rufus) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
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.

von John Doe (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Rufus Τ. F. (rufus) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Die etwas teurere, aber deutlich besser dokumentierte Alternative zum 
CH376 ist der VNC1L ("Vinculum") von FTDI.

von Arduino Fanboy D. (ufuf)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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.

von Flo S. (flos6323)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Flo S. (flos6323)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Michael U. (amiga)


Bewertung
0 lesenswert
nicht lesenswert
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

von Flo S. (flos6323)


Bewertung
0 lesenswert
nicht lesenswert
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
}

von puc2000 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
ESP32-S2

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]
  • [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.