środa, 31 października 2018

Jak wyświetlić kolorowy obrazek na wyświetlaczu 1.8 TFT ILI9163 - aktualizacja biblioteki dla PIC32MM.

Ponieważ udało mi się opanować konwersję kolorów z RGB888 do RGB565  i jej adaptację na wyświetlaczu ILI9193. Niniejszym czynię wpis, w którym pokażę drogę jaką trzeba przebyć od pobrania dowolnego obrazka z internetu do jego wyświetlenia na kolorowym wyświetlaczu TFT. Motywem przewodnim , który zostanie wyświetlony będzie zamieszczony obok komiksowy obrazek z dwoma znanymi Herosami. Zobaczymy jak nasz wyświetlacz poradzi sobie z tym obrazkiem i paletą barw. Czy choć trochę wyświetlony obrazek będzie przypominał pierwowzór ?? Zapraszam do zabawy.

Wpis jest przyczynkiem do zaktualizowania biblioteki dla wyświetlacza ILI9163  pod kątem mojej nowej płytki developerskiej dla PIC32MM, gdzie mamy do czynienia z 4-pinowym sterowaniem wyświetlacza.

Bohaterami od strony sprzętowej będzie zatem wyświetlacz 1.8 o rozdzielczości 160x120 i 16-bitowej palecie barw oparty na chipsecie ILI9163 z kartą SD na pokładzie :



Wyświetlaczem tym obsadzimy moją nową płytkę developerską dla PIC32MM Microchipa i płytkę developerską dla EFM32TG11 Silicon Labs.
Wyświetlacz jest jak na razie stosunkowo łatwo dostępny szczególnie na znanym portalu aukcyjnym bardzo daleko wschodnim :). Cena u nas ok 25 zł , za granicą ok 15 zł. 
Drugim bohaterem naszej zabawy będzie MCU firmy Microchip z serii PIC32MM a jest to dokładnie : PIC32MM0256GPM048  I taki MCU znajdziemy na mojej płytce developerskiej. Projekt płytki jest dostępny dla każdego bezpłatnie. Piny z jakich będziemy korzystać w bibliotece na obrazku poniżej :


Przejdźmy zatem do konkretów. Pierwszym krokiem zabawy jest upatrzenie sobie obrazka z internetu. Najlepiej aby miał kształt prostokąta. Standardowo obrazki są w formacie 24-bitowym RGB888. Na naszym wyświetlaczu wyświetlimy natomiast obrazek w standardzie RGB565 czyli 16 bitowym (5+6+5 = 16).



Aby dokonać konwersji posłużymy się ogólnie dostępnymi narzędziami takimi jak np. LCD Image Converter
Pomimo, że program ten jest dedykowany dla systemu Windows, to bez problemu uruchamia się w systemie Linux z użyciem nakładki Wine, którą trzeba sobie dodatkowo doinstalować z repozytorium .

Ściągamy zatem nasz obrazek z nagłówka artykułu na dysk lokalny. 
Kolejną czynnością będzie przekonwertowanie wymiarów obrazka do formatu 160x128 pixeli. W tym celu uruchamiamy pierwszy lepszy program, ja posłużę się aplikacją webową dostępną na stronie : Konwersja zdjęć do zadanego wymiaru.


Ładujemy do aplikacji nasz lokalny obrazek i ustawiamy docelowy rozmiar obrazka na 160x128 px. Odznaczamy znak wodny i klikamy Wykonaj. Wyskoczy nam okienko nowej strony z linikiem do pobrania z przekonwertowanym obrazkiem :


Pobieramy obrazek w wymiarach 160x128 na dysk lokalny. I to będzie nasze źródło dalszych działań. Mamy obrazek przycięty do rozmiarów naszego wyświetlacza teraz czas na konwersję kolorów.
Uruchamiamy LCD Image Converter :


Wybieramy opcję File --> Open i wskazujemy na nasz przycięty obrazek. Ja musiałem w Linuxie przenieść plik do wirtualnego dysku Wine C:

Po poprawnym wgraniu obrazka zobaczymy taki widok :


Wchodzimy w opcje : Options --> Conversion, otwiera nam się nowe okienko :


Wchodzimy w zakładkę Image i ustawiamy wszystko jak na obrazku poniżej :


Preset powinien być ustawiony na R5G6B5.

Klikamy na dole po lewej Show Preview, otwiera się okienko jak poniżej :


Zaznaczamy myszką dokładnie wszystkie cyfry i kopiujemy do schowka systemowego  CTRL+C

Uruchamiamy środowisko MPLABX  , wchodzimy do katalogu Header Files naszej biblioteki dla wyświetlacza ILI9163 i tworzymy nowy plik nagłówkowy z rozszerzeniem .h. Nazwijmy go heros.h.
W pliku heros.h tworzymy pustą tablicę const uint16_t. Do tej tablicy kopiujemy ze schowka systemowego za pomocą skrótu CTRL + V, dane 16 bitowe uzyskane z programu LCD Image Converter
Po skopiowaniu danych otrzymamy obrazek jak poniżej : 


I to już tyle od strony operacji na obrazku. Teraz najfajniejsze czyli jak nasze dzieło po konwersjach wyświetlić na wyświetlaczu.
Do pliku main.c biblioteki ILI9163 dodajemy #define "heros.h". Bibliotekę uzupełniłem o funkcję wyświetlającą obrazek w formacie RGB565 . Użycie jej wygląda bardzo prosto :

DrawBitmapRGB565(heros, 160, 128, 0, 0);

Trzeba jednak zauważyć , że w funkcji dodałem zamianę miejscami pola R i B bo to co wyszło z programu konwertującego nie za bardzo się podobało wyświetlaczowi w tym zakresie. Tutaj prawdopodobnie ma znaczenie ustawienie opcji Litle Endian lub Big Endian w programie konwertującym.

Poniżej efekt wyświetlania naszego obrazka, trzeba tylko pamiętać o właściwej orientacji wyświetlacza i ustawienie tego parametru w programie :






Efekt jest całkiem fajny jak na nie optymalizowany wymiar źródłowego obrazka. Od razu apetyt rośnie na większą rozdzielczość wyświetlacza i rozmiar, no ale nie dajmy się zwariować. Generalnie cieszyłem się jak dziecko kiedy obrazek namalował się na wyświetlaczu. I z tego punktu widzenia zabawę uważam za udaną. Nasz wyświetlacz po rewersie ma gniazdo na kartę SD, więc do przechowywania obrazków  w sam raz.

Plik projektu z GitHuba przegrywamy w postaci spakowanej na dysk lokalny, rozpakowujemy w katalogu projektów MPLABX-IDE i importujemy do IDE.
Miłej zabawy. 


Pozdrawiam
picmajster.blog@gmail.com



Linki:

Konwersja zdjęć do zadanego wymiaru.
Biblioteka do sterowania wyświetlaczem w wersji 4 pinowej






2 komentarze:

  1. Wciągnąłem do MPLAB i zaciekawił mnie fragment zegara ,na płytce nie ma kwarcu więc jest RC 8MHz i włączony fail safe monitor , czy ten monitor ma kompensować braki dokładności częst. kwarcu? Czy może trzeba włączyć ten POSC?

    OdpowiedzUsuń
  2. Fail Safe Monitor, to mechanizm , który pilnuje czy tyka kwarc zewnętrzny jeśli przestaje tykać np na skutek awarii to procek przełączy się automatycznie na tykanie kwarcem wewnętrznym. To możemy dezaktywować. Zegar w projekcie ustawiony na 24 MHz powinien być, korzystałem tutaj z MCC w MPLABX-IDE.

    OdpowiedzUsuń