Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Audioerzeugung mit Microcontroller
#1
Hallo zusammen,

bei der Entwicklung eines Internetradios kommt man irgendwann mal an den Punkt, die digitalisierten Daten in analoge Werte (in diesem Fall - Audio-NF) umzusetzen. Glücklich kann man sich schätzen, wenn der eingesetzte Microcontroller wie zum Beispiel der ESP32 von Expressif-Systems ein DAC an Bord hat. Sollte ein DAC fehlen, bietet es sich an einen externen DSP zu nutzen.

   

Dieser DSP von VSLI erzeugt ein analoges Stereosignal und kann nebenbei einen digitalen Datenstrom im Ogg Vorbis/MP3/AAC/WMA/... - Format dekodieren. Dadurch wird dem Microcontroller auch die Softwaredekodierung der eben genannten Datenformate abgenommen. Für einen Arduino (mit AVR) unverzichtbar, mit seinen 16 MHz CPU-Takt ist er nicht in der Lage diese Aufgabe rein in Software zu lösen. Auch die schnellen ESP8266 und der ESP32 profitieren von so einem DSP, haben Sie doch im Einsatz als Internetradio noch genügend andere Aufgaben zu erledigen (Webclient, Webserver, Datentransport zum DSP, Nutzereingaben,Displayansteuerung und so weiter).

Möchte man mit einem Microcontroller "nur" einmal Audio erzeugen, ganz ohne DAC oder DSP, geht es auch einfacher. Fast alle Controller haben PWM-Ausgänge an Bord. Diese PWM-Ausgänge lassen sich als DAC-missbrauchen, das Thema ist sicher nicht neu. Für ein halbwegs brauchbares Audio-Signal muß man aber auf eine hohe PWM-Trägerfrequenz zurückgreifen, auch das zusammenschalten von PWM-Ausgängen verbessert das Audiosignal signifikant.
Die ganze Theorie lässt sich unter http://wiki.openmusiclabs.com/wiki/PWMDAC nachlesen.

Hier mal meine Umsetzung die zeigt wie ein einfacher Arduino Nano klingen kann.



Sicher kein HiFi, aber an den Klang eines AM-Radios kommt man schon gut ran.  Möglicherweise kann so ein Arduino mit PWM-"DAC" mal als Modulationsquelle für einen Sender herhalten. Für mein Internetradio bevorzuge ich aber oben gezeigtes DSP in Verbindung mit den schnellen Microcontrollern von Expressif.


Viele Bastlergrüße
Bernhard
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren
#2
Weiter geht es mit der zweiten Variante der Kracherzeugung am Microcontroller.

   

 Für mein Internetradio möchte ich einen DSP - Typ VS1053b von VLSI einsetzen. Dieser Prozessor kann Datenströme  in mehreren Formaten (MP3,MP4,WMA,Ogg,…) direkt verarbeiten. Er erkennt anhand der Header im Datenstrom die Übertragungsparameter und liefert an seinen Ausgang ein analoges Mono/Stereo-Signal. Zusätzlich hat er selbst GPIOs und kann im RAM Benutzerprogramme simultan neben seinen Dekodierroutinen abarbeiten.
Auf dem DSP-Entwicklungsbord ist auch noch ein Mikrofon für Aufnahmen und ein Line-In vorgesehen. Der Preis für ein solches DSP-Board liegt bei zirka 7 bis 14 EURO, je nach Bezugsquelle. Das Datenblatt des Chips habe ich hier angelegt.
.pdf   vs1053.pdf (Größe: 695,62 KB / Downloads: 50)
 
Sucht man im Internet nach dem DSP und Microcontroller, findet man viele C/C++ - Programmierbibliotheken zum 1053. Die Wahl der richtigen Bibliothek ist nicht einfach, bei genauerem Studium sind viele nur halbherzig und teilweise in der Funktion implementiert. Letztendlich habe ich mich für die Bibliothek von Adafruit entschieden. Diese ist zwar nicht für mein eingesetztes DSP-Entwicklungsbord geschrieben, sondern für das Board von Adafruit, ließ sich aber sehr schnell an meine Umgebung anpassen und kompilieren.
 
Ein weiterer Stolperstrick kann der Anschluss des DSP an den ESP8266-Mikrocontroller selbst sein. Wie man im Pinout des ESP8266 erkennen kann, sind die GPIO-Bezeichnungen nicht gerade logisch vollzogen.

.jpg   ESP8266Pinout.jpg (Größe: 89,9 KB / Downloads: 665)

Der Ausgang D0 ist zum Beispiel GPIO16, D1 dagegen plötzlich GPIO5. Warum man diese verwirrende Nummerierung gewählt hat ist mir nicht bekannt. Vermutlich waren Layout-Gründe am ESP8266-Entwicklungsbord ausschlaggebend, man wollte womöglich viele Brücken oder Leitungskreuzungen vermeiden?
Entsprechend durcheinander ist auch die Zuteilung der GPIO-Anschlüsse zwischen ESP8266 und DSP in meinem Programm.
 

Code:
// Anschlussschema des VS1053-DSP
#define VS1053_CS      5    // VS1053 Chip Select Pin
#define VS1053_DCS     16   // VS1053 Data/Command Select Pin
#define VS1053_DREQ    4    // VS1053 Data request
#define VS1053_MOSI   13    // VS1053 MOSI
#define VS1053_MISO   12    // VS1053 MISO
#define VS1053_CLK    14    // VS1053 Clock Pin
#define VS1053_RESET   -1   // VS1053 reset pin (-1 unbelegt)



Ein weiteres Problem an meinem DSP-Entwicklungsbord ist, das einige GPIOs frei in der Luft hängen und weder auf LOW noch auf HIGH gelegt sind. Das hatte für eine ziemlich frustrierende Fehlersuche gesorgt. Nachdem ich mein Testprogramm geschrieben und einen MP3 Datenstrom zum DSP geschickt hatte, blieb dieser stumm.
Am Oszi konnte man die Datenpakete am DSP-Eingang sehen und ich war mir auch sicher das der DSP richtig initialisiert wurde, schließlich konnte ich mit dem ESP8266 die Register des DSPs vollständig auslesen. Mein Programm war also korrekt nur der DSP-Ausgang arbeitete nicht. Nach erneutem Studium des Datenblatts von VLSI fand ich heraus, das der DSP in zwei Betriebsmodi arbeiten kann. Modus 1: MIDI- Synthesizer mit mehreren Instrumenten für Keyboards. Modus 2: MP3-Dekoder. Die Umschaltung erfolgt über den Status einiger GPIOs zur Bootzeit des DSP. Und genau der für die Umschaltung benötigte GPIO1 hing in der Luft, wurde als HIGH interpretiert und zusammen mit GPIO0 auf LOW startete der DSP im Midi-Modus.
Da ich keine Softwarelösung für das Problem gefunden habe, habe ich GPIO01 mit einer Lötbrücke zwangsmäßig auf GPIO0-Level gezogen.
   
Nach einem Reset bootete der DSP im MP3-Modus und arbeitete fortan fehlerfrei. Also Augen auf falls Ihr mal ein DSP-Board wie meines kauft und nichts funktioniert.


Nachfolgend dazu mein Testprogramm zum Empfang des Deutschlandfunks über Internet und Ausgabe über den DSP. Ich hoffe das Programm ist ausreichend kommentiert und selbsterklärend.


Code:
// Bibliotheken einbinden
#include <ESP8266WiFi.h>
#include <Adafruit_VS1053.h>

// Zugangsdaten zum WLAN
char* ssid     = "XXXXX";
const char* password = "XXXXX";

// Webstream DLF: http://st01.dlf.de/dlf/01/56/ogg/stream.ogg
const char *hostrechner = "st01.dlf.de";
const char *pfad = "/dlf/01/56/ogg/stream.ogg";
int httpPort = 80;

// Anschlussschema des VS1053-DSP
#define VS1053_CS      5    // VS1053 Chip Select Pin
#define VS1053_DCS     16   // VS1053 Data/Command Select Pin
#define VS1053_DREQ    4    // VS1053 Data request
#define VS1053_MOSI   13    // VS1053 MOSI
#define VS1053_MISO   12    // VS1053 MISO
#define VS1053_CLK    14    // VS1053 Clock Pin
#define VS1053_RESET   -1   // VS1053 reset pin (-1 unbelegt)


// Dekoderinstanz erstellen
Adafruit_VS1053 VS1053Dekoder = Adafruit_VS1053(VS1053_MOSI, VS1053_MISO, VS1053_CLK, VS1053_RESET, VS1053_CS, VS1053_DCS, VS1053_DREQ);

// MP3 Datenpuffer
uint8_t mp3buff[32];  

// Einen WiFi-Client für HTTP/TCP-Verbindungen erstellen
WiFiClient client;

 
void setup() {
 Serial.begin(115200); // Serielle Console für Fehlersuche
 
 if (! VS1053Dekoder.begin())
   { // initialisiere VS1053-Dekoder
    Serial.println(F("Kein VS1053-DSP-Dekoder gefunden"));
    while (1) delay(10);
 }

 Serial.println(F("VS1053-DSP-Dekoder gefunden"));
 // Einstellung Standardlaustärke (links, rechts)
 VS1053Dekoder.setVolume(7, 7);
 
 // WIFI-Client initialisieren
 Serial.print("Verbinde mit Netzwerk-SSID "); Serial.println(ssid);
 WiFi.begin(ssid, password);  
 while (WiFi.status() != WL_CONNECTED) {
   delay(500);
   Serial.print(".");
 }

 Serial.print("WIFI-Verbindung hergestellt. ");  
 Serial.println("IP-Adresse: ");  Serial.println(WiFi.localIP());

 
 Serial.print("Verbinde zum Audiostream: ");  Serial.println(hostrechner);
 
 if (!client.connect(hostrechner, httpPort)) {
   Serial.println("Verbindung fehlgeschlagen!");
   return;
 }
 
 // URI zur Anfrage erzeugen
 Serial.print("Verbindung steht, stelle Anfrage-URL: ");
 Serial.println(pfad);
 
 client.print(String("GET ") + pfad + " HTTP/1.1\r\n" +
              "Host: " + hostrechner + "\r\n" +
              "Connection: close\r\n\r\n");
}


