amaro07

Octopus LAB – MicroPython pro ESP32 (7)

V této části se zaměříme na běžné a dostupné zobrazovací jednotky, které často nazýváme displeje.
Anglické slovo „display“ se do češtiny obvykle překládá jako „zobrazovat“ nebo „ukázat.“ Používá se ale i pro označení displeje nebo obrazovky, na které se něco zobrazuje, a může se proto přeložit jako „displej“ nebo „obrazovka“. Použití je jasné a souvisí s druhem či účelem zařízení, ale dovolím si zdůraznit velkou důležitost i při vytváření projektu. Zobrazování mezivýsledků při vývoji je nejen nezbytné pro správné odladění celého systému, ale zásadně se podílí na úspěšnosti hledání případných chyb, čímž celý vývoj podstatně urychluje. Proto se displejům budeme podrobněji věnovat hned na začátku, než se pustíme do složitějších a komplexnějších záležitostí.


Jakým způsobem se dá k ESP připojit displej?

Nebudeme se bavit o velkých monitorech s konektorem VGA nebo HDMI, ale soustředíme se na malé kompaktní moduly, připojitelné pomocí několika PINů k mikrokontroléru. Možná je vhodné se na tomto místě ještě zmínit o základních digitálních sběrnicích pro komunikaci s jinými zařízeními, které samozřejmě slouží i pro připojení zobrazovacích jednotek:

1. UART (Universal Asynchronous Receiver/Transmitter):

  • UART je sériová komunikační sběrnice, která umožňuje přenos dat mezi ESP32 a jinými zařízeními (sériově – za sebou, jeden bit za druhým).
  • Používá se pro komunikaci s různými periferiemi, jako jsou senzory, GPS moduly, ale i displeje.
  • UART používá dvě datové linky: TX (přenos/vysílání dat) a RX (příjem dat).

2. I2C (Inter-Integrated Circuit):

  • I2C je dvoudrátová sběrnice, která umožňuje komunikaci mezi ESP32 a více periferiemi, které jsou připojeny ke stejné sběrnici. Navržena byla pro spolupráci integrovaných obvodů na jedné desce.
  • Využívá dvě linky: jednu pro hodiny SCL (Serial Clock Line) a druhou pro data SDA (Serial Data Line).
  • Každé zařízení na sběrnici má svoji jedinečnou adresu, což umožňuje komunikaci vždy pouze s jedním konkrétním zařízením na sběrnici.
  • I2C je často používáno i pro připojení senzorů, EEPROM pamětí, LCD či OLED displejů a jiných periferií. Doporučujeme dodržet „TTL vzdálenost“ vodičů (max 30 cm).

3. SPI (Serial Peripheral Interface):

  • SPI je sériová komunikační sběrnice, která je často používána pro rychlou komunikaci mezi ESP32 a periferiemi, jako jsou displeje, paměti a další zařízení, která vyžadují vysokou propustnost dat.
  • SPI používá čtyři linky: MISO (Master In Slave Out), MOSI (Master Out Slave In), SCLK (Serial Clock) a SS/CS (Slave Select/Chip Select).

Vybraným typům displejů se budeme věnovat samostatně. Následující ukázky kódu jsou součástí Frameworku esp32_micropython_framework
github.com/octopuslab-cz/esp32_micropython_framework.
Předpokládá se, že máte úspěšně framework nainstalován a správně nakonfigurovanou desku.

Samozřejmě že nemusíte používat OctopusLAB moduly ani náš MicroPython framework. Váš program bude mít jen více řádků a někdy se můžete zaseknout na nějaké neočekávané chybě. Můžete vycházet z veřejně dostupných knihoven, které jsou na Githubu. My se snažíme především začínajícím vývojářům co nejvíce ulehčit práci. Ty pokročilejší bychom rádi motivovali k tvorbě vlastních knihoven a pokud možno jejich sdílení s komunitou.


Display8 – osm sedmisegmentovek

Obr. 1


