Raspberry Pi

33) Ovládání nestandardních grafických displejů 

     1.část:  Displej HB12625-B  (rozlišení 120x64 bodů) 

Delší dobu jsem se teď zabýval zprovozňováním grafických LCD displejů.
Prvním displejem, který zde popíšu, bude HB12625-B.
Tento displej je pětivoltový, ale bez problémů pracuje i s napájecím napětím 3,3V.

Podle jednoho polského diskusního fóra by měl pravděpodobně pocházet z nějaké čtečky čárových kódů.

Zapojení vývodů je následující:

Vývod Význam
1 GND
2 Napájení - může pracovat s 5 V, nebo s 3,3V
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 ???
18 ???
19 Napájení podsvětu - 100V střídavých s frekvencí 400Hz
20 Druhý pól napájení podsvětu - (GND)

 

Na připojení displeje k RasPi jsem použil můj oblíbený expander MCP23017.
Jedna jeho polovina (GPB) se stará o 8 datových vývodů, druhá polovina (GPA) je pro řídící signály (L/R, Reset, RS, E).
Vzhledem k tomu, že displej pracuje i s napětím 3,3V, použil jsem toto napájení i pro expander MCP23017, který to napětí zvládá také.
Tím odpadla nutnost používat oddělovač napěťových úrovní pro I2C komunikaci.

Protože I2C komunikace je celkem pomalá, ponechal jsem v programu 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.

Porovnání rychlostí zobrazení při obou případech naleznete na konci článku.

Nevýhoda tohoto displeje je v tom, že ke své činnosti potřebuje ještě další zdroj záporného napětí asi -12V. Toto napětí slouží k nastavení kontrastu displeje a je tedy nutné, aby bylo regulovatelné pomocí nějakého trimru. U mého displeje, který jsem napájel 3,3V jsem musel pro nejlepší zobrazení nastavit asi -11,2V. U každého displeje to ale může být jiné.
Záleží i na napájecím napětí. Při pokusech s 5V napájením displeje, jsem to záporné napětí musel nastavit asi na -10V.

Displej včetně expanderu si z RasPi (z 3,3V napájení) bere proud necelý 1mA (povolené maximum je 50mA).
Odběr ze záporného napětí je také necelý 1mA.

Běžně prodávané displeje už mají tento zdroj v sobě zabudovaný. U tohoto displeje si budete muset záporné napětí vyrobit.
Návodů je na internetu spousta. Já jsem využil toto zapojení:


Napájení 5V je z RasPi - GPIO konektor (pin č.2).
Vývod "VO" se zapojí k displeji na nohu č.3.

 

V případě krajní nouze můžete použít třeba 12V baterii zapojenou tak, že na GND z RasPi připojíte plus baterie a pomocí trimru vytvoříte dělič napětí.
Odběr proudu z baterie při použití 100k trimru se pohybuje mezi 0,5 a 0,6 mA, takže při kapacitě baterie 20mAh vydrží baterka asi 30 hodin.

 

 

Další problém je s podsvětem, který potřebuje střídavé napětí 100V s frekvencí 400Hz.
Měl jsem strach pouštět takto vysoké napětí do drátů, které vedou jen pár milimetrů od GPIO signálů z RasPi, tak jsem podsvět nezapojoval. Displej je za denního osvětlení bez problémů čitelný i se zhasnutým podsvětem.

Novější, běžně prodávané displeje, mají jako podsvět použity LED diody, takže tam už žádné "vysoké" napětí není potřeba.

Střídavé napětí 100V/400Hz je možné vytvořit pomocí speciálního obvodu D310-C, který je však obtížné sehnat. 

Další možností je vytvoření měniče pomocí generátoru obdélníkového signálu například pomocí obvodu NE555, jehož výstup se pomocí transformátoru zesílí na požadované napětí. Návody na výrobu takovéhoto zdroje naleznete na internetu.
Také můžete použít třeba toto zapojení http://danyk.cz/menic230.html, ve kterém nahradíte původní transformátor transformátorem 120V/2x5V, změníte frekvenci na 400Hz a celé to budete napájet 5V z RasPi. 

Ale dejte si pozor, protože už pracujete s napětím,
které není klasifikováno jako bezpečné podle ČSN 33 0120. 

 

Celkové schéma včetně nepovinného zdroje pro podsvět s použitím obvodu D310-C je tady:

 

Software:

Displej používá řadič KS0108, takže ovládání je podobné jako u běžně prodávaných displejů (např. GDM12864AFLYBW).
Jen je třeba počítat s tím, že ovládání levé a pravé poloviny displeje je řešeno pouze jedním vývodem, takže aktivní je vždycky  buď jen levá, nebo pravá polovina displeje. 
Další rozdíl je v počtu sloupců. Běžně prodávané displeje mají 64 sloupců na půlku displeje, ale displej HB12625-B má těch sloupců pouze 60.

Pro ukázku jsem vytvořil program v Pythonu, který slouží k ovládání displeje na vyšší úrovni - nemusíte se tedy starat o nastavování jedniček a nul na vývodech displeje, ale už jen používáte připravené podprogramy.

Ovládací program je možné stáhnout tady: glcd12064.py
K němu budete potřebovat ještě soubor, ve kterém je nadefinovaný font: font.txt
A pro ukázku zobrazení bitmapového obrázku si stáhněte ještě tento portrét: zem.bmp

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í.

Před spuštěním programu nejdříve nastavte 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/glcd12064.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ž 119), "radka" (0 až 7).
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ž 119) a "supery" (0 až 63) 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_bmp12064(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ž 119)
radka ... číslo řádky 0 až 7
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.
vert_rolovani(textove_pole) Vertikální rolování celého displeje. V proměnné "textove_pole" jsou nadefinovány jednotlivé řádky.  

 

A tady je výsledek

Ukázka činnosti (bez zapojeného podsvětu):


Odkaz na YouTube
Rychlejší varianta komunikace:
 pomocí signálů E a RS připojených na GPIO22 a GPIO23.

 

Stejné demo, ale s pomalejší variantou -
 připojení signálů E a RS na expander si můžete prohlédnout tady:
glcd12064-demo2.avi (Odkaz na YouTube)

 


Poděkování

Děkuji panu Josefu Havlíčkovi za poskytnutí displejů a za pomoc s jejich zprovozněním. 
 

 


úvodní strana webu AstroMiK.org

poslední úprava stránky 22.4.2013