Raspberry Pi i LCD na I2C

Znakowy LCD na I2C i Raspberry
Znakowy LCD na I2C i Raspberry

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:

Podłączenie LCD do RPi
Podłączenie LCD do RPi

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 ;)