[048] Wyświetlacz z Nokii cz. 1

[048] Wyświetlacz z Nokii cz. 1

Proste telefony Nokii z przełomu wieków obrosły legendą za sprawą… no właśnie, nic w sobie tak naprawdę nie miały poza jednym: dla wielu były pierwszym telefonem komórkowymi. W cieniu tej legendy wykluła się inna, związana z niepozornym wyświetlaczem, który był używany w wielu modelach produkowanych ponad dekadę. I znowu, jak to bywa czasem w życiu, element opracowany na potrzeby taniego telefonu stał się kolejnym standardem, jest produkowany do dziś i często używany w nie tylko amatorskich konstrukcjach.


Wyświetlacze w tych słynnych Nokiach nie były zbyt przyjazne do użycia w warunkach domowych, ale szybko powstały zgrabne moduły ze standardowymi wyprowadzeniami na płytce drukowanej, już miłe w adaptacji we własnych projektach. Oczywiście, jak to bywa ze standardami, na rynku jest ich sporo i różnią się kolejnością wyprowadzeń, rodzajem podświetlenia czy wymiarami ogólnymi. Poza wersjami rozwojowymi, wymagającymi innych bibliotek, wszystkie zaliczające się do tego standardu bazują na układzie PCD8544 Philipsa i obsługują rozdzielczość 84x48 piksele.

Ani to dużo, ani mało. Komputer z czasów ZX Spectrum, dysponujący czymś takim byłby raczej żałosny. Jednak jeśli ograniczmy się do rozmiaru półtora cala, tyle pikseli wystarczy, by ten obszar sprawnie wykorzystać. Dziś znajdziemy dużo innych rozwiązań, o większym kontraście i rozdzielczości. Prezentowany wyświetlacz ma jednak dwa istotne atuty: jest ogólnie dostępny i tani oraz pobiera niewielką ilość prądu: około 300 uA, nie licząc podświetlenia. To możemy jednak wyłączyć, bo technologia w której wykonano wyświetlacz pozwala na jego wyraźne widzenie w świetle zastanym. Samo podświetlenie składa się z czterech diod świecących o różnych barwach, choć najczęściej dostępne są białe. Można także spotkać się z podświetleniem RGB, które umożliwia otrzymanie już dowolnego koloru. W przypadku tu przedstawionego diody konsumują w sumie 8 mA, więc relatywnie mało.

Skoro już mamy wyświetlacz, będziemy musieli zidentyfikować jego wyprowadzenia oraz podłączyć go do Arduino. W przypadku tego egzemplarza opisano je, natomiast częściej spotyka się modele z inną kolejnością tychże. Ale to nie problem, wystarczy odpowiednio podłączyć przewody albo przedefiniować wyprowadzenia w programie.

Problem będzie inny. W przypadku wyboru Arduino pracującego na trzech woltach po prostu łączymy wszystko przewodami. Dla modeli pięciowoltowych… no właśnie. Internety donoszą jednocześnie, iż by się tym nie przejmować jak również, że spotka nas sroga kara i siwy dym. Producent jednoznacznie ustalił: 3,3 wolta i ani trochę więcej. Praktyka pokazuje, że pięć woltów nie szkodzi i urządzenie działa bez problemów, co najwyżej trzeba inaczej ustawić parametry związane z kontrastem. Ja jednak wolę na zimne dmuchać, dlatego zbudujemy sobie konwerter.

Schemat połączeń jest prosty. Wykorzystuje się tutaj pięć linii, przy czym dwie są opcjonalne. Przede wszystkim mamy interfejs SPI, a więc linię danych MOSI i zegara SCLK. Uzupełnia ją wychodząca poza standard interfejsu trzecia linia rozróżniająca dane i komendy D/C. Kolejne wejście CE aktywuje nasłuch danych, dzięki czemu można na magistrali powiesić wiele różnych urządzeń i nie będą się zakłócać, a ostatnie – RST resetuje układ. Pierwsza z linii może być zwarta do masy na stałe, jeśli nie mamy już żadnych innych układów SPI, a resetująca podłączona typowym układem RC samoczynnie resetującym obwody po włączeniu zasilania. Zauważmy, że nie mamy tutaj pełnego interfejsu SPI – brakuje linii przesyłającej dane z wyświetlacza do kontrolera. Ale nie ma takiej potrzeby, niczego w drugą stronę tutaj się nie wysyła.

