sobota, 2 kwietnia 2011

Arduino: Wyświetlacz LCD HD44780 na dwóch pinach interfejsu TWI (I2C) z wykorzystaniem ekspandera PCF8574


Arduino: Wyświetlacz LCD HD44780 na dwóch pinach interfejsu TWI (I2C) z wykorzystaniem ekspandera PCF8574


Autor: Piotr Rzeszut (Piotrva)
Redakcja: Dondu

Prawie każdy z Was używał już zapewne wyświetlaczy alfanumerycznych LCD, kompatybilnych ze sterownikiem HD44780, więc o ich możliwościach, wadach, zaletach itp. chyba nie ma potrzeby wspominać.

Zwykle LCD podłączamy do naszego Arduino za pomocą 6 przewodów, są to sygnały:
  • RS, 
  • EN, 
  • D4...7. 

Czasem jednak przy stosunkowo niewielkiej ilości pinów, jaką dysponuje Arduino chcielibyśmy zaoszczędzić nieco wyprowadzeń. Można to zrobić z wykorzystaniem scalonych ekspanderów, czy rejestrów przesuwnych i dowolne piny mikrokontrolera - przykład: LCD HD44780 na 3 pinach z 74HC595

Możemy także wykorzystać tanie i łatwo dostępne adaptery do tych wyświetlaczy LCD, wykorzystujące magistralę I²C. W mikrokontrolerach Atmela odpowiednikiem I²C jest TWI.


LCD podłączony do Arduino na adapterze I²C (TWI)
LCD podłączony do Arduino na adapterze I²C (TWI)

Wyświetlacz z adapterem (konwerterem) I²C (TWI)
Wyświetlacz z adapterem (konwerterem) I²C (TWI)


Co w adapterze siedzi - czyli stadko pułapek?


Zapewne każdy z nas chciałby wpiąć wyświetlacz w adapter, podłączyć go do Arduino, wgrać program i cieszyć się działającym LCD, jednak takie podejście doprowadza nas często do szewskiej pasji, gdyż czasem nic nie działa. Świadczą o tym stosunkowo częste pytania zadawane na forach, w których zwykle czytamy:

Anonimowy
Podłączyłam/łem LCD, kabelki, program wgrany, ale LCD nie daje oznak życia...

Swoją drogą szkoda, że Pań w roli elektroników wciąż mało :)


Adapter (konwerter) HD44780 I²C (TWI)
Adapter (konwerter) HD44780 I²C (TWI)


Zanim zaczniemy szukać pułapek, uniemożliwiających tchnięcie życia w LCD na 2 kabelkach, warto spojrzeć na schemat modułu, który otrzymałem do testów od firmy Electropark.


Adapter HD44780 I²C - schemat modułu z oferty Electropark.pl (produkcja LC Technology)
Adapter HD44780 I²C - schemat modułu z oferty Electropark.pl
(produkcja LC Technology)




A teraz możemy przejść do pułapek, a czeka nas ich kilka. Wszystkie one wynikają z tego, że na rynku dostępnych jest wiele niemalże identycznych modułów tego typu (Google: HD44780 I²C - zobaczcie na różnice między kilkoma pierwszymi z brzegu schematami), jednak diabeł tkwi w szczegółach.


Pułapka 1 - rezystory podciągające


Jak wiemy, magistrala I²C (nie będę tu o niej szczegółowo pisał, gdyż jest to właściwie temat na osobny artykuł) wymaga podciągania linii do zasilania (pull-up) za pomocą rezystorów, które czasami są obecne na płytkach, a czasem nie. Jeśli ich nie ma do poprawnej pracy układu musimy podłączyć do linii SDA i SCL rezystory o wartości około 4,7kΩ.

Należy także zachować ostrożność przy łączeniu innych modułów I²C - teoretycznie połączenie kilkunastu modułów z wbudowanym podciąganiem (a więc połączenie rezystorów podciągających równolegle) może spowodować niekorzystne efekty, a w skrajnych przypadkach nawet uszkodzenie układów z powodu przepływu zbyt dużego prądu.


Pułapka 2 - typ układu


Moduł oparty jest przeważnie na popularnym ekspanderze portów PCF8574, jednak układ ten występuje w 2 głównych wersjach:
  • PCF8574
  • PCF8574A 

Dokumentacja: PCF8574_PCF8574A.pdf (kopia)




Układy te są identyczne z wyjątkiem różnych adresów bazowych na magistrali, które odczytujemy z noty katalogowej:


Adresowanie układów PCF8574 i PCF8574A
Adresowanie układów PCF8574 i PCF8574A


Tak więc to kolejna kwestia na którą musimy zwrócić uwagę - spojrzeć na płytkę i ustalić jaki układ na niej zamontowano. Jest też szansa, że trafimy na inny "scalak" niż PCF8574.


Pułapka 3 - (a w zasadzie 2,5) Adres układu


Jak widzimy na powyższym wycinku z noty katalogowej i wnioskujemy z opisu najniższe bity adresu układu determinowane są poprzez podłączenie pinów adresowych A2..0.

Powinieneś sprawdzić jak piny te połączone są w posiadanej przez nas przejściówce.


W tej, którą otrzymałem, są one podciągane do zasilania (zatem wartość binarna 1 jest ustawiana na wszystkich bitach) przez rezystory R3..5. Niezamontowane (N/M) rezystory R6..8 pozwalają na zmianę adresu układu (np. poprzez zwarcie ich kroplami cyny).


Pułapka 4 - połączenie z wyświetlaczem + biblioteka


Kolejnym problemem jest to, iż w różnych modułach układ ekspandera może być połączony w zupełnie inny sposób. Teoretycznie mamy około 40 000 możliwości :) Dlatego kolejną kwestią jest ustalenie, które piny układu połączone są z którymi pinami wyświetlacza.

Z tym problemem związana jest także kwestia biblioteki - czasem biblioteki mają definicję przypisania tychże pinów zapisane na stałe w swoich źródłach (co powodowałoby konieczność ich modyfikowania), ale dla tego polecam zastosowanie biblioteki ze strony: https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads :


Zastępujemy nią oryginalną bibliotekę Arduino (sprawdzone na wersji 1.5.6-r2) LiquidCrystal i dostajemy dzięki temu możliwość szybkiej konfiguracji przypisania pinów oraz sterowanie wyświetlaczem z poziomu programu w pełni zgodne z oryginalnym.


Pułapka 5 - podświetlanie


Kolejną pułapką modułów jest różne podłączenie podświetlania wyświetlacza LCD (o ile montowany przez nas wyświetlacz ma takowe). Czasem połączenie jest "na stałe", a czasem, jak w testowanym przeze mnie module, mamy możliwość sterowania podświetlaniem.

Tu jednak także należy uważać, gdyż w module umieszczono szeregowo z obwodem podświetlania LCD rezystor R9 o wartości 1kΩ. To zdecydowanie za duża wartość, dodatkowo biorąc pod uwagę to, iż zwykle wyświetlacze mają już odpowiednie rezystory zamontowane na swojej płytce.


Rezystory ograniczające prąd diod LED podświetlenia LCD.
Rezystory ograniczające prąd diod LED podświetlenia LCD.

Jeśli takowe znajdują się na naszym wyświetlaczu to spokojnie rezystor ten na adapterze możemy zewrzeć kroplą cyny, czy kawałkiem drutu (esteci mogą go wymienić na elegancki rezystor o wartości ). W przeciwnym wypadku należy zamontować zamiast niego odpowiedni rezystor, zwykle z zakresu 10-50Ω.


Pułapka 6 - gdzie znaleźć odpowiedzi na te wszystkie pytania?

Tu niestety nie dam Wam jednoznacznej odpowiedzi. Zawsze najlepiej zacząć od przeszukania strony sprzedawcy, potem producenta, jeśli ten jest wymieniony na płytce. Tu jednak uwaga, bo czasem bliźniaczo podobne płytki (nie różniące się "na oko" niczym) mają inne połączenia. Jeśli nie uda się nam w ten sposób uzyskać rzetelnej informacji to zostaje nam wziąć w rękę multimetr i sprawdzać wszystkie (a na pewno kluczowe) połączenia na module - tak właśnie ja zrobiłem tworząc schemat otrzymanego modułu.


Po biegu z przeszkodami czas na ostatnią prostą

Czyli, gdy już wiemy o naszym adapterze więcej niż jego producent, możemy zabrać się za pisanie programu, który właściwie poza 2 linijkami nie wykracza poza normalną obsługę wyświetlacza LCD (a takie było przecież nasze założenie).

Wyjaśnię jeszcze tylko kwestię adresu układu. Jak już wspominałem poszczególne bity ustalamy na podstawie typu układu oraz podłączenia jego wejść adresowych A0..2. Taką wartość (u mnie przeliczoną na zapis heksadecymalny) dzielimy jednak przez 2. Dlaczego?

Otóż (z niewyjaśnionych powodów) biblioteka Wire z Arduino przyjmuje adresy pozbawione najniższego bitu (bit kierunku transmisji). Dzieląc adres przez 2 uzyskujemy właśnie usunięcie tego bitu na potrzeby bibliotek Arduino. Oczywiście zamiast tego możemy tam podać wartość adresu od razu wyliczoną bez tego bitu.

Myślę, że poniższy kod nie wymaga już dodatkowych komentarzy.

PCF8574-LCD-HD44780.c
//kod pobrany ze strony: http://mikrokontrolery.blogspot.com
//(c) Piotr Rzeszut

#include <Wire.h>  // Biblioteka Arduino do obsługi magistrali I2C
// Get the LCD I2C Library here: 
// https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads
// Move any other LCD libraries to another folder or delete them
// See Library "Docs" folder for possible commands etc.
#include <LiquidCrystal_I2C.h>

// Ustawiamy adres naszego ekspandera, przypisanie pinów, pin sterujący podświetlaniem i polaryzację (POSITIVE lub NEGATIVE)
// Czyli czy podanie sygnału wysokiego czy nieskiego powoduje zapalenie się podświetlania
//                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x4E/2, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // konfigurujemy wyświetlacz na modzule I2C


void setup()
{
  lcd.begin(16,2);   // inicjalizacja wyświetlacza
}


void loop()
{
  lcd.setCursor(0,0);
  lcd.print("LCD na I2C!!    ");
  lcd.setCursor(0,1);
  lcd.print("Drugi wiersz    ");
  delay(1000);
  
  lcd.noBacklight(); // dzięki tej komendzie wyłączamy podświetlanie
  lcd.setCursor(0,0);
  lcd.print(" Podswietlanie  ");
  lcd.setCursor(0,1);
  lcd.print("    wylaczone   ");
  delay(1000);
  
  lcd.backlight(); // a teraz je włączamy - to dodatkowe funkcje nieobecne w oryginalnej bibliotece
  lcd.setCursor(0,0);
  lcd.print(" Podswietlanie  ");
  lcd.setCursor(0,1);
  lcd.print("    wlaczone    ");
  delay(1000);
  
}

Do pobrania: PCF8574-LCD-HD44780.c (kopia)


4 komentarze:

  1. niestety ale załączony kod na środowisku 1.0.6 "się wywala" i nie kompiluje do końca
    This report would have more information with
    "Show verbose output during compilation"
    enabled in File > Preferences.
    Arduino: 1.0.6 (Windows 7), Board: "Arduino Uno"
    sketch_dec18a:14: error: 'POSITIVE' was not declared in this scope

    OdpowiedzUsuń
  2. reszta artykułu bardzo rzeczowa i zawierająca cenne wiadomości zgromadzone w "jednym miejscu"

    OdpowiedzUsuń
  3. Sprawdź czy masz zaimportowana tylko jedną bibliotekę LiquidCrystal_I2C.h
    Jak jest więcej bierze pierwszą z brzegu, też tak miałem.

    OdpowiedzUsuń
  4. A mi wyskakuje arduino.h no such file or directory :(

    OdpowiedzUsuń