Eksperimenter med ESP32 som WIFI radio (netradio)

Bemærk: Espressif har inden for de seneste måneder, ændret deres system fra version 2 til 3 og dermed også API, dvs. hvis man skal kunne compile ældre Sketch, skal  Arduino ESP 32 Boards, i Arduino IDE BOARDS MANAGER ændres til 2.0.xx, og ikke opdateres når den tilbyder det.

Hvorfor ændre teknologi:


Raspberrypi fungere sådan set fint og stabilt, men der er et problem, opstart tiden er meget høj i forhold hvad man er vandt til i dag, i radions barndom hvor teknikken baserede sig på radiorør, var det normalt med opvarmning, før der kom lyd det var vilkårende, men i dag er 30 sekunder lang tid.
Derfor tænkte jeg det ville være en god ide og prøve med en microcontroler i stedet, og da så pico kom med WIFI, så skulle den jo være hjemme, men selvom der et lydbibliotek der kan installeres, gav det en meget ringe lyd.
I min søgning på alternativer fandt jeg så Espressif ESP32 serie af microcontrolere med WIFI, hvor wrover fungere fint til WIFI radio, wroom kan også bruges, men lidt dårligere buffer, nu er der jo ikke noget der er helt uden opstart tid (boot), og ESP32 bruger en form for simpelt operativsystem, så opstart som WIFI radio tager ca. 3 sekunder, altså en klar forbedring, desværre gør det så min hidtil anvendte datalink styring noget ustabil, jeg har ændret til interrupt styring og forenklet læsning af seriel signal, men det kan svigte på den måde at man forsøger program skift, men den bliver på samme program, når man så prøver igen så skifter den.
Så det er ikke den helt store succes, men hvis opstart tid er et problem, så er det nogenlunde brugbart, man kan også lade en Raspberrypi køre kontinuerligt, men stanby forbrug er jo ikke populært i disse tider, de gamle radioer har jo også et ret stort standby forbrug, så det er nok en god ide at slukke helt, når det ikke er i brug.

Hardware:

ESP32 kan købes enten som et lille modul eller development board (devboard), modulet er ret vanskeligt at montere pga. den meget lille afstand mellem lodde punkter, og der skal også monteres switche til reset og programmering, 3,3V forsyning samt tilslutning af usb til seriel, det kan lade sig gøre men det er meget nemmere med et devboard, de kan fås forholdsvis billigt i Kina f.eks Ali hvis man gider vente ca. 1 måned, som DAC kan et lydkort til Raspberrypi bruges eller dvs. andre løsninger, der skal forbindes de sædvanlige 5 ledninger: strøm + - og 3 digital signaler, DIN - GPIO22, LCK - GPIO25 og BCK - GPIO26, det nemmeste er at bruge de små ledninger med han - hun stik, link indgangen er meget enkel, jeg bruger GPIO33 den er forbundet med 3,3V gennem en 10k pullup, og link gennem en diode og en modstand 1k, dioden med katode mod link, så den spærre for 5V fra link vigtigt, kan evt. monteres med små ledninger med stik og kronmuffer hvis man vil undgå at lodde.




Software:

Til forskel fra Raspberrypi, der har et SD kort med styresystem og software, bruger ESP32 indbygget flash hukommelse, den nemmeste måde at overføre software til ESP32, er efter min mening Arduino's IDE, der kan tilpasses med en fil, og biblioteket til lydsystemet er nemt at installere.
Softwaren bygger for størstedelen på en WIFI radio afspiller se: ESP8266: How To Make Wi-Fi Radio - Hackster.io
 den afspiller en URL der er skrevet ind direkte, det samme gælder netværksnavn og nøgle, dvs. ESP32 skal om programmeres hvis noget skal ændres, det jeg har tilføjet er et valg mellem 9 URL, ud fra datalink koden se eksempel: boKontESP32.ino.
ESP32 har også bluetooth, så her er et eksempel: boKontESP32Bt.ino så den kan bruges til bluetooth adapter sammen med WIFI radio, betjeningen er lidt anderledes, radioen starter først når man vælger den indgang den er forbundet til, når bluetooth skal bruges: Tryk stop så radioen bliver tavs, derefter kan bluetooth pares med f. eks Telefon, efter brug fjern parring, og radio kan startes, der skal bruges et ekstra bibliotek downloades fra github . 06-08-24 bibliotekerne er opdateret, desvære fungere bluetooth ikke længere. 09-09-24 hvis man bruger ældre biblioteker, og samtidig skifter til
Espressif version 2, se øverst på siden, ser det ud til at fungere.
Grundet den dårlige performance, vil jeg prøve med et andet lyd bibliotek, det er det samme som bruges i MiniWebRadio, der findes en meget enkel version, under eksempler til lyd biblioteket, jeg har fjernet display delen, og tilpasset den til datalink, den bruger ikke SD kort til URL, de skrives direkte i ino filen, til at huske sidst spillet kanal og volume bruges eeprom i ESP32,  volume bruges ikke i denne version, men kan tilpasses i setup (giver ikke mening sammen med radio), selve de kodning af datalink ligger i IR biblioteket, jeg har ændret til datalink, i stedet for fjernbetjening se eksempel her, hvilket gør installationen lidt mere besværlig, i biblioteket ESP32-IR-Remote-Control skal de 2 filer IR.h og IR.cpp skiftes ud, det nemmeste er at slette indholdet i den gamle fil og derefter kopierer det nye ind, se fil indholdet her. Det er også muligt at få bluetooth med, men denne er vanskeligere at installere se eksempel her, som det første skal ESP32 version i boards manager sættes til 2.xx, partition scheme: Huge APP og biblioteker skal også være fra før version 3, audio fungere i 2.0.6 og bluetooth i 1.7.4, IR er vanskeligere, der er ikke nogle gamle, der skal oprettes en mappe med navnet: ESP32-IR-Remote-Control i libraries hvor de 2 filer: IR.cpp og IR.h skal placeres se fil indholdet her, så skulle den compile, skift til bluetooth med stop, og retur til radio med play, hvis du har monitor på vil du se at der sker et reset, det er fordi jeg gemmer hvilken funktion der skal bruges  eeprom, der ellers bruges til at huske volume niveau, hvilket jeg ikke anvender, efter et software reset starter den i den ønskede funktion. Vigtigt husk omsætter 5V til 3,3V på indgangen 33, ESP32 er meget følsom for over spænding.

Arduino IDE kan hentes på deres side Software | Arduino tilpasning til anvendelse med ESP32: Åben File og vælg Preferences, næsten nederst i winduet, click på det grønne mærke til højre for linjen der stater med Additional boards, i det nye vindue click på nederste linje der starter med: Click for a list, i den lange liste vælges ESP32 og adressen kopieres og tilbage til forrige vindue, hvor adressen indsættes , nu skulle den kende ESP32 og du kan vælge et ESP32 board i stedet for Arduino, næste trin er installation af biblioteker, start med at downloade fra github click på code og vælg download zip, i IDE åben Sketch og vælg Include Library derefter Include .ZIP Library, vælg det bibliotek du downloadede, så skulle den være klar.

ESP32 devboard i Raspberrypi form factor:

Montering af ESP32 modul, kan lettes lidt med adapter print mellem 1,27 mm hulafstand og standard 2,54 mm, des være har dem jeg fandt hos Kineserne, en ekstra mellemliggende række huller se billede, printet på tværs hovedformål er at stabilisere de 2 adapter print, det er limet med 2 komponent lim, samtidig giver det mulighed for at montere en SD kort holder underneden til evt. fremtidige projekter.



Der er ikke så meget plads i siderne, men det går lige, i den ene side er der plads til GPIO konnekter, og i den anden reset og flash switche samt RX og TX konnekter til USB til TTL converter, der er ingen grund til at have en fast monteret, den skal kun bruges til download af program. Forbindelser til GPIO konnekter er som følger:

PCM 5102ESP32GPIO CON. PIN
LCKIO 2535
BCKIO 2612
DINIO 2240
VIN3,3 V2 & 17
GNDGND39

Pin 2 er 5 V tilslutningen, men denne version har ikke nogen spændings regulator, og tilsluttes til en billig 3 V strømforsyning, den jeg bruger giver ca. 3,2 V, så det passer fint, det nok til VIN på DAC, men giver ikke nogen støjdæmpning på forsyningen.
Reset og flash switch monteres, så de kan trække henholdsvis EN og IO 0 lav, og med en 10 k pull up, og 100 nF over switch.
USB til TTL har 3 tilslutninger GND til GND, TX til RX  og RX til TX, bemærk skal indstilles til 3,3 V (meget vigtigt), det er normalt et par loddepunkter der skal kortsluttes.

Super WIFI radio med datalink, display og touch:

Denne udgave af en ESP32 netradio er baseret på MiniWebRadio, se: GitHub - schreibfaul1/ESP32-MiniWebRadio det er en meget veludviklet og stabil net radio efter min mening, men også et meget stort program, der er også en del hardware, til datalink styring kan display undværes, der er en web-server så indstillinger og betjening kan udføres i browser, den har også mulighed for fjernbetjening, og det kan bruges til en mere stabil link betjening, uden at ændre hoved programmet, det kan desværre kun bruges til program skift, dvs. stream kan kun stoppes ved at slukke strømmen, det er ikke et begynder projekt, specielt softwaren er vanskelig, så måske skal du prøve om du kan få software opsætningen til at fungere, før du investere i hardware, Bemærk: det kan ikke garanteres at softwaren og denne side er tilgængelig i længere tid, så download det du skal bruge mens tid er.




Versionen med display og touch er konstrueret på et hulprint der er monteret på stikket bag på displayet, ESP32 modulet har jeg monteret ved først at forbinde de 3 GND, så modulet har en afstand på 4-5 mm til printet, derefter er det forholdsvis nemt at forbinde resten med tynd monterings tråd, på adapteren til SD kortet har jeg forbundet de 2 GND og monteret en 10 k pull up på D0 ellers kan den ikke læse SD kortet og stopper under opstart, DAC er standard men vær opmærksom på 3,3 eller 5 V, det samme gælder for display, husk 5 til 3,3 V hvis den forsynes fra 5 V, forbindelser mellem de enkelte dele se GitHub siden, link tilslutning til GPIO35 husk diode og modstand, programmering som de tidligere beskrevne, det fungere med Arduino IDE 2.1.0.

Software opsætning:

På GitHub siden er der en beskrivelse med Visual Studio Code og PlatformIO IDE som han anbefaler, og det fungerer fint men er noget omstændeligt. Jeg downloader den version jeg bruger: 2.40, den fungere til datalink, medens de nyeste er ændret i fjernbetjenings delen, i src mappen i den ud pakkede download ligger main.cpp den og de andre filer kopieres til projekt mappe under Arduino giv den navnet MiniWeRadio, main.cpp omdøbes til MiniWebRadio.ino dobbelt klik på den, så starter den i Arduino IDE, mappen skulle gerne ligge i dokumenter, i Aduino mappen er mappen libraries dertil kopieres indholdet af lib mappen fra det downloadede, i libraries mappen skal ESP32-audioI2S-master og ESP32-IR-Remote-Control også placeres, henholdsvis lyd og fjernbetjening, audio mappen kan hentes på GitHub siden du skal et niveau op, se evt. under repositories, fjernbetjening hentes samme sted, i mappen tftLib skal filerne i src kopieres op i tftLib, ellers kommer der en fejlmelding, så mangler der Arduino_json og SoapESP32 den sidste skal være version 1.1.5 den nye fungerer ikke her, de to filer kan installeres library manager,
program filen til fjernbetjenings delen ligger i library mappen til projektet, ESP32-IR-Remote-Control/src/IR.cpp, denne skal ændres til datalink, se eksempel her (opdatering 02-04-24 betjening ændret, volume og mute giver ikke rigtigt mening, når det findes på fjernbetjeningen direkte). I filen common.h kan netværks data skrives, den kan redigeres Arduino IDE, der kan display type også redigeres hvis det er aktuelt, så skulle det fungere, men der sker jo hele tiden ændringer og opgraderinger, testet 02-04-24.

SD kort og adapter:

SD kortet skal indeholde de filer der ligger i mappen Content_on_SD_Card i det downloadede, i networks.csv kan SSID og password skrives, som alternativ til common.h der skal ikke være stjerne først på linjen, i stations.csv er navn og streamURL, stationer lægges nemmest browser siden, der også mulighed for at søge stationer, i mappen audiofiles kan f. eks. mp3 filer placeres til afspilning. Adapter er en af dem det ofte følger med microSD kort, der skal på loddes monterings tråd eller f. eks. halve jumper kabler, så korte som muligt og de to gnd skal forbindes, ellers kan den ikke læse kortet og starter ikke, jeg havde ret mange problemer med den første jeg byggede på et Breadboard, der var ikke for gode forbindelser og det samme med jumper kablerne, samtidig kunne pull up modstande ikke undværes, når der bruges jumper kabler, det brugte jeg nogle timer på.


Betjening med Beolink 1000 via datalink:

Enkelt pile: Program skift, dobbelt pile: højre: OK og skift til ur, venstre: Sleep timer, off: Slukker ikke stream, dvs. den slukker først når strømmen afbrydes (data forbrug), numeriske taster: program skift, mapping kan ændres i tabellen (case) i IR.cpp, håber det fungerer, jeg har kun adgang til en Ouverture, dvs. kun phono indgang, og ingen numerisk.



Version uden display med wrover dev. board:

DAC modul eller lydkort forbindes med jumper kabler, og SD adapter med halve på loddede se billede, datalink tilslutning til GPIO35 husk diode og modstand, programmering som de tidligere beskrevne, hvis det fungere skulle du gerne kunne se: MiniWebRadio et sted i monitor udskriften på Arduino IDE, 115200 baud, den skriver også en server port i ulæseligt format, så det er nemmest at finde med ip scanner, indsæt adressen i browser så er der en side med betjening.  



Konklusion:

Hvis hovedformålet er at opnå hurtig opstart, så er det i hvert fald en forbedring, selvom tiden stiger lidt i den sidste version ca. 10 sek. Men prisen er høj, ikke så meget den direkte pris for hardwaren, hardware er jo utroligt billigt efterhånden, men kompleksiteten i program og hardvare konstruktion er meget stor i forhold til de tidligere, strømforbruget er lidt lavere ca. 1,3 W med display, målt på 5 V indgang, men det er en rigtig lækker WIFI radio.

Bemærk: Det kan ikke garanteres at softwaren og denne side er tilgængelig i længere tid, så download det du evt. skal bruge mens tid er.
---------------------------------------------------------------------------------------------------------------------------------------
Kurt Nielsen 15-09-2024

Bemærk: Raspberrypi er et varemærke tilhørende Raspberrypi Foundation.
Bemærk: B&O og datalink er varemærker tilhørende Bang & Olufsen A/S. Denne side har ingen forbindelse med Bang & Olufsen.
ESP32 er et varemærke tilhørende Espressif
Kilder: Link i ovenstående tekst.