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):


Odkaz na YouTube
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  (Odkaz na YouTube)

 


úvodní strana webu AstroMiK.org

poslední úprava stránky 30.4.2013