Themabewertung:
  • 1 Bewertung(en) - 5 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
ESP32 Audio Kit Grundlagen
#1
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)
Zitieren
#2
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.
Zitieren
#3
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.
Zitieren
#4
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)
Zitieren
#5
Jupp, genau so machen wir das!
Grüße aus Wassenberg,
Norbert.
Zitieren
#6
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
Zitieren
#7
(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")
Zitieren
#8
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:


.jpg   beth.JPG (Größe: 58,4 KB / Downloads: 1.002)

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)
Zitieren
#9
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.
Zitieren
#10
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_CSTP_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=0VOLUME_DOWN=1STATION_UP=2STATION_DOWN=3};
enum 
staus {RELEASED=0PRESSED=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=4o=r*3;
    if(b.s==RELEASEDcolor=TFT_GOLD;
    if(b.s==PRESSED)  color=TFT_DEEPSKYBLUE;
    tft.drawRoundRect(b.xb.yb.wb.hrcolor);
    switch(b.a){
        case VOLUME_UP:
            tft.fillTriangle(b.x+b.w/2b.y+ob.x+ob.y+b.h-ob.x+b.w-ob.y+b.h-ocolor); break;
        case VOLUME_DOWN:
            tft.fillTriangle(b.x+ob.y+ob.x+b.w/2b.y+b.h-ob.x+b.w-ob.y+ocolor); break;
        case STATION_UP:
            tft.fillTriangle(b.x+ob.y+ob.x+ob.y+b.h-ob.x+b.w-ob.y+b.h/2color); break;
        case STATION_DOWN:
            tft.fillTriangle(b.x+b.w-ob.y+ob.x+ob.y+b.h/2b.x+b.w-ob.y+b.h-ocolor); break;
    }
}
void write_stationNr(uint8_t nr){
    tft.fillRect(531875045TFT_BLACK);
    String snr String(nr);
    if(snr.length()<2snr "0"+snr;
    tft.setCursor(65188);
    tft.setFont(Garamond34x42);
    tft.setTextColor(TFT_YELLOW);
    tft.print(snr);
}
void write_volume(uint8_t vol){
    tft.fillRect(2151875345TFT_BLACK);
    String svol String(vol);
    if(svol.length()<2svol "0"+svol;
    tft.setCursor(222188);
    tft.setFont(Garamond34x42);
    tft.setTextColor(TFT_YELLOW);
    tft.print(svol);
}
void write_stationName(String sName){
    tft.fillRect(0031975TFT_BLACK);
    tft.setFont(Times_New_Roman34x27);
    tft.setTextColor(TFT_CORNSILK);
    tft.setCursor(1315);
    tft.print(sName);
}
void write_streamTitle(String sTitle){
    tft.fillRect(075319110TFT_BLACK);
    tft.setFont(Times_New_Roman34x27);
    tft.setTextColor(TFT_LIGHTBLUE);
    tft.setCursor(1375);
    tft.print(sTitle);
}

//**************************************************************************************************
//                                           S E T U P                                             *
//**************************************************************************************************
void setup()
{
    btn[0].x12btn[0].y=186btn[0].w=40btn[0].h=40btn[0].a=STATION_DOWNbtn[0].s=RELEASED;
    btn[1].x=108btn[1].y=186btn[1].w=40btn[1].h=40btn[1].a=STATION_UP;   btn[1].s=RELEASED;
    btn[2].x=175btn[2].y=186btn[2].w=40btn[2].h=40btn[2].a=VOLUME_UP;    btn[2].s=RELEASED;
    btn[3].x=268btn[3].y=186btn[3].w=40btn[3].h=40btn[3].a=VOLUME_DOWN;  btn[3].s=RELEASED;
    max_stationssizeof(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_CSTFT_DCSPI_MOSISPI_MISOSPI_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_DATAIIC_CLK))
  {
    Serial.printf("Failed!\n");
    delay(1000);
  }
  Serial.printf("OK\n");

  DAC_ES.volume(ES8388::ES_MAINvolume);
  DAC_ES.volume(ES8388::ES_OUT1volume);
  DAC_ES.volume(ES8388::ES_OUT2volume);
  DAC_ES.mute(ES8388::ES_OUT1false);
  DAC_ES.mute(ES8388::ES_OUT2false);
  DAC_ES.mute(ES8388::ES_MAINfalse);
  
      
// Enable amplifier
  pinMode(GPIO_PA_ENOUTPUT);
  digitalWrite(GPIO_PA_ENHIGH);

    // set I2S_MasterClock
  audio.i2s_mclk_pin_select(I2S_MCLK);

  audio.setPinout(I2S_BCLKI2S_LRCKI2S_DOUT);
  audio.setVolume(cur_volume); // 0...21
  audio.connecttohost(stations[cur_station].c_str());

  for(uint8_t i=0i<(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 xuint16_t y){
    for(uint8_t i=0i<(sizeof(btn)/sizeof(*btn)); i++){
        if(x>btn[i].&& (x<btn[i].x+btn[i].w)){
            if(y>btn[i].&& (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(00319185TFT_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(00319185TFT_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.
Zitieren
#11
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.


.pdf   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)
Zitieren
#12
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
Zitieren
#13
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)
Zitieren
#14
Hallo Jupp (so werde ich hier in Nähe Köln auch genannt, ist halt so Smile )

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
Zitieren
#15
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)
Zitieren
#16
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.
Zitieren
#17
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
Zitieren
#18
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)
Zitieren
#19
(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
Zitieren
#20
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.
Zitieren


Möglicherweise verwandte Themen…
Thema Verfasser Antworten Ansichten Letzter Beitrag
  ESP32-Internetradio yoRadio saarfranzose 90 19.633 Vor 6 Stunden
Letzter Beitrag: saarfranzose
  Internetradio mit dem ESP32-S3 Audio Kit The MicroMaker 4 145 Vor 11 Stunden
Letzter Beitrag: The MicroMaker
  Das einfachste Internetradio mit dem neuen ESP32 Audio pintel 129 33.639 16.04.2024, 00:12
Letzter Beitrag: Charliey
Rainbow YoRadio ESP32 Hilfe bei minimaler Softwareänderung Ralf_00 2 259 08.04.2024, 21:20
Letzter Beitrag: Ralf_00
  yoradio mit ESP32 Juppy 22 812 08.04.2024, 11:24
Letzter Beitrag: saarfranzose

Gehe zu: