Už snad deset let si chci postavit malý kapesní cyberdeck. Něco jako malou databanku ze starých dob, kdy ještě nebyly smartphony. Teď jsem se konečně rozhoupal a pustil se do stavby.
Jako základ jsem použil ESP32-S3, malou klávesnici, SD kartu a 2,42″ OLED displej. A protože by cyberdeck bez možnosti něco k němu připojit nebyl úplný, nechybí ani rozšiřující port s několika komunikačními rozhraními.

Cyberdeck má být hlavně přenosný vývojový, herní a pokusný terminál – prostě něco na hraní a různé pokusničení v terénu. Proto jsem hledal dostatečně výkonný hardware, který by zároveň zůstal malý a úsporný.
Nechtěl jsem použít Raspberry Pi s klasickým Linuxem. Lákalo mě vytvořit si vlastní jednoduchý systém přesně podle svých potřeb a mít nad ním úplnou kontrolu. Nakonec jsem proto zvolil ESP32-S3, které má dostatek výkonu a k tomu i Wi-Fi a Bluetooth LE, takže se hodí i pro připojení k bezdrátovým sítím a různé síťové experimenty.
Hardware
Základem celého cyberdecku je vývojová deska LaskaKit ESP32-S3 DEVKit, která má dvoujádrový ESP32-S3 s taktem až 240 MHz, 16 MB flash paměti, integrovanou Wi-Fi a Bluetooth LE a nabízí dostatek GPIO i několik hardwarových komunikačních rozhraní. Pro tento projekt je šikovná také integrovaná nabíječka Li-ion akumulátoru, měření jeho napětí a možnost softwarově zapínat napájení periferií přes GPIO47.
Právě množství dostupných rozhraní bylo jedním z důvodů, proč jsem ESP32-S3 vybral. Displej a klávesnice mohou mít vlastní sběrnice a SPI pro SD kartu lze zároveň sdílet s rozšiřujícím portem.
OLED displej
Pro zobrazení jsem použil monochromatický 2,42″ OLED s rozlišením 128 × 64 bodů a řadičem SSD1309. Displej komunikuje přes čtyřvodičové SPI. V mém zapojení je napájený 3,3 V.
Výhodou OLEDu je dobrá čitelnost, vysoký kontrast a hlavně to, že nepotřebuje podsvícení. Rozlišení 128 × 64 bodů není nijak závratné, ale pro jednoduché menu, terminál, textové informace nebo malou grafiku je dostačující.
Zapojení displeje je následující:
| OLED | ESP32-S3 | Funkce |
|---|---|---|
| VCC | 3,3 V | Napájení |
| GND | GND | Zem |
| SCK | GPIO7 | SPI hodiny |
| MOSI / SDA | GPIO6 | SPI data |
| CS | GPIO5 | Výběr displeje |
| DC | GPIO4 | Rozlišení dat a příkazů |
| RST | GPIO15 | Reset displeje |
Displej používá vlastní SPI sběrnici. MISO zde není potřeba, protože data putují pouze z ESP do displeje.
Klávesnice CardKB
Jako klávesnici jsem použil M5Stack CardKB. Je to malá QWERTY klávesnice s 50 tlačítky, která komunikuje přes I²C na adrese 0x5F. Kromě běžných znaků podporuje také Shift, Sym, Fn a kurzorové klávesy.
Tady se ale objevila první komplikace. CardKB je určena pro napájení 5 V a v mém zapojení při 3,3 V nefungovala spolehlivě. Přidal jsem proto obyčejný DC step-up měnič nastavený na 5 V.
ESP32-S3 ale používá logické úrovně 3,3 V, takže mezi něj a klávesnici jsem ještě vložil běžný obousměrný čtyřkanálový převodník logických úrovní 3,3/5 V. Z jeho čtyř kanálů používám pouze dva pro SDA a SCL.
Zapojení datové části je:
| CardKB | Převodník | ESP32-S3 |
|---|---|---|
| SDA | 5V strana → 3,3V strana | GPIO42 |
| SCL | 5V strana → 3,3V strana | GPIO2 |
| VCC | — | 5 V ze step-up měniče |
| GND | společná zem | GND |
CardKB tak má svoje I²C připojení a nijak se nedělí o sběrnici vyvedenou na rozšiřující konektor.
SD karta
Pro ukládání dat jsem přidal také microSD kartu. Použil jsem jednoduchý držák bez vlastního stabilizátoru a bez převodníků logických úrovní, takže karta pracuje přímo na 3,3 V.
SD karta komunikuje v režimu SPI:
| microSD | ESP32-S3 | Funkce |
|---|---|---|
| VCC | 3,3 V | Napájení |
| GND | GND | Zem |
| MISO | GPIO21 | Data z karty |
| SCK | GPIO38 | SPI hodiny |
| MOSI | GPIO39 | Data do karty |
| CS | GPIO41 | Výběr SD karty |
Tato SPI sběrnice se později používá také na rozšiřujícím portu. SD karta má vlastní CS na GPIO41, zatímco zařízení připojené přes rozšiřující port dostalo samostatný CS na GPIO16.
Díky tomu může být na jedné SPI sběrnici více zařízení. Každé má svůj vlastní Chip Select a ESP vždy vybere pouze to, se kterým chce právě komunikovat.
Napájení
Cyberdeck je napájený z jednočlánkového 3,7 V Li-pol akumulátoru s kapacitou 400 mAh, což odpovídá energii přibližně 1,48 Wh.
Napětí akumulátoru může ESP měřit přímo. LaskaKit ESP32-S3 DEVKit má na GPIO9 připojený odporový dělič 1 MΩ + 1,3 MΩ, takže není potřeba přidávat vlastní měřicí obvod. Deska má zároveň integrovanou nabíječku Li-ion/Li-pol akumulátoru.
Další zajímavostí desky je spínané napájení konektorů uŠup. Napájecí větev ovládá GPIO47:
HIGH– napájení periferií zapnutéLOW– napájení periferií vypnuté
V mém zapojení je přes tuto větev napájena také SD karta a napájecí část klávesnice. To se bude hodit hlavně později při řešení úsporných režimů, protože software může nepoužívané periferie kompletně odpojit od napájení.
Rozšiřující port
Cyberdeck jsem nechtěl uzavřít jen na zařízení umístěná uvnitř. Na boční straně proto dostal 15pinový D-Sub konektor DA-15, přes který jsou vyvedena hlavní komunikační rozhraní ESP.
K dispozici je I²C, UART, SPI, jeden univerzální GPIO a napájení 3,3 V i 5 V.
Napětí 5 V na rozšiřujícím portu je vyvedeno ze stejného step-up měniče, který napájí klávesnici. Při připojení externího zařízení je proto potřeba počítat s omezeným výkonem tohoto měniče.
Finální zapojení konektoru je následující:
| Pin DA-15 | Funkce | ESP32-S3 |
|---|---|---|
| 1 | GND | GND |
| 2 | +3,3 V | 3,3 V |
| 3 | I²C SDA | GPIO1 |
| 4 | I²C SCL | GPIO48 |
| 5 | UART TX | GPIO17 |
| 6 | UART RX | GPIO18 |
| 7 | GND | GND |
| 8 | SPI SCK | GPIO38 |
| 9 | SPI MOSI | GPIO39 |
| 10 | SPI MISO | GPIO21 |
| 11 | SPI CS | GPIO16 |
| 12 | univerzální GPIO | GPIO8 |
| 13 | +5 V | 5 V |
| 14 | nezapojeno | NC |
| 15 | nezapojeno | NC |
SPI na rozšiřujícím portu sdílí vodiče SCK, MOSI a MISO s interní SD kartou. Rozlišují se pouze pomocí samostatného signálu CS:
SD karta: CS = GPIO41
rozšiřující port: CS = GPIO16
Při připojování vlastního SPI zařízení je proto důležité, aby jeho výstup MISO po deaktivaci CS přešel do stavu vysoké impedance a neblokoval komunikaci se SD kartou.
I²C rozšiřujícího portu je naopak oddělené od I²C sběrnice klávesnice. CardKB používá GPIO42 a GPIO2, zatímco externí I²C je vyvedené na GPIO1 a GPIO48.
Na konektoru jsou sice dostupná napětí 3,3 V i 5 V, samotné signály ESP jsou ale 3,3V logika. Připojené zařízení proto nesmí posílat 5V logickou úroveň přímo do GPIO ESP. Pokud bude externí modul pracovat s 5V logikou, bude stejně jako u CardKB potřeba převodník úrovní.
Tím mám venku prakticky všechna rozhraní, která bych mohl u takového zařízení potřebovat. Přes stejný konektor tak půjde připojit sériové zařízení, I²C senzor, SPI modul nebo nějaký úplně jednoduchý vlastní hardware ovládaný jedním GPIO.
Krabička
Ze začátku jsem přemýšlel, že použiju plastovou krabičku od LCD displeje, ale ukázalo se, že je rozměrově příliš malá a navíc se mi ani moc nelíbila.

Rozhodl jsem se proto vyrobit vlastní krabičku z překližky v retro steampunkovém stylu.

Základní rozměry krabičky jsou 11,5 × 8 cm. Tloušťka dna je 4 mm a obvodové části jsou vyrobené z překližky o tloušťce 10 mm.


Po obvodu krabičky jsem vyřezal a vybrousil potřebné otvory pro základní desku, vypínač, SD kartu a rozšiřující konektor.




Nakonec jsem zaoblil rohy, začistil nerovnosti a celou krabičku natřel svou oblíbenou mahagonovou lazurou. Poté jsem ještě namontoval panty a zavírání ve stylovém retro vzhledu.

Poté přišel čas na instalaci vnitřních komponent. Začal jsem spodní částí, ve které je umístěno všechno kromě displeje. Místa je uvnitř opravdu málo, takže dalo docela práci všechny součástky rozumně uspořádat.

Displej má vlastní rámeček z překližky, který ho drží ve víku krabičky. Přívodní vodiče jsem pro efekt omotal provázkem.

Kolem klávesnice jsem přidal několik kousků plastové desky, které zakrývají vnitřní součástky a vodiče. Omezení úhlu otevření víka jsem jednoduše vyřešil kouskem provázku.
Software
Po dokončení hardwaru přišel na řadu firmware. Během stavby vzniklo několik zkušebních verzí, ve kterých jsem postupně rozchodil displej, klávesnici, měření baterie, SD kartu a jednotlivé části menu. Když už byl celý Cyberdeck mechanicky hotový a všechny části prošly společným testem, mohl jsem program označit jako první stabilní verzi 1.0.

Program je napsaný v Arduino IDE a celý zůstává v jednom .ino souboru. I když už má poměrně dost funkcí, snažil jsem se ho rozdělit tak, aby hlavní loop() pouze řídil provoz a jednotlivé aplikace byly ve vlastních podprogramech. Novou funkci tak můžu později přidat jako další položku menu, aniž bych musel překopávat celý systém. To odpovídá i stylu, který používám u větších Arduino projektů – krátká hlavní smyčka a skutečná práce rozdělená do pojmenovaných funkcí.
Hlavní menu
Po zapnutí se nejdřív zobrazí úvodní obrazovka a potom hlavní menu. V horní liště je název MICRODECK, aktuální napětí akumulátoru a číslo vybrané položky. Nabídka se ovládá šipkami na CardKB a potvrzuje klávesou Enter.


Ve verzi 1.0 jsou připravené tyto programy:
- Terminal – jednoduchý sériový terminál
- Poznámky – psaní a prohlížení textových poznámek na SD kartě
- WiFi scan – vyhledání okolních Wi-Fi sítí
- Mandelbrot – výpočet a vykreslení Mandelbrotovy množiny
- SD karta – informace o kartě a prohlížení jejího obsahu
- Test kláves – zobrazení kódu stisknuté klávesy
- Nastavení – kontrast, rychlost terminálu a úsporné funkce
Klávesa Esc má ve všech programech pokud možno stejný význam – návrat o úroveň zpět nebo zpět do hlavního menu. Díky tomu se ovládání nemusí pro každý podprogram učit znovu.
Terminál
Jednou z funkcí, kterou jsem chtěl mít od začátku, byl klasický sériový terminál. Cyberdeck tak můžu přes rozšiřující konektor připojit k jinému Arduinu, ESP nebo prakticky libovolnému zařízení s UARTem a používat ho jako malý samostatný terminál.

