Beiträge: 7.078
Themen: 606
Registriert seit: Sep 2013
25.11.2021, 22:23
(Dieser Beitrag wurde zuletzt bearbeitet: 01.12.2023, 23:33 von saarfranzose.)
Bernhard hatte das ESP32 Audio Kit hier vorgestellt:
ESP32 Boards für Internetradio und Audioanwendungen
und ich hatte bemerkt dass ich auch welche bestellt habe und mich damit beschäftigen wolle.
Dass ich heute erste Erfolge damit vermelden kann verdanke ich vor allem einer Diskussion zwischen verschiedenen Programmierern (u.a. Wolle/Schreibfaul) und einem Entwickler/Distributor (?) aus ShenZhen.
hier nachzulesen:
Ai-Thinker-Open / ESP32-A1S-AudioKit
dabei klärten sich all meine Probleme für eine erste Tonausgabe. Das erste Problem ist dass der verwendete DAC, der nicht einsehbar unter der ESP32-Haube steckt, sich bei neueren boards bei gleicher Rev.Nr. 2.2 von einem AC101 auf einen ES8388 geändert hat und daher eine andere library benötigt. Dann gibt es bei den boards unterschiedliche pinouts. Und letztendlich gibt es auch noch einen Aktivierungs-Pin um die NF aus dem "deep sleep" zu holen.
hier beschreibe ich mal speziell meine boards, andere build-Nummern können abweichen!
meine boards tragen die Bezeichnung "ESP32 Audio Kit V2.2 / 3318" Wobei die 3318 leider nicht massgeblich für eine eindeutige Indentifizierung ist.
Hersteller des board ist AI Thinker. Die genaue Bezeichnung des ESP-Modules lautet "ESP32-A1S", wobei der Zusatz A1S nur aussagt dass ein per I2S angesteuerter DAC eingebaut ist, aber nicht welcher chip dafür verwendet wurde. In meinem Fall ein ES8388. Der ESP ist eine WROVER Ausführung, was bedeutet dass er mit 4 MB SPI RAM und 8 MB PSRAM ausgestattet ist. Das ist wichtig bei der Baustein-Definition in der Entwicklungsumgebung und bringt den Vorteil eines Puffers bei streaming-Anwendungen. Der chip ist weiterhin mit bluetooth und 2,4GHz-WLAN ausgestattet.
Hier das Pinout:
Code: #define SD_CS 21
// GPIOs for SPI
#define SPI_MOSI 13
#define SPI_MISO 12
#define SPI_SCK 14
// I2S GPIOs
#define I2S_SDOUT 26
#define I2S_BCLK 5
#define I2S_LRCK 25
#define I2S_MCLK 0
// I2C GPIOs
#define IIC_CLK 23
#define IIC_DATA 18
// Amplifier enable
#define GPIO_PA_EN 21
ausser der boot- und reset-Taste gibt es noch 6 weitere programmierbare Microtasten. Dabei ist es wichtig zu wissen dass diese mit Kondensatoren zur Entprellung versehen sind, was zu berücksichtigen ist wenn man die dazugehörigen gpio's zweckentfremden will.
Das board beinhaltet weiterhin 2 Mikrofone, einen line-out, einen line-in, 2 Stück Class D Audio Amplifier vom Typ NS4150, einen SD-card reader und eine Ladeschaltung für eine 3,7 Lithium Zelle. Ein 5fach Dip-Schalter ist zwar per Platinenaufdruck näher spezifiziert. Ladebuchse und UART-Buchse (beides Micro-USB) laden ein zum Verwechseln!
Die boards sind bei ebay unter dem Suchbegriff "Audio Kit ESP32 Audio Entwicklungs Platine" für unter 20 Euro/Stk. zu bekommen inkl. kostenlosem Versand aus China.
Software:
erste Versuche, um das board kennenzulernen, habe ich mit einem Sketch von Schreibfaul unter der Arduino IDE und deren seriellem Monitor erfolgreich durchgeführt. Schreibfaul gibt im Quellcode auch die links für die benötigten libraries an. Bzw. mein erster erfolgreicher Sketch ist ein example einer library. Hier zu finden:
schreibfaul1 / es8388
es wird einfach nur ein webradio-stream abgespielt. Jetzt wo ich die hardware kenne will ich demnächst weitermachen mit dem Audio Development Framework (ESP-ADF) und der toolchain.
Gruß,
Jupp
-----------------------------
was du baust ist immer mit dir verbunden
(Lego)
Einsamkeit ist nur ein Mangel an Technologie
(@beetlebum)
Beiträge: 1.607
Themen: 72
Registriert seit: Sep 2013
Hallo Jupp,
schön zu lesen, dass Du Deinen Boards erste Töne entlocken kannst!
Informationen zum ESP32-A1S gibt es reichlich - leider nicht zentral.
Außerdem wird selten die verwendete Board Version angeführt, was die Sache nicht vereinfacht.
Interessant finde ich den folgenden Thread im Forum von mikrocontroller.net.
Dort werden erste Schritte mit dem Board aufgeführt. Außerdem enthält er links auf verschiedene
Projekte, u.a. auch auf die WebSites von schreibfaul1, die Du ja schon aufgeführt hattest.
Der Codec für den ES8388 scheint ziemlich neu zu sein. Auf der espressif Site habe ich bisher
nichts passendes gefunden.
Ich habe mich am folgenden Code orientiert und anstelle eines Touch-Displays die Tasten
key3 bis key6 zur Lautstärken- bzw. Senderwahl benutzt.
Nach meinen bisherigen Informationen sind Lötarbeiten zum Anschluß eines TFT- LC-Displays nötig,
da nicht alle zum Betrieb benötigten Signale auf Header-Pins gelegt sind.
Grüße aus Wassenberg,
Norbert.
Beiträge: 1.607
Themen: 72
Registriert seit: Sep 2013
26.11.2021, 13:01
(Dieser Beitrag wurde zuletzt bearbeitet: 26.11.2021, 14:38 von norbert_w.
Bearbeitungsgrund: Fehlerkorrektur Pinbelegung
)
Hallo Jupp,
anbei füge ich einen Schaltplanauszug des Boards an.
Die Pinbelegung, speziell das enable Signal der Endverstärker, liegt auf GPIO 19 nicht GPIO 21.
Des weiteren liegen key4 / key5 auf GPIO 18 bzw. 23, die auch für den I2C-Bus verwendet werden....
Damit werde ich mich heute Abend beschäftigen.
Da gibt es noch einiges an Baustellen aufzuräumen.
Grüße aus Wassenberg,
Norbert.
Beiträge: 7.078
Themen: 606
Registriert seit: Sep 2013
Hallo Norbert,
mit der Pheripherie habe ich mich noch nicht beschäftigt. Aber die schwierigste Hürde ist genommen. Jetzt kann ich mich in Ruhe um software, Anzeige, Bedienung kümmern. Vielleicht können wir uns hinter den Kulissen noch etwas austauschen, bis wieder etwas vorzeigbares geschaffen ist.
Gruß,
Jupp
-----------------------------
was du baust ist immer mit dir verbunden
(Lego)
Einsamkeit ist nur ein Mangel an Technologie
(@beetlebum)
Beiträge: 1.607
Themen: 72
Registriert seit: Sep 2013
Jupp, genau so machen wir das!
Grüße aus Wassenberg,
Norbert.
Beiträge: 6.330
Themen: 328
Registriert seit: Oct 2014
26.11.2021, 20:06
(Dieser Beitrag wurde zuletzt bearbeitet: 26.11.2021, 20:07 von navi.)
Hallo, Norbert und Jupp,
Ich weiß nicht ob meine Vermutung in richtige Richtung läuft, aber es scheint, dass der/die Hersteller sich richtig Mühe gemacht haben,
einen ziemlich komplexen und vielseitigen Baustein zu entwickeln. Wobei der veränderte DAC, unterschiedlichen Pinouts und nicht zuletzt die umfangreiche Peripherie deuten an viele Versuche mit Ergebnis ein Flop-Produkt,. Wahrscheinlich war es zunächst gedacht die Hersteller der Internetradio und Audiogeräte anzusprechen und weil diese Idee nicht aufgegangen ist, werden diese als Module angeboten. Mich wundert der fehlende Display Anschluss für die Visualisierung. Vielleicht irre ich mich komplett, bin mir nicht sicher, ist nur eine Idee von mir.
Sicherlich werde ich eure Arbeit gerne verfolgen.
Gruß,
Ivan
Beiträge: 3.725
Themen: 235
Registriert seit: Dec 2015
26.11.2021, 20:59
(Dieser Beitrag wurde zuletzt bearbeitet: 26.11.2021, 23:37 von Bernhard45.)
(26.11.2021, 20:06)navi schrieb: dass der/die Hersteller sich richtig Mühe gemacht haben,
einen ziemlich komplexen und vielseitigen Baustein zu entwickeln.
Wahrscheinlich war es zunächst gedacht die Hersteller der Internetradio und Audiogeräte anzusprechen und weil diese Idee nicht aufgegangen ist, werden diese als Module angeboten.
Na so ein richtig komplexer "Baustein" ist das nicht. Das ist halt ein typischer uC mit WiFi an dem für Audiozwecke ein paar unterschiedliche Codecs + Class D Verstärker adaptiert wurden. Das ist ein typisches Bastelboard der Maker- und IoT Szene (offenes Design, die PCB kann man sich selbst herstellen (lassen), das Design ist im Netz) . Vergleichbares gibt es auch für andere Anwendungsbereiche als Audio. Als Grundlage gar für industrielle Internetradios waren diese Bord nicht gedacht. Was die Maker-Szene mit diesen Boards eher im Sinn hat, sind diese Dienste die auch von SDKs unterstützt werden: Voice recognition and integration with online services such as Alexa, DuerOS, ... + KI Integration in Audioanwendung. Da spielt die Musik, nicht bei "popeligem" Internetradio mit denen wir uns beschäftigen. Das ist fast schon eine "Abfallanwendung".
Klar das bei solchen offenen Projekten die Chinesen mit verschiedenen fertigen Boards den Markt überschwemmen. Das findet man auch in der Arduinowelt wieder.
Alles was irgendwie auf Arduino (ATmega) war wird nochmal auf ESP32 aufgewärmt und selbiges nochmal für STM32.
(26.11.2021, 20:06)navi schrieb: Wobei der veränderte DAC, unterschiedlichen Pinouts und nicht zuletzt die umfangreiche Peripherie deuten an viele Versuche mit Ergebnis ein Flop-Produkt,.
Man nimmt was man an ICs bekommen kann in der Chip-Krise oder wenn etwas abgekündigt oder kaum lieferbar ist, dann halt das nächste IC. Ist auch kein Problem, denn in den SDKs kann man ja schnell solche Sachen hinzufügen und umstellen und mehrere DACs unterstützen. Ist auch alles als Open Source angelegt und einsehbar, könntest Du jederzeit forken und ein eigenes Board + Codec dazupacken. Muss nur ein Chinese anspringen und dein Board produzieren und auf Ali, ebay und co. vertreiben.
(26.11.2021, 20:06)navi schrieb: Mich wundert der fehlende Display Anschluss für die Visualisierung.
RX/TX, mehr brauchst Du doch nicht um einen Frontprozessor, also Display und Steuerung anzuschließen.
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")
Beiträge: 7.078
Themen: 606
Registriert seit: Sep 2013
ich hab festgestellt dass meine obige pinout-Tabelle nur für den I2S-Bereich passt. Mehr hab ich ja auch für die einfache Ausgabe eines webstreams nicht gebraucht.
Nun wollte ich das Abspielen von SD-Karte testen. Ich stellte dann fest dass die pin's für MISO, MOSI, CD_CS und PA_EN nicht stimmten.
Mit dieser Kombination funktioniert sowohl Radio als auch SD-card. I2C hab ich mal noch weggelassen weil noch nicht gegengeprüft:
Code: #define SD_CS 13
// GPIOs for SPI
#define SPI_MOSI 15
#define SPI_MISO 2
#define SPI_SCK 14
// I2S GPIOs
#define I2S_SDOUT 26
#define I2S_BCLK 5
#define I2S_LRCK 25
#define I2S_MCLK 0
// Amplifier enable
#define GPIO_PA_EN 21
SD-Karte:
beth.JPG (Größe: 58,4 KB / Downloads: 1.006)
was jetzt auch funktioniert ist das Vorlesen eines Textes mit der connecttospeech-Funktion:
Gruß,
Jupp
-----------------------------
was du baust ist immer mit dir verbunden
(Lego)
Einsamkeit ist nur ein Mangel an Technologie
(@beetlebum)
Beiträge: 1.607
Themen: 72
Registriert seit: Sep 2013
Hallo Jupp und Mitleser,
nach viel Lesen, ausgiebigem Programmieren / Testen und letztendlich auch Löten, ist es mir gelungen ein TFT_Display zum Mitspielen zu bewegen.
Als Vorlage dienen Programme und Bibliotheken von Wolles GitHub - Seiten, speziell sein Simple Webradio und sein ES8388 Beispielprojekt.
Danke für die sehr gute Arbeit!
Aufgrund der o. a. Dokumentation habe ich in einem ersten Schritt ein Webradio "nachgebaut", bei welchem mit den 4 Tasten KEY3 bis KEY6 eine
Senderwahl bzw. Verstellung der Lautstärke möglich ist.
Es stellte sich ausserdem heraus, dass es Unterschiede bei gleicher Platinen V2.2 und Revisionsnummer 3378 für die GPIO Belegung des I2C Bus gibt.
Jupps Version benutzt GPIO 18 und 23 während GPIO 32 und 33 bei meiner Version zum Einsatz kommen.
Es ist also Vorsicht beim Nachbau (besser Messen / Testen) angesagt.
Im zweiten Schritt ging es an den Anschluß eines TFT-Displays. Hier habe ich mich ebenfalls an Wolles Vorgehensweise orientiert, da sie plausibel ist.
Im Unterschied zu dessen Projekt kommt hier ein Display mit ILI9341 Controller zum Einsatz.
Anbei ein paar Bilder:
Den Code muss ich noch ein wenig aufräumen. Ich stelle ihn heute Abend ein.
Grüße aus Wassenberg,
Norbert.
Beiträge: 1.607
Themen: 72
Registriert seit: Sep 2013
Hallo Jupp und Mitleser,
wie heute Mittag beschrieben, hier ist der Code des Mini-Mini-Radio-Programms.
PHP-Code: //////////////////////////////////////////////////////////////////// // // // ESP32-A1S Internet Radio Project V 0.1 // // mit Codebeispielen - Ideen von: // // https://github.com/schreibfaul1 und weiteren // // Personen, die ich hier nicht alle aufführen kann. // // Besonderer Dank gilt Jupp (saarfranzose) für seine // // Ideen, Geduld und ausgiebigen Software Tests. // // an eigene Ideen und PlatformIO angepaßt // // Arduino Version Codeänderung für TFT-Display mit ILI9341 // // 11/12.21 norbert_w // // // ////////////////////////////////////////////////////////////////////
/* Variable GPIO Signal im Schaltplan Aufdruck Platine #define SPI_CS 13 // SD_DATA3 #define SPI_MOSI 15 // SD_CMD - MTDO JTAG #define SPI_MISO 2 // SD_DATA0 auf neue Leiste #define SPI_SCK 14 // SD_CLK - MTMS JTAG #define SD_DETECT 34 12 // SD_DATA2 4 // SD_DATA1 auf neue Leiste? I2S GPIOs Pinnamen des AC101 / ES8388 #define I2S_DSIN 35 #define I2S_BCLK 27 #define I2S_LRCK 25 #define I2S_MCLK 0 #define I2S_DOUT 26
I2C GPIOs #define IIC_CLK 32 #define IIC_DATA 33
Taster #define KEY1 36 #define KEY2 13 #define KEY3 19 #define KEY4 23 #define KEY5 18 #define KEY6 5
Verstärker enable #define GPIO_PA_EN 21
LEDs #define LED_D4 22 #define LED_D5 19
Schaltkontakt Kopfhöhrerbuchse #define earphone 39
Belegung JTAG (einreihige) Stiftleiste 1 2 3 4 MTDO MTCK MTDI MTMS IO15 IO13 IO12 IO14 SPI_MOSI TFT_CS TFT_DC SPI_SCK
DIP-Schalter Kontakt +--- 1 - OFF KEY2 GPIO 13 ------+--- 2 - OFF DATA3 +---|--- 3 - OFF CMD | +--- 4 - ON MTCK GPIO 15 --+------- 5 - ON MTDO
Belegung doppelreihige Stiftleiste X2 GND IO 0 RST TX0 RX0 3V3 3V3 1 3 5 7 9 11 13 2 4 6 8 10 12 14 IO21 IO22 IO19 IO23 IO18 IO 5 GND
Verdrahtung ESP32-A1S <----> 2.8 TFT-Display 240x320 ILI9341 SD_DATA0 7 SPI_MISO 2 --- J2. 9 SDO(MISO) --- J2.13 T_DO JTAG MTDO 1 SPI_MOSI 15 --- J2. 6 SDI(MOSI) --- J2.12 T_DIN JTAG MTCK 2 TFT_CS 13 --- J2. 3 CS JTAG MTDI 3 TFT_DC 12 --- J2. 5 DC JTAG MTMS 4 SPI_SCK 14 --- J2. 7 SCK --- J2.10 T_CLK X2. 2 TFT_BL --- J2. 8 LED X2. 5 RST --- J2. 4 RESET X2. 8 TP_IRQ --- J2.14 TP_IRQ X2.10 TP_CS --- J2.11 TP_CS X2.13 3V3 --- J2. 1 VCC X2.14 GND --- J2. 2 GND
*/
#include "Arduino.h" #include <Preferences.h> #include "SPI.h" #include "WiFi.h" #include "tft.h" //see my repository at github "https://https://github.com/schreibfaul1/ESP32-TFT-Library-ILI9341-HX8347D" #include "Audio.h" //https://github.com/schreibfaul1/ESP32-audioI2S #include "ES8388.h" // https://https://github.com/schreibfaul1/es8388 // Board-Belegung V2.2 // #define SD_CS 13 // 21 // SD nicht getestet
// GPIOs for SPI #define SPI_MOSI 15 #define SPI_MISO 2 #define SPI_SCK 14 // I2S GPIOs, the names refer on ES8388, AS1 Audio Kit V2.2 3378 #define I2S_DSIN 35 #define I2S_BCLK 27 #define I2S_LRCK 25 #define I2S_MCLK 0 #define I2S_DOUT 26 // TFT-Display & Touch Panel #define TFT_CS 13 #define TFT_DC 12 #define TP_CS 18 #define TP_IRQ 23
// I2C GPIOs #define IIC_CLK 32 #define IIC_DATA 33
#define LED_4 22 // Kontroll LED #define LED_D5 19
// amplifier enable #define GPIO_PA_EN 21 // TFT_BL
Preferences pref; TFT tft; TP tp(TP_CS, TP_IRQ); Audio audio;
String ssid = "ssid"; String password = "password";
String stations[] ={ "0n-80s.radionetz.de:8000/0n-70s.mp3", "mediaserv30.live-streams.nl:8000/stream", "www.surfmusic.de/m3u/100-5-das-hitradio,4529.m3u", "realfm.live24.gr/realfm", "stream.1a-webradio.de/deutsch/mp3-128/vtuner-1a", "mp3.ffh.de/radioffh/hqlivestream.aac", "www.antenne.de/webradio/antenne.m3u", "listen.rusongs.ru/ru-mp3-128", "edge.audio.3qsdn.com/senderkw-mp3", "macslons-irish-pub-radio.com/media.asx", "wdr-1live-live.icecast.wdr.de/wdr/1live/live/mp3/128/stream.mp3", "wdr-wdr2-aachenundregion.icecast.wdr.de/wdr/wdr2/aachenundregion/mp3/128/stream.mp3", "wdr-wdr4-live.icecast.wdr.de/wdr/wdr4/live/mp3/128/stream.mp3", "wdr-wdr5-live.icecast.wdr.de/wdr/wdr5/live/mp3/128/stream.mp3", "liveradio.swr.de/sw282p3/swr3/play.mp3", "stream.dashitradio.de/dashitradio/mp3-128/stream.mp3", "ndr.de/resources/metadaten/audio/m3u/ndr2.m3u", "ndr.de/resources/metadaten/audio/m3u/n-joy.m3u", };
//some global variables uint8_t max_volume = 21; uint8_t max_stations = 0; //will be set later uint8_t cur_station = 0; //current station(nr), will be set later uint8_t cur_volume = 0; //will be set from stored preferences int8_t cur_btn =-1; //current button (, -1 means idle);
static ES8388 DAC_ES; // ES8388 (new board)
int volume = 70; // 0...100
enum action{VOLUME_UP=0, VOLUME_DOWN=1, STATION_UP=2, STATION_DOWN=3}; enum staus {RELEASED=0, PRESSED=1};
struct _btns{ uint16_t x; //PosX uint16_t y; //PosY uint16_t w; //Width uint16_t h; //Hight uint8_t a; //Action uint8_t s; //Status }; typedef _btns btns;
btns btn[4];
//************************************************************************************************** // G U I * //************************************************************************************************** void draw_button(btns b){ uint16_t color=TFT_BLACK; uint8_t r=4, o=r*3; if(b.s==RELEASED) color=TFT_GOLD; if(b.s==PRESSED) color=TFT_DEEPSKYBLUE; tft.drawRoundRect(b.x, b.y, b.w, b.h, r, color); switch(b.a){ case VOLUME_UP: tft.fillTriangle(b.x+b.w/2, b.y+o, b.x+o, b.y+b.h-o, b.x+b.w-o, b.y+b.h-o, color); break; case VOLUME_DOWN: tft.fillTriangle(b.x+o, b.y+o, b.x+b.w/2, b.y+b.h-o, b.x+b.w-o, b.y+o, color); break; case STATION_UP: tft.fillTriangle(b.x+o, b.y+o, b.x+o, b.y+b.h-o, b.x+b.w-o, b.y+b.h/2, color); break; case STATION_DOWN: tft.fillTriangle(b.x+b.w-o, b.y+o, b.x+o, b.y+b.h/2, b.x+b.w-o, b.y+b.h-o, color); break; } } void write_stationNr(uint8_t nr){ tft.fillRect(53, 187, 50, 45, TFT_BLACK); String snr = String(nr); if(snr.length()<2) snr = "0"+snr; tft.setCursor(65, 188); tft.setFont(Garamond34x42); tft.setTextColor(TFT_YELLOW); tft.print(snr); } void write_volume(uint8_t vol){ tft.fillRect(215, 187, 53, 45, TFT_BLACK); String svol = String(vol); if(svol.length()<2) svol = "0"+svol; tft.setCursor(222, 188); tft.setFont(Garamond34x42); tft.setTextColor(TFT_YELLOW); tft.print(svol); } void write_stationName(String sName){ tft.fillRect(0, 0, 319, 75, TFT_BLACK); tft.setFont(Times_New_Roman34x27); tft.setTextColor(TFT_CORNSILK); tft.setCursor(13, 15); tft.print(sName); } void write_streamTitle(String sTitle){ tft.fillRect(0, 75, 319, 110, TFT_BLACK); tft.setFont(Times_New_Roman34x27); tft.setTextColor(TFT_LIGHTBLUE); tft.setCursor(13, 75); tft.print(sTitle); }
//************************************************************************************************** // S E T U P * //************************************************************************************************** void setup() { btn[0].x= 12; btn[0].y=186; btn[0].w=40; btn[0].h=40; btn[0].a=STATION_DOWN; btn[0].s=RELEASED; btn[1].x=108; btn[1].y=186; btn[1].w=40; btn[1].h=40; btn[1].a=STATION_UP; btn[1].s=RELEASED; btn[2].x=175; btn[2].y=186; btn[2].w=40; btn[2].h=40; btn[2].a=VOLUME_UP; btn[2].s=RELEASED; btn[3].x=268; btn[3].y=186; btn[3].w=40; btn[3].h=40; btn[3].a=VOLUME_DOWN; btn[3].s=RELEASED; max_stations= sizeof(stations)/sizeof(stations[0]); log_i("max stations %i", max_stations); Serial.begin(115200); pref.begin("WebRadio", false); // instance of preferences for defaults (station, volume ...) if(pref.getShort("volume", 1000) == 1000){ // if that: pref was never been initialized pref.putShort("volume", 10); pref.putShort("station", 0); } else{ // get the stored values cur_station = pref.getShort("station"); cur_volume = pref.getShort("volume"); }
WiFi.mode(WIFI_STA); WiFi.begin(ssid.c_str(), password.c_str()); while (WiFi.status() != WL_CONNECTED){ Serial.print("."); delay(1000); } log_i("Connect to %s", WiFi.SSID().c_str());
tft.begin(TFT_CS, TFT_DC, SPI_MOSI, SPI_MISO, SPI_SCK); tft.setRotation(3); tp.setRotation(1); tft.setFont(Times_New_Roman34x27); tft.fillScreen(TFT_BLACK);
Serial.printf("Connect to DAC codec... "); while (not DAC_ES.begin(IIC_DATA, IIC_CLK)) { Serial.printf("Failed!\n"); delay(1000); } Serial.printf("OK\n");
DAC_ES.volume(ES8388::ES_MAIN, volume); DAC_ES.volume(ES8388::ES_OUT1, volume); DAC_ES.volume(ES8388::ES_OUT2, volume); DAC_ES.mute(ES8388::ES_OUT1, false); DAC_ES.mute(ES8388::ES_OUT2, false); DAC_ES.mute(ES8388::ES_MAIN, false); // Enable amplifier pinMode(GPIO_PA_EN, OUTPUT); digitalWrite(GPIO_PA_EN, HIGH);
// set I2S_MasterClock audio.i2s_mclk_pin_select(I2S_MCLK);
audio.setPinout(I2S_BCLK, I2S_LRCK, I2S_DOUT); audio.setVolume(cur_volume); // 0...21 audio.connecttohost(stations[cur_station].c_str());
for(uint8_t i=0; i<(sizeof(btn)/sizeof(*btn)); i++) draw_button(btn[i]); write_volume(cur_volume); write_stationNr(cur_station); }
//************************************************************************************************** // L O O P * //************************************************************************************************** void loop() { audio.loop(); tp.loop(); } //************************************************************************************************** // E V E N T S * //**************************************************************************************************
// optional void audio_info(const char *info){ Serial.print("audio_info "); Serial.println(info); } void audio_id3data(const char *info){ //id3 metadata Serial.print("id3data ");Serial.println(info); } void audio_eof_mp3(const char *info){ //end of file Serial.print("eof_mp3 ");Serial.println(info); } void audio_showstation(const char *info){ Serial.print("station ");Serial.println(info); } void audio_showstreamtitle(const char *info){ String sinfo=String(info); sinfo.replace("|", "\n"); write_streamTitle(sinfo); } void audio_bitrate(const char *info){ Serial.print("bitrate ");Serial.println(info); } void audio_commercial(const char *info){ //duration in sec Serial.print("commercial ");Serial.println(info); } void audio_icyurl(const char *info){ //homepage Serial.print("icyurl ");Serial.println(info); } void audio_lasthost(const char *info){ //stream URL played Serial.print("lasthost ");Serial.println(info); } void audio_eof_speech(const char *info){ Serial.print("eof_speech ");Serial.println(info); } void tp_pressed(uint16_t x, uint16_t y){ for(uint8_t i=0; i<(sizeof(btn)/sizeof(*btn)); i++){ if(x>btn[i].x && (x<btn[i].x+btn[i].w)){ if(y>btn[i].y && (y<btn[i].y+btn[i].h)){ cur_btn=i; btn[cur_btn].s=PRESSED; draw_button(btn[cur_btn]); } } } } void tp_released(){ if(cur_btn !=-1){ btn[cur_btn].s=RELEASED; draw_button(btn[cur_btn]); switch(btn[cur_btn].a){ case VOLUME_UP: if(cur_volume<max_volume){ cur_volume++; write_volume(cur_volume); audio.setVolume(cur_volume); Serial.print("volume ");Serial.println(cur_volume); pref.putShort("volume", cur_volume);} // store the current volume in nvs break; case VOLUME_DOWN: if(cur_volume>0){ cur_volume-- ; write_volume(cur_volume); audio.setVolume(cur_volume); Serial.print("volume ");Serial.println(cur_volume); pref.putShort("volume", cur_volume);} // store the current volume in nvs break; case STATION_UP: if(cur_station<max_stations-1){ cur_station++; write_stationNr(cur_station); tft.fillRect(0, 0, 319, 185, TFT_BLACK); audio.connecttohost(stations[cur_station].c_str()); Serial.print("station ");Serial.println(cur_station); pref.putShort("station", cur_station);} // store the current station in nvs break; case STATION_DOWN:if(cur_station>0){ cur_station--; write_stationNr(cur_station); tft.fillRect(0, 0, 319, 185, TFT_BLACK); audio.connecttohost(stations[cur_station].c_str()); Serial.print("station ");Serial.println(cur_station); pref.putShort("station", cur_station);} // store the current station in nvs break; } } cur_btn=-1; }
Die verwendeten GPIOs müsst Ihr gegebenenfalls an Eure Boards anpassen.
Die ES8388-, Audio- und TFT-Bibliotheken findet Ihr auf Wolles GitHub-Seiten, die entsprechenden Links
sind im Programm aufgeführt.
Viel Spaß beim Basteln!
Grüße aus Wassenberg,
Norbert.
Beiträge: 7.078
Themen: 606
Registriert seit: Sep 2013
ich fasse mal den aktuellen Stand zusammen.
Aufgrund der unterschiedlichen gpio-Belegungen hat sich eine Tabelle als sehr hilfreich erwiesen. Die erste Spalte zeigt die Belegung meiner beiden Platinen, die 2. Spalte die Belegung der Platinen von Norbert. Die weiteren Spalten zeigen die Belegung von unterschiedlichen fertigen templates von Karadio. Keine davon passt zu unseren Platinen. Also mit Karadio kommen wir nur weiter wenn wir selbst boards definieren können. So weit bin zumindest ich immer noch nicht.
audiokit-karadio.pdf (Größe: 35,75 KB / Downloads: 64)
meine Versuche mit Edzelf, der in der Version V2.0 ja mittlerweile I2S-Unterstützung eingebaut hat, verliefen stumm. Möglich dass unser DAC, der ES8388, von der Helix-Library nicht unterstützt wird.
Zitat Edzelf:
Zitat:..Works with MAX98357A (3 Watt amplifier with DAC), connected three lines (DOUT, BLCK, LRC) to I2S. For stereo are two MAX98357A necessary. AudioI2S works with UDA1334A (Adafruit I2S Stereo Decoder Breakout Board) and PCM5102A. Other HW may work but not tested. Plays also icy-streams and GoogleTTS..
Ich fand aber auch keine Möglichkeit bei Edzelf V2.0 die I2S-gpios zu definieren. Trotzdem an der Stelle noch ein Hinweis wie man das webinterface ins spiffs lädt, wenn man so wie ich immer noch die Arduino IDE benutzt:
Arduino ESP32 filesystem uploader
Was funktioniert bis jetzt überhaupt?
zum Laufen hatte ich bis jetzt nur einen schreibfaul Beispielcode sowie den weiter oben gezeigten code von Norbert. Beide aktuell noch mit fest eincodierter Radiostation und Lautstärke. Die Umlöterei auf ein SPI-Display erspare ich mir. Meine Variante des Audio-Kit hat zumindest noch die I2C-Ports zugänglich, die Variante von Norbert leider nicht.
Noch Hinweise zum upload des code aus der IDE. Als board sollte ein wrover Modul definiert sein, und falls zu wenig Speicherplatz gemeldet wird als partition scheme: Huge App
Danke an Norbert, alleine hätte ich das nicht so erarbeiten können.
Gruß,
Jupp
-----------------------------
was du baust ist immer mit dir verbunden
(Lego)
Einsamkeit ist nur ein Mangel an Technologie
(@beetlebum)
Beiträge: 8
Themen: 0
Registriert seit: Jul 2022
03.08.2022, 14:23
(Dieser Beitrag wurde zuletzt bearbeitet: 03.08.2022, 14:42 von AndroidDev.)
Hallo,
vor einiger Zeit fielen mir zwei Audio-Kit Boards in die Hände und ich fand es war an der Zeit, damit Projekte zu realisieren.
So habe ich norbert_ws Script gefunden und bei einem Board (TypA149) lief der Code Problemlos. Das Display habe ich weggelassen und über ioBroker, mqtt und ioBroker-Vis einen App-Player daraus fertiggestellt. Zudem habe ich noch MP3 hören von SD-Karte hinzugefügt. Hintergrund dazu ist, das Telefon und Türgong
eingeblendet werden, wenn das Telefon klingelt, bezw. jemand an der Türe ist. Das höre ich nun draussen sehr gut.
Hier kann ein Bild dazu betrachtet werden: App
Nun aber mein Problem:
Mit dem zweiten Board ist mir bisher kein Projekt gelungen. Das heißt, mit folgenden Einstellungen höre ich auf einem Kanal leise Musik.
#define I2S_DSIN 35
#define I2S_BCLK 5
#define I2S_LRCK 25
#define I2S_MCLK 0
#define I2S_DOUT 26
// I2C GPIOs
#define IIC_CLK 23
#define IIC_DATA 18
Daher meine Frage: Hat inzwischen jemand das Board mit dem Typ 3378 erfolgreich in Betrieb?
Kann auch möglich sein, dass das Board eine Macke hat.
Gruß
Josef
Beiträge: 7.078
Themen: 606
Registriert seit: Sep 2013
Hallo Josef,
das wäre dann die Belegung die meinem Board (erste Spalte der Tabelle) entspricht. Testest du am Kopfhörerausgang oder über die Endstufen? Wenn die Endstufen nicht enabled sind ist der Ton darüber auch nur ganz leise (aus der Erinnerung). Meine 3378-Boards hatten damals funktioniert, es war nur bei diesem layout kein Display möglich ohne massiv an den Leiterbahnen zu basteln.
Gruß,
Jupp
-----------------------------
was du baust ist immer mit dir verbunden
(Lego)
Einsamkeit ist nur ein Mangel an Technologie
(@beetlebum)
Beiträge: 8
Themen: 0
Registriert seit: Jul 2022
Hallo Jupp (so werde ich hier in Nähe Köln auch genannt, ist halt so )
Das schwache Signal ist jeweils aus der Endstufe, sowie aus dem Kopfhörer zu hören.
Bin da mit meinem Latein am Ende. Habe so ziemlich alle Seiten durch, wo irgendwelche
mögliche Setups erwähnt werden. Denke die Karte hat einen weg.
Für alle, die an der PubSubClient Version, bezw.App interessiert sind, leiste
ich gerne Hilfestellung. Erfahrungen mit ioBroker und JS sind allerdings zwingend notwendig.
Gruß
Josef
Beiträge: 7.078
Themen: 606
Registriert seit: Sep 2013
dann hat es mit dem PA_EN nichts zu tun. Der kann nur die Endstufen stumm schalten, nicht aber den Kopfhörer. Es muss dann ein Problem in der Lautstärkeeinstellung sein. Das ist wohl ein heikles Thema bei I2S-Codecs. Siehe auch die Probleme in der Edzelf V2. Hier im Forum hatten wir uns auch darüber ausgetauscht:
FAQ zum iRadioMini
Mit ioBroker etc. habe ich keine Erfahrungen. Kenne die Begriffe nur von der Hausautomation und das war noch nie mein Thema. Die Brücke zum Internetradio sehe ich grad nicht. Es wäre mal interessant wenn du dein Konzept als eigenen thread vorstellst.
Gruß,
Jupp
-----------------------------
was du baust ist immer mit dir verbunden
(Lego)
Einsamkeit ist nur ein Mangel an Technologie
(@beetlebum)
Beiträge: 1.607
Themen: 72
Registriert seit: Sep 2013
Hallo Josef, Jupp und Mitleser,
Wolfgang entwickelt in den letzten Wochen/Monaten sehr aktiv an der Software und hat so "Einiges" geändert.
Die neueste Version eines Testprogramms findet man hier.
Ich würde als Erstes Wolle's Sketch mit dem Board Typ 3378 ausprobieren.
Halt - noch etwas:
aktuell benutzt Du Pin 23 und 18 für den I2C
#define IIC_CLK 23
#define IIC_DATA 18
während in "meinem" Sketch Pin 32 / 33 verwendet werden
I2C GPIOs
#define IIC_CLK 32
#define IIC_DATA 33
Teste das bitte.
Grüße aus Wassenberg,
Norbert.
Beiträge: 8
Themen: 0
Registriert seit: Jul 2022
Hallo Jupp
Denke an PA_EN kann es nicht liegen, ein Kanal funktioniert ja, wenn auch nur leise.
Also „beerdige“ ich diese Karte.
Ja, ioBroker ist für Hausautomation. Bin als „geborener“ Löter auch erst langsam in die Sache hereingewachsen und mittlerweile macht mir das entwickeln von Software großen Spaß.
Dachte auch, was bringt das schon, aber tatsächlich habe ich heute fast täglich neue Ideen.
Wenn sich dann Sachen als nervig entpuppen, fliegen sie eben wieder hinaus.
IoBroker verwaltet und verknüpft quasi alles was eine IP hat. Und man kann auf Ereignisse reagieren und wiederum andere auslösen.
Bei dem Player fließen alle Daten über MQTT in den Broker und auf der anderen Seite kann ich auch Daten senden. Z.B. muss die Playlist nicht mehr hart codiert werden. Die editierten Stationen kann ich dem Player zum abspielen senden. Über die Visualisierung können kleine Webseiten erstellt werden, wie z.B. mein Player-UI. Die App stellt tatsächlich nur eine WebView dar, wer sie nicht mag, kann den Player auch im Browser aufrufen.
Über den Vorschlag das Projekt vorzustellen denke ich nach, wenn es auch hier eigentlich der falsche Ort ist.
Danke für deine freundliche Hilfe.
Gruß
Josef
Beiträge: 7.078
Themen: 606
Registriert seit: Sep 2013
AndroidDev schrieb:..Über den Vorschlag das Projekt vorzustellen denke ich nach, wenn es auch hier eigentlich der falsche Ort ist..
das ist allein deine Entscheidung. Herzlich eingeladen bist du jedenfalls. Es gibt eine stetig wachsende kleine Gruppe in diesem Forum die sich mit modernen Techniken befasst.
Gruß,
Jupp
-----------------------------
was du baust ist immer mit dir verbunden
(Lego)
Einsamkeit ist nur ein Mangel an Technologie
(@beetlebum)
Beiträge: 8
Themen: 0
Registriert seit: Jul 2022
(04.08.2022, 07:20)norbert_w schrieb: Halt - noch etwas:
aktuell benutzt Du Pin 23 und 18 für den I2C
#define IIC_CLK 23
#define IIC_DATA 18
während in "meinem" Sketch Pin 32 / 33 verwendet werden
I2C GPIOs
#define IIC_CLK 32
#define IIC_DATA 33
Teste das bitte.
Sorry, in der Eile habe ich deinen Post fast übersehen.
Typ 3378 kann nur mit:
#define IIC_CLK 23
#define IIC_DATA 18
initialisiert werden. Das Board wird richtig angesteuert und reagiert damit auf alles...ausser
die Outputs halt. Das scheint abgeraucht zu sein.
Gruß
Josef
P.S. Gutes Board hier mit netten hilfsbereiten Leuten...ist heutzutage Mangelware
Beiträge: 1.607
Themen: 72
Registriert seit: Sep 2013
Hallo Josef,
habe gerade noch einmal nachgeschaut.
Mein Board hat die Bezeichnung ESP32 AudioKit V2.2 3378 und es läuft einwandfrei mit der o. g. Konfiguration!
Viel Erfolg.
Grüße aus Wassenberg,
Norbert.
|