3.1 LCD displej s čipom ST7789
Grafický čip ST7789
Zariadenie M5StickC Plus je vybavené LCD IPS displejom s rozlíšením 135 × 240 px a 16-bitovými farbami. Využíva ovládací čip ST7789, pripojený cez zbernicu SPI s maximálnou frekvenciou 80 MHz. Rovnaký displej má aj populárna vývojová doska TTGO (či po novom LILYGO) T-Display, a to aj vo verzii T-Display RP2040.
Oficiálne maximum frekvencie SPI zbernice na tých pinoch, ku ktorým je displej pripojený na ESP32, je 26,6 MHz. MicroPython oficiálne ani nedovolí nastaviť viac, no náš špeciálny firmvér toto obmedzenie odstraňuje. Funkčnosť už nie je garantovaná, ale na 40 MHz by sa nemali vyskytnúť žiadne problémy. Maximum 80 MHz už bude spôsobovať rôzne artefakty, v horšom prípade „zamrznutie“.
Podpora tohto čipu nie je priamo integrovaná v MicroPython, no môžeme využiť:
- klasickú externú MicroPython knižnicu: GitHub devbis (Ivan Belokobylskiy) - st7789py_mpy - ide však o veľmi pomalý variant;
- upravenú implementáciu MicroPython (firmvér) so zabudovanou podporou displeja: GitHub Dušan Zervan - st7789_mpy-builder (pre klasický ESP32 firmvér s predponou „ESP32_“);
- vzdelávaciu inštaláciu - firmvér vychádzajúci z variantu 2, obohatený aj o ďalšie objekty M5Stick.
Používať budeme variant 3, teda našu vzdelávaciu inštaláciu (súbor .bin nájdete v Classroom). V nej je displej už pripravený ako objekt ST7789 pod menom M5Stick.lcd, samotná SPI zbernica je dostupná ako M5Stick.spi.
Ovládanie podsvietenia
Na pôvodný M5StickC Plus (oranžový) je nutné podsvietenie displeja zapnúť cez správu napájania (PMU) a pre úsporu energie potom podobne aj vypnúť. V školskej inštalácii je to možné dosiahnuť príkazmi:
M5Stick.pmu.lcd_on()M5Stick.pmu.lcd_off()
Nový M5StickC Plus2 (žltý) už nemá podsvietenie vedené cez PMU, ale priamo cez GPIO s LED, takže vypnutie a zapnutie je možné priamo cez objekt ST7789:
M5Stick.lcd.on()M5Stick.lcd.off()
V oboch prípadoch sa po vypnutí podsvietenia obraz zachová v pamäti.
Objekt ST7789
Objekt ST7789 poskytuje základné funkcie ovládania:
- .init(): úvodná inicializácia displeja - vypne režim spánku a následne vymaže obraz;
- .on() / .off(): zapne / vypne podsvietenie, ak je nastavený pin pre backlight (na pôvodnom M5Stick nie je) - no výhodnejšie je objektu nedávať tento pin a spravovať si ho cez PWM;
- .sleep_mode({hodnota}): režim spánku (True/False) - prestane zobrazovať obraz (zachová sa v pamäti) a zníži odber energie;
- .rotation({hodnota}): nastaví otočenie obrazu (0 = 0°, 1 = 90°, 2 = 180°, 3 = 270°) - mali by sme vykonať ešte pred inicializáciou;
- .width() / .height(): vráti šírku a výšku obrazu (so zohľadnením rotácie).
Jednoduchá cesta - objekt M5Stick
V našej vzdelávacej inštalácii je displej už pripravený na používanie:
import M5Stick
print(M5Stick.spi)
displej = M5Stick.lcd
displej.rotation(0)
displej.init()
# nový žltý M5StickC Plus2 má priame podsvietenie, init() ho aj zapne
# starý oranžový M5StickC Plus má podsvietenie cez PMU, musíme zapnúť
if hasattr(M5Stick, "pmu"):
M5Stick.pmu.lcd_on()
Vlastná inicializácia
Ak potrebujeme displej inicializovať sami, musíme v prvom rade poznať zapojenie a všetky piny nakonfigurovať v programe. Konštruktor objektu ST7789 očakáva parametre: objekt SPI, šírku, výšku a objekty Pin pre reset, dc a cs.
| M5StickC Plus | M5StickC Plus2 | T-Display | T-Display RP2040 | |
| SPI SCK |
GPIO 13 |
GPIO 13 | GPIO 18 | GPIO 2 |
| SPI MOSI | GPIO 15 | GPIO 15 | GPIO 19 | GPIO 3 |
| SPI MISO | None | None | None | None |
| vstup displeja DC | GPIO 23 | GPIO 14 | GPIO 16 | GPIO 1 |
| vstup displeja RST | GPIO 18 | GPIO 12 | GPIO 23 | GPIO 6 |
| vstup displeja CS | GPIO 5 | GPIO 5 | GPIO 5 | GPIO 5 |
| vstup displeja BL | - | GPIO 27 | GPIO 4 | GPIO 4 |
Ako sme už spomínali, pôvodný M5StickC Plus (oranžový) nemá pin BL (backlight, teda podsvietenie) a je nutné využiť správu napájania - konkrétne cez čip AXP192, výstup LDO2.
Vývojová doska TTGO T-Display RP2040 má frekvenciu SPI zbernice obmedzenú do 62,5 MHz a treba ešte nastaviť SPI polarity a SPI phase na hodnotu 1.
Konkrétna inicializácia displeja pre všetky uvedené dosky:
# pôvodný M5StickC Plus (oranžový)
spi = SPI(1, baudrate = 40_000_000, sck = Pin(13), mosi = Pin(15), miso = None)
displej = ST7789(spi, 135, 240, dc = Pin(23, Pin.OUT), reset = Pin(18, Pin.OUT), cs = Pin(5, Pin.OUT))
# nový M5StickC Plus2 (žltý)
spi = SPI(1, baudrate = 40_000_000, sck = Pin(13), mosi = Pin(15), miso = None)
displej = ST7789(spi, 135, 240, dc = Pin(14, Pin.OUT), reset = Pin(12, Pin.OUT), cs = Pin(5, Pin.OUT), backlight = Pin(27, Pin.OUT))
# T-Display
spi = SPI(1, baudrate = 40_000_000, sck = Pin(18), mosi = Pin(19), miso = None)
displej = ST7789(spi, 135, 240, dc = Pin(16, Pin.OUT), reset = Pin(23, Pin.OUT), cs = Pin(5, Pin.OUT), backlight = Pin(4, Pin.OUT))
# T-Display RP2040
spi = SPI(0, baudrate = 62_500_000, sck = Pin(2), mosi = Pin(3), miso = None, polarity = 1, phase = 1)
displej = ST7789(spi, 135, 240, dc = Pin(1, Pin.OUT), reset = Pin(6, Pin.OUT), cs = Pin(5, Pin.OUT), backlight = Pin(4, Pin.OUT))
Šetrenie energie
Na všetkých zariadeniach je (s odchýlkou ±1 mA) rozdiel odoberaného prúdu medzi zapnutým a vypnutým podsvietením displeja 17 mA. Nezávisle od toho aktivácia režimu spánku displeja ušetrí 8 mA, teda celkovo je rozdiel medzi vypnutým a zapnutým stavom 25 mA. Toto je hodnota, ktorú sa už pri behu na batériu oplatí šetriť a displej vypínať, keď nie je potrebný - napríklad pri neaktivite, či keď detekcia pohybu dlhšie nič nezaznamenala.