Cyberdeck mikro

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í:

OLEDESP32-S3Funkce
VCC3,3 VNapájení
GNDGNDZem
SCKGPIO7SPI hodiny
MOSI / SDAGPIO6SPI data
CSGPIO5Výběr displeje
DCGPIO4Rozlišení dat a příkazů
RSTGPIO15Reset 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:

CardKBPřevodníkESP32-S3
SDA5V strana → 3,3V stranaGPIO42
SCL5V strana → 3,3V stranaGPIO2
VCC—5 V ze step-up měniče
GNDspolečná zemGND

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:

microSDESP32-S3Funkce
VCC3,3 VNapájení
GNDGNDZem
MISOGPIO21Data z karty
SCKGPIO38SPI hodiny
MOSIGPIO39Data do karty
CSGPIO41Vý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-15FunkceESP32-S3
1GNDGND
2+3,3 V3,3 V
3I²C SDAGPIO1
4I²C SCLGPIO48
5UART TXGPIO17
6UART RXGPIO18
7GNDGND
8SPI SCKGPIO38
9SPI MOSIGPIO39
10SPI MISOGPIO21
11SPI CSGPIO16
12univerzální GPIOGPIO8
13+5 V5 V
14nezapojenoNC
15nezapojenoNC

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.

Původní návrh v plastové krabičce

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

Základní díly

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.

Instalace komponent

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.

Detail umístění displeje do rámečku

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.

Hotovo

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.

Úvodní obrazovka

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.

Hlavní menu. Položky 1-5
Hlavní menu. Položky 3-7

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.

Program 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 – Menu

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.

Editace nové poznámky

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í.

Program Wifi scan

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.

Nalezené sítě

Š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.

Program SD karta

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ů.

Program Mandelbrot – menu

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 50 iterací

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.

Program Test kláves

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
Položka Nastavení

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.

Obrazovka Cyberdecku během testu výdrže

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
Průběh napětí akumulátoru během vybíjení

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.

Související články

4 komentáře u „Cyberdeck mikro“

  1. 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ě

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *