|
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):
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
()
Poděkování
Děkuji panu Josefu Havlíčkovi za poskytnutí displejů
a za pomoc s jejich zprovozněním.
|
|
|
|