Ve finální verzi je pro něj použitý hardwarový UART1, který je vyvedený na rozšiřující port. Rychlost komunikace lze měnit v Nastavení od 300 až po 115200 baudů.
Terminál zobrazuje šest řádků textu, starší obsah automaticky posouvá nahoru a podporuje i základní speciální klávesy. Enter odešle dvojici znaků CR+LF, tedy návrat na začátek řádku a přechod na nový řádek, Backspace maže znak a směrové šipky jsou posílány jako ANSI sekvence.
Poznámky
Když už má Cyberdeck vlastní klávesnici a SD kartu, byla by škoda nemít možnost napsat si na něm obyčejnou textovou poznámku.

Program Poznámky používá na SD kartě adresář:
/POZNAMKY
Nové soubory dostávají automaticky názvy:
NOTE0001.TXT
NOTE0002.TXT
NOTE0003.TXT
...
Po otevření programu se zobrazí seznam uložených poznámek a položka pro vytvoření nové. V editoru se píše přímo na CardKB, Enter vloží nový řádek a Backspace maže poslední znak.
Pro uložení jsem zvolil klávesu Tab. Esc naopak editor opustí bez uložení změn. Uloženou poznámku lze znovu otevřít, procházet šipkami a případně pokračovat v její editaci.

Nejde samozřejmě o náhradu plnohodnotného textového editoru. Pro krátkou poznámku, pinout, naměřenou hodnotu nebo pár řádků textu je to ale přesně ta funkce, kterou jsem od malého cyberdecku chtěl.
Wi-Fi scanner
ESP32-S3 má samozřejmě vlastní Wi-Fi, takže další jednoduchou utilitou je vyhledávání sítí v okolí.

Po spuštění WiFi scan se Wi-Fi zapne do režimu stanice a provede se vyhledání dostupných sítí. Na displeji se potom zobrazují názvy SSID společně se sílou signálu v dBm. U zabezpečených sítí je navíc jednoduchá značka, aby byly na první pohled odlišitelné od otevřených.

Šipkami lze seznam posouvat a Enter spustí nové hledání. Po návratu do menu se Wi-Fi zase vypne, takže zbytečně nezvyšuje spotřebu v době, kdy není potřeba.
SD karta
Samostatná položka SD karta slouží hlavně jako rychlá kontrola úložiště. Po otevření se karta inicializuje a program zobrazí její stav, kapacitu a volné místo.

Pod tím je jednoduchý seznam souborů a adresářů v kořenovém adresáři. Složky a soubory jsou od sebe odlišené a seznamem lze listovat šipkami.
Zatím jde pouze o základní prohlížeč kořenového adresáře. Pro verzi 1.0 mi to stačí – důležité je, že SD karta funguje jako společné úložiště, které mohou využívat další podprogramy. Poznámky už jsou první z nich.
Mandelbrot
Mandelbrotova množina je trochu méně praktická položka, ale do podobného zařízení podle mě patří. Původně jsem tento výpočet používal už na jiném projektu a tady jsem ho přizpůsobil rozlišení 128 × 64 bodů.

Před výpočtem lze zadat maximální počet iterací od 10 do 999. Vyšší počet iterací umožní přesněji vykreslit oblasti kolem hranice množiny, ale samozřejmě také prodlouží výpočet.

Výpočet je udělaný neblokujícím způsobem po menších částech, takže je možné ho klávesou Esc přerušit. Zároveň se tato funkce hodí jako jednoduchý benchmark. Při zachování stejného rozlišení a počtu iterací můžu později porovnat Cyberdeck s dalšími deskami.
Test klávesnice
Program Test kláves vznikl původně při zprovozňování CardKB, ale nakonec jsem ho v systému nechal jako servisní utilitu.

