feed-image Odebírat tento obsah čtečkou
Nabídka
csenderusktr

Moje Rapsberry Pi - I2C LCD 16x2

raspipidi

Pro zobrazování stavů pidi počítače RPI jsem dobastlil (hlavně pro budoucí využití u zalévače trávníku) LCD displej 16x2 znaků. Displej je připojen pomocí I2C sběrnice přes převodník PCF8574. Pozor před připojením LCD k I2C RasPi je nutné použít převodník úrovní I2C 5V na I2C 3,3V, jinak hrozí poškození RasPi! Příklad převodníku I2C zde (pouze neosadíme obvod PCF na desce AD převodníku - budeme mít jeden vstup I2C 3,3V na 4 výstupy I2C 5V. Tento převodník lze použít i s Arduinem (v příloze je ukázkový kód).

ZDARMA

  • schema

DONATE

  • zdroj pro Arduino IDE, pro Python, desky spojů a gerber (Eagle)

Schema zapojení převodníku I2C PCF8574 na LCD:

 

schema

Pokud připojíme konektor (na obrázku vlevo) k RPI (v mém případě deska zalévače trávníku) k pinům +5V, SDA, SCL, GND bude se převodník PCF8574 hlásit na I2C sběrnici na adrese 0X20. Pokud potřebujeme PCF na jiné adrese přepojíme vstupy A0,A1,A2 z GND na VCC dle této tabulky (k dispozici je 16 adres - dle IO obvodu):

PCF8574 address map

Deska plošných spojů

deska pohled top

osazovak

pcb top

IMG 20141015 065949

IMG 20141015 065930

IMG 20141015 065908

Seznam součástek

kód gme.cz označení hodnota cena/ks ks
433-053 IC1 PCF8574P 59,0 Kč 1
210-035 T1 BC556A 0,9 Kč 1
119-043 R2 RRU 1K 0207 2,2 Kč 1
824-004 IC1 DIL16PZ 12,4 Kč 1
111-959 R3 RR 3x10K 2,8 Kč 1
832-017 JP1,JP2 S1G20 2,54mm kolík oboustranný 4,9 Kč 1
832-090 (pokud potřebujeme úhel) S1G20S 2,54mm kolík oboustranný 90 st. 6,2 Kč 1
903-060 R1 SMD10K trimr 18,0 Kč 1
    celkem 106,5 Kč  

Příklad použitelného LCD (řadič HD44780) displej: http://www.gme.cz/mc1602e-trv-p513-099

Pokud máme nainstalovány nástroje pro práci s I2C v RPI viz tento článek, připojíme I2C LCD k RPI a koukneme na výpis sběrnice, zda je přítomen na adrese 0x20. Výpis bude vypadat nějak takto:

sudo i2cdetect -y 1

Pokud používáme jeden z prvních RPI (Raspberry Pi 256 MB Model B), pak budeme muset změnit příkaz:

sudo i2cdetect -y 0

 i2c detect s lcd

adresa: 0x20 = PCF8574 (adresa 0x48 je AD převodník a 0x68 je obvod RTC na desce zalévače...)

Pro obsluhu převodníku potřebujeme knihovnu pylcd2.py (můžeme ji stáhnout na původní www, nebo zde v příloze pod článkem).

Nakopírujeme (například do home/pi) knihovnu pylcd2.py a test.py do RPI a provedeme test LCD displeje...

cd /home/pi

sudo python test.py

Na LCD se začne vypisovat stav RPI (IP adresa, čas atd...)

 IMG 20131127 124611

IMG 20131127 124614

IMG 20131127 124618

IMG 20131127 124622

IMG 20131127 124624

V RPI se vypisuje tento text:

test

 

Pro výpis na LCD v našem python programu stačí vložit tento kód:

import pylcdlib # import LCD knihovny
lcd = pylcdlib.lcd(0x21,0) # adresa PCF prevodniku  

# vypis na LCD
lcd.lcd_puts("Ahoj pepo",1)  # text max 16  znaku radek 1
lcd.lcd_puts("jak se mas?",2)  # text max 16 znaku rade 2  

# pokud potrebujeme smazat displej

lcd.lcd_clear() pro smazani celeho LCD, jinak se bude radek vzdy premazavat novym textem

V příloze pod článkem je soubor i2c autodetect lcd.py, který automaticky vyhledá a zobrazí připojený obvod PCF a jeho adresu.

 

 

Oštítkován jako: Raspberry Pi

Komentáře   

#15 Martin Pihrt 2016-08-28 09:17
Cituji Adrian:
LCD display plug-in:
Traceback (most recent call last):
File "/home/pi/OSPy/plugins/lcd_display/__init__.py", line 83, in run
update_lcd(line1, line2)
File "/home/pi/OSPy/plugins/lcd_display/__init__.py", line 353, in update_lcd
lcd = pylcd2.lcd(lcd_options['address'], 0 if helpers.get_rpi_revision() == 1 else 1)
File "/home/pi/OSPy/plugins/lcd_display/pylcd2.py", line 45, in __init__
self.lcd_device.write(0x03)
File "/home/pi/OSPy/plugins/lcd_display/pylcd2.py", line 12, in write
self.bus.write_byte(self.addr, byte)
IOError: [Errno 5] Input/output error

This is what I get now, any idea why?

hi,
1) really you have got properly connected wires SCL and SDA? Try switching SCL and SDA.
2) really you got on the bus SCL and SDA pull-up resistors? if not add it (4k7 compared to + 3.3V)
3) really you view on the I2C address range 0x20-0x27, 0x38-0x3f?
When you enter the command: sudo -y 1 i2cdetect
5) really you got SMBus support? sudo apt-get install python-SMBus

Here see source: http://www.rpiblog.com/2012/07/interfacing-16x2-lcd-with-raspberry-pi.html
Bite run without OSPy only this script (LCD must also work simply without OSPy sprinkler) -> service ospy stop...

test.py
Import pylcdlib (you must download it on page and name pylcdlib)
lcd = pylcdlib.lcd (0x21,0) # adress your PCF

# Print to LCD
lcd.lcd_puts ( "Hello Adrian", 1)
lcd.lcd_puts ("How are you?", 2)

sudo python test.py

OSPy with LCD plugin and LCD hardware now use 10 people (that I know that it was built without error)

reagrds M
#14 Adrian 2016-08-27 11:16
LCD display plug-in:
Traceback (most recent call last):
File "/home/pi/OSPy/ plugins/lcd_dis play/__init__.p y", line 83, in run
update_lcd(line 1, line2)
File "/home/pi/OSPy/ plugins/lcd_dis play/__init__.p y", line 353, in update_lcd
lcd = pylcd2.lcd(lcd_ options['addres s'], 0 if helpers.get_rpi _revision() == 1 else 1)
File "/home/pi/OSPy/ plugins/lcd_dis play/pylcd2.py" , line 45, in __init__
self.lcd_device .write(0x03)
File "/home/pi/OSPy/ plugins/lcd_dis play/pylcd2.py" , line 12, in write
self.bus.write_ byte(self.addr, byte)
IOError: [Errno 5] Input/output error

This is what I get now, any idea why?
#13 Martin Pihrt 2016-08-03 19:46
Cituji Adrian:
LCD plugin encountered error: Traceback (most recent call last):
File "/home/pi/SIP/plugins/lcd_adj.py", line 72, in run
get_LCD_print(self, text_shift) # Print to LCD 16x2
File "/home/pi/SIP/plugins/lcd_adj.py", line 134, in get_LCD_print
lcd = pylcd2.lcd(adr, 1 if get_rpi_revision() >= 2 else 0) # Address for PCF8574 = example 0x20, Bus Raspi = 1 (0 = 256MB, 1=512MB)
File "/home/pi/SIP/pylcd2.py", line 36, in __init__
self.lcd_device = i2c_device(addr, port)
NameError: global name 'i2c_device' is not defined

LCD plugin encountered error: Traceback (most recent call last): A
There's more but I can fit it in here.

Could you please help?
It was asking me for pylcd2 library and I downloaded it fro a website and just put it in the SIP folder.

Unfortunately, I can not you help with SIP (I no longer use Sip), so see that have I2C address 0x27 LCD display.
The error means that it is probably in the library pylcd2.py (and perhaps even pylcd2 without .py) in the directory where the plugin here thus: https://github.com/Dan-in-CA/sip_plugins/tree/master/lcd_adj problem Try to use original library: http://www.rpiblog.com/2012/07/interfacing-16x2-lcd-with-raspberry-pi.html
maybe there were some changes in the library compared to the previous Sip from Dan in CA. OSPy and SIP can not be merged together (or plugins).
Regards MP
#12 Adrian 2016-08-03 09:03
LCD plugin encountered error: Traceback (most recent call last):
File "/home/pi/SIP/p lugins/lcd_adj. py", line 72, in run
get_LCD_print(s elf, text_shift) # Print to LCD 16x2
File "/home/pi/SIP/p lugins/lcd_adj. py", line 134, in get_LCD_print
lcd = pylcd2.lcd(adr, 1 if get_rpi_revisio n() >= 2 else 0) # Address for PCF8574 = example 0x20, Bus Raspi = 1 (0 = 256MB, 1=512MB)
File "/home/pi/SIP/p ylcd2.py", line 36, in __init__
self.lcd_device = i2c_device(addr , port)
NameError: global name 'i2c_device' is not defined