Svítivé sedmisegmentovky jsou již několik desetiletí velmi oblíbené pro relativně jednoduché zapojení, dobrou čitelnost a dlouhou životnost. Využíváme například modulu s obvodem MAX7219, který se připojuje pomocí SPI. K připojení osmi sedmisegmentovek s obvodem MAX nám tak postačí pětice vodičů (včetně napájení) a je to proto do začátku ideální displej pro základy práce s mikrokontrolérem. Pro zobrazení „retro hranatých“ číslic využívá sedm segmentů, a číslic umí zobrazit osm najednou – proto disp8. (V předchozí verzi v roce 2016 jsme ho nazvali podle sedmi segmentů disp7, což se ale po čase ukázalo jako méně vhodné, hlavně v případě hned následujícího modulu disp4 (na obrázku č.1 je čtyřznakový displej vlevo ve variantě IR teploměru a uprostřed dole jako modul hodin).

Přestože se obvod MAX zapojuje většinou na 5V (Vcc), při použití jediného modulu nám to funguje i na 3.3V. Proto využíváme přímého propojení s OCTOBUSEM (což je jen formální pojmenování PINů pro unifikované opakované použití).

připojení Disp8 k ESP32:
MAX  --> OCTOBUS      (PIN)
---------------------------
Vcc  --> 3V
GND  --> GND
DOUT --> SPI_MOSI_PIN (23)
LODA --> SPI_CS0_PIN  (5)
CLK  --> SPI_CLK_PIN  (18)

Následující kód tvoří jednoduchý základ pro zobrazení údaje (nebo jednoduchého „textu“) na displeji. Vytvoříme instanci d8 objektu Display8. Předávanými parametry jsou instance spi (objektu sběrnice SPI) a PIN pro ss (chip select). Hlavní metodou pro zobrazení údaje na displeji je pak show() s parametrem zobrazovaného „textu“ (čísla).

Pro takto zjednodušené použití musíte mít nastaven základní modul ESP32 nebo modul, který využíváte. Pomocí metody setup() (z MicroPythonového terminálu s promptem) nastavíte pomocí ds [device setting] například DoIt modul (volbou čísla „1“). Framework pak může přímo odkazovat k „tabulkám“ PInů. V adresáři pinouts/ se pak využije esp32_base.py a esp32_doit_adapter.py. V těchto souborech je pouze výpis použitých (dostupných pinů) s přiřazením čísla (konstanty) každému jednotlivému názvu. Například: SPI_CS0_PIN = const(5). Nemusíme pak pokaždé znovu bádat, které PINy použít a ověřovat, zda to s nimi bude fungovat. Pomocí metody set_pinout() inicializujeme instanci pinout a pak už jen postačí, když se odkážeme parametrem k SPI_CS (chip select): pinout.pinout.SPI_CS0_PIN obsahuje číslo 5, což je ověřené číslo PINu na OCTOBUSU pro SPI_DISPLAY.

from machine import Pin
from components.display8 import Display8
from octopus_lib import spi_init
from utils.pinout import set_pinout

pinout = set_pinout()

spi = spi_init()
ss = Pin(pinout.SPI_CS0_PIN, Pin.OUT)
d8 = Display8(spi, ss)

d8.show('octopus')

Na displeji se zobrazí slovo „octoPuS“ v mezích možností segdmisegmetového zobrazení. Displej je určen především pro zobrazování číslic, ale některé znaky zvládne také (například pro hexadecimální …ABCDEF). Obdobný modul se shodným ovladačem je matice 8×8 svítivých diod, ale o něm snad někdy příště.

Samozřejmě, že se můžete pokusit připojit si displej i napřímo. Ale každá jedna sedmisegmentová LED číslovka potřebuje 8 datových PINů (počítáme-li i tečku, jinak by stačilo sedm). Připojení tří segmentovek by nám teoreticky sebralo 24 PINů (3×8), což by k ESP32 šlo připojit dost složitě a navíc by nám už nezbyly žádné PINy pro projekt. Čtyři číslovky už k ESP32 napřímo nepřipojíme (4×8=32). Řešívá se to, že se jednotlivé segmentovky ovládají multiplexně, to znamená že postupně zobrazujete data vždy jen pro jedinou číslici. Rychle a cyklicky se střídají všechny za sebou, lidské oko ale uvidí zdánlivě všechny tři/čtyři svítící zároveň. Pokud si pořídíte vícečíslicovou sedmisegmentovku (nejdostupnější jsou pro 2,3 a 4 číslice) bývají už většinou zapojeny pro multiplexní provoz (pak se řeší zda mají pro všechny propojené LEDky společnou anodu či společnou katodu). Zobrazování ale musíte detailně obsloužit ve svém programu, což může značně snížit rychlost provádění ostatních procedur. Právě proto se hodí samostatné a do jisté míry inteligentní moduly, které připojíme jen pomocí několika vodičů a jejichž ovládání je podstatně jednodušší a ani nezdržuje mikrokontrolér od vykonávání možná podstatnějších činností.

Obr. 2

Pro ilustraci předkládáme obrázek (č. 2) propojení čtyřznakového displeje se společnou anodou. (Každý znak Dig.1 až Dig.4 má propojeny anody LEDek) segmentů ag včetně tečky dp. (například pro zobrazení jedničky rozsvítíme segmenty b a c), o které se jedná je vidět na obrázku č. 3.

POZOR, obvod MAX pracuje s displeji se společnou katodou, pokud se rozhodnete ho sami sestrojit. V tomto případě můžete použít základ z obrázku 3.


Dispaly4 – čtyři sedmisegmentovky

Jádro tohoto modulu může tvořit obvod TM1637, což je čipový řadič číslicového sedmisegmentového displeje se čtyřmi číslicemi. S ESP32 komunikuje pomocí jednoduchého sériového rozhraní, které zahrnuje linky pro přenos dat a řízení. Nejčastěji se používá pro hodiny (bývá většinou i s dvojtečkou) nebo pro teploměr, ale využití najde v mnoha jiných zařízeních či projektech.

Připojení modulu k ESP32 je podobné, jako k SPI (využíváme značení pro Octopus Framework), ale řídící PINy si můžete zvolit i jinak:

připojení Disp4 k ESP32:
TM  --> Octopus FM  (PIN)
--------------------------
CLK --> SPI_CLK_PIN  (18)
DIO --> SPI_MISO_PIN (19)
GND --> GND
Vcc --> 5V

Modul s obvodem TM (alespoň ty, které máme k dispozici) už vyžaduje napájení 5V.
Následující ukázka demonstruje jednoduché použití s OctopusLAB Frameworkem. Vytváříme instanci tm objektu TM1637Decimal, které předáváme PINy pro clk (hodiny) a dio (data). Základní metoda pro zobrazení textu (čísla) je pak show().
Pokud nevyužijete OctopusLAB Framework můžete obejít instanci pinout tak, že předáte čísla PINů přímo. Ale stejně musíte mít k dispozici knihovnu pro TM.

from machine import Pin
from utils.pinout import set_pinout
from components.display4 import TM1637Decimal

pinout = set_pinout()

tm = TM1637Decimal(clk=Pin(pinout.SPI_CLK_PIN), dio=Pin(pinout.SPI_MISO_PIN))
tm.show('1234')




LCD (Liquid Crystal Display) s modulem I2C

Obr. 4

HD44780 je integrovaný obvod firmy Hitachi, který se stal standardním rozhraním pro ovládání malých řádkových alfanumerických displejů. Tento čip řídí zobrazení textu a symbolů na LCD displeji a poskytuje jednoduché a standardizované rozhraní pro mikrokontroléry a jiná zařízení. Je to spolehlivý a jednoduchý způsob, jak přidat textový výstup do projektů, které vyžadují vizuální zobrazování informací.

  1. Základní Funkce: HD44780 umožňuje „vykreslit“ text na LCD displeji ve standardním znakovém formátu. Obvod ovládá obvykle dvouřádkový nebo čtyřřádkový displej a podporují alfanumerické znaky a některé speciální symboly (které se dají i doprogramovat). Znak je zpravidla definován ve formátu 5×8 PIXELů.
  2. Řídicí Piny: Obvod komunikuje po sběrnici o šíři 4 nebo 8 bitů a 3 řídících bitů. Řídicí PINy (bity) zahrnují EN (Enable), RS (Register Select) a RW (Read/Write).
  3. Zjednodušení: S výhodou využíváme rozšiřující modul I2C expandéru (s obvodem PCF8574), který nám umožní připojit celý displej jen za pomocí čtyř vodičů (včetně napájení).
  4. Použití: Moduly LCD displejů jsou populární už mnoho let v různých aplikacích, jako jsou digitální hodiny, tiskárny, průmyslová zařízení (kotle, klimatizace), a další elektronické přístroje, kde je potřeba zobrazovat text nebo informace uživateli.
  5. Kontrast: Většina LCD displejů má nastavitelný kontrast a podsvícení, což umožňuje měnit viditelnost textu na displeji.
  6. Rozlišení: Rozlišení LCD displejů se obvykle udává v počtu znaků na řádek (nejčastěji 16×2 pro 16 znaků na dvouřádkovém displeji nebo 20×4 pro čtyřřádkový displej).

from octopus_lib import i2c_init
from components.display_i2c_lcd import I2cLcd

i2c = i2c_init()
addr, rows, col = 39, 2, 16
lcd = I2cLcd(i2c, addr, rows, col) 

lcd.putstr("-  octopusLAB  -")
lcd.move_to(0,1)
lcd.putstr("|  temp: ...  |")

Základ programu pro vypisování textových údajů na LCD displeji není složitý. Vytváříme instanci lcd objektu I2cLcd. Konstruktoru objektu předáme čtveřici parametrů: instanci i2c , addr je I2C adresa displeje, rows určuje počet řádků (2 nebo 4) a poslední je col pro počet sloupců (znaků na řádek). K zobrazení textu na displeji slouží metoda putstr(). Za zmínku stojí metoda move_to(), která přesouvá kurzor na novou pozici sloupce a řádku, přičemž další text se pak vypisuje až od tohoto místa. Tímto způsobem můžeme programově určit, kde se má co vypisovat.
Pokud si nejste jistí, jakou adresu má váš displej, můžete použít metodu scan() instance i2c ve formátu: print(i2c.scan()). Ta vám vypíše adresy všech dostupných zařízení na i2c sběrnici. V našem případě to bylo [ 39 ] (vypisuje to jako pole). V projektu emulátoru Intel8085 (na obrázku č.4 nahoře) využíváme tří expandérů (každý na jiné adrese), tam nám metoda vrátila trojici čísel. Jeden expandér máme pro osmici LEDek, jeden pro osmici mikrospínačů a ten třetí je pro LCD displej.


poznámka pro redaktora:

uvidíme, jak se vejde, mám displejů na skoro tři díly…

ty hlavní velké obrázky (obr. 1 a obr. 4) jsou zamýšleny přes celou šířku – jiné menší, jak to vyjde, někdy postačí i na vaší klasickou 1/3
bylo by ideální mít možnost sázet některé obrázky (a také texty, kde je programový kód) na půl šířky stránky – nechci měnit koncept časopisu, ale dva sloupce… by se i lépe četly a při zvětšeném písmu (což jste redesignem provedli) by se toho paradoxně vešlo i víc – resp. lépe

toto (ve žlutém bloku) tradičně prosím do časopisu „nesázet“ 😉

a zde, pod blokem – je to zase něco, co by mohlo být v barevném rámečku, jako „zajímavost“?



Jelikož nám nestačila velikost dodávaného modulu, vytvořili jsem si vlastní desku pro ESP32 DoIt, na kterou můžeme variantně osadit další dvě velikosti displejů (A / B).