OR OPEN RADIO · CORE2
ARK. 1/1 · PRE-RELEASE EN
Polskie stacje radiowe, wszędzie na świecie/M5Stack Core2/ gra na biurku

Polskie radio,
które po prostu gra.

Rodzina i znajomi za granicą lubią mieć w tle polskie radio. Do tej pory oznaczało to płatne aplikacje albo drogie dedykowane odbiorniki, więc zrobiłem kostkę, która gra dziewięć polskich stacji radiowych przez Wi-Fi i Bluetooth. Obraz systemu udostępniam za darmo — możesz powielić ją u siebie.

RYSUNEK ZŁOŻENIOWY OR-C2 LAB
54 mm 54 mm 16 mm USB-C 5 V ESP32 2 × 240 MHz 16 MB FLASH · 8 MB PSRAM GŁOŚNIK 1 W WI-FI 2,4 GHz + BT CLASSIC OR-C2 · EKRANY: EMULATOR 1:1
ostatni capture: route BTstarvation 0watchdog 0kolejka pełna
A1
9
stacji radiowych
A2
~50
cały sprzęt, bez lutowania
A3
320×240
dotykowy IPS 2,0″
A4
0
kont · chmur · telemetrii
A5
2,75mld
tokenów AI w produkcji
A6
100+
dokumentów inżynierskich
01 / zakres

Czym ta kostka jest, a czym świadomie nie jest

Open Radio powstało z jednego założenia: kupić gotowy sprzęt all-in-one i napisać do niego cały system. Zakres funkcji zamknęliśmy z premedytacją.

Jest

  • Systemem do sprzętu z półki. Hardware robi M5Stack, my robimy resztę: firmware, GUI, recovery, katalog stacji. Zero lutownicy i drukarki 3D.
  • Kompromisem kosztu i wydajności. ESP32 kontra streaming w 2026 roku. Cała inżynieria tego projektu wynika z tej dysproporcji.
  • Mobilną i prostą w obsłudze. Trzy dotknięcia na dole ekranu: poprzednia stacja, siatka, następna. Urządzenie zrozumiałe w dziesięć sekund, a na wbudowanym aku gra do 2 h bez kabla.
  • Maksymalnie bezobsługową. Sieć, strumień, głośnik, konfiguracja: wszystko, co może paść, ponawia się samo, bez rebootu i bez telefonu.
  • Celowo małą funkcjonalnie. Każdy kilobajt DRAM jest policzony, a Wi-Fi i Bluetooth walczą o jedno radio. Więcej funkcji zwyczajnie się w tym krzemie nie mieści.

Nie jest

  • Audio hi-end. MP3 128 kb/s przez SBC na głośnik Bluetooth albo wbudowany 1 W. Do kuchni, warsztatu i na balkon — nie do odsłuchowni.
  • Platformą do wszystkiego. Dziewięć stacji i zamknięta funkcjonalność. Bez Spotify, podcastów, budzików i sterowania z telefonu.
  • Kombajnem do konfigurowania. Ustawienia mieszczą się na trzech ekranach. Nie ma ukrytych plików ani trybu eksperta.
  • Produktem chmurowym. Jedyny ruch wychodzący to strumienie stacji i opcjonalny NTP. Radio nie wie, czego słuchasz, i nie ma komu o tym powiedzieć.

Dziewięć dużych polskich anten — od rocka Antyradia po klubowe mixy RMF MAXX Club. Kostka gra ich oficjalne, publiczne strumienie MP3 wprost od nadawców: bez retransmisji, bez nagrywania, bez pośredników. Z perspektywy stacji to po prostu kolejny słuchacz na liczniku, tyle że w ładniejszym pudełku. Linki prowadzą na oficjalne strony.

02 / hardware

Jedno pudełko z półki

MCUESP32-D0WDQ6-V3 · 2 rdzenie Xtensa LX6 @ 240 MHz
Pamięć520 KB SRAM + 8 MB PSRAM · 16 MB flash
EkranIPS 2,0″ · 320 × 240 · dotyk pojemnościowy
Audiowzmacniacz I2S NS4168 + głośnik 1 W
RadioWi-Fi 2,4 GHz b/g/n + Bluetooth Classic · A2DP source (SBC)
ZasilanieUSB-C · wbudowany aku 380 mAh — do 2 h grania bez kabla
Obudowa54 × 54 × 16 mm · gotowa, fabryczna
Dlaczego M5Stack Core2

Bo to jedyna droga do 50 € bez lutowania. Ekran, dotyk, głośnik, bateria, obudowa i oba radia są w cenie — wyciągasz z pudełka i flashujesz.

Płaci się za to jedną walutą: Wi-Fi i Bluetooth dzielą jeden modem radiowy 2,4 GHz i muszą się nim wymieniać w czasie. Większość wpisów w dzienniku poniżej wynika wprost z tej jednej decyzji zakupowej.

Sam Core2 to fragment większego ekosystemu M5Stack: kostki Core z ekranem, mniejsze Atom i StickC oraz dziesiątki nakładanych modułów — wszystko na ESP32, z publiczną dokumentacją. Do tego projektu niczego nie dokładaliśmy: jedna kostka prosto z pudełka.

03 / tor audio

Od CDN-u do membrany

SCHEMAT PRZEPŁYWU OR-C2/A 44,1 kHz
STACJACDN · MP3 128 kb/s WI-FI / TCPpotrzeba 16 KB/s DEKODER MP38192 ramki / przebieg KOLEJKA PCM≈ 6 s zapasu · 44,1 kHz BT A2DP · SBCreconnect 8–20 s GŁOŚNIK BTtwój, zapamiętany GŁOŚNIK 1 Wfallback wbudowany awaria BT → dźwięk gra dalej lokalnie
MP3 128 kb/s potrzebuje 16 KB/sWi-Fi pod aktywnym BT dowozi 12–14 KB/sta różnica = główny przeciwnik projektu → LOG-01
04 / dziennik produkcji

Nerd stuff: co się naprawdę działo

Wybrane wpisy z dziennika inżynierskiego. Wszystkie liczby pochodzą z telemetrii zrzucanej z urządzenia podczas wielominutowych testów.

LOG-01FIZYKA

Jedno radio, dwie roboty

Wi-Fi i Bluetooth siedzą w ESP32 na wspólnym module 2,4 GHz i dzielą antenę w czasie. Gdy A2DP nadaje, okno TCP (~5,7 KB — stała kompilacji Arduino LWIP) pomnożone przez RTT rozdęte do 350–500 ms daje 12–14 KB/s. Strumień MP3 128 kb/s potrzebuje 16. Deficyt to nie bug, to arytmetyka.

LOG-02PUŁAPKA

WiFi.setSleep(false)

Klasyczna rada z forów na przyspieszenie Wi-Fi w ESP32. Przy aktywnym Bluetoothu kontroler robi abort() i kostka boot-loopuje co 26 sekund. Bez modem-sleep koegzystencja obu radiów po prostu się sypie.

LOG-03FIZYKA

Burst-equilibrium

CDN oddaje pierwsze sekundy strumienia szybkim burstem, potem już dokładnie 1× realtime. Każdy próg bufora ustawiony powyżej punktu równowagi nigdy nie zostanie osiągnięty — radio w nieskończoność „czeka, aż się zbuforuje". Wszystkie progi rezerw musiały zejść poniżej.

LOG-04ODKRYCIE

Budżet dekodera ≠ przepustowość

Potrojenie pracy dekodera na przebieg pętli nie dodało ani jednej ramki audio (deficyt siedzi w sieci), za to wydłużyło przebieg do 1,6 s i zabiło dotyk. Przy deficycie sieciowym budżet dekodera decyduje wyłącznie o responsywności interfejsu. Wróciło 8192 ramek na przebieg.

LOG-05BUG

Rotacja, która nie rotowała

Ścieżki śmierci strumienia nie czyściły aktywnego endpointu, więc „rotacja kandydatów" od zawsze otwierała w kółko ten sam martwy URL. Objaw: 81 restartów w 3 minuty. Naprawa sprowadziła się do czyszczenia endpointu w trzech miejscach.

LOG-06RAM

TLS kontra Bluetooth

Handshake TLS potrzebuje ~40 KB wolnego DRAM. Przy grającym Bluetoothu zostaje 25–30 KB, więc przełączenie na stację wymagającą discovery przez HTTPS w trakcie grania jest fizycznie niewykonalne. Rozwiązanie: przypięte fallbacki plain-HTTP per stacja plus cache ostatniego działającego źródła.

LOG-07BT

Okno parowania

Głośnik po odłączeniu zasilania nie czeka grzecznie na skan — sam dzwoni do kostki. A kostka odrzucała nieznajomych. Klincz. Fix: dotknięcie „skanuj" otwiera okno, w którym przychodzący zgodny głośnik zostaje adoptowany i zapamiętany.

LOG-08RF

Za blisko routera

Kostka 2 m od punktu dostępowego tnie audio falami; w drugim pokoju gra idealnie. Nadajnik Wi-Fi routera zagłusza odbiornik Bluetooth w kostce. Czasem najlepszą poprawką firmware'u jest przestawienie urządzenia o trzy metry.

05 / bezobsługowość

Co się dzieje, gdy coś pada

Zasada projektowa: wtyczka + prąd = gra. Każdą awarię radio ma przeżyć samo, bez telefonu i bez człowieka.

padło Wi-Fiponawia znane sieci z ograniczonym backoffem; nigdy nie wejdzie w obcą ani otwartą sieć
serwer zerwał strumień2 s bez ramki = natychmiastowy reopen i rotacja kandydatów (jeden z serwerów zrywał TCP 65× na 12 min — gra mimo to)
padł głośnik BTdźwięk przechodzi na głośnik wbudowany, reconnect próbuje w tle co 8–20 s
martwy URL w katalogulast-known-good: ostatnie działające źródło każdej stacji zapamiętane na flashu
zwis pętli głównejwatchdog 30 s: diagnostyczny reset i automatyczny powrót do grania zamiast cegły
uszkodzona konfiguracjasafe mode z lokalną naprawą; zepsuty stan nigdy nie nadpisuje ostatniego działającego
0 kont0 chmury0 telemetrii0 nagrywania0 auto-OTAjedyny ruch: strumienie stacji + opcjonalny NTP
06 / produkcja

Zbudowane w trójkącie: dwa AI i człowiek

System powstaje w całości w parze agentów AI pracujących na jednej maszynie, z audytami krzyżowymi między silnikami. Człowiekowi zostają decyzje i uszy.

Główny inżynier

GPT-5.6 Sol · Codex

2,5 mld
tokenów

Architektura, firmware, symulator GUI z pixel-parity (przeglądarka rysuje dokładnie te same piksele RGB565 co urządzenie), dwujęzyczna dokumentacja.

Stabilizacja i audyt

Claude Fable 5 · Claude Code

250 mln
tokenów

Przejęcia produkcji w kryzysie: fizyka toru audio, hotfixy rotacji i TLS, bramki QC, audyty krzyżowe raportów drugiego silnika.

Właściciel projektu

Tomasz Fiedoruk

1 para uszu
+ decyzje i weto

Wyznacza granice produktu, słucha wyników na żywo i zatrzymuje każdy flash, który nie przeszedł protokołu. Jedyny element układu, który słyszy.

Werdykt PASS/FAIL wydaje telemetria. Każdy kandydat na firmware przechodzi wielominutowy test z zapisem: starvation Δ0 · watchdog Δ0 · wstrzyknięta cisza 0,0 s / 300 s · kolejki pełne. Dopiero potem człowiek słucha.

W repo jest ponad 100 numerowanych dokumentów inżynierskich, każdy po polsku i angielsku. Tak, do radia.

07 / FAQ

Pytania, które już padły

Część z nich naprawdę.

FAQ-01

Dlaczego akurat te dziewięć stacji?

Żona lubi siedem z nich. Dwie kolejne dodały się same, bo miały stabilny strumień. Inżynieria bywa prosta. ;)

FAQ-02

Czemu gra lepiej w drugim pokoju niż obok routera?

Bo router krzyczy Wi-Fi prosto w bluetoothowe ucho kostki. Zmierzyliśmy to. Trzy metry odstępu robią więcej niż niejeden firmware-fix, szczegóły w LOG-08.

FAQ-03

Przecież są aplikacje na telefon.

Są, czasem płatne. Tylko że telefon dzwoni, powiadamia i wychodzi z tobą z kuchni. Kostka stoi i gra.

FAQ-04

Ile to naprawdę kosztowało?

Sprzęt ~50 €. Do tego 2,75 miliarda tokenów AI, których nie przeliczamy na złotówki, bo miało być hobby.

08 / status i dystrybucja

Najpierw obraz systemu, potem źródła

Kolejność wydania odwróciliśmy celowo: zamiast wypuszczać surowe źródła, najpierw udostępnimy gotowy obraz do wgrania — jedna komenda esptool i kostka gra. Kod trafi na GitHub po szlifach, testach długodystansowych i domknięciu bramek licencyjnych.

Gra na biurku całymi dniami — build laboratoryjny, 9/9 stacji z logotypami, dotyk, ulubione
10-minutowy test ciągły zaliczony — 0,0 s wstrzykniętej ciszy, po drodze 1 realny restart źródła
Dwa fizyczne głośniki BT potwierdzone — parowanie, auto-reconnect po restarcie, adopcja przychodzącego
Kwalifikacja długodystansowa w toku — progi 60 min → 2 h → 8 h ciągłego grania przed publikacją
Repo na GitHubie: wkrótce — obraz systemu do pobrania jako pierwszy, źródła po dopracowaniu

Licencje zadeklarowane: GPL-3.0-or-later (kod) · CC BY-SA 4.0 (dokumentacja) · CC0 (katalog stacji) · bez retransmisji i nagrywania audycji · logotypy stacji tylko za zgodą nadawców