LCD plugin encountered error: Traceback (most recent call last): A
There's more but I can fit it in here.

Could you please help?
It was asking me for pylcd2 library and I downloaded it fro a website and just put it in the SIP folder.
#11 Adrian 2016-08-03 08:55
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- 27 -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
#10 Martin Pihrt 2015-12-31 14:06
Cituji Vojta:
Zdravím,dík za radu,moc mi to nepomohlo,protože nepouživám knihovnu pylcd2,nejde to třeba nastavit v LCD.conf,tam je nastavení displeje ...,

[hd44780]
ConnectionType=i2c
Device=/dev/i2c-1
Port=0x20
Backlight=yes
Size=20x4
DelayBus=false
DelayMult=1
Keypad=no

Netuším co je za soubor LCD.conf, ale vidím tam Backlight=yes (to je povolení podsvícení).
MP
#9 Vojta 2015-12-31 13:59
Zdravím,dík za radu,moc mi to nepomohlo,proto že nepouživám knihovnu pylcd2,nejde to třeba nastavit v LCD.conf,tam je nastavení displeje ...,

[hd44780]
ConnectionType=i2c
Device=/dev/i2c-1
Port=0x20
Backlight=yes
Size=20x4
DelayBus=false
DelayMult=1
Keypad=no
#8 Martin Pihrt 2015-12-31 10:35
Cituji Vojta:
Zdravím, tak jsem nakonec celou desku i2c překopal a nakonec jsem všechno rozjel,naistaloval jsem si OSMC
a připojil i LCD , všechno jede ,ale když vypnu system tak mi pořad svíti LCD ,nenašel jsem nic jak to vypnout
,můžete mi poradit,zatím dik. Vojta

Dobrý den,
v knihovně pylcd2 na řádku 55 je příkaz, který nastaví na portu P7 log "0" tím sepne tranzistor podsvícení (příkaz self.lcd_write( 0x08). Zhasnutí displeje není v knihovně implementováno. Programově se displej zhasne self.lcd_write( 0x00) na portu P7 se nastaví log "1" tím tranzistor vypne.
Musíte přidat do knihovny:
# lcd led on
def led_on(self):
self.lcd_write( 0x08)
# lcd led off
def led_off(self):
self.lcd_write( 0x00)
zakomentovat radek 55 self.lcd_write( 0x08) aby se displej nezapínal hned po zapnutí. Potom v Pythonu v našem programu kde ovládáme displej stačí zadat:
lcd.led_on() pro zapnutí
a když se bude systém vypínat tak nejprve displej vypnout a potom systém vypnout
lcd.led_off() pro vypnuti
MP
#7 Vojta 2015-12-31 00:48
Zdravím, tak jsem nakonec celou desku i2c překopal a nakonec jsem všechno rozjel,naistalo val jsem si OSMC
a připojil i LCD , všechno jede ,ale když vypnu system tak mi pořad svíti LCD ,nenašel jsem nic jak to vypnout
,můžete mi poradit,zatím dik. Vojta
#6 Martin Pihrt 2015-11-04 11:57
Cituji Vojta:
Zdravím,všechno jsem pochopil ,kromě jednoho a to je jak dosadit moje zapojení-
1: top 4 bits of expander are commands bits AND P0-4 P1-5 P2-6
2: top 4 bits of expander are commands bits AND P0-6 P1-5 P2-4 ani podle vašeho schematu mi to nepasuje,muj lcd jede na adrese 0x27,podle desky to mám zapojene: P0-RS, PI-RW, P2-E, P4-D4, P5-D5, P6-D6 ,P7-D7, trochu jinak než u Vás,nevím jak to dosadit do knihovny pylcd2, Vojta.. :cry:

Dobrý den,
pylcd2 já vy chiňan:
P0 - D4 - RS
P1 - D5 - R/W
P2 - D6 - E
P3 - D7 - D4
P4 - RS - D5
P5 - R/W- D6
P6 - E - D7

příklad pro init v pylcd2:
76543210 port
00110000 = 0x30 // if self.reverse: (nemáme je nastaveno 0 v def __init__(self, addr, port, reverse=0):
00100000 = 0x20
else:
00000011 = 0x03 // tady změnim P0-D4,P1-D5 na piny P3-D4,P4-D5
00000010 = 0x02 // tady změnim P1-D5 na pin P4-D5

změnim na:
else:
00011000 = 0x18
00010000 = 0x10

takto budete muset předělat celou knihovnu z pinů na jiné piny...

https://www.mathsisfun.com/binary-decimal-hexadecimal-converter.html

Nemáte oprávnění pro vkládání komentářů (You have no rights to post comments.)