Po stisku klávesy zobrazí její hodnotu v desítkové i šestnáctkové podobě a u běžných znaků také samotný znak. Hodí se to například při přidávání dalších funkcí, kdy potřebuji rychle zjistit, jaký kód konkrétní klávesa vrací.
Nastavení a ukládání konfigurace
V nabídce Nastavení lze měnit čtyři základní parametry:
- kontrast OLED displeje
- rychlost sériového terminálu
- dobu do automatického ztlumení displeje
- dobu do zhasnutí OLEDu

Konfigurace seukládá pomocí knihovny Preferences do NVS flash paměti ESP32-S3. SD karta tedy pro nastavení není potřeba a zvolená konfigurace zůstane zachovaná i po úplném vypnutí zařízení.
Do flash se navíc nezapisuje při každém stisku šipky. Hodnoty se uloží až ve chvíli, kdy Nastavení opustím klávesou Esc. Tím se počet zápisů výrazně omezí.
Úspora energie
OLED patří při běžném používání mezi výraznější spotřebiče, zvlášť když zobrazuje hodně rozsvícených bodů. Firmware proto sleduje dobu od posledního stisku klávesy.
Ve výchozím nastavení se displej po 30 sekundách nečinnosti ztlumí a po jedné minutě úplně přejde do úsporného režimu. Oba časy lze změnit nebo funkci úplně vypnout.
Po zhasnutí stačí stisknout libovolnou klávesu. První stisk pouze probudí obrazovku a dál se nezpracuje, takže například nehrozí, že bych při probouzení omylem spustil vybranou položku menu.
Při výpočtu Mandelbrotovy množiny se automatické vypnutí displeje dočasně nepoužívá, aby úsporný režim neovlivňoval případné měření doby výpočtu. Aktivitu naopak představují i data přicházející do terminálu, takže při probíhající komunikaci displej nezhasne.
Zatím jde hlavně o úsporu samotného OLEDu a vypínání Wi-Fi v době, kdy není potřeba. ESP32-S3 ještě nepřechází do light nebo deep sleep a společná napájecí větev periferií zůstává zapnutá. To je prostor pro některou z dalších verzí, pokud bude potřeba výdrž na baterii ještě výrazně prodloužit.
Základ pro další programy
Nejdůležitější pro mě na verzi 1.0 není počet funkcí, ale to, že už je hotová základní kostra celého systému. Funguje společné menu, klávesnice, displej, SD karta, nastavení, ukládání konfigurace i rozdělení jednotlivých aplikací.
Další verze už proto nemusí předělávat samotný základ Cyberdecku. Nový program stačí přidat jako další položku menu a vytvořit pro něj vlastní podprogramy. Právě tady se z původního pokusu s malým displejem a klávesnicí konečně stal použitelný základ pro další hraní.
Test výdrže akumulátoru
Když už byl Cyberdeck hotový a fungoval, zajímalo mě, jak dlouho vlastně vydrží běžet z vestavěného akumulátoru. Nechtěl jsem ale měřit nějaký ideální úsporný režim. Naopak jsem zvolil poměrně nepříznivé podmínky, abych získal spíš spodní hranici reálné výdrže.
Pro test jsem proto připravil jednoduchý program. ESP32-S3 běželo bez uspávání, OLED displej zůstával po celou dobu zapnutý a přibližně polovinu plochy zabíral svítící text. Každou minutu se navíc na SD kartu ukládal čas od spuštění a aktuální napětí akumulátoru.
Protože Cyberdeck nemá RTC, nebylo možné zapisovat skutečný čas. Program tedy počítal dobu od spuštění pomocí millis(). Pro tento účel to úplně stačí – důležitá byla pouze celková doba provozu.

