Raspberry Pi

32) Řízení displeje a klávesnice přes I2C

V tomto článku spojím dohromady několik systémů, které jsem jednotlivě popisoval v minulých článcích:

1) Ovládání dvojřádkového displeje - (odkaz).
2) Rozšíření počtu GPIO pomocí expanderu MCP23017 - (odkaz)
3) Zjišťování stisknutých tlačítek na  maticové klávesnici - (odkaz)

Spojením těchto tří částí vznikne jednotka, pomocí které je možné i bez televize a počítačové sítě (jen s použitím malé tlačítkové klávesnice a znakového displeje ) řídit běh různých programů.

Například se pomocí takovéto jednotky může postavit kalkulačka, nebo se jednotka může využít pro spouštění různých programů pomocí několikaúrovňového menu.

Zapojení na nepájivém poli vypadá trochu složitě, ale ve skutečnosti to nic složitého není - jak je vidět níže na schématu:   

Základem je GPIO expander MCP23017.

Jeho port "GPA" se stará o řízení displeje. Displej je k expanderu připojený "úsporným" (čtyřdrátovým) způsobem (má zapojené pouze 4 datové vstupy). To umožňuje využít zbylé GPA piny pro řídící signály (Strobe - E, RegistrySelect - RS a podsvět - A). Jeden pin (GPA7) dokonce zbyl a je možné ho využít pro další vstup (například tlačítko) , nebo výstup (třeba LED).

Druhá polovina expanderu (GPB) se stará o čtení maticové klávesnice 4x4 znaky.

Původně jsem chtěl použít tuto levnou čínskou nalepovací klávesnici, ale ukázalo se, že je to strašný šmejd.
Tlačítka byla nespolehlivá a bylo třeba je hodně mačkat, než došlo ke spojení kontaktů.
Proto jsem nakonec použil tuto dražší:

Když i přesto budete chtít použít pro svůj projekt tu fóliovou klávesnici, dejte si pozor na to, že má trochu jinak uspořádané vývody,
než ta černá klávesnice.

Displej a expander pracují s napěťovými úrovněmi 5V. Sběrnice I2C na RaspPi  je ale třívoltová. Proto bylo třeba tyto napěťové úrovně oddělit. Ve schématu jsem použil obvod PCA9306, který je k tomu přímo určený. Pokud ho ale nemáte k dispozici, klidně můžete použít zapojení se dvěma FETy, jak je uvedeno v dřívějším článku o expanderu.

Připojení celého tohoto systému k RasPi je provedeno pouze pomocí 5 drátů - SDA, SCL, GND, +3,3V a +5V. Toto zapojení tedy nepotřebuje žádný další GPIO pin na Raspíčku. Celé řízení jednotky probíhá pomocí komunikace I2C.


Software

Ke správné funkci je třeba mít v RasPi nainstalovanou podporu I2C a SMBUS pro Python.

Program tady nebudu vypisovat celý (je dost dlouhý). Můžete si ho stáhnout zde:

   disklav.py

Na jeho začátku je několik ukázkových příkladů použití, s jejichž pomocí by mělo být jasné, jak fungují všechny podprogramy.
Snažil jsem se to všechno pečlivě okomentovat, tak ho snad pochopíte.

 

Ještě pár poznámek:

1) Program byl odzkoušen na dvouřádkovém displeji s šířkou 16 znaků. Nemám to sice vyzkoušené, ale když v podprogramech  "pozice()" a "blikkurzor()" zrušíte komentáře, měl by program fungovat i se čtyřřádkovými displeji. 

2) Definice položek v menu je jen ukázkový příklad a odpovídá takovémuto menu:

 Akce vyvolané vybráním příslušných položek jsou volně definovatelné. Já jsem v příkladu použil spouštění programu:
   /home/pi/runmenu s parametrem, který identifikuje vybranou položku ( např. /home/pi/runmenu oaplikaci ).
Program "runmenu" zajistí tisk předávaného parametru a vypadá takto:

#!/usr/bin/env python

import sys

print "Byl spusten program runmenu s parametrem: " , sys.argv[1]

 

3) Program v mnoha částech neobsahuje žádné kontroly na korektní vstupy. Problém nastane například v okamžiku, když se pokusíte vypsat český text:

...
  slovo("žluťoučký kůň") 
...

Program využívá funkci ord() pro získání ASCII kódu písmene. Pokud ale tato funkce dostane znak s ASCII kódem větším než 127 (například "ž"), program zhavaruje. 


Videoukázka běhu programu je tady:
 
Odkaz na YouTube

A tady ještě jednou kalkulačka:

Odkaz na YouTube

 

 


úvodní strana webu AstroMiK.org

poslední úprava stránky 27.2.2013