Internetradio met de ESP32-S3

[ 22 keer bekeken / views ]

Toen ik het TFT-LCD-Display-EC11 en het Piggyback Board beschreef, gaf ik aan dat je er een internetradio mee zou kunnen maken. In deze post beschrijf ik zo’n Internet Radio die ik rond dit Piggyback board heb gemaakt. Een zender kiezen en het volume regelen klinkt eenvoudig.

Here you can find an English version of this post

De uitdaging voor de bediening is dat het piggyback board slechts een draaiknop met drukfunctie en één losse drukknop heeft. Hoe geef je daarmee de equalizer en de instellingen een logische plek?

De andere uitdaging diende zich aan toen de radio eenmaal speelde. Sommige zenders leveren hun audio onregelmatig aan. De firmware moet dan bepalen of er nog genoeg audio in de buffer zit om door te spelen, of dat het tijd is om de verbinding opnieuw op te bouwen.

De hardware

Het TFT-display, de EC11-draaiknop en het Piggyback Board

Het Piggyback Board met de ESP32-S3 zit rechtstreeks achter het display. Het display toont de gekozen zender, het volume en, als de zender die informatie meestuurt, het nummer dat speelt. De EC11 kan zowel draaien als indrukken registreren. Samen met de losse drukknop levert dat genoeg mogelijkheden op om de radio vanaf het frontpaneel te bedienen.

Van I²S naar analoog geluid met de PCM5102A

De ESP32-S3 stuurt het digitale audiosignaal via I²S naar een PCM5102A. Deze DAC zet het om in een analoog stereosignaal dat naar een versterker of actieve luidsprekers kan.

De equalizer en volumeregeling werken al in de firmware, vóór het signaal de DAC bereikt.

De radio bedienen

Volume, zenderkeuze en de driebands-equalizer

Tijdens het luisteren regelt de draaiknop het volume. Met een korte druk open je de zenderlijst. Je selecteert een andere zender door aan de draaiknop te draaien en opnieuw op de knop te drukken. Houd je de draaiknop ingedrukt, dan open je de equalizer voor lage, midden- en hoge tonen.
De losse drukknop geeft toegang tot de technische informatie en het instellingenmenu.

Bediening via het display en de browser

De radio heeft een eigen web-interface die je op je lokale netwerk kunt openen. Daar zie je welke zender speelt en kun je het volume aanpassen of een andere zender kiezen. Dat is vooral handig als de radio buiten handbereik staat. Het display en de web-interface geven altijd dezelfde informatie weer. Met de web-interface kun je echter nog wat andere instellingen aanpassen.

De zenderlijst beheren en bewaren

In de web-interface kun je zenders toevoegen, wijzigen en verwijderen.

Per zender leg je onder meer de naam en het adres van de audiostream vast. Je kunt de volledige lijst ook downloaden, bijvoorbeeld om een reservekopie te bewaren of dezelfde lijst op een tweede radio te gebruiken.

De zenders worden in een JSON bestand opgeslagen;

{
  "stations": [
    {
      "name": "Jazz24",
      "sortField": "JZZ01",
      "url": "https://knkx-live-a.edge.audiocdn.com/6285_128k",
      "codec": "mp3"
    },
    {
      "name": "Radio Swiss Jazz",
      "sortField": "JZZ",
      "url": "http://distribution.srg-ssr.ch/m/rsj/mp3_128",
      "codec": "mp3"
    },
    .
    .
  ]
}

Het sortfield geeft een mogelijkheid om de lijst in de radio te sorteren. Als een station hapert (zie verderop) dan zal de radio een ander station kiezen waarvan de éérste letter van het sortfield gelijk is aan die van het huidige (haperende) station.

Hoe de firmware is opgebouwd

De taakverdeling tussen netwerk, audio en bediening

Het ophalen van de stream, het afspelen van de audio en de bediening zijn over aparte taken verdeeld. Een trage netwerkverbinding zal daardoor de bediening niet ophouden. Ook als de radio bezig is een verbinding te herstellen, kun je met de draaiknop of de browser een andere zender kiezen.

Eén radiostatus voor het display en de web-interface

De firmware houdt centraal bij welke zender is gekozen en hoe hoog het volume staat. Draai je aan de volumeknop, dan zie je de verandering meteen zowel op het display als ook in de browser. Kies je in de browser een andere zender, dan verschijnt die direct ook op het display. Deze synchronisatie wordt bewerkstelligt door een WebSocket-verbinding tussen de radio en de web-interface.

Zenders in LittleFS, instellingen in NVS

De zenderlijst staat als JSON-bestand in LittleFS (het bestandssysteem in het flashgeheugen). In het Non-volatile storage (NVS) worden de afzonderlijke instellingen, zoals de laatst gekozen zender, de equalizer, de draairichting van de encoder en het WiFi SSID en Wachtwoord bewaart. Na het uit- en weer inschakelen gaat de radio gewoon verder met de opgeslagen voorkeuren.

Van internetstream naar geluid

Een MP3- of AAC-stream openen

Bij het kiezen van een zender opent de radio een HTTP- of HTTPS-verbinding naar het adres in de zenderlijst. Daarvoor is een directe MP3- of AAC-stream nodig. Het streamadres verwijst naar de verbinding waarover de audio binnenkomt.

Hoe de ringbuffer het ophalen van de stream loskoppelt van het afspelen

De netwerktaak schrijft de binnenkomende audiogegevens in een ringbuffer in het PSRAM. De afspeeltaak leest daar in zijn eigen tempo uit. Bij het starten wacht de radio tot er voldoende gegevens in de buffer staan (gele balk).

Die voorraad geeft het afspelen ruimte om schommelingen in de aanvoer op te vangen.

Van decoder via equalizer en volumeregeling naar I²S

De decoder zet de gecomprimeerde MP3- of AAC-gegevens om in digitale audiosamples. Vervolgens worden de equalizerinstellingen en het volume toegepast, waarna de samples via I²S naar de PCM5102A worden gestuurd.

Zender- en nummerinformatie

Sommige zenders sturen informatie over het nummer mee tussen de audiogegevens. De firmware haalt die informatie uit de stream voordat de audio naar de decoder gaat. Vervolgens maakt ze de tekst één keer op voor weergave op het display en in de browser.

Als een zender hapert of stilvalt

Korte haperingen opvangen met de ringbuffer

Als een zender even minder gegevens levert dan de radio verbruikt, loopt de buffer terug. Zolang er nog audio in zit, speelt de radio door. Levert de zender daarna weer voldoende gegevens, dan vult de buffer zich tijdens het afspelen.

Vertraging beperken met wifi- en TCP-instellingen

In de radio firmware is de energiebesparing van wifi uitgeschakeld. Hierdoor blijft de ontvanger tijdens het afspelen actief. De TCP-instellingen zijn zodanig aangepast dat er meer gegevens achter elkaar kunnen worden ontvangen. Zo kan de buffer zich sneller herstellen wanneer de gegevens na een korte vertraging weer binnenkomen.

Een mislukte openingspoging opnieuw proberen

Soms lukt het bij het kiezen van een zender niet meteen om de verbinding te openen. De firmware probeert het dan opnieuw. Tijdens die pogingen blijft de audio stil. Zodra de verbinding werkt en er voldoende gegevens in de buffer staan, begint het afspelen.

Wat als de stream vastloopt en stopt

Een verbinding kan open blijven terwijl er geen bruikbare audiogegevens meer binnenkomen. De firmware merkt dat doordat de afspeeltaak herhaaldelijk een lege buffer aantreft. Houdt dat ongeveer vijf seconden aan, dan vraagt de afspeeltaak aan de netwerktaak om de verbinding met dezelfde zender te sluiten en opnieuw te openen.

Na het leeglopen van de buffer wacht de radio tot er weer een voorraad is opgebouwd. Meteen beginnen zodra de eerste gegevens terugkomen, kan leiden tot korte stukjes muziek met stiltes ertussen. Door eerst bij te vullen, krijgt de stream de tijd om weer op gang te komen.

Pas verder spelen als de buffer weer voldoende gevuld is

Bij aanhoudende uitval eerst wifi controleren en dezelfde zender opnieuw starten

Blijft de stream stilvallen, dan controleert de firmware ongeveer elke twintig seconden of de radio nog een IP-adres heeft. Zo nodig probeert ze eerst de wifi-verbinding te herstellen. Daarna start ze de stream van de huidige zender opnieuw. Bij aanhoudende uitval doorloopt de radio die herstelstappen maximaal vier keer voordat hij naar een andere zender zoekt.

Na vier mislukte herstelpogingen uitwijken naar een andere zender uit dezelfde groep

Als de huidige zender na vier herstelrondes nog steeds uitvalt, zoekt de radio in de zenderlijst naar een alternatief uit dezelfde groep. De firmware gebruikt daarvoor de eerste letter van het sorteerveld (sortfield). Is er geen passende zender, dan blijft de huidige zender geselecteerd.

Zelf bouwen en installeren

De firmware bouwen en flashen met ESP-IDF

Het project is opgezet voor ESP-IDF en kan worden geopend in VS Code met de ESP-IDF-extensie. Bij het bouwen maakt ESP-IDF ook een LittleFS-image met de web-interface en de eerste zenderlijst. Die gaat bij de eerste installatie samen met de firmware naar de ESP32-S3.
Vind je dat allemaal teveel gedoe dan kun je de firmware en het LittleFS ook via mijn flasher website installeren. Je hebt dan alleen een geschikte browser en een USB kabel die geschikt is voor dataoverdracht (niet alleen geschikt voor opladen van een accu) nodig.

De eerste wifi-configuratie

Bij de eerste start maakt de radio een eigen wifi-netwerk aan. Via het bijbehorende configuratiescherm kies je je eigen netwerk en voer je het wachtwoord in. De radio bewaart die gegevens en gebruikt ze om bij volgende starts automatisch verbinding te maken.

Firmware bijwerken via het netwerk

Je kunt de firmware Over The Air (OTA) bijwerken via je lokale netwerk. Bij zo’n update stopt de radio eerst de audiotaken. Na het schrijven van de nieuwe firmware start de radio opnieuw.

Broncode en documentatie

De broncode, bouwinstructies en technische projectbeschrijving staan bij elkaar in de radioProject-repository op GitHub.

This entry was posted in 3D printing, Aandewiel, ESP32, Firmware, Hardware, piggyback, WiFi and tagged , , , , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

The maximum upload file size: 4 MB. You can upload: image, other. Links to YouTube, Facebook, Twitter and other services inserted in the comment text will be automatically embedded. Drop file here

This site uses Akismet to reduce spam. Learn how your comment data is processed.