Raspberry Pi i LCD na I2C
No cóż o Arduino było, teraz czas na Raspberry. Ten sam konwerter I2C do znakowych LCD może być użyty też z Raspberry Pi. Jednak tutaj pojawia się potencjalny problem – poziomy napięć.
Większość LCD znakowych wymaga napięcia zasilającego 5V. O ile jeszcze logika (czyli sam kontroler wyświetlacza) będzie działał przy zasilaniu 3.3V to podświetlenie już niekoniecznie. LCD zasilany jest z konwertera, jeśli tego zasilimy napięciem 5V, to takie zasilanie też dostanie LCD. Rasperry Pi ma wyjście na GPIO z napięciem 5V, więc w czym problem?
Ano, Raspberry nie znosi jeśli dostanie napięcie większe niż 3.3V na pin GPIO. A jeśli konwerter I2C LCD zasilimy 5V, każda odpowiedź odesłana przez niego będzie wysłana tak, że stan logiczny wysoki będzie symbolizowany napięciem równym napięciu zasilania. Czyli 5V, co zniszczy port GPIO. Ba! Nawet brak komunikacji będzie zagrożeniem – I2C wymaga by obydwa sygnały (SDA i SCL) były 'podciągnięte’ do zasilania poprzez rezystory. Takie rezystory są na konwerterze i przy zasilaniu 5V, gdy nikt nie nadaje na obu liniach jest cały czas 5V…
Dlatego albo potrzebujesz LCD znakowego, które jest przystosowane do pracy z zasilaniem 3.3V (a zdecydowana większość LCD znakowych nie jest przystosowana) albo skorzystasz z konwertera poziomów logicznych.
Polecamy niewielką wersję 4-ro kanałową lub 8-mio kanałową (już nieco większą). Jak działa taki konwerter? Podłączamy masy i zasilanie obu układów, z jednej strony (tzw niskiej) napięcie 3.3V a z drugiej (wysokiej) 5V. Teraz każdy kanał ze strony niskiej możemy podłączyć do układów w logice 3.3V a z wysokiej w logice 5V. Dzięki temu każdy z układów ma zagwarantowane, że stan wysoki będzie reprezentowany właściwym napięciem.
Jak podłączyć LCD do Raspberry?
Zdjęcie na wstępie przedstawia złożony taki układ, jego schemat to:
I tak, przed chwilą pisałem, że masy z obu stron powinny być podłączone do konwertera poziomów logicznych. Tutaj akurat nie ma takiej potrzeby, bo masa (GND) jest już wspólna – pochodzi z Raspberry.
Ze strony Raspberry używamy pinów o numerach (numery pinów a nie portów GPIO):
- 1 – zasilanie 3.3V jako referencyjne dla konwertera poziomów logicznych
- 2 – zasilanie 5V zasilanie LCD i konwertera I2C/LCD
- 3 i 5 – GPIO2 i GPIO3 to odpowiednio SDA i SCL
- 6 – masa (GND)
Mamy co trzeba podłączone jak trzeba :) pozostaje napisać kod. I ku mojemu zdziwieniu, nie znalazłem od ręki dobrze działającej biblioteki dla Raspberry będącej mniej/więcej odpowiednikiem LiquidCrystal z Arduino. Ale, po kolei. Jeśli wcześniej nie miałeś/aś powodu korzystać z I2C w Raspberry Pi, to trzeba włączyć jego obsługę. W tym celu uruchamiamy sudo raspi-config
i wybieramy Advanced Options
i następnie I2C
. Wybieramy odpowiedź Yes
dwa razy. Przy wyjściu z raspi-config
na pytanie czy restartować – restartować.
Do sprawdzenia czy wszystko jest połączone jak należy przyda się narzędzie i2cdetect
by je zainstalować wydaj polecenie sudo apt-get install i2c-tools
. Gdy już będzie zainstalowane komenda i2cdetect -y 1
przeskanuje całą przestrzeń adresową (jeśli masz stare RPi w wersji 1 to użyj -y 0
), i wypisze adresy pod którymi odezwało się jakieś urządzenie:
pi@raspberrypi:~ $ i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- 27 -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
Jak widać pod adresem 0x27
coś się odzywa i powinien to być właśnie nasz konwerter. Teraz do kodu w pythonie. Najpierw potrzebujemy sudo apt-get install -y python-smbus
by nasz skrypt mógł korzystać z I2C. Sam skrypt do obejrzenia jako Gist. Możesz go sklonować na RPi:
git clone https://gist.github.com/6ad9020b3c84bc65b53119b21a4bc37d.git i2c_lcd cd i2c_lcd python i2c_lcd.py
Na ekranie powinny się pojawić napisy. Jak korzystać samemu? Skrypt jest tak napisany, ze wykonuje proste demo jesli uruchomiony bezpośrednio tak jak powyżej, ale wystarczy go zaimportować, a będzie można używać funkcji z niego:
pi@raspberrypi:~/i2c_lcd $ python Python 2.7.9 (default, Sep 17 2016, 20:26:04) [GCC 4.9.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import i2c_lcd >>> i2c_lcd.lcd_string("TEST",i2c_lcd.LCD_LINE_1)
I już w linii pierwszej pojawił się napis. Jak pisałem, nie znalazłem rozbudowanej biblioteki do obsługi LCD, ale to powinno wystarczyć. Przyjrzyj się inicjacji LCD w skrypcie by wyciągnąć informacje jak samemu dodać bardziej zaawansowane funkcje. Do prostego wyświetlania napisów to w zupełności wystarczy. Jeśli chcesz użyć wyświetlacza innego niż 2×16 to trzeba zmodyfikować init i stałą LCD_WIDTH
. Funkcja lcd_string
bierze jako argument łańcuch do wyświetlenia i w której linii go ma wyświetlić. Chcesz usunąć wszystko – clear
to zrobi:
>>> i2c_lcd.clear()
OK, jak widać – całość jest prosta i można wyświetlać dane, czasem dodawanie zaawansowanego wyświetlacza, gdy Raspberry pełni rolę jakiegoś serwerka to naprawdę za dużo, a taki znakowy LCD wystarczy i często dodaje industrialnego sznytu Twojej malinie ;)
Witam
jestem w trakcie projektu smarthouse i bede podlaczal 2x rpi3 do wyswietlaczy
ale ze schematu wynika ze linia SDA ( SerialData ) jest podlaczona w kierunku z wyswietlacza poprzez konwerter do rpi. Czy ten konwerter działa w obie strony ?
Bo w tym przypadku dane nie beda przesylane w kierunku displaya. Z tego co wiem tylko SCL jest jednokierunkowa a SDA dziala w obu. W tym przypadku nie wiem czy bedzie potrzebna odpowiedz z displaya poprzez PCF do Mastera ( RPI ).
Ale jesli konwerter jest jednokierunkowy to display nie dostanie zadnych danych.
A nato wskazuje oznaczenie wejsc/wyjsc. RXI->RXO TXI->TXO
NIe mam jeszcze sprzetu zeby to sprawdzic.
Pozdro.
@Jerry
Tak, konwerter jest dwukierunkowy, wiec nie ma problemu. Ale. W sumie nie musi być w ogóle potrzebny. Jeśli układ slave I2C (czyli tutaj konwerter wyświetlacza) nie ma na sobie pull-upów na linii I2C, można połączyć bezpośrednio, bez konwertera.
Jak to sprawdzić – po podłączeniu zasilania do modułu zobaczyć czy jest napięcie na liniach SDA/SCL modułu. Jeśli tak – konwerter jest niezbędny.
Czemu bez pull-upów na module nie trzeba? Napięcie wysokie na linii SDA/SCL 'zapodaje’ master, a slave komunikuje się zwierając linię do masy. W ten sposób będzie działał bez zagrożenia dla RPi. Jedyny warunek dodatkowy jest taki, że moduł slave musi potraktować napięcie 3.3V jako stan HIGH, ale to chyba większość układów TTL 5V zrobi.