Esp32 usb host

Beitrag #5754304 wurde von einem Moderator gelöscht.
#5759152
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
Angehängte Dateien:
Persönliche Seite #5759217
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.
Gast #5760143
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.
OP #5775482
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.
#5775773
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
OP #5777886
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
}
#7561890
Lesenswert?

Moin Leute, ich habe da derzeit eine "wahnsinnige" Idee in meinem Hinterkopf. Nachdem meine esp32 Internetradio wunderbar funzt, denke ich über folgendes nach.

Könnte man einem DAB USB Dongel (wie für Android Autoradios üblich /SDR Chips) auch einen ESP32 "füttern"?

Ich kenne DADDUINO etc und habe diesbzgl. In der letzten Zeit viel gelesen. Zur Zeit scheint das aber alles 'zu ruhen"...!?

Hintergrund ist: Ich möchte alte Autoradios für Oldtimer (hier SAAB) eventuell auf DAB+ hochrüsten.

Herzliche Grüße Manfred

#7562051
Lesenswert?

Hallo, es ist ja eigentlich für Raspi geschrieben und ich empfinde es heute als etwas "in die Jahre" gekommen. Es muß doch möglich sein, die USB Kommunikation mit den SDR /DAB+ Sticks mit esp32 nachbilden zu können. Der Stick müsste dann mit MP3 Files o.ä. antworten. Beim Webradio funktioniert das ja auch perfekt. Hat jemand Ideen, kennt jemand die Kommunikation /Protokolle /Befehle, die zwischen SDR/DAB Sticks und Rechner ausgetauscht werden? Ich bin für jeden Hinweis dankbar!

Viele Grüße Manfred

#7562214
Lesenswert?

Manfred S. schrieb:

es ist ja eigentlich für Raspi geschrieben und ich empfinde es heute als etwas "in die Jahre" gekommen.

Und? Ich verstehe Dein Problem nicht. Du hast Sourcecode, den musst Du halt portieren. Was hat das Alter des Sourcecodes damit zu tun? Anders als die Hipsterprogrammiersprachen, die alle drei Wochen inkompatibel zu sich selbst werden, ist das bei C und C++ nicht der Fall. Man kann problemlos auch jahrzehntealten Code übersetzen.

Manfred S. schrieb:

Es muß doch möglich sein, die USB Kommunikation mit den SDR /DAB+ Sticks mit esp32 nachbilden zu können. Der Stick müsste dann mit MP3 Files o.ä. antworten.

Kann es sein, daß Du nur sehr vage Vorstellungen davon hast, was so ein SDR/DAB+-USB-Stick macht?

#7562371
Lesenswert?

Hallo, du schreibst: Du hast Sourcecode, den musst Du halt portieren. Was hat das Alter des Sourcecodes damit zu tun?

Ich denke, das ist kein guter Weg. Das wäre ein "reingenearing". Das kann man zwar machen, ist aber "zu zeitaufwendig" (das sind solche Projekte aber immer ;)

Du hat Recht, ich weiß (leider) nicht genau, wie die Kommunikation auf der USB Schnittstelle mit so einem RDS/DAB Chip abläuft. Das wüsste ich aber gerne, darum frage ich. Herzliche Grüße Manfred

#7562551
Lesenswert?

Manfred S. schrieb:

Ich denke, das ist kein guter Weg. Das wäre ein "reingenearing".

Nein, es ist kein Reengineering, wenn Du bestehende Sourcen verwendest. Reengineering wäre es, wenn Du /ohne/ bestehende Sourcen den Krempel neu entwickeln müsstest, und dabei bei einem funktionierenden Beispiel mit Analysemethoden die Kommunikation belauschen und verstehen müsstest.

Das ist aber bei bestehendem Sourcecode nicht der Fall. Den musst Du nur portieren, und dabei ist es wirklich vollkommen wurscht, wie alt der Sourcecode ist.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren