|
Raspberry Pi
34) Ovládání nestandardních grafických
displejů
2.část: Displej
TF928-004B (rozlišení 128x128 bodů)
Displej má velice podobné ovládání, jako předchozí typ,
který jsem tu popisoval minule (HB12625-B).Takže když se
vám bude zdát, že už jste tohle povídání někde četli, tak máte pravdu.
Ulehčil jsem si práci a většinu textu jsem okopíroval z minulého článku.
Hlavní rozdíl v hardwéru je v tom, že k přepínání polovin displeje (levá / pravá)
přibyl ještě jeden vývod na přepínání (horní / dolní).
Také je změna v napájecím napětí displeje - tento větší displej pracuje
s napájením 5V.
Zapojení vývodů tohoto displeje je následující:
Vývod |
Význam |
1 |
GND |
2 |
Napájení +5 V |
3 |
Nastavení kontrastu - vyžaduje připojení vnějšího
regulovatelného záporného napětí |
4 |
RS - přepínaní "Příkazy" / "Data"
(někdy označeno jako C/D - Command / Data) |
5 |
R/W - zápis dat do displeje (při "0"), nebo čtení
dat z displeje (při "1") |
6 |
E - potvrzení nastavených vstupů (Strobe) - aktivní v
"1" |
7 |
D0 |
8 |
D1 |
9 |
D2 |
10 |
D3 |
11 |
D4 |
12 |
D5 |
13 |
D6 |
14 |
D7 |
15 |
L/R - přepínání "Levá" / "Pravá"
polovina displeje |
16 |
Reset - aktivní v "0" |
17 |
T/B - přepínání "Horní" / "Dolní"
polovina displeje |
18 |
??? |
19 |
Napájení podsvětu - 100V
střídavých s frekvencí 400Hz |
20 |
Druhý pól napájení podsvětu - (GND) |
I tady jsem pro připojení k RasPi použil GPIO expander MCP23017.
Protože však displej pracuje s 5V, bylo třeba napájet expander také
5V.
Pro ovládání přes I2C jsem z toho důvodu musel převést napěťové úrovně
z 3,3V, se kterými pracuje RasPi, na 5V, se kterými pracuje expander.
Buď můžete použít zapojení se dvěma FETy, nebo
tam zapojte obvod, který je k
převodu napěťových úrovní I2C komunikace přímo určený - já jsem použil
PCA9306.
Jedna polovina expanderu (GPB) se stará o 8 datových vývodů, druhá polovina (GPA)
je pro řídící signály (L/R, Reset, RS, E, T/B).
Protože I2C komunikace je celkem
pomalá, ponechal jsem i tady možnost připojit některé řídící signály přímo
na GPIO konektor v RasPi. Konkrétně potvrzovací signál E (Strobe)
a přepínací signál RS (Data/Příkazy). Tyto signály se velice často
mění, a proto je zrychlení znatelné.
Jestli potřebujete vyšší rychlost zobrazování na displeji,
připojte tyto dva signály na GPIO22 a GPIO 23 na RasPi.
Pokud vám stačí menší rychlost zobrazování, můžete ušetřit 2 GPIO
piny tím, že je připojíte na expander.
Další částečné zrychlení zobrazení je možné nastavením
rychlejší komunikace I2C (například na 400kHz). Postup popíšu níže.
Tam si ale dejte pozor, aby nově nastavenou rychlost zvládaly i ostatní I2C
zařízení připojená na stejnou sběrnici.
Nebudu tady popisovat problematické externí napájení podsvětu
a záporné napájení pro kontrast.
Je to naprosto stejné, jako u minule popsaného displeje (HB12625-B)
Záporné napětí je u tohoto displeje třeba trochu nižší (asi -10,5V).
Napětí pro podsvět (100V / 400Hz) je nepovinné. Displej je perfektně čitelný
i bez podsvětu.
Celkové schéma včetně nepovinného zdroje pro podsvět s použitím
obvodu D310-C je tady:
Software:
Ovládací program je v podstatě stejný, jako u displeje HB12625-B.
Navíc tam přibylo ovládání horní/dolní poloviny displeje a rozšíření
ze 60 na 64 bodů pro každou polovinu displeje.
Z toho důvodu bylo také třeba rozšířit proměnnou "mapa", která si
pamatuje aktuální stav displeje, o jeden parametr (horní/dolní polovina).
Z programu jsem vyhodil funkci pro vertikální rotaci celého displeje.
Nepodařilo se mi totiž nastavit správné navazování grafiky při přechodu z dolní
do horní poloviny displeje.
Ostatní funkce zůstaly zachovány.
Ovládací program je tady: glcd128128.py
Soubor s fontem je stejný, jako u minulého displeje:
font.txt
Testovací bitmapový obrázek je tu: schw.bmp
(Z důvodů politické korektnosti jsem pro tento displej použil druhého
finalistu nedávných voleb
- zdroj
obrázku
)
Všechny tři soubory si uložte do adresáře /home/pi/. Připojte
displej podle schématu, které je uvedeno výše a připojte napájecí napětí.
I
tady je vhodné nejdříve nastavit správný kontrast displeje (záporné napětí
na vývodu č.3): Otáčejte pomalu trimrem ve zdroji záporného napětí na jednu nebo druhou
stranu do doby, než uvidíte tmavnutí celé aktivní plochy displeje.
Pokud budete v otáčení trimrem pokračovat, displej zčerná úplně a nebude
nic vidět.
Vraťte trimr zpět na pozici, kdy displej teprve začíná tmavnout.
V tento okamžik máte jistotu, že pokud se něco na displeji zobrazí, bude to
vidět.
Na závěr v terminálu spusťte DEMO:
sudo python /home/pi/glcd128128.py |
Všechny podprogramy jsou vysvětleny přímo v kódu, tak zde
uvedu jen jejich krátký popis:
disclear(pattern) |
Vyplní celý displej hodnotou proměnné "pattern"
- tím smaže displej při (pattern=0), nebo ho celý zaplní černými
body pro (pattern=255) . |
znak(kod , superx , radka , inverze) |
Zobrazí jeden znak s ASCII kódem "kod" na souřadnice
"superx" (0 až 127), "radka" (0 až 15).
Pokud je proměnná "inverze" nastavená na "True",
zobrazí se bílý znak na tmavém podkladě. |
slovo(text, superx , radka, mezera, inverze) |
Zobrazí text (více znaků) na souřadnicích "superx"
a "radka" (parametry stejné jako v podprogramu
"znak()"). Mezi jednotlivé znaky vsune mezeru, jejíž šířka
je v proměnné mezera. Poslední proměnná "inverze" je opět
stejná, jako ve funkci "znak()" . |
plot(superx, supery, styl) |
Na souřadnicích "superx" (0 až 127) a "supery"
(0 až 127) zobrazí, smaže, nebo invertuje jeden bod. Jestliže styl=
0, provádí se mazání bodu, při styl=1 se bod zobrazí a při
styl=2 se provádí změna stavu bodu na displeji. |
mem_plot(superx, supery, styl) |
Stejná funkce jako předchozí "plot()", akorát
se body nezobrazují přímo na displeji, ale pouze v dočasném paměťovém
prostoru. Pomocí této funkce je možné rychlejší kreslení. Po použití
je ale nutné přenést obsah té dočasné paměti na displej pomocí
funkce "mem_dump()". |
mem_dump() |
Přenesení obsahu paměti na displej po použití příkazu
mem_plot(). |
h_cara(supery, od, do, styl) |
Vykreslení jednoduché horizontální čáry ve vzdálenosti
"supery" od horního okraje s možností definování začátku
a konce čáry (proměnné "od" a "do"). Parametr
"styl" je stejný jako ve funkci "plot()". |
load_bmp128128(jmeno_obrazku) |
Načtení dvoubarevného obrázku ze souboru do displeje.
Pozor na správný formát souboru! |
rotace(napis, osax, radka, sirka, rychlost) |
Zobrazení vodorovně rotujícího nápisu
napis ... text, který bude rotovat
osax ... číslo levého sloupce, ve kterém se budou ztrácet písmena (0
až 127)
radka ... číslo řádky 0 až 15
sirka ... šířka oblasti ve znacích (v šesticích pixelů), která je vyhrazena pro
rotující nápis
rychlost ... pauza v sekundách mezi jednotlivými mikroposuvy nápisu. |
Pokud byste chtěli zrychlit zobrazení na displeji, můžete
toho dosáhnout buď připojením řídících signálů "E" a "RS"
přímo na GPIO v RasPi, nebo změnou parametru "baudarate" v komunikaci I2C.
Tento parametr se vždycky po startu RasPi nastaví na hodnotu
100kHz. Pomocí editace souboru "/sys/module/i2c_bcm2708/parameters/baudrate"
tu rychlost ale můžete změnit až na 400kHz.
Expander, který je napájený 5V, to zvládá bez problému. Dokonce se mi povedlo ten parametr vytáhnout až na megahertz.
Pak už začal program házet "I/O" chyby v komunikaci.
Příkaz pro editaci souboru baudrate vypadá takhle:
sudo nano /sys/module/i2c_bcm2708/parameters/baudrate |
Soubor obsahuje pouze jedno číslo. Po jeho změně a uložení
souboru (Ctrl+X, Y, Enter) se okamžitě změní rychlost komunikace.
Po restartu RasPi se hodnota v souboru vrátí zpátky na 100kHz.
DEMO
Ukázka činnosti (bez zapojeného podsvětu):
Nejrychlejší varianta komunikace -
připojení signálů E a RS přímo na
GPIO v RasPi
a zároveň zrychlení komunikace I2C na 400kHz
A pro porovnání rychlostí je tady ta nejpomalejší
varianta
(všechno přes expander a rychlost I2C nastavena na defaultních
100kHz):
glcd128128-exp100khz.avi ()
|
|
|