Oczywiście pozostaje jeszcze zasilanie i masa. Ponieważ wyświetlacz pracuje z napięciem 3,3 V, użyjemy gratisowego stabilizatora siedzącego w Arduino. Niestety od tego nie zrobią się nagle niższe poziomy na wyjściach Arduino i będziemy musieli zbudować konwerter, przesuwający wysokie poziomy z pięciu woltów do 3,3 V Można użyć jakichś ambitnych rozwiązań bazujących na specjalizowanych układach, ja jednak wybiorę skuteczny prymitywizm, czyli pięć par rezystorów w układzie dzielników napięcia. Prawo Oma zrobi nam odpowiednie napięcie i nie będziemy się musieli już niczym martwić.

Ostatnim elementem jest aktywacja podświetlenia. By działało, musimy podać niski stan na odpowiednie wejście. Można z wyjścia Arduino – wtedy będziemy mogli sterować podświetleniem – albo bezpośrednio zwierając to wejście do masy.

Po włączeniu zasilania wyświetlacz powinien się zaświecić, ale niczego więcej nie zobaczymy. Czas pobawić się programem. Od razu wyjaśnię: w przeciwieństwie do wyświetlacza HD44780 tutaj możemy dostać się do każdego piksela. Jednak taka obsługa, o ile byłaby możliwa, byłaby również mało wygodna. Wielu twórców opracowało biblioteki skracające proces rysowania tekstów oraz grafik do poleceń i dziś wykorzystam chyba najbardziej znaną, firmy Adafruit.

#include <Adafruit_GFX.h>                                  // Biblioteka obsługująca rysowanie grafik na wyświetlaczach.
#include <Adafruit_PCD8544.h>                              // Biblioteka obsługująca ten konkretny wyświetlacz.
Adafruit_PCD8544 nokia = Adafruit_PCD8544(3, 4, 5, 6, 7);  // nazwa wyświetlacza, piny: SCLK, MOSI, D/C, CE, RST

Biblioteka jest uniwersalna i współpracuje z różnymi wyświetlaczami. Dlatego trzeba jeszcze dodać taką, która określi nasz, konkretny. Następnie trzeba zadeklarować port, czyli zdefiniować wyjścia. Wystarczy tutaj, nie trzeba będzie już niczego z tymi pinami robić później. W wierszu tym deklarujemy także nazwę wyświetlacza – użyłem tutaj nazwy oczywistej, czyli nokia.

void setup() {
  nokia.begin();          // Inicjuj wyświetlacz.
  nokia.setContrast(60);  // Ustaw kontrast.
  nokia.clearDisplay();   // Wyczyść wyświetlacz.
}

W części wstępnej zainicjujemy bibliotekę, ustawimy kontrast i wyczyścimy wyświetlacz. Z kontrastem może być różnie, bo przedział jest niewielki. Gdyby na wyświetlaczu nie było nic widać, trzeba wartość zwiększyć, gdyby był czarny – zmniejszyć. Można to oczywiście zrobić programowo.

nokia.print("Czesc! Jestem wyswietlaczem z Nokii, ktory wiekszosc pamieta z gry w weza ;)");  // Załaduj tekst do wyświetlenia.
nokia.display();                                                                              // Wyświetl załadowany wcześniej tekst.

Zacznijmy od napisania tekstu. Służy do tego powyższa instrukcja, ale by tekst się ukazał, musi jeszcze pojawić się komenda display() - choć już zwykle nie będę jej zamieszczał w listingach, pamiętajmy o niej za każdym razem, gdy będziemy chcieli coś wyświetlić. Na razie nie będziemy nic formatować, tylko skompilujemy program i oto – proszę, możemy podziwiać naszą pierwszą udaną współpracę z wyświetlaczem.

Jak więc widać, znaków mamy tutaj 14 na wiersz, a wierszy – 6. Rzem: 84 znaki, więc nieco więcej od dwurzędowego wyświetlacza 2x40. Matryca brutto to 8x6 pikseli, lecz uwzględniając niezbędny odstęp mamy taką samą ilość powierzchni, co w przypadku standardu 44780. Problem polega jednak na tym, że nie wygląda to dobrze. Sformatujmy tekst ręcznie w ten sposób i po wysłaniu będzie wyglądał już tak.

nokia.print("Czesc! Jestem wyswietlaczem z Nokii, ktorywiekszosc pa- mieta z gry   w weza ;)");

Przy zamieszczaniu tekstów na wyświetlaczach o takich proporcjach warto o tym pamiętać. Warto także pamiętać zmuszaniu kompilatora do osadzania takich tekstów w pamięci stałej. Dzięki temu oszczędzimy 80 bajtów RAM-u, którego – przypomnę – w przypadku Uno mamy 16 razy mniej od pamięci Flash. Przypomnę – robimy to, dopisując przed wyrażeniem literę F

