amaro08

Octopus LAB – MicroPython pro ESP32 (8)

V tomto pokračování o displejích se ještě zastavíme u jednoho ovladače sedmisegmentových LED displejů. Pak si ukážeme, jak připojit malé OLED moduly. Opět s jednoduchým „několikadrátovým“ připojením (SPI nebo I2C) a s fragmenty fungujícího kódu postaveném na MicroPython Frameworku od Octopus LABu.


TM1638 – osm sedmisegmentovek

V předchozím díle jsme popisovali využití obvodu MAX7219, který slouží k připojení osmi sedmisegmentovek nebo matice 8×8 LEDek. Obvod TM1638 má oproti tomu také vstupní část, která umožňuje zapojit i „klávesnici“, osm bitů přímo nebo maticově zapojené spínače (odzkoušeno máme 3×7, šlo by i 3×8). Na obrázku 1 je základní zapojení, ve kterém využíváme opět dva moduly se čtyřmi segmentovkami. Klávesnici pak připojujeme jako externí ke konektoru 3×7 (nebo 3×8) k pinům (K1, K2, K3) x (D1, …, D8)

Obr. 1
připojení TM1638 k ESP32:
TM  --> RIGHT OCTOBUS (PIN)
---------------------------
Vcc  --> 3V
GND  --> GND
STB  --> SPI_MOSI_PIN (23)
CLK  --> SPI_MISO_PIN (19)
DIO  --> SPI_CLK_PIN  (18)

Následující ukázka kódu je opět jen minimalistické zjednodušení a demonstrace relativní jednoduchosti, když máte knihovny odladěné. Přesto vám doporučujeme vždy si každé zapojení co nejvíce odzkoušet. My v první verzi HW měli chybu (byly tam prohozené čtveřice displejů „levý za pravý“), proto jsme museli dělat programové „korekce“, které musely v knihovně zůstat, ale v nové verzi už to máme opraveno. Také nepoužití pinu SPI_CLK_PIN pro CLK vycházelo z nějakého obecného modulu, který se dal k OCTOBUSU připojit bez křížení, proto jsme značení PINů úplně nedodrželi (což nám SDK ESP32 umožňuje, tak proč toho nevyužít).

from machine import Pin
from utils.pinout import set_pinout
from components.tm1638 import TM1638

pinout = set_pinout()
S = Pin(pinout.SPI_MOSI_PIN)
C = Pin(pinout.SPI_MISO_PIN)
D = Pin(pinout.SPI_CLK_PIN)

tm = TM1638(stb=S,clk=C,dio=D)

tm.show("octopus")

# test klavesnice
btn_read = tm.keys()
print(btn_read)
# > (0, 0, 0, 0, 0)


TM1638 je často používán v projektech či zařízeních, které vyžadují uživatelské rozhraní s tlačítky a zobrazením informací na LED displeji. Umožňuje tak snadné ovládání tlačítek a displeje pomocí malého počtu pinů, což ho činí atraktivním pro různé projekty, jako jsou hodiny, teploměry, „herní“ konzole a další. My jsme ho minulý rok využili pro emulátor historických mikropočítačových systémů (na obrázku 2). Vytvořili jsme si klávesnici s hexadecimálními znaky (0-F) a několika řídícími klávesami. Ze začátku jsme otestovali jednoduchou emulaci obecného osmibitového procesoru (zjednodušení verze 8080), pak jsme se zaměřili na HP5036A, který je založen na osmibitovém mikroprocesoru Intel 8085. Uměli bychom emulovat i PMI-80, což je obdobný československý mikropočítač, jehož jádro tvořil obvod MHB 8080 a celou řadu podobných retro počítačů včetně sestavy KIM-1 (s mikroprocesorem 6502). Hlavní část emulátoru i s modulem displeje je v samostatném repozitáři na Githubu, kde tvoří jádro projektu UDI_22 (Univerzální digitální rozhraní):
https://github.com/octopuslab-cz/esp32_micropython_uni_digi_interface

Obr. 2

OLED

OLED (Organic Light-Emitting Diode) displeje používají pro emisi světla organické sloučeniny, což umožňuje vytvářet tenké a světlé displeje s výborným kontrastem. Jsou populární pro svou nízkou spotřebu energie, výbornou kontrastní ostrost a rychlou odezvu. Nízká spotřeba je způsobena tím, že svítí pouze aktivní pixely, displej nepotřebuje žádné podsvícení (na rozdíl od LCD či většiny TFT). Když pixel není „zapnut“, nevyžaduje žádnou energii, což je výhodné pro bateriové aplikace. Samozřejmě je nejlepší zapínat displej jen v případě potřeby, jelikož po delším provozování se svítící pixely „vypalují“ (tzv. „burn-in“), což vede částečnému ale trvalému zobrazení statických obrazů i ke snížení kontrastu.
OLED displeje mohou být jednobarevné (často bílé nebo jasně modré), dvoubarevné (například modro-žluté) nebo i plnobarevné.

Nejčastěji se setkáváme s rozlišením 128×64 nebo 128×32 pixelů (na obrázku 3 vlevo dole). Toto rozlišení je dostatečné pro zobrazování krátkých informativních textů a jednoduché grafiky, ačkoli některé modely nabízejí rozlišení i vyšší. Typové označení řadiče je pak SSD1306 a připojují se pomocí I2C nebo SPI. Vzhledem k využívání, kdy nepotřebujeme maximální rychlost a zároveň bojujeme s počtem PINů, upřednostňujeme variantu I2C. V tomto případě jsou k dispozici hotové moduly se čtyřmi připojovacími PINy (SPI jich má pět). Pozor na jejich různé pořadí. Nejčastěji bývá napájení a data po dvojicích u sebe, ale pak už se můžete setkat s oběma variantami (GND na kraji nebo druhé zkraje) stejně tak i data CLK a SDA.
Varianty: GND VCC SCL SDA | VCC GND SCL SDA, ale i GND VCC SDA SCL…

Obr. 3
Vcc  --> 3V
GND  --> GND
CLK  --> I2C_SCL_PIN (22)
SDA  --> I2C_SDA_PIN (21)

Zapojení PINů pro I2C není tak „volné“, jako v případě SPI, proto využíváme PINout přímo z knihovny a k inicializaci I2C pak postačí metoda i2c_init(), která má pinout napevno daný. Někdy je vhodné si ještě ověřit I2C adresu (pomocí metody i2c.scan()), kterou má většina displejů danou pevně. Setkali jsme se s variantami, kde se dala mikrojumperem přenastavit, což umožní připojit i více displejů zároveň (každý se adresuje samostatně).

Opět jen jednoduchý program pro zobrazení textu „octopus“ na pozici (20, 0):

from octopus_lib import i2c_init
from components.display_i2c_oled import Oled

i2c = i2c_init()

oled = Oled(i2c, 0x3c, 128, 64)
oled.text("octopus", 20, 0)

Knihovna má často i metody pro jednoduchou práci s grafikou, například:

oled.fill(0) 
# vyplní vše

oled.pixel(0, 10) 
# get pixel (získá stav)

oled.pixel(0, 10, 1)  
# set pixel at 0,10 to c=1
# colour c=0 cerna / 1 bila

oled.hline(0, 8, 3, 1) 
# horizontal line w=3,c=1
# w (width)

oled.vline(0, 8, 2, 1) 
# draw vertical line

oled.line(0,0,127,63,1) 
# line from 0,0 to 127,63

oled.rect(10, 10, 107, 43, 1) 
# rectangle 10,10 to 117,53,c=1

oled.fill_rect(10,10,107,43,1) 
# solid rectangle

oled.text('octopus',0,0,1) 
# text at x=0,y=0

oled.scroll(20, 0) 
# scroll 20 pix.to the right
...

Máme k dispozici i pár užitečných metod pro řízení displeje:

# dalsi zakladni funkce:
oled.poweroff()   # vypnuti  
oled.poweron()    # zapnuti  
oled.contrast(0)  # tlumene
oled.contrast(255)# jasne
oled.invert(1)    # invertovane
oled.invert(0)    # vychozi
oled.rotate(True) # rot 180 deg.
oled.rotate(False)# rot 0 deg.
...
Obr. 4

V projektu zapojení meteorologické stanice (2017) a také i v projektu hydroponie (2018) jsme vytvořili knihovnu pro vykreslení tří sedmisedmentovek pomocí grafických linek (obrázek 4 a obrázek 3 uprostřed). Využívá se především pro zobrazení času nebo teploty (a je to tak lépe čitelné i z větší vzdálenosti). Využíváme metod oled.hline() a oled.vline() – horizontálních a vertikálních linek vykreslovaných na pozici každého segmentu, kde měníme barvu 0/1 podle toho, zda segment „svítí“ (je vykreslen) nebo ne.
V jednoduchém „pomalém digitálním osciloskopu“ jsme vykreslovali graf průběhu pomocí jednotlivých pixelů s využitím metody oled.pixel(x,y,1). Na obrázku 5 je vidět průběh na RC členu zobrazený na dvoubarevném (žluto modrém) OLED displeji. Modul vlevo slouží pro řízení a nastavení průběhu, v tomto případě generuje obdélníkový signál (cca 2k Hz).

Obr. 5

Upravit