První pokus nevyšel
První test bohužel nedopadl úplně podle plánu. Po vybití akumulátoru se ESP32 začalo opakovaně restartovat. Při každém startu program vytvořil nový CSV soubor a ještě stihl zapsat jeden řádek s napětím kolem 2,5 až 2,7 V, než se zařízení znovu vypnulo.
Výsledkem byla SD karta plná malých nebo úplně prázdných souborů. Navíc zmizel právě hlavní záznam vybíjení. Podle poškozených názvů souborů a chybějících čísel se pravděpodobně poškodil souborový systém karty během opakovaných výpadků napájení.
Program jsem proto upravil. Pokud napětí akumulátoru klesne na 3,00 V nebo méně pětkrát za sebou, provede se poslední zápis na SD kartu, soubor se zavře, karta se korektně ukončí a Cyberdeck přejde do deep sleep. Současně se vypne displej a napájení periferií. Tím se nejen chrání obsah SD karty, ale zároveň se akumulátor dál zbytečně nevybíjí.
Druhý test
Po naformátování SD karty jsem test spustil znovu. Akumulátor byl prakticky plně nabitý, i když program při startu naměřil pouze 4,054 V. Je možné, že nabíječka při současném odběru Cyberdecku nedokázala napětí dostat výš.
Tentokrát už celý test proběhl bez problémů. Napětí klesalo poměrně pozvolna:
- pod 3,9 V se dostalo přibližně po 31 minutách
- pod 3,7 V po 1 hodině a 17 minutách
- pod 3,5 V po 1 hodině a 56 minutách
- kolem 3,4 V už začalo klesat výrazně rychleji
Test byl automaticky ukončen po 2 hodinách, 27 minutách a 4 sekundách, kdy program naměřil 2,992 V a přešel do deep sleep.
Poslední záznam v souboru vypadal takto:
147;02:27:04;2.992;KONEC_3V

Na grafu je dobře vidět typický průběh vybíjení Li-ion akumulátoru. Většinu času napětí klesá poměrně pomalu, ale pod přibližně 3,4 V už se křivka začne výrazně lámat. Posledních několik desetin voltu proto představuje jen malou část celkové provozní doby.
Výsledek
Za těchto poměrně nepříznivých podmínek vydržel Cyberdeck mikro běžet 2 hodiny a 27 minut. Po celou dobu byl zapnutý OLED displej, ESP32 nebylo uspáváno a každou minutu probíhal zápis na SD kartu.
Reálná výdrž při běžném používání tak může být delší, hlavně pokud později využiju zhasínání displeje nebo některý z úsporných režimů ESP32. Pro mě je ale důležitější právě tento výsledek – i bez jakýchkoliv úspor můžu počítat přibližně se 2,5 hodinami nepřetržitého provozu.
Závěr
Myslím, že se mi Cyberdeck mikro povedl víc, než jsem na začátku čekal. Z původního nápadu na malý terminál vzniklo plně samostatné zařízení s klávesnicí, displejem, SD kartou, vlastní baterií a hlavně rozšiřujícím portem, přes který k němu můžu připojovat další hardware.
Po hardwarové stránce by se samozřejmě dalo ještě hodně vylepšovat, ale většina změn by znamenala větší krabičku, a to už nechci. Právě malé rozměry jsou pro mě jedna z hlavních vlastností celého projektu. Pro další rozšiřování proto raději využiju DA-15 konektor a budu vyrábět externí moduly podle konkrétního použití.
Také firmware verze 1.0 beru hlavně jako hotový základ. Funguje menu, terminál, poznámky, Wi-Fi scanner, SD karta, Mandelbrot, nastavení i ukládání konfigurace. Ještě zbývá prostor pro lepší práci s energií, protože ESP32-S3 zatím nepoužívá light ani deep sleep a napájení periferií zůstává zapnuté.
Jako první rozšíření plánuju připojit Bluetooth tiskárnu, kterou jsem sehnal téměř zadarmo. Potom bych chtěl vyrobit zvukový modul pro přehrávání hudby a rozhodně by to chtělo i nějakou jednoduchou hru. Teď už mám hlavně platformu, na které se dá dál pokusničit – a přesně to jsem od Cyberdecku mikro chtěl.

Tohle je top, moc pěkné. Držím palce v dalším vývoji. Zasloužilo by si to i repo na githubu a rovnou i model pro vytištění na 3D tiskárně
Díky
Moc hezké, akorát bych akumulátor nenechal vybíjet pod 3.4V.
Díky. S aku souhlasim, proto tam mám monitorování napětí 😉