void loop() {
 // DSP für weitere Daten bereit?
 if (VS1053Dekoder.readyForData()) {      
   if (client.available() > 0) {
     // Datenpuffer füllen
     uint8_t bytesread = client.read(mp3buff, 32);
     // und zum Dekoder schicken
     VS1053Dekoder.playData(mp3buff, bytesread);      
    }
 }
}



   

In dem Testprogramm ist der Link zum Stream des DLF noch direkt im Programm festgehalten. Im nächsten Schritt soll der ESP8266 einen Webserver mit einem Internetportal bereitstellen in dem verschiedene Programmspeicherplätze mit unterschiedlichen Radiostationen (Stream-URLs) belegt werden können. Es muss also eine Art Programmverwaltung programmiert werden. Hoffentlich gelingt mir das besser als bei vielen industriellen Internetradios aus Fernost! Danach ist das Internetradio auch fast schon fertig, es sei denn es kommen mir noch andere Ideen. Display und Taster/Drehimpulsgeber zur Bedienung müssen natürlich auch noch hinzugefügt werden.  <Wird fortgesetzt>
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren
#3
Hallo Bernhard,

Das sind sehr interessante Ansätze. Ich bin ja gerade dabei mich mit dem Arduino zu beschäftigen. Das macht mir viel Spaß. Ich werde deine Beiträge weiter verfolgen, da ich damit viel lernen kann.
Viele Grüße
Semir
---------------------------------
"Alle sagten: Das geht nicht. Dann kam einer der wußte das nicht, und hat es gemacht."
(Prof. Hilbert Meyer, Uni Oldenburg)
Zitieren
#4
Hallo Semir,

den ESP8266 kannst Du auch als WiFi-Arduino-Shield für rund die Hälfte des Preises eines NodeMCU kaufen. Damit fehlen dir zwar meisten GPIOs des Prozessors, aber er kann über AT-Kommandos und eine serielle Schnittstelle mit den "kleinen" Atmel AVRs reden. Für die AVRs gibt es ja auch noch den ENC28J60 als RJ45-Variante für Ethernetverbindungen. Für kleine Steuerungsaufgaben sollte die Leistung der 8-Biter von Atmel locker ausreichen, für Multimedia wird es wohl knapp.


Viele Grüße
Bernhard
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren
#5
Hallo Mitleser,

ich hatte oben ja schon einige Wege der Klangerzeugung mit einem Microcontroller oder DSP gezeigt. Nachschieben möchte ich noch ein sehr schönes Papier zum Thema Puls-Dichte-Modulation (PDM) und die Möglichkeit, die sich damit auf großen und kleinen Controllern bietet. 


.pdf   Understanding_PDM_Digital_Audio.pdf (Größe: 610,45 KB / Downloads: 30)

Hier eine praktische Anwendung für den ESP8266:  https://janostman.wordpress.com/audio-ha...e-esp8266/

Fröhliche Bastler-Bits sendet Bernhard.
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren
#6
(29.06.2017, 12:12)Bernhard45 schrieb: ..Ein weiteres Problem an meinem DSP-Entwicklungsbord ist, das einige GPIOs frei in der Luft hängen und weder auf LOW noch auf HIGH gelegt sind. Das hatte für eine ziemlich frustrierende Fehlersuche gesorgt. Nachdem ich mein Testprogramm geschrieben und einen MP3 Datenstrom zum DSP geschickt hatte, blieb dieser stumm.
Am Oszi konnte man die Datenpakete am DSP-Eingang sehen und ich war mir auch sicher das der DSP richtig initialisiert wurde, schließlich konnte ich mit dem ESP8266 die Register des DSPs vollständig auslesen. Mein Programm war also korrekt nur der DSP-Ausgang arbeitete nicht. Nach erneutem Studium des Datenblatts von VLSI fand ich heraus, das der DSP in zwei Betriebsmodi arbeiten kann. Modus 1: MIDI- Synthesizer mit mehreren Instrumenten für Keyboards. Modus 2: MP3-Dekoder. Die Umschaltung erfolgt über den Status einiger GPIOs zur Bootzeit des DSP. Und genau der für die Umschaltung benötigte GPIO1 hing in der Luft, wurde als HIGH interpretiert und zusammen mit GPIO0 auf LOW startete der DSP im Midi-Modus.
Da ich keine Softwarelösung für das Problem gefunden habe, habe ich GPIO01 mit einer Lötbrücke zwangsmäßig auf GPIO0-Level gezogen.

Nach einem Reset bootete der DSP im MP3-Modus und arbeitete fortan fehlerfrei. Also Augen auf falls Ihr mal ein DSP-Board wie meines kauft und nichts funktioniert.

an dem Problem hänge ich grad fest. Ich verwende einen ESP32 mit VS1053-board. Das Löten an dem LPQFP-48 Chip traue ich mir nicht zu. Aber ich habe einen Sketch mit einer Softwarelösung gefunden. Allerdings bin ich nicht in der Lage diese mit meiner Bibliothek ("vs1053_ext.h") umzusetzen. Mit der Bibliothek "VS1053.h" taucht das Problem übrigends nicht auf und ich habe Radiowiedergabe.

Zur Softwarelösung:

dies sind die Hinweise im Quellcode:

Code:
   // A library for the VS1053 (for ESP32) is not available (or not easy to find).  Therefore
   // a class for this module is derived from the maniacbug library and integrated in this sketch.
...
   // Most VS1053 modules will start up in midi mode.  The result is that there is no audio
   // when playing MP3.  You can modify the board, but there is a more elegant way:
   wram_write ( 0xC017, 3 ) ;                            // GPIO DDR = 3
   wram_write ( 0xC019, 0 ) ;                            // GPIO ODATA = 0

Der Aufruf von wram_write geschieht mit folgender Syntax:

Code:
void        wram_write ( uint16_t address, uint16_t data ) ;

weiter komme ich mit meinen bescheidenen Kenntnissen leider nicht.

Das komplette Programmpaket von Andreas Spiess findet sich hier:

https://github.com/Edzelf/ESP32-Radio

Mir ist dieses Programm etliche Nummern zu komplex um weiter da einzusteigen! Aber vielleicht kann Bernhard sich was rausziehen.
Gruß,
Jupp
-----------------------------

was du baust ist immer mit dir verbunden
(Lego)

Einsamkeit ist nur ein Mangel an Technologie
(@beetlebum)
Zitieren
#7
jetzt hab ich auch mal den Deutschlandfunk-Sketch von Bernhard auf das WiFi des ESP32 und die bewährten GPIO Belegungen meiner Platine geändert sowie einen gültigen host eingetragen. Das Radio läuft problemlos. Es ist keine Modifikation am DAC erfolgt. Vielleicht wurde die Adafruit-Bibliothek nachgebessert?


   
Gruß,
Jupp
-----------------------------

was du baust ist immer mit dir verbunden
(Lego)

Einsamkeit ist nur ein Mangel an Technologie
(@beetlebum)
Zitieren
#8
Hallo Jupp,

hänge die VS1053-Bibliothek (Header und C/C++ Dateien) in der Du den Softwarepatch sehen willst bitte mal als zip hier rein, dann schaue ich mir an wie wir den Patch von
der EdZelf-Firmware in deine Version der Bibliothek bekommen. 
 
Klappt das über den Softwareweg nicht, dann kann ich Dir ein fertig gebrücktes Board über Ing-Büro Weinert (dem ich deinen Sangean vermittelt habe) zukommen lassen. Er lötet Dir deine Boards wohl auch kostenfrei um, da bin ich mir sicher + das geht denke ich schneller, als das 1053-Board zu mir runter zu schicken oder wenn ich meine Frau drauf ansetze das passende Board aus meinem Magazin rauszusuchen.

Gruß 
Bernhard
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren
#9
Hallo Bernhard,

sketch und Bibliothek hab ich eingefügt.


.zip   ESP32_Web_Radio_kopie.zip (Größe: 32,79 KB / Downloads: 17)

Versteh mich nicht falsch, es muss nicht dieser sketch sein. Auch wenn ich den Autor educ8s sehr schätze. Sein Internetradio mit Nextion-Display, um das es hier geht, stellt er hier vor:

Internet Radio Using an ESP32

Genausogut können wir auch deinen Deutschlandfunk-Sketch ausbauen mit einer Senderwahl, bevorzugt mit encoder, und einer Displayausgabe, bevorzugt mit Nextion-Display. Mehr ist es ja nicht. Die host-Adressen dürfen gerne hardcodiert sein. Mehr als eine Handvoll Stationen braucht man m.E. nicht. Das würde ich mir sogar selbst zutrauen. Oder den sketch von educ8s umschreiben auf die Adafruit-Library.

Bei mir läuft das Programm gleich nach dem WiFi-connect in eine Guru-Meditation. Das muss noch nicht mal wirklich an dem Initialisierungsproblem des VS1054 liegen, es ist nur sehr naheliegend.

   
Gruß,
Jupp
-----------------------------

was du baust ist immer mit dir verbunden
(Lego)

Einsamkeit ist nur ein Mangel an Technologie
(@beetlebum)
Zitieren
#10
hier noch was interessantes zur baldram-library, da wurde es durch eine Funktion gelöst:

..
#include <VS1053.h>
..
VS1053 player(VS1053_CS, VS1053_DCS, VS1053_DREQ);
..
player.begin();
player.switchToMp3Mode();

Auszug aus der README.md:

