Pod názvem JLX12864G lze z Číny přibližně za stokorunu sehnat modul s grafickým displejem z tekutých krystalů (LCD) s rozlišením 128x64 bodů a zobrazovací plochou 23*37mm. Displej je řízen driverem UC1701 a existuje k němu kvalitní datasheet (což je mnohdy u čínských modulů problém). Samotné zapojení displeje ke driveru, které je potřeba znát ke správné konfiguraci driveru, přirozeně už zdokumentované není. To je ale naštěstí jen minimální komplikace.
Podsvícení - K podsvícení slouží bílá LED, připojená katodou na GND modulu. Anoda je přes odpor R2 (120R) přivedena na pin LEDA. Prahové napětí diody 2.7V při proudu 5mA je překvapivě nízké. Vzhledem k tomu, že jde o LCD displej, který je z principu věci ve vnějším osvětlení čitelný, slouží podsvícení v podstatě výhradně k provozu "v noci" nebo obecně v temných podmínkách a tudíž nepotřebuje žádný velký světelný výkon. I při 5mA je jas dle mého názoru zbytečně velký. Připojením 3.3V na LEDA dosáhneme již zmíněných 5mA, připojením 5V vzroste proud na přibližně 17mA. Ve většině případů bude tedy možné budit podsvícení přímo pinem MCU (STMka dodají 5mA naprosto v pohodě a AVR s 5V napájením si s necelými 20mA také legálně poradí). Nabízí se tedy řídit jas pomocí PWM. Další možnost jak jas snížit je připojit k LEDA sériově další rezistor.
Provozní napětí - Driver i displej mohou běžet na 3.3V i 2.5V. Konstruktér modulu byl asi velký šprýmař. Z výroby je na modulu osazen 3.3V regulátor napětí AMS1117-3.3 (resp. jeho alternativa). Ten má dropout (minimální rozdíl vstupního a výstupního napětí) něco pod 1V. To znamená, že aby správně pracoval musíte na jeho vstup přivést napětí větší jak cca 4.3V, což prakticky znamená, že tam přivedete 5V. Komunikační rozhraní (o němž bude řeč později) ale dovoluje maximální napětí 3.6V. Na první pohled je tedy záhadou jaký má 3.3V stabilizátor význam. Domnívám se, že zamýšlený scénář použití vypadá následovně. Uživatel připojí 5V Arduino k modulu a protože 5V napájení by driver (UC1701) zničilo, ochrání ho před přímou destrukcí zmíněný regulátor napětí. Na piny komunikačního rozhraní se pak už bezohledně přivede 5V digitální signál a soudruzi z Číny už mají ověřené, že to driver nějak přežije. Tahle situace vám poněkud komplikuje práci. Protože máte-li systém napájený pouze 3.3V, musíte regulátor napětí přemostit. Na to je naštěstí na desce pájecí "jumper" (R1). A když už budete přemosťovat tak můžete regulátor rovnou odpájet a snížit citelně odběr modulu. Tady je patrné jak zhoubný dopad na kvalitu HW má Arduino komunita ... na druhou stranu nelze jí upřít nesporné zásluhy za to, že je modul tak levný. K dostání jsou i moduly neosazené regulátorem napětí.
Komunikační rozhraní - Komunikační rozhraní je jednosměrné SPI (mode 3) s maximální rychlostí 33Mb/s (při 3.3V). Komunikace se provádí pomocí linek:
CS - Chip Select (aktivní v log.0)
SDA - Alias MOSI (data do driveru)
SCK - Clock (driver čte data na vzestupnou hranu)
CD (RS) - Command/Data pin. Log.1 znamená, že byte obsahuje data ke zobrazení, log.0 znamená, že byte je příkaz. Driver snímá stav CD pinu s první vzestupnou hranou SCK v rámci jednoho bytu.
RST - Reset driveru (akvitní v log.0). Lze jej zapojit přes pullup nebo napevno k VDD, protože reset lze vyvolat i příkazem po SPI.
ROM - Na modulu je osazena ROM, jejíž obsah mi není znám. Pravděpodobně je v ní znaková sada, ale vzhledem k totální absenci dokumentace jejího rozhraní (SPI) i obsahu je tam asi zbytečně. Paměť s nezapojenými vstupy má spotřebu skoro 2mA. Její spotřeba by měla klesnou na jednotky uA uzemněním ROM_CS. Pokud tedy plánujete použít displej na aplikace s nízkou spotřebou, mějte to na paměti. Osobně jsem ROM odpájel spolu se stabilizátorem.
Spotřeba - Samotný driver při 3.3V má v režimu spánku (výchozí stav) spotřebu okolo 31uA. V aktivním režimu je spotřeba okolo 290uA. To vše za situace kdy je z modulu odpájen regulátor napětí i ROM.
Tvar Pixelu - Jak už jsem uváděl, displej má "viewing area" 23x37mm a rozlišení 128x64px. Bystrý čtenář si všimne že oba poměry nejsou stejné. Obraz je v poměru 1:1.61 a rozlišení v poměru 1:2. To znamená že pixel nemá čtvercový tvar ale je to mírný obdélník. Na většinu grafiky to nevadí, ale mějte na paměti, že to drobně deformuje tvar fontů a hlavně ... že to dost komplikuje kreslení kružnic :D
Driver UC1701
Na obrázku 3 je modul upraven do nejvhodnější konfigurace, takhle může pracovat s napájecím mezi 2.5V a 3.3V. Driver UC1701 má obrazovou paměť (Displej Data RAM) 132x65 pixelů. Displej má ale jen 128x64 pixelů (128x8 Byte). To znemožňuje přepsat celý její obsah jednou SPI sekvencí a nutí programátora aby přepis prováděl "po řádcích". Tedy aby po dosažení 128. sloupce, poslal příkaz s adresou prvního prvku nového řádku. To je škoda hlavně z toho důvodu, že to komplikuje využití DMA k přenosu obrazových dat. Na použití driveru je komplikovaná pouze inicializace. Částečně se lze inspirovat z "ukázkového" zdrojového kódu v dokumentaci k modulu, ale jako zaručenou informaci ho brát nemůžete. Konfiguraci některých parametrů jsem tedy odladil metodou pokus-omyl a věřím, že je správná.
Ovladač
Ovladač (SW) jsem pojal tak aby byla striktně oddělená vrstva komunikace s UC1701 od grafiky. Protože komunikační rozhraní neumožňuje čtení z UC1701 zvolil jsem variantu kdy je celý obrazový buffer skladován v paměti MCU. Pro displej těchto rozměrů je to asi vhodná volba. Celý obraz zabírá pouze 1kB. Díky tomu, že je v RAM MCU lze v něm snadno provádět grafické operace (výpis textu, vykreslování geometrických obrazců apod.). Ovladač pak může být velice jednoduchý a obsahovat pouze kód k inicializaci pinů a periferií, inicializaci displeje, posílání příkazů (například k vypínání) a jedinou funkci pro přepis celé obrazové RAM. Díky tomu je snadné ovladač portovat na jiné platformy.
Zdrojový kód ovladače k UC1701 v různých variantách je ke stažení zde. Postupně jak budu kód portovat ebo vylepšovat sem přidám další varianty:
Grafická knihovna se postupně rozrůstá. Klíčovým prvkem je schopnost importu fontů pomocí TheDotFactory. Návod na import a její použití bude v dalších dílech tutoriálu.