Latający Orzeł na 11 listopada – animacja z hymnem na ESP32-S3

Latający Orzeł na 11 listopada – animacja z hymnem na ESP32-S3
11 listopada obchodzimy Narodowe Święto Niepodległości – wspominamy odzyskanie przez Polskę niepodległości w 1918 roku, po 123 latach zaborów. To dobry moment, żeby zatrzymać się przy naszych symbolach narodowych: białym orle, biało-czerwonych barwach i Mazurku Dąbrowskiego. Postanowiliśmy uczcić je tak, jak potrafimy najlepiej – elektroniką.
Jak to wygląda? W spoczynku ekran jest czarny. Po naciśnięciu przycisku od lewej wsuwa się czerwone tło, a z oddali nadlatuje biały orzeł w złotej koronie. Rośnie, miarowo macha skrzydłami, hamuje, ląduje po prawej stronie ekranu i zastyga z uniesionymi skrzydłami. Obok niego wyrasta maszt, rozwija się biało-czerwona flaga i zaczyna łopotać na wietrze, a po lewej pojawia się tekst hymnu. Chwilę później z głośników rozbrzmiewa Mazurek Dąbrowskiego – śpiewany właśnie wiersz rozjaśnia się bielą, pozostałe są przygaszone, jak w karaoke. Po ostatnim takcie ekran zasłania czerń.
Do symboli narodowych podeszliśmy z należytym szacunkiem – uważamy, że otaczanie ich czcią jest prawem i obowiązkiem każdego obywatela. Hymnu nie skracamy i niczym go nie zagłuszamy: kiedy gra, orzeł stoi nieruchomo, flaga łopocze, a wiersze tekstu rozjaśniają się w rytm muzyki. Po ostatnim takcie obraz łagodnie gaśnie. Nasz orzeł to uproszczona, animowana grafika inspirowana godłem, a nie oficjalny wizerunek godła Rzeczypospolitej Polskiej.
Nagraliśmy film na youtube
Na naszym kanale znajdziesz materiał wideo o tym projekcie!
Lista elementów
| Nazwa | Do czego służy | Link |
|---|---|---|
| Płytka ESP32-S3-DevKit N16R8 | „Mózg” pokazu – składa obraz i odtwarza hymn | Zobacz w sklepie |
| Wyświetlacz TFT LCD 3,97″ 480 × 800 px ST7701 | Ekran, na którym leci cały pokaz | Zobacz w sklepie |
| CJMCU-1334 – moduł DAC UDA1334A I2S | Zamienia cyfrowy dźwięk na sygnał analogowy | Zobacz w sklepie |
| Moduł wzmacniacza PAM8403 | Wzmacnia sygnał dla głośników | Zobacz w sklepie |
| Głośnik 1 W YD58 – 2 szt. | Hymn gra na obu kanałach | Zobacz w sklepie |
| Przewody połączeniowe | Połączenia między modułami | Zobacz w sklepie |
| Kondensator elektrolityczny 470-1000 µF – 2 szt. | Filtruje zasilanie wzmacniacza | z warsztatowej szuflady 😉 |
👉 Nie chcesz kompletować wszystkiego osobno? Przygotowaliśmy gotowy koszyk – jedno kliknięcie i wszystkie elementy lądują w zamówieniu.
Dlaczego taki wyświetlacz? 🖥️
Przy płynnie lecącym orle i łopoczącej fladze liczy się szybkość. Popularne małe ekrany SPI dostają obraz bit po bicie – przy rozdzielczości 480 × 800 pełna klatka szłaby za długo. Wyświetlacz 3,97″ ze sterownikiem ST7701 ma równoległy interfejs RGB: 16 linii danych naraz plus sygnały synchronizacji, jak monitor. Cały ekran odświeża się ponad 40 razy na sekundę.
Haczyk: taki panel nie ma własnej pamięci obrazu. Wyświetla tylko to, co w danej chwili dostaje, więc mikrokontroler musi wysyłać mu pełną klatkę bez przerwy. Potrzebny jest więc sprzętowy kontroler LCD RGB i dużo pamięci – i tu wchodzi ESP32-S3.

Dlaczego ESP32-S3 N16R8? 🧠
- kontroler LCD RGB – sprzętowo wysyła obraz do panelu,
- 8 MB PSRAM – klatka 480 × 800 w 16-bitowym kolorze to 750 KB, a trzymamy dwie; wewnętrzny RAM (512 KB) nie zmieściłby nawet jednej,
- 16 MB flash – program, grafika orła i nagranie hymnu,
- I2S – cyfrowe wyjście dźwięku,
- dwa rdzenie 240 MHz – o nich za chwilę.
Zwróć uwagę na oznaczenie N16R8 (16 MB flash, 8 MB PSRAM) – wersje bez PSRAM się tu nie nadają.

Dźwięk: przetwornik i wzmacniacz 🔊
ESP32-S3, w przeciwieństwie do klasycznego ESP32, nie ma przetwornika cyfrowo-analogowego (DAC). Dźwięk wychodzi cyfrowo, interfejsem I2S, do modułu CJMCU-1334 z 16-bitowym przetwornikiem, który sam odtwarza zegar z sygnałów I2S, więc wystarczą trzy przewody.
Dalej sygnał trafia do wzmacniacza klasy D PAM8403 i dwóch głośników YD58 1 W. Wzmacniacz ma 2 × 3 W, więcej, niż znoszą głośniki – dlatego program ma twardy limit głośności (−14 dB).

Połączenia 🔌
Moduły łączymy według schematu i tabel. Numery to GPIO ESP32-S3.
💡 Kilka słów o zasilaniu:
Całość zasilamy z USB płytki: wyświetlacz bierze 5 V, przetwornik 3,3 V. Uwaga na wzmacniacz – PAM8403 pobiera prąd krótkimi impulsami. U nas po podłączeniu go do tego samego 5 V co ekran animacja zaczęła się zacinać. Dlatego przy wzmacniaczu i przy pinie 5V płytki stoją kondensatory 470-1000 µF, a zasilanie wzmacniacza idzie osobnymi przewodami prosto z pinów. Jeśli obraz nadal się zacina, gdy gra hymn – zasil PAM8403 z osobnego zasilacza 5 V.
Wyświetlacz ↔ ESP32-S3
| Wyświetlacz | ESP32-S3 |
|---|---|
| R0-R4 | GPIO 1-5 |
| G0-G5 | GPIO 6-11 |
| B0-B4 | GPIO 12-16 |
| CLK / DE / HS / VS | GPIO 39 / 17 / 21 / 18 |
| SCL / SDA / CS / RST | GPIO 40 / 41 / 42 / 47 |
| VCC / BL | 5 V / 3,3 V |
| GND, R5-R7, G6-G7, B5-B7 | GND |
CJMCU-1334 ↔ ESP32-S3 i PAM8403
| CJMCU-1334 | Połączenie |
|---|---|
| VIN | 3,3 V (nie 5 V – UDA1334A znosi najwyżej ok. 4 V) |
| GND | GND |
| BCLK / WSEL / DIN | GPIO 48 / 38 / 43 |
| SF0, SF1, PLL, DEEM, MUTE | GND |
| Lout / Rout / AGND | PAM8403 L / R / GND wejścia |
PAM8403 ↔ zasilanie i głośniki
| PAM8403 | Połączenie |
|---|---|
| +5V / GND | 5 V / GND płytki + kondensator przy module |
| L+ / L− | Głośnik lewy |
| R+ / R− | Głośnik prawy |
⚠️ Wyjścia PAM8403 są mostkowe – minusa głośnika nigdy nie łączymy z masą ani z drugim kanałem.
Co wykorzystaliśmy z ESP32-S3?
Nie ma tu gotowej biblioteki graficznej ani odtwarzacza MP3 – cały pokaz to nasz kod w C++. Większość ciężkiej pracy wykonuje jednak sprzęt mikrokontrolera:
- Kontroler LCD RGB i DMA – obraz płynie do panelu bez udziału procesora.
- Podwójne buforowanie w PSRAM – panel wyświetla jedną klatkę, a program rysuje następną w drugim buforze; zamiana między klatkami, więc obraz się nie „rozrywa”.
- Rysowanie tylko zmian – odświeżamy obszar wokół orła albo flagi, nie cały ekran.
- Osobna partycja na hymn- czytany prosto z flasha – nagranie (3,7 MB surowych próbek, bez kompresji) leży na osobnej partycji pamięci flash. ESP32-S3 „podpina” ją pod zwykłe adresy w pamięci, więc program czyta próbki jak elementy tablicy. Nie trzeba ich nigdzie kopiować ani dekodować, jak w przypadku MP3.
- Tekst podąża za muzyką – podświetlenie wierszy nie zależy od osobnego licznika czasu, tylko od tego, ile próbek nagrania naprawdę trafiło już do głośnika. Jeśli rysowanie klatki się opóźni, tekst dogoni muzykę w następnej klatce – karaoke nie rozjedzie się z hymnem.
Orzeł to 16 klatek machania narysowanych wektorowo w Pythonie, a flaga jest w całości liczona matematycznie.
Warto też zaznaczyć, ze w tym projekcie jawnie wykorzystaliśmy oba rdzenie ESP32-S3
Rdzeń 0 zajmuje się tym, co musi działać w ściśle określonym rytmie: przerwaniem panelu, które dosyła obraz, i zadaniem audio, które karmi przetwornik próbkami. Rdzeń 1 ma całą moc na rysowanie klatek. Czy było to konieczne? Niekoniecznie, ale chcieliśmy pokazać, że taka możliwość jest i że korzysta się z niej prosto: przy tworzeniu zadania FreeRTOS wystarczy przypiąć je do rdzenia.

DMA – cichy bohater projektu ⚡
Gdybyśmy mieli wskazać jeden element, bez którego ten projekt by się nie udał, byłoby to DMA. To dzięki niemu ESP32-S3 może jednocześnie zasilać wyświetlacz obrazem, grać hymn i rysować kolejne klatki. Procesor w pojedynkę nie dałby rady robić wszystkiego naraz. DMA działa po cichu w tle i łatwo o nim zapomnieć, a w niemal każdym poważniejszym projekcie z wyświetlaczem, dźwiękiem czy szybką komunikacją robi kluczową robotę. Dlatego chcemy go Wam trochę przybliżyć.
DMA (Direct Memory Access, czyli bezpośredni dostęp do pamięci) to sprzętowy mechanizm przenoszenia danych. Bez niego procesor musiałby sam przenosić każdy bajt: odczytać go z pamięci, wpisać do rejestru peryferium i czekać na następny. Przy dźwięku 44,1 kHz oznaczałoby to przerwanie pracy co 22,7 µs, a przy obrazie z naszego wyświetlacza – kopiowanie 32 MB na sekundę. Na rysowanie nie zostałoby już nic.
Z DMA procesor tylko zleca zadanie: podaje adres danych, miejsce docelowe (np. interfejs I2S albo kontroler LCD) i liczbę bajtów. Dalej pracuje sprzęt. Peryferium samo zgłasza, kiedy jest gotowe na kolejną porcję, a kontroler DMA przenosi ją po magistrali. Gdy cała porcja jest wysłana, przerwanie daje znać procesorowi, że może przygotować następną. W ESP32-S3 zadania można łączyć w listę, więc DMA przechodzi od porcji do porcji bez przerwy.
Tutaj pracują dwa takie strumienie i żaden z nich nie może się spóźnić.
Obraz. Klatka to 750 KB, a panel potrzebuje jej ponad 41 razy na sekundę – ok. 32 MB/s, bez przerwy. Klatki leżą w PSRAM, ale DMA wysyła obraz z małych buforów odbijających w RAM wewnętrznym, po 10 linii. Gdy DMA wysyła jeden, przerwanie dopełnia drugi porcją z PSRAM. Jeśli się spóźni, cały obraz drga. Rysowanie też korzysta z PSRAM i potrafiło „zagłodzić” przerwanie – pomogło składanie wierszy w RAM wewnętrznym i to, że nieruchomego orła i tekstu nie przerysowujemy. Ciekawostka: większe bufory odbijające pogorszyły sprawę, bo przestały się mieścić w pamięci podręcznej.
Dźwięk. Zadanie audio odkłada próbki do kolejki DMA (ok. 46 ms zapasu), a I2S wysyła je do przetwornika w idealnie równym tempie – hymn gra płynnie, nawet gdy klatka rysuje się dłużej.
Programowanie 💾
Projekt budujemy w PlatformIO z platformą pioarduino (Arduino core 3.x na ESP-IDF 5). Wgrywamy program, a potem jednorazowo pakiet z hymnem i tekstem na osobną partycję flasha. Pokaz uruchamia przycisk BOOT na płytce.
💾 Kod źródłowy:
Nagranie hymnu: Mazurek Dąbrowskiego, United States Navy Band – domena publiczna (Wikimedia Commons). Czcionka: Fira Sans Condensed (SIL Open Font License).
Podsumowanie 🎯
Latający Orzeł to nasz sposób na uczczenie Święta Niepodległości – i przy okazji dobry przykład tego, ile potrafi ESP32-S3. Kontroler LCD RGB, PSRAM, DMA, I2S i dwa rdzenie współpracują tu tak, że animacja i hymn idą równo, bez zacięć. A 11 listopada niech na ekranie zabrzmi Mazurek Dąbrowskiego. 🇵🇱

Całą elektronikę z artykułu znajdziesz w naszym sklepie 👉 sklep.msalamon.pl 👈 Zajrzyj też do nas w social mediach – na bieżąco piszemy tam o nowościach i najlepszych promocjach 😎👇



