Raspberry Pi

16) Dvouřádkový displej

POZOR

Všechny návody a příklady na této stránce
 platí pro Raspberry Pi verze 1 
(starší verze bez dvou montážních otvorů v desce) 

Novější verze 2 má trochu jinak číslované některé
vývody na GPIO konektoru.

Popis rozdílů obou variant je zde: http://elinux.org/....28GPIO.29

Protože signalizace stavů pomocí několika LED diod na GPIO portech není dostatečná, přikoupil jsem k RasPi ještě dvouřádkový alfanumerický LCD displej.

Z mnoha dostupných typů displejů jsem si vybral tento: WINSTAR-WH1602a

Před nákupem věnujte pozornost i znakové sadě, která je uložena v ROM paměti displeje. Všechny znaky anglické abecedy a čísla jsou zobrazitelné na jakémkoliv displeji. Pokud však koupíte displej s čínskou ROM, nebudete mít k dispozici řecké, některé české a speciální znaky (stupně, šipky, přehlásky...). Porovnejte si tabulky na stránkách 13 a 14 v katalogovém listu řídícího obvodu. 
V displeji je sice část vnitřní paměti pro 8 uživatelsky definovaných znaků, kde si můžete své vlastní znaky vytvořit, ale je to zbytečná komplikace.


Nejdříve jsem zkoušel vymyslet vlastní program pro zobrazování znaků, ale nakonec jsem narazil na tento návod, pomocí kterého jsem displej zprovoznil:
http://www.raspberrypi-spy.co.uk/2012/07/16x2-lcd-module-control-using-python/

Jen drobnými změnami parametrů je možné ten program přizpůsobit i pro jiné displeje (16x4 nebo 20x2 znaky)

Asi nemá cenu tady ten článek překládat, tak jen v jednoduchosti:

0) pokud ještě nemáte nainstalovaný GPIO driver do Pythonu, tak ho nainstalovat podle této stránky:
   http://www.raspberrypi-spy.co.uk/2012/07/install-rpi-gpio-library-in-raspbian/

Jsou to vlastně jen 2 příkazy do terminálu.
Jen je třeba zkontrolovat aktuální verzi a správný systém (novější Raspbian nebo starší Debian Wheezy):

wget http://raspberry-gpio-python.googlecode.com/files/python-rpi.gpio_0.4.1a-1_armhf.deb
sudo dpkg -i python-rpi.gpio_0.4.1a-1_armhf.deb      

1) propojit podle obrázku na výše uvedených stránkách (...16x2-lcd-module ...)
2) zkopírovat ovládací program do nějakého souboru v RasPi (já jsem ho nazval "display" a dal jsem ho do složky "/home/pi/" )
3) spustit program
4) na displeji by se měl objevit nějaký testovací nápis

 

Postup na výše uvedených stránkách potom jsem ještě trochu poupravil:

1) Signál CONTRAST, který je na LCD vývodu č.3, jsem nepřipojoval přímo na +5V, ale připojil jsem ho přes potenciometr, takže je možné kontrast plynule nastavit. Když byl vývod přímo na +5V, byl displej špatně čitelný (prosvítalo pozadí). Na hodnotě potenciometru moc nezáleží, protože je zapojen jako dělič napětí. Takže řádově kilo ohmy až desítky kilo ohmů by měly být v pořádku. Nižší hodnoty by zbytečně zatěžovaly pětivoltový zdroj v RasPi.

2) Při ukončení programu docházelo k tomu, že se displej zaplnil 32 znaky invertovaného "P". Je to způsobeno tím, že při ukončení skriptu se GPIO porty nastaví jako vstupní a ovládání zápisu na LCD displej tak zůstane v nedefinovaném stavu "ve vzduchu". Problém jsem vyřešil jednoduše přidáním odporu 150k mezi vývod "+5V" a "E" na displeji. Tím je zajištěna trvalá logická "1" při odpojení ovládacího pinu, takže na displeji zůstane zobrazen poslední stav. (Asi by stačil i menší odpor. Já tam přilepil první kus, který mi přišel pod ruku a fungovalo to. Ten odpor musí být samozřejmě tak velký, aby při běžné komunikaci umožnil Raspíčku stáhnout úroveň na tom ovládacím pinu k "0". Nepočítal jsem to, ale podle zkušeností jsou to řádově desítky kilo ohmů).

Tady je video, které ukazuje ten problém s naplněním displeje znaky "P": http://youtu.be/mrIJaIcRGkE
A tady je fotografie připojení toho odporu, kterým se problém vyřešil:

 

