Dodatkowy wyświetlacz do routera z Nokii 5110
Ostatnia zmiana: 2015-02-26 20:11

W kilku poprzednich poradnikach opisywane były możliwości wykorzystania różnych wyświetlaczy:
- breloczków LCD
- cyfrowych ramek na zdjęcia
- wyświetlaczy na USB na przykładzie Soundgraph iMON VFD/IR

Jak łatwo zauważyć - temat nie został jeszcze do końca wyczerpany, bo można wykorzystać także inny popularne wyświetlacze - od telefonów komórkowych. W zależności od modelu mogą one być sterowne przez własny protokół, i2c, spi lub innymi metodami. W tym artykule opisano sposób podłączenia wyświetlacza ze starej Nokii 3310/5110, opartego na sterowniku PCD8544. Wyświetlacz można pozyskać ze starego telefonu, można także kupić go w postaci gotowego modułu przeznaczonego do wykorzystania w projektach Arduino czy Raspberry Pi. Główne cechy tego wyświetlacza to:
- ekran graficzny 84x48 pikseli
- monochromatyczny
- możliwość programowego sterowana kontrastem
- obsługa podświetlania (różne kolory w zależności od modelu wyświetlacza - biały, niebieski, zielony, czerwony)
- małe zużycie energii
- możliwa praca w szerokim zakresie temperatur



Sterowanie takiego LCD odbywa się przy pomocy magistrali szeregowej z wykorzystaniem kilku linii, sam wyświetlacz tak naprawdę potrafi tylko wyświetlać (albo gasić) określone piksele, więc na użytkowniku spoczywa cały obowiązek przygotowania procedur wyświetlania np. tekstu; moduł nadaje się do wyświetlania i grafiki i tekstu po uprzednim przygotowaniu wzoru czcionek.
W internecie można łatwo znaleźć informacje na temat działania, adresacji pamięci i sposobie obsługi wyświetlacza, więc nie będą one tu przytaczane. Dostępne są gotowe bibliotek do popularnych platform i systemów, więc można skorzystać z gotowych procedur lub napisać je własne.
W tym poradniku został zaprezentowany sposób podłączenia wyświetlacza wykorzystując wolne linie GPIO routera. Ponieważ do obsługi niezbędne są co najmniej cztery - obsługa LCD została zaprezentowana z wykorzystaniem routera GL.iNet, jako że bezpośrednio udostępnia on kilka wolnych linii.

Podłączenie LCD

Podłączenie jest bardzo proste, bo nie wykorzystuje poza przewodami innych elementów zewnętrznych. Wyświetlacz dysponuje kilkoma liniami, z czego cztery są niezbędne do podłączenia, jedna linia jest opcjonalna, reszta to zasilanie lub sterowanie podświetlaniem. Zakładając więc że mamy cztery wolne linie GPIO podłączamy wyświetlacz w następujący sposób:


    router wyświetlacz

    gpio21 RST
    GND CE
    gpio22 DC
    gpio18 DIN
    gpio19 CLK
    3.3V VCC
    GND LIGHT
    GND GND

W podanym przykładzie zrezygnowano z osobnego sterownia linią CE i podłączono ją na stałe do GND (dzięki temu układ jest na stałe aktywny). Ten model ma także podświetlanie w postaci czterech białych diod LED, więc linię LIGHT podłączono do GND (w niektórych wyświetlaczach linia ta może być sterowana z VCC - należy to sprawdzić). Zasilanie wyświetlacza zapewnia napięcie 3.3v z routera, pozostałe zaś linie podłączono do gpio - wykorzystano linie o numerach 18, 19, 21 i 22.


    

Obsługa wyświetlacza