nokia.print(F("Czesc! Jestem wyswietlaczem z Nokii, ktorywiekszosc pa- mieta z gry   w weza ;)"));

Skoro mamy swobodę dostępu do każdego piksela, z pewnością istnieje sposób, by żonglować jakoś napisami. Na początek coś prostego – powiększanie liter.

nokia.setTextSize(2, 2);

Jednak już przy dwukrotnym powiększeniu nasz wyświetlacz zaczyna bardzo przypominać znaczek pocztowy.

Bardziej użyteczne będzie powiększanie liter na przykład tylko w pionie. W tym celu instrukcja setTextSize musi otrzymać dwa argumenty: pierwszy odpowiada za powiększenie w poziomie, drugi – w pionie.

Przejdźmy teraz do czegoś ciekawszego: możliwości zmiany czcionek. Jak mówiłem, biblioteka obsługuje różne wyświetlacze, w tym o większej rozdzielczości niż tu widoczna i tam można sobie z krojami pisma folgować.

Na tak małej powierzchni jednak nie poszalejemy i domyślna czcionka jest najlepsza. Ale w zestawie znajdziemy kilka przydatnych, także miniaturowe, również proporcjonalne, mogące być użytecznymi w określonych warunkach. Za cenę marnej czytelności zyskamy możliwość wyświetlenia blisko 200 liter.

Jak to uzyskać? Musimy dopisać linie, w których zawrzemy nazwę zbioru znajdującego się w katalogu czcionek biblioteki.

#include <Fonts/TomThumb.h>
nokia.setFont(&TomThumb);

Może być ich więcej. Już w treści programu możemy je przełączać poleceniem setFont z nazwą zbioru. Brak argumentu wymusza przełączenie się na zestaw domyślny. A co z polskimi literami? No cóż, jeśli zechcemy ich tutaj, najprawdopodobniej będziemy musieli stworzyć je sami, edytując zbiory znaków. Powstały do tego specjalne narzędzia, ale na pozostawię omówienie tego na inną okazję.

Napisy możemy stawiać gdziekolwiek. Brak argumentu umieszczał je dotychczas w zerowym wierszu i zerowej kolumnie. Poniższa instrukcja pozwoli nam się nieco przesunąć.

nokia.setCursor(24, 20);
nokia.print(F("Czesc!"));

Co ciekawe, drukowanie nowych znaków domyślnie nie niszczy starych. Można zatem uzyskać kolejny efekt, drukując ten sam tekst z przesunięciem.

nokia.setCursor(24, 20);
nokia.print(F("Czesc!"));
nokia.setCursor(25, 21);
nokia.print(F("Czesc!"));

Jest to także prosty sposób na dodanie ogonków do polskich znaków – jak to robiło się niegdyś w drukarkach, które ich nie wspierały. Wystarczy ustawić się na początku tekstu poprawianego i dopisać przecinki, apostrofy i ukośnik w wybranych miejscach. Niestety nie wygląda to dobrze, ponieważ te znaki wobec liter są zbyt grube.

nokia.print(F("Czesc! Jestem wyswietlaczem z Nokii, ktorywiekszosc pa- mieta z gry   w weza ;)"));
nokia.setCursor(0, 0);
nokia.print(F("   ``           `                      `    ,    ``                      ,'"));

Można też zadeklarować kolor „biały”, czyli niewidoczny. Drukowanie wprost nie będzie mieć sensu, ale zasłoni czarne piksele znajdujące się pod spodem, co może w pewnych warunkach dać ciekawe efekty. Będzie to jednak użyteczne w grafikach, a nie przy stawianiu tekstów. Biały kolor atramentu to zero, czarny – domyślny – to jedynka.

nokia.setTextColor(0, 1);

Jeśli wydrukujemy coś białym atramentem na czarnym tle, uzyskamy taki, negatywowy efekt.

Niestety w tym wypadku będziemy mieć problem z brakiem pikselowej ramki, przez co zwłaszcza lewa krawędź liter zlewa się z tłem. Jak to zrobić – o tym napiszę w następnym artykule, w którym zajmiemy się funkcjami graficznymi, bo w przeciwieństwie do wyświetlaczy alfanumerycznych, tutaj możemy rysować też różne figury geometryczne, a także dowolne rysunki, w ramach skromnych 4032 pikseli.

Płytka edukacyjna TME-EDU-ARD-2Płytka edukacyjna TME-EDU-ARD-2Sprawdź tutaj

Przeczytaj również

Nasi partnerzy

TMETech Master EventTME EducationPoweredby
Copyright © 2024 arduino.pl