3) Upravil jsem ovládací program tak, aby zobrazoval i "NE ASCII" znaky (třeba znak ° nebo řecké znaky). A také jsem přidal možnost spouštět program se dvěma parametry, které udávají texty na jednotlivých řádcích.

Úpravy se týkají těchto částí kódu
Při úpravách si dejte pozor na správný počet odsazovacích mezer.
Je to "Pythoní" skript a ten, když má špatný počet mezer na začátku řádky (třeba v podmínkách, nebo ve smyčkách), tak hlásí chyby:

Původní část programu Upravená část programu
#import
import RPi.GPIO as GPIO
import time

    
#import
import RPi.GPIO as GPIO
import time
import sys

    
# Initialise display
  lcd_init()

  # Send some test
  lcd_byte(LCD_LINE_1, LCD_CMD)
  lcd_string("Rasbperry Pi")
  lcd_byte(LCD_LINE_2, LCD_CMD)
  lcd_string("Model B")

  time.sleep(3) # 3 second delay

  # Send some text
  lcd_byte(LCD_LINE_1, LCD_CMD)
  lcd_string("Raspberrypi-spy")
  lcd_byte(LCD_LINE_2, LCD_CMD)
  lcd_string(".co.uk")

  time.sleep(20)
# Initialise display
  lcd_init()

  prvniradka=sys.argv[1]
  druharadka=sys.argv[2]

  lcd_byte(LCD_LINE_1, LCD_CMD)
  lcd_string(prvniradka)

  lcd_byte(LCD_LINE_2, LCD_CMD)
  lcd_string(druharadka)

    
def lcd_string(message):
  # Send string to display

  message = message.ljust(LCD_WIDTH," ") 

  for i in range(LCD_WIDTH):
    lcd_byte(ord(message[i]),LCD_CHR)
def lcd_string(message):
  # Send string to display

  message = message.ljust(LCD_WIDTH," ") 

  i=0
  while i < len(message):
    if message[i] == "|" :
      hexadec = message[i+1:i+3]
      desit = int(hexadec, 16)
      lcd_byte(desit,LCD_CHR)
      i=i+2 
    else:
      lcd_byte(ord(message[i]),LCD_CHR)
    i = i + 1    

Program v tomto stavu není chráněný proti nesmyslným vstupům nebo chybějícím argumentům - ale je to jen takový základ, který ukazuje možnosti zobrazení. 

 

Po úpravách kódu, popsaných výše, je tedy možné posílat zprávy na displej takovýmto způsobem:

sudo python /home/pi/display 'Raspicko bylo' 'nastartovano'


První parametr je text na horní řádce, druhý parametr je text pro spodní řádku.

V případě, že je třeba zobrazit nějaký speciální znak, provede se to znakem "svislá čárka", která je následovaná dvojmístným hexadecimálním kódem znaku podle tabulky na stránce 14 v tomto katalogovém listu: www.crystalfontz.com/controllers/ST7066U.pdf

(Protože je svislá čára použitá jako přepínací znak, není možné jí zobrazit přímo, ale jen pomocí kódu "|7C")


Takže třeba pro zobrazení nápisu "teplota je 10°C" na prvním řádku, vypadá příkaz takto:

sudo python /home/pi/display 'teplota je 10|B2C' ' '

( znak pro stupně má kód |B2 )

A pomocí takovéhoto zápisu lze zobrazit řecké znaky a další speciality:

sudo python /home/pi/display '|DF|E0|E1|E2|E3|E4|E5|DE|ED   |7C' '|F4f  m/s|1E  a|1F 1|EAF'

A třeba aktuální datum a čas se dá zobrazit takto:

sudo python /home/pi/display  `(date +%a)`'   '`(date +%d.%m.%Y)` '    '`(date +%H:%M:%S)`
Všimněte si kombinace normálních a zpětných apostrofů v parametrech.
Kód, který je mezi zpětnými apostrofy se vykoná a jeho textový výsledek se vsune místo výrazu v těch zpětných apostrofech.
Mezi obyčejnými apostrofy jsou jen několikaznakové mezery. První trojice mezer je mezi označením dne a datumem. 
Druhá čtveřice mezer je před časem.
Před tímto druhým blokem mezer je obyčejná mezera, která odděluje dva parametry příkazu (první a druhou řádku). 

Na závěr ještě upravené schéma:

 


úvodní strana webu AstroMiK.org

poslední úprava stránky 10.2.2013