Zitat:Please note that `player.switchToMp3Mode()` is an optional switch. Some of VS1053 modules will start up in MIDI mode. The result is no audio when playing MP3.
You can modify the board, but there is a more elegant way without soldering. For more details please read a discussion here: [http://www.bajdi.com/lcsoft-vs1053-mp3-m...ent-33773).
<br />No side effects for boards which do not need this switch, so you can call it just in case.

Bernhard, ich habe eines meiner beiden VS1053-Boards jetzt gelötet. Hab mich getraut. Der Effekt ist gleich geblieben. Die Guru-Mediation kommt nicht mehr, seit ich einen stabileren Aufbau habe (kein Steckbrett mehr sondern eine Platine). Mein ursprünglicher sketch funktioniert aber immer noch nicht. Es kommt kein Ton. Die serielle Ausgabe stoppt mit der Meldung "kein VS1053 Board gefunden". Der modifizierte Bernhard-sketch läuft weiterhin.
Gruß,
Jupp
-----------------------------

was du baust ist immer mit dir verbunden
(Lego)

Einsamkeit ist nur ein Mangel an Technologie
(@beetlebum)
Zitieren
#11
Hallo Jupp,

bei deinem verlinken Code-Archiv in #9 ist der Softwarepatch auf jeden Fall bereits enthalten!

/**
 * An optional switch.
 * Most VS1053 modules will start up in MIDI mode. The result is that there is no audio when playing MP3.
 * You can modify the board, but there is a more elegant way without soldering.
 * No side effects for boards which do not need this switch. It means you can call it just in case.
 *
 * Read more here: http://www.bajdi.com/lcsoft-vs1053-mp3-m...ment-33773
 */
void VS1053:ConfusedwitchToMp3Mode() {
    wram_write(0xC017, 3); // GPIO DDR = 3
    wram_write(0xC019, 0); // GPIO ODATA = 0
    delay(100);
    LOG("Switched to mp3 mode\n");
    softReset();
}



und in deinem Programm, also in der ino, wird er auch benutzt:

  void initMP3Decoder()
  {
    player.begin();
    player.switchToMp3Mode(); // optional, some boards require this
    player.setVolume(VOLUME);
  }



Da kann ich also nichts mehr ändern, das ist so schon richtig wie es dort steht.
Das 0xC017 auf 3 und 0xC019 auf 0 ist genau das was ich im Forum auch schon als Workaround vorgestellt habe, bei einigen Boards funktioniert es, bei anderen aber nicht, dort ist dann einzig die Lötbrücke das machbare. Wenn allerdings schon ein Board auf den Software-Patch "anspricht", dann ist es sehr unwahrscheinlich das es mal mit dem einen Sketch läuft, mit einem anderen aber nicht.

Wenn dein Sketch antwortet das es keinen VS1053 gefunden hat, wird tatsächlich ein Verbindungsfehler/keine Betriebsspannung,... also was in der Verkabelung nicht okay sein. Bitte nochmal und nochmal prüfen. Ich kenne jetzt meine Anschlußbelegung die ich im Sketch benutzt habe nicht, aber ist es die gleiche wie für den Sketch mit der Skalensimulation? 

Deine benutzte Bibliothek bietet zur Überprüfung des korrekten Anschlusses  auch eine extra Prüffunktion an.



/**

 * A lightweight method to check if VS1053 is correctly wired up (power supply and connection to SPI interface).

 *

 * @return true if the chip is wired up correctly

 */

bool VS1053::isChipConnected() {

    uint16_t status = read_register(SCI_STATUS);

    return !(status == 0 || status == 0xFFFF);
}

 

Könnte in der Ino also so genutzt werden, um zu schauen was die Funktion zurück gibt.

bool result = player.isChipConnected();

if (result)
   Serial.println("richtig angeschlossen");
else
   Serial.println("falsch angeschlossen");


Also ich wüsste nicht was ich da am Code ändern sollte, es ist auf dem ersten und zweiten Blick eigentlich alles vorhanden um den VS1053 anzusprechen und wenn es geht, per Software aus den MIDI-Modus zu holen. Auf einen eigenen ESP32/VS1053 kann ich es leider nicht testen, denn ich habe beides leider nicht dabei. Eigentlich müsste man auch direkt deinen Aufbau analysieren und debuggen um zu schauen wo das Problem ist, denn ein anderer Aufbau würde sich wahrscheinlich wieder ganz anders verhalten. Kurz und knapp, dein Internetradio sollte nicht nur mit meinem Sketch richtig laufen, sondern auch mit dem Fremdcode!
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren
#12
Hallo nochmal,

zu meinem Testcode für den VS1053 von oben, bitte baut damit keine dauerhaften Installationen auf! Zum Testen des VS1053 und eine erste Wiedergabe eines Internetradios ist es gut, ein richtig fertiges Internetradio sollte aber mindestens Multithreading (mehrere Threads für Tasteneingabe, Display und auch füllen eines richtig großen Empfangspuffers haben.)

Das Hauptprogramm von oben:

PHP-Code:
void loop() {
 
// DSP für weitere Daten bereit?
 
if (VS1053Dekoder.readyForData()) {      
   
if (client.available() > 0) {
 
    // Datenpuffer füllen
 
    uint8_t bytesread client.read(mp3buff32);
 
    // und zum Dekoder schicken
 
    VS1053Dekoder.playData(mp3buffbytesread);      
    
}
 } 



Holt per HTTP ja nur kurz einen Datenteil von 32 Byte(!) aus dem Internet und reicht ihn dann an den VS1053 weiter. Wenn also die WiFi-Verbindung mal hüstelt, dann fängt die Wiedergabe an zu stocken. 

Also in eigenen Implementierungen bitte 

a.) Multithreading verwenden

- die Taskscheduler-Bibliothek ist ideal, siehe hier: https://radio-bastler.de/forum/showthread.php?tid=8759

- damit könnte man dann ein Webradio so aufbauen wie in meinem sehr alten Code:

Code:
//Tasks
Task taskFillStreamingBuffer(1,  TASK_FOREVER, &Task_FillBuffer);
Task taskEncoderPolling(1,  TASK_FOREVER, &Task_EncoderPolling);
//Task taskIRPolling(125,  TASK_FOREVER,  &Task_IRPolling);
Task taskProgrammUmschaltung(2000,  TASK_FOREVER, &Task_Programmumschaltung);
Task taskDisplay(500,  TASK_FOREVER,  &Task_Display_Proxy);


Also ein Task für das permanente Füllen des Empfangspuffers, ein Task für Drehencoder, ein Task für Fernbedienung, einer der auf Programmumschaltungen reagiert, einer der das Display aktualisiert. Die Tasks waren dann weiter unten im Code definiert. 

b.) Unbedingt einen Empfangspuffer implementieren der mehr als 32 Byte(!) umfasst, das könnte zum Beispiel
ein Ringpuffer, FiFo usw. sein. Die Klasse #include <QueueArray.h> , kann das zum Beispiel. Man kann die Daten oben mit einem Task nach dem ASAP-Prinzip rein-pushen bis der Puffer voll ist und dann warten, siehe Taskcode

PHP-Code:
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// TASK-HANDLER BEGINN
/////////////////////////////////////////////////////////////////////////////////////////////////////////////

void Task_FillBuffer() {
 
  // if (VS1053Dekoder.readyForData()) {
 
  if (client.available() > 0) {
 
    if (!queue.isFull()) {
 
      Buffer32Byte *mp3data = new Buffer32Byte();
 
      client.read(mp3data->data32);
 
      queue.push(mp3data);
 
    //   if (!queue.isFull()) {
 
  // if (client.available() > 0) {
 
  // } //   if (VS1053Dekoder.readyForData()) {



und auf der anderen Seite die Daten so schnell wie es der VS1053 haben will aus dem Puffer raus-pop'en.

PHP-Code:
  // Dekodiere empfangene Daten wenn Ringpuffer nicht leer ist
 
  if (VS1053Dekoder.readyForData()) {
 
    //Serial.println(queue.count());
 
    if (!queue.isEmpty()) {
 
      Buffer32Byte *mp3 queue.pop();
 
      VS1053Dekoder.playData(mp3->data32);
 
      delete(mp3);
 
    }
 
  



Unter dem Strich ist das sicher mal eine interessante Aufgabe so ein Internetradio richtig in allen einzelnen Aufgaben auf einem schnellen uC zu implementieren, aber und das sage ich hier ganz unverblümt, seit dem iRadio (https://github.com/BM45/iRadio)
ist diese Art des Aufbaus eines Internetradios obsolet und rein von akademischer Betrachtung. Soetwas wie Minix für Betriebssystementwickler.

Warum? Nun ein ESP8266 oder ESP32 (auch diese CPUs sind schon etwas angestaubt!) kostet fast soviel wie ein Raspberry Zero WH, der benötigte VS1053 ist zwar noch zu bekommen, aber abgekündigt und wurde durch den VS1063 ersetzt. Alle diese DSP-Boards (mit 53er oder 63er) kosten ohne Versand und bei Lieferung aus Deutschland auch gut einen 10er oder mehr. Diese Kosten kommen zum ESP32 also noch dazu. Damit liegen wir bei den Gesamtkosten locker bei dem kleinsten Raspi 3A+ oder sogar 4, der aber im Vergleich zu einem ESP32 mit 240 MHz wahnsinnig viel mehr an Leistung und Schnittstellen zu bieten hat! Die Lösung mit dem iRadio ist zukunftssicher, die Komponenten (Playersoftware und auch das Betriebssystem und die Firmware des Pi) werden täglich von dutzenden, gar hunderten Entwicklern vorangetrieben. Der VS1053 oder 63 ist auf seine implementierten Audiocodecs festgelegt, beim iRadio hingegen werden immer und aktuell neue Audiocodecs rein in Software implementiert und sind praktisch nach dem Erscheinen in der Playersoftware verfügbar. Der VS1063 mit Stand von vor 3 Jahren müsste aber gegen einen anderen DSP ausgetauscht werden, das aufgebaute Radio bräuchte also einen Hardwareumbau!


Überlegt es Euch also gut, welche Lösung Ihr verfolgt. Auch das von Jupp gezeigte ESP32-Internetradio https://www.instructables.com/id/Interne...-an-ESP32/ mit seiner schönen Skale ist es eigentlich nicht mehr Wert nachgebaut zu werden, denn mit der Skalensimulation auf iRadio-Basis haben wir da die viel leistungsfähigere und flexiblere Lösungn zum praktisch gleichen Kostenaufwand. 

Meine generelle Empfehlung: ESP32 Radios also nur noch zu Lehrzwecken angehen, wenn man alle Bestandteile unbedingt nur auf einem uC haben will und man sein Multitasking noch selbst auf der CPU schreiben möchte. Der Minix-Weg halt. Für ein täglich nutzbares und zukunftsicheres Internetradio mit Bluetooth lieber zum iRadio greifen.


Gruß
Bernhard
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren
#13
ich komme weiter, kein Problem. Meine hardware ist okay. Es lag eher an meiner Entwicklungsumgebung. Meine IDE hat sich in den Jahren aufgebläht, mit attiny, arduino und Unmengen libraries. Man muss wohl ab und an mal einen break machen und von vorne anfangen. Und siehe da, auf einmal funktioniert der serielle Monitor wieder, die Warnungen im compiler sind verschwunden, und ich muss nicht mal mehr die boot-Taste betätigen um den esp zu füttern. Meine sketche laufen auch wieder. Der Guru-Meditations-sketch noch nicht, wohl aber andere.
Gruß,
Jupp
-----------------------------

was du baust ist immer mit dir verbunden
(Lego)

Einsamkeit ist nur ein Mangel an Technologie
(@beetlebum)
Zitieren
#14
Hallo Jupp,

das "hard" codieren von Webadressen ist eigentlich nur bei Testprogrammen zum VS1053 "erlaubt". Ein solches Internetradio mit hart-codierten Sendern wird nie ein im Alltag nutzbares Internetradio sein. Man muss die Sender auch nicht hart im Programmcode codieren, sondern kann ganz einfach Out-of-Box mit den Bibliotheken einen Webserver auf dem uC zusätzlich aufsetzen. Ich hatte es im Forum ja schon gezeigt. Dieser Webserver hat dann kleine Webseiten drauf, mit denen man die Programmliste im Prozessor bearbeiten kann. Der ESP32 oder ESP8266 hält die Liste dabei im nicht-flüchtigen Speicher. Also bitte macht nicht solch einen falschen Schritt und baut Internetradios mit hard-codierten Programmlisten auf, die man im Nachhinein nur mit einer Entwicklungsumgebung, Compiler und Programmierkabel bearbeiten kann! Schnell will man einen anderen Sender haben oder schlimmer eine Sender-URL veraltet!

Im Prinzip ist das alles was ich im Forum schon mal gezeigt habe ein Thema für einen Fortgeschrittenenkurs Mikrocontrollerprogrammierung. Da gehört es hin, aber auch nur wenn die "Kundschaft" es auch sehen möchte und tatsächlich noch auf diese Art ein Internetradio aufbauen möchte. Hier in "Audioerzeugung mit Microcontroller" sollten wir uns rein auch auf die Erzeugung von NF mit einer CPU befassen. Bitte fangt jetzt nicht an irgendwelche Internetradioprojekte mit verschiedenen Prozessoren hier zu verlinken. Hier bitte nur die Technik die auch den Ton digital erzeugt. VS1053 fein, irgendwelche DACs oder Pseudo-DACs fein, aber bitte kein Verzeichnis von ESP32-Internetradios, daß könnten wir an anderer Stelle doch besser unterbringen?! Danke!

Bernhard
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren
#15
lieber Bernhard, es ging mir eigentlich nur um den workaround des von dir angesprochenen bug des VS1053, und dann um die Weiterentwicklung deines eigenen codes. Sketche die ich verlinkt habe hast du zuerst selbst angefordert. Ich sah das nicht als offtopic. Aber egal, du hast die Grenze ja jetzt abgesteckt. Und, sorry das ich das so sagen muss, als privater Bastler "erlaube" ich mir das zu was ich Lust habe. Das werden nie Prototypen für industrielle Fertigung sein, sondern möglichst gut nachbaufähige Spielereien.
Auf Themen wie Preiskalkulation, Zukunftsicherheit und auch Tonqualität werde ich dann mal hier nicht mehr weiter eingehen.
Gruß,
Jupp
-----------------------------

was du baust ist immer mit dir verbunden
(Lego)

Einsamkeit ist nur ein Mangel an Technologie
(@beetlebum)
Zitieren
#16
(15.04.2020, 16:47)saarfranzose schrieb: lieber Bernhard, es ging mir eigentlich nur um den workaround des von dir angesprochenen bug des VS1053, und dann um die Weiterentwicklung deines eigenen codes. Sketche die ich verlinkt habe hast du zuerst selbst angefordert. 

Ja und das gehört ja hier auch rein! Und zwar bis wir dein Problem mit dem VS1053 wirklich gelöst haben Jupp! Dieser DSP ist ja sozusagen das Teil was die NF erzeugt, also hier genau richtig.

Dein vorletzter Post aber mit Link zu "Simple ESP32 Internet Radio with OLED Display" gehört wohl eher in eine Rubrik "Ein weiteres Internetradios mit …. Prozessor" und nicht direkt zur technischen Audioerzeugung. Und damit das hier nicht zu einem Verzeichnis weiter Internetprojekte ausartet (nicht notwendigerweise von deiner Seite aus!), habe ich grob nochmal auf den Rahmen dieses Threads hingewiesen, ansonsten können wir uns hier im Forum auch alle Rubriken sparen und einfach ein großes "Sonstiges" aufmachen!

(15.04.2020, 16:47)saarfranzose schrieb: Und, sorry das ich das so sagen muss, als privater Bastler "erlaube" ich mir das zu was ich Lust habe. Das werden nie Prototypen für industrielle Fertigung sein, sondern möglichst gut nachbaufähige Spielereien.

Bitte ja, baue was DU magst und schriebe dann auch darüber. Aber bitte dann im eigenen, neuen Thread und da rede ich Dir dann auch nicht rein! Danke.

(15.04.2020, 16:47)saarfranzose schrieb: Auf Themen wie Preiskalkulation, Zukunftsicherheit und auch Tonqualität werde ich dann mal hier nicht mehr weiter eingehen.

Niemand zwingt Dich hier einen ESP32 oder Pi mit Pseudo-DAC in ein 3D-Druck-Gehäuse oder dein Würstchendosenradio einzubauen! Du kannst gern auch ein ESP32 oder Pi mit richtigen High-End DAC und Röhrenendstufe bauen.

Gruß
 Bernhard
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren
#17
Hallo Yupp, hallo Bernhardt

die Guru Meldung ist ja der Absturz des Prozessors und die Meldung der Wlan-Firmware die immer mit ūbertragen wird. Bernhardt erinnerst du dich woran ea lag? Du hast es doch auf meinem Prozessorboard herausgefunden! Wenn der Esp Prozessor zu schnell getaktet betrieben wird als es das Design des Prozessorboard erlaubt kommt es zu dem Absturz. In der Arduino IDE also den Takt von 240 auf 160 oder von 160 auf 80 MHz drosseln hat immer funktioniert. Aber nur wenn im Quellcode keine Anweisung steht die den CPU Takt wieder hochschraubt. Diese Anweisung mūsste dann auskommentiert werden. Ich glaube auch der niedrige CPU Takt hat dann den Audiocodec zuverlässig funktionieren lassen.

Otto.
Zitieren
#18
ein guter Hinweis! danke Otto! ohne das ich etwas eingestellt hätte wird wahrscheinlich auf 240MHz kompiliert

Chip is ESP32D0WDQ6 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
MAC: 3c:71:bf:fd:17:cc
Gruß,
Jupp
-----------------------------

was du baust ist immer mit dir verbunden
(Lego)

Einsamkeit ist nur ein Mangel an Technologie
(@beetlebum)
Zitieren
#19
Hallo Ihr beiden!

Ihr habt ja Recht! Damals sind ein paar ESP32 aber auch! ESP8266 bei der jeweilig höchsten Taktrate regelmäßig und zuverlässig abgestürzt. Ich erinnere mich dunkel. Beim ESP32 hat es ausgereicht auf 160 MHz zurück zu gehen, der ESP8266 musste auf 80MHz gedrosselt werden.
Ich weiß nicht mehr was genau die Ursache auf den Boards war. Ich glaube es war der höhere Stromverbrauch den einige Regler nicht immer gewachsen waren und der Prozessor stieg aus. Die Prozessoren können ja kurzfristig sehr hohe Spitzenströme abfordern. Der Pi schmiert ja auch ab wenn er an einem zu schwachen Netzteil hängt bzw. bootet gar nicht. Beim ESP xxx ist der Regler aber fix auf dem Board, so einfach Netzteil tauschen bringt meist nicht viel.

@Jupp: Weißt Du wo in der Arduino IDE die Taktfrequenz umgeschaltet wird? Das sollte im Werkzeug-Menü gewesen sein, bei Board oder CPU. Allerdings und das stimmt, gibt es auch einen Softwareweg den Takt wieder hochzufahren. Da muss ich aber erstmal noch nachschlagen wie der Befehl lautete. Ich habe halt nach dem iRadio nichts mehr mit dem VS1053 und ESP gemacht, Johanna hat sich noch drum gekümmert und das ist ja dann alles irgendwo in den Ausbau des Edzelf-Codes gegangen, ich habe alle Kraft ins iRadio gesteckt.

Die Expressif-Controller hatten übrigens auch einen Bug in einer Schnittstelle! Ich weiß aber nicht mehr ob das I2C oder SPI und was genau das Problem war. Expressif hat das später über ein Update des SDKs in den Griff bekommen, aber das offizielle SDK (https://www.espressif.com/en/products/so...k/overview) ist ja was anderes als der Arduino-Fork, der hoffentlich auch schon nachgezogen hat? Ist ja doch ein paar Jahre her sicher sind schon einige neuere Versionen der Libs im Umlauf. Aber auch das kann Probleme mit dem VS1053 erklären, wobei ich ehr zur Taktfrequenz/Stromverbrauch tendiere.

So oder so, testen kann ich hier keinen Code auf den Prozessoren. Diese oder gar einen VVS1053 hier aufzutreiben, dürfte unter der aktuellen Situation nicht zu machen sein. Wann ich wieder Zugang zu Expressif-Controller habe, zur Zeit unbekannt. Tut mir leid.

Bernhard
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren


Möglicherweise verwandte Themen…
Thema Verfasser Antworten Ansichten Letzter Beitrag
  Microcontroller, kein Problem für Elektronikpraktiker! hardware.bas 15 6.024 08.02.2020, 22:13
Letzter Beitrag: hardware.bas
  Leistungsvergleich/Benchmark Microcontroller Bernhard45 0 1.210 10.08.2017, 14:41
Letzter Beitrag: Bernhard45
  Multitasking mit Microcontroller Bernhard45 0 1.573 20.06.2017, 11:16
Letzter Beitrag: Bernhard45
  Grafische Programmierung von Microcontroller Bernhard45 2 1.541 16.06.2017, 21:54
Letzter Beitrag: Radiobastler

Gehe zu: