blogy logo
login PRIHLÁS SA
BLOG deadawp
ČLÁNKY
DISKUSIE
3
SLEDUJETE BLOG
Programátor
deadawp



Internetové rádiá - ESP32 + MAX98357 (I2S)
pridal deadawp 9.3. 2025 o 0:11 (naposledy upravené 11.3. 2025 o 21:32)

Mono zosilňovač MAX98357 je veľmi obľúbený u Arduino komunity. Ide o spoľahlivý modul, ktorý je možné ľahko pripojiť k audio rozhraniu I2S (Inter-IC Sound), ktorým disponuje napríklad ESP32-WROOM-32, ESP32-S, či ESP32-S3 a iné. Pre prehrávanie zvukov potrebujeme ešte samozrejme reproduktor. Mám dobrú skúsenosť s 2W i 3W verziou reproduktorov. Okrem prehrávania samostatných zvukových stôp napríklad z SD karty, či súborového systému SPIFFS (LittleFS) je obľúbená forma využitia aj na internetové rádio (webradio).

Vďaka tomu môžete počúvať vaše obľúbené rádio skrz internet, ale rovnako tak prakticky akékoľvek svetové rádio, ktoré je šírené prostredníctvom internetu, t.j., je streamované. Internetové rádiá sú najčastejšie komprimované ako .mp3, .ogg (Vorbis), alebo .aac (LC - Low Complexity, HE - High Efficiency, HEv2 - High Efficiency v2) stream. V našom prípade budeme používať .mp3 stream, ktorý je najrozšírenejší. Na strane mikrokontrólera to znamená potrebu dekódovania streamu v reálnom čase.

Pre ESP32 je najpoužívanejšou knižnicou na tento účel ESP32-audioI2S (hlavičkový súbor Audio.h), ktorá ale vyžaduje dual-core ESP32. Nie je kompatibilná pre S2, či C3 verziu mikrokontroléra. Z hľadiska hardvéru je však nutné, aby mikrokontróler obsahoval prídavnú RAM pamäť (PSRAM), nakoľko dekódovanie streamu je náročné na pamäť, zvlášť keď sa na ESP32 používa ešte aj WiFi, či iné snímače a podaplikácie náročne na pamäť a jej nárazové použitie.

Ak použijete ESP32 bez PSRAM, mikrokontroléru môže v rôznom čase dôjsť pamäť a v dôsledku toho sa reštartuje kvôli chybe, čo v konečnom dôsledku preruší prehrávanie streamu. V závislosti na programe to môže byť krátka prestávka, ak je ihneď po reštarte ESP32 pripojené na WiFi a je preberaný stream, alebo aj dlhšia doba, ak ESP32 neprehráva žiadny stream, kým nie je manuálne zadaný používateľom. Pre taký prípad, ak už chcete prehrávať .mp3 stream, odporúča sa použiť 64 kbps, alebo 32 kbps stream a nesnažiť sa o použitie 128, 256 či dokonca 320 kbps. 

Švajčiarsky vývojár yellobyte navrhol aj vlastný devkit priamo pre použitie s knižnicou ESP32-audioI2S, ktorá má priamo integrovaný modul ESP32-S3 s 2 MB PSRAM a 8 MB Flash, slot na SD kartu a tiež MAX98357 zosilňovač. Nie jeden zosilňovač, ale rovno dva, čo umožňuje získať priestorový zvuk (stereo) s ľavým a pravým kanálom, nakoľko zosilňovač sám o sebe je iba mono. Rovnako tak má devkit aj svorkovnice na pripojenie reproduktorov. Cena devkitu YB-ESP32-S3-AMP sa pohybuje niekde okolo 12-15€. V súčasnosti sú už v revízii 3, teda sú dosť odladené.

Ak máte poruke len bežné ESP32 devkity, prakticky väčšina z nich nemá PSRAM. Určite ale PSRAM nájdete napríklad u obľúbeného ESP32-CAM modulu s ESP32-S od AI-Thinker, ktorý má PSRAM integrovanú na PCB a to až vo veľkosti 4 MB, ktorú používa štandardne pri kamere OV2460. Takáto PSRAM spoľahlivo zabezpečí optimálny beh audio streamu aj vo vysokých kvalitách. Pri ESP32-CAM je však potrebné poznamenať, že nemá vyvedené hardvérové I2S piny a je nutné ich nastaviť na ľubovoľné GPIO, treba však použiť také, ktoré nie sú strapping / flash piny, ktorými by ste mohli zamedziť bootovaniu ESP32.

Pri ESP32-CAM ale rátajte s tým, že musíte ESP32 nahrávať skrz externý USB-UART prevodník, napríklad FT232RL a že GPIO0 musíte pred reštartom mikrokontroléra pripojiť na PULLDOWN, aby sa ESP32-CAM prepla do download módu v ktorom môžete nahrať firmvér. Po nahratí firmvéru je nutné reštartovať mikrokontróler skrz reset (EN) tlačidlo. Nakoľko ESP32-CAM má značný odber a FT232RL ho nemusí pokryť, odporúčam externé napájanie. To má ale za následok, že nebudete mať GND pin pre prevodník.

Z toho dôvodu je nutné dospájkovať si kábel niekde, kde si môžete GND ukradnúť, napr. na slot SD karty. Prípadne si inde vytiahnutú zem musíte rozdvojiť, ak máte v pláne užívať aj USB-UART. Ak už máte aplikáciu ready, nie je to potrebné. S Minimal SPIFFS tabuľkou partícii je možné mať aj OTA update firmvéru pre budúce updaty, napr. formou BasicOTA s virtuálnym sieťovým COM portom. V tomto prípade som ESP32-CAM napájal externým zdrojom ZK-4KX na 5V.

Použil som preto nasledovnú pin konfiguráciu pre zosilňovač MAX98357 a ESP32-CAM, tieto piny sú zdieľané s SD kartou, teda SD kartu nemôžete využívať na čítanie a zápis:

  • #define I2S_DOUT  12
  • #define I2S_BCLK  13
  • #define I2S_LRC   15
  • Gain pin nebol pripojený

Spotreba bežiaceho webrádia s ESP32-CAM bola niekde na úrovni 60 až 150 mA @ 5V, pričom úroveň zvuku bola nastavená na 8, pričom 21 je maximálne. Rovnako tak tieto piny neblokujú bootovací proces mikrokontroléra a dokáže sa spustiť bez potreby odpojenia káblov v tejto fáze.

Ukážkovo prehrávaný stream "Rádio Slovensko" bol čerpányzo zdroja https://icecast.stv.livebox.sk/slovensko_128.mp3, teda bitrate je 128 kbps (FM kvalita) a má komprimovaciu frekvenciu 44,1 kHz. Rovnako tak je možné výstup zosilniť aj Gain pinom. V našom prípade s nepripojeným GAIN pinom je zisk 9 dB (typical, rozsah 8,4 - 9,6 dB), pri priamom (tvrdom) pulldown pinu na GND je to 12 dB, pri použití 100K rezistora na pulldown je to 15 dB zisk.

Pri dekódovaní .mp3 streamu sa stream dynamicky prevádza na PCM moduláciu, ktorá je vhodná pre vstup DAC prevodníka. PCM je možné predstaviť si ako RAW digitálny signál, ktorý bol získaný po dekódovaní .mp3 streamu, najčastejšie má vzorkovaciu frekvenciu 44,1 kHz, čo je považované za štandard "CD kvalitu" so vzorkou každých cca 23 us, niektoré internetové rádiá majú aj podvzorkovanie na polovičnú frekvenciu, čo ale môže znižiť kvalitu prehrávaného obsahu, najmä ak ide o hudbu, pri monotónnom hlase nemusí byť podvzorkovanie až tak počuteľné.

DAC prevodníkom je samotný zosilňovač MAX98357, ktorý vykoná konverziu streamovaného digitálneho signálu na analógový, ktorý z jeho výstupu ide priamo do reproduktora, čím prehráva zvuk. Skrz ESP32 a knižnicu ESP32-audioI2S je možné regulovať aj hlasitosť v rozsahu od 0 po 21. Pri hlasitosti 0 je to samozrejme bez prehrávaného zvuku, akoby "mute". Pre programovú implementáciu som využil príklad z https://circuitdigest.com/microcontroller-projects/esp32-based-internet-radio-using-max98357a-i2s-amplifier-board, ktorý som doplnil o vlastný čítač zo sériového rozhrania, ktorý načítava po zadaní príkazu riadok po ukončovací znak \n. Základný program internetového rádia zaberá 1 4XX XXX bajtov, čo prevyšuje štandardnú 1,2 MB partíciu aplikácie. Musíte preto poupraviť aj schému partícii napr. na Huge App.

Pôvodný príklad obsahoval "hard-coded" URL na HTTP stream internetového rádia. Toto rádio sa štandardne spustí aj napr. po reštarte mikrokontroléra aj za predpokladu, že by medzitým bežalo iné rádio. Vlastný čítač mal 3 podporované príkazy. Išlo o znaky "+ "alebo "-" pre úpravu hlasitosti, pričom v programovej implementácii sa myslelo aj na hraničné hodnoty, teda maximálneho a minimálneho nastavenia zvuku, aby nešiel nad 21 a ani pod 0. Aj 2W reprák hraje dostatočne a určite nebude potrebovať plnú hlasitosť.

Vďaka funkciám triedy String v Arduino Core bolo jednoduché overiť, či zadaný reťazec začína znakmi reťazcom "http", čo bude validné pre HTTP i HTTPS stream. Zároveň overenie neprejde, ak by bolo http niekde v reťazci, ale nezačínal by tým. V takom prípade na sériové rozhranie ESP32 vypíše, že nepodporuje tento príkaz a navedie používateľa na zadanie jedného z podporovaných formátov vstupu.


Z pohľadu programovej implementácie vo vzťahu k zmene aktuálne prehrávaného streamu je nutné aktuálny stream zastaviť. To znamená zavolanie funkcie audio.stopSong() a následne pripojenie k novému hostovi so streamom - audio.connecttohost(input). Nakoľko fukcia connecttohost() má vstup pole znakov (char array) a nie String, je nutné vykonať konverziu Stringu skrz .c_str().

Najväčšiu databázu slovenských rádii som našiel na https://fmstream.org/index.php?c=SVK ("The Radio Stream Directory"). Na rozhraní ma oslovilo najmä to, že si viete ihneď skopírovať link pri navolení konkrétneho streamu, čo bola forma ktorou som aktívne rádio prepínal. Niektoré weby so zoznamom internetových rádii mali len button na prehratie a k linku so streamom ste sa museli komplikovane preklikávať.

Celkovo je tu dostupných 233 slovenských rádii. Mnohé z nich sú samostatné žánre rádii, teda je tam XY podrádii určitých rádii. Je pravda, že sa našlo medzi nimi niekoľko neaktívnych. V zozname rádii je možné nájsť aj internátne (študentské) rádio TLIS (internáty Mladosť, STUBA) https://stream.tlis.sk/tlis.mp3, či Rádio X (internáty Veľký Diel, UNIZA): https://stream.radiox.sk:8443/alternative.mp3, ktoré má aj viacero štýlov, napr. DNB, Oldies, Chillout. V zozname síce nebolo, ale určite by som spomenul aj Rádio 9 na internátoch Jedlíková, ktoré vysiela pre študentov TUKE: https://stream.radio9.sk/high.mp3

A keď sme už pri tejto databáze, za zmienku určite stoja aj zahraničné rádia, napríklad:

Výberom vlastných streamov rádii si môžete zostaviť aplikáciu webrádia na mieru s vašimi obľúbenými stanicami, pričom to môžete doplniť aj o vlastnú metódu prechádzania medzi rádiami. Môžete využiť napríklad otočný enkóder, či inkrementačné tlačidlo ktoré cykluje stanice s indexom 0 až 15. Môžete to doplniť o OLED displej, na ktorý môžete vykresliť logo (bitmapu) aktuálne prehrávaného / navoleného rádia, či jeho pomyselnú FM / AM frekvenciu. Ovládanie staníc môže byť riešené aj priamo skrz dotykovú plochu, ak to použitý displej umožňuje. Rovnako tak so špecifickou grafikou na displeji je možné dosiahnuť aj old-school vizuál rádia, trebars aj s imitáciou ladenia rádia na frekvenciu AM či FM, vrátane stupnice, na ktorej rádio štandardne vysiela na rádiových vlnách.

Voľbu stanice je možné uchovať natrvalo, aby aj po reštarte / odpojení a pripojení napájania začala hrať posledne nastavená stanica. Voľbu treba uložiť do pamäte ESP32 ihneď po navolení stanice, najlepšie skrz Preferences knižnicu, ktorá je zabudovaná priamo do Arduino Core pre ESP32 a priamo nahrádza skoršiu knižnicu EEPROM, ktorá fungovala na softvérovú emuláciu EEPROM pamäte na určenom sektora flash pamäte ESP32 do maximálnej veľkosti 4 kB. Preferences má wear-leveling a tak nebude problém ani s častým prepisovaním. Rozhodne to nezníži životnosť postaveného webrádia pri bežnom, aj dennom používaní a prepínaním medzi rádiami.

Prepínanie rádii môže prebiehať napríklad aj skrz webserver, ktorý môže na ESP32 bežať. Webserver je dostupný na štandardnom HTTP protokole 80, pričom je možné použiť aj mDNS lokálny záznam, aby používateľ nemusel zložito hľadať pridelenú IP adresu z DHCP služby na sieti, ale môže pristúpiť priamo cez lokálne mDNS meno, ktoré je dostupné v LAN sieti. V tomto prípade je to audio.local, teda celý url bude: http://audio.local. Rovnako tak je ale webserver dostupný aj skrz IP adresu.

Používateľ si môže vybrať predvolené rádio zo zoznamu streamov, alebo môže zadať aj priamo URL na akékoľvek svetové rádio, ktoré chce počúvať. Samozrejmosťou je aj kontrola hlasitosti. Program, ktorý sa používa a vychádza z ukážkovej implementácie podporuje aj .aac a .ogg streamy, nie je tam rozdiel v implementácii. Pri mikrokontroléroch bez PSRAM by však pri pokuse o prehratie týchto formátov streamov došlo k okamžitej chybe, .mp3 by bežali určitý čas, ale nie donekonečna.



Prístupov 277
Kvalita článku
hlasov 0

PRÍSPEVKY
SLEDOVAŤ
Prosím prihláste sa pre možnosť pridania komentáru.
Prihláste sa, alebo použite facebook login facebook login
ĎALŠIE ČLÁNKY V BLOGU
ESP32 WiFi Provisioning s EspTouch V1
[ 7.3.2025] (príspevkov 0)
Protherm kotol chyba F.28 - reštart kotl...
[ 2.3.2025] (príspevkov 0)
ESP32 hlasové ovládanie s Firebase Realt...
[ 1.3.2025] (príspevkov 0)
Maticový displej s MAX7219
[ 22.2.2025] (príspevkov 0)
EBYTE E32-433T20D s dosahom až 3 km?
[ 19.2.2025] (príspevkov 0)
HTTP POST request - SIMCom A7670E
[ 9.2.2025] (príspevkov 0)
Logický analyzátor 24 MHz / 8 kanálov
[ 7.2.2025] (príspevkov 0)
Google Spreadsheet ako databáza
[ 6.2.2025] (príspevkov 0)
NFC hudobný systém pre Escape room
[ 31.1.2025] (príspevkov 0)