Ponieważ zostały wykorzystane linie GPIO, cała obsługa sprowadza się do napisania własnych procedur obsługi portów i sterowania sygnałami. Odbywa się to przez odpowiednie podawanie stanów na wyjścia linii, dzięki czemu możliwe jest zaadresowanie pamięci wewnętrznej wyświetlacza. Upraszając - aby zapalić jeden piksel na ekranie należy zaadresować odpowiednie komórki pamięci i wpisać tam liczbę która w binarnej reprezentacji odpowiada zapaleniu lub zgaszeniu punktów. Można samodzielnie takie procedury napisać lub skorzystać z gotowych rozwiązań spotykanych w sieci.

Python

Jako język skryptowy, Python daje możliwości szybkiego napisania i przetestowania działania programu. A dzięki obsłudze wielu bibliotek istnieje także prosty sposób skorzystania np. z jego możliwości manipulacji obrazkami. W tym przykładzie zaprezentowano prosty skrypt do wyświetlania obrazów. Należy zainstalować odpowiednie biblioteki wraz z zależnościami:


    # opkg update
    # opkg install python python-imaging-library

Jako przykład zastosowania: skrypt showimage.py którego zadaniem jest wyświetlanie obrazka na ekranie:


    # ./showimage.py ekoonepl.png




Obrazek musi w formacie PNG, czarno-biały (1bitowa mapa kolorów) o rozdzielczości 84 x 48. Wtedy dokładnie każdy piksel na obrazku odpowiada zapalonemu lub zgaszonemu pikselowi na wyświetlaczu. Poniżej obrazek który został wyświetlony.



C

Procedury wyświetlania można także wykonać w czystym języku C. O ile sterowanie liniami gpio jest dość proste, o tyle należy pamiętać że wyświetlacz jest graficzny i wyświetla piksele - nie posiada własnej pamięci z wyglądam liter, więc jeżeli chcemy wyświetlić tekst to należy przygotować go w postaci obrazka (bitmapy) lub napisać swoje matryce zawierające reprezentacje znaków w postaci binarnej. Na szczęście w sieci można znaleźć gotowe biblioteki do obsługi tego wyświetlacza zapewniające i wyświetlanie tekstu i rysowanie linii, okręgów, kształtów geometrycznych czy innych elementów grafiki. Jako przykłady:

- program wyświetlający tekst na ekranie:


    # ./3310_writetext " ------------ eko.one.pl ------------"




Biblioteka zapewnia wyświetlanie liter o matrycy 8x6 pikseli co daje możliwość wyświetlenia 84 liter (6 linii po 14 znaków).

- prosty monitor zasobów


    # ./3310_sysinfo
OpenWrt sysinfo display
========================================

Prosta prezentacja uptime, użycia procesowa i pamięci RAM.



- małe demo


    # ./test
Test: All pixels on.
Test: All pixels off.
Test: Display logo.
Test: Display single pixel.
Test: Draw many lines.
Test: Draw rectangles.
Test: Draw multiple rectangles.
Test: Draw multiple circles.
Test: Draw the first ~120 chars




Można zauważyć, że sterowanie liniami GPIO nie jest zbyt efektywne. Można wykonać też kilka różnych optymalizacji związanych ze sterowaniem GPIO, ale na potrzeby poradnika jest to wystarczające rozwiązanie.

W przykładach na stałe zapisane są linie gpio wykorzystywane przeze mnie (18,19,21,22). Jeżeli ktoś używa innych to należy pamiętać o zmianie tych linii w źródłach. Należy także dostosować kontrast do danego wyświetlacza. Do sterowania została użyta gotowa biblioteka PCD8544.c przeznaczona dla Raspberry Pi, lekko przerobiona przeze mnie pod kątem innego sterowania liniami GPIO.

Literatura

- skrypty i przykłady prezentowane w artykule: link
- datasheet kontrolera PCD8544: link
- biblioteki C do obsługi PCD8544 dla Raspberry Pi: link
- biblioteki Pythona do obsługi PCD8544: link
- sposób adresowania pamięci wyświetlacza i problemy z niektórymi modelami: link
- podłączenie LCD do GL-iNet: link