środa, 19 grudnia 2018

Jak wyświelić kolorowy obrazek na wyświetlaczu TFT ILI9163 1.8" zapisany na karcie SD.

Zbliżają się narodziny Pana Jezusa. To piękne święto bo m.in tuż przed, czyli w dzień Wigilijny wszyscy się obdarowują prezentami. Taki symboliczny wyraz miłości do drugiego człowieka. Na okoliczność tego radosnego święta rozpracowałem zagadnienie związane z wyświetlaniem dowolnego obrazka z karty SD. Wykorzystałem możliwości biblioteki FatFs i biblioteki dla kolorowego wyświetlacza ILI9163 1.8 " z czytnikiem SD. Pan Jezus może mi wybaczy , że przed jego urodzinami zajmuję się takimi głupotami, zamiast Żonie pomóc lepić pierogi :) No ale co ja poradzę, że lepić pierogów nie lubię a grzebać w kodzie tak.

W bibliotece z artykułu dotyczącym wyświetlania obrazka na wyświetlaczu TFT ILI9163 1.8", dane obrazka pobieraliśmy z tablicy.  Przy rozdzielczości 160x128 a taką ma nasz wyświetlacz ,tablica zawierała 20480 elementów. PIC32MM dla ,którego była dedykowana biblioteka ma relatywnie spory  Flash-256kB i RAM-32kB ale nawet dla takich zasobów MCU waga obrazka zbyt mocno obciąża zasoby pamięci. Inna sprawa jaki jest sens wyświetlania obrazków na tak małym wyświetlaczu , sztuka dla sztuki ale zabawa przednia. Skoro umiemy wyświetlać kolorowy obrazek z tablicy to czemu nie pójść krok na przód i nie zrobić tego przy użyciu karty SD. Ja taki krok zrobiłem udało się , efekt jest fajny. Ale po kolei.

Baza sprzętowa to moja płytka developerska dla PIC32MM i wyświetlacz TFT ILI9163 w wersji 1.8" z czytnikiem SD po rewersie. Ponieważ mam na razie na stanie płytki developerskie dla PIC32MM w wersji 2.0  ,więc na nich bazuję. Dla przypomnienia płytki w wersji 3.0 mają na pokładzie wyświetlacz ILI9163 i są naprawdę fajne. Główny koszt zrobienia płytki to w zasadzie koszt wyświetlacza. Zachęcam do ich produkowania w "płytkarniach", moje projekty udostępniam za darmo.
Podłączenia jakie wykorzystałem w bibliotece dla czytnika kart SD i wyświetlacza ILI9163 są dokładnie takie jak na płytce w wersji 3.0.

     Required connections for LCD ILI9163:

     RESETRB11
     A0         -  RC3
    SDA      -  RD0
    SCK      RB8
    CS        Ground   
   
    Reqired connections for SD card:

     SCK     - RA0
     MISO   - RA1
     MOSI   - RA3
     CS       - RB3

Poniżej schemat podłączenia wyświetlacza i czytnika SD do PIC32MM :

 
Od strony peryferiów wykorzystałem dwa moduły sprzętowe SPI, SPI1 do sterowania wyświetlaczem i SPI2 do sterowania czytnikiem kart SD. Jak widać w praktyce przydaje się większa krotność danego peryferium w zasobach MCU.
Prędkość SPI w obu przypadkach ustawiona jest na 1,2 MHz  (BRG = 0x9) można tę prędkość śmiało sobie zwiększyć np do 12 MHz.

Całą konfigurację sprzętową (ustawienie peryferiów, pinów, timera) w PIC32MM, wykonałem za pomocą wtyczki do MPLABX-IDEMCC. Wtyczka generuje doskonały kod i przejrzystą strukturę projektu. Producenci z ekosystemu ARM-a powinni uczyć się od Microchipa jak generować dobry i przyjazny dla użytkownika kod z tego typu narzędzi.

Teraz zajmiemy się obrazkiem. Obrazek , który weźmiemy na warsztat to dokładnie ten z nagłówka artykułu. Oryginalny obrazek ma rozdzielczość 1024x768 co daje współczynnik 768/1024 = 0,75 co jest zbliżone do parametrów naszego wyświetlacza 128/160 = 0.8. Ideałem byłoby aby współczynnik źródłowy obrazka pokrywał się z możliwościami naszego wyświetlacza wtedy geometria obrazka będzie wiernie odwzorowana.
W pierwszej kolejności musimy dokonać dostosowania rozdzielczości obrazka źródłowego do naszej docelowej rozdzielczości jaką dysponuje nasz wyświetlacz ILI9163 1.8 " czyli 160x128. Ja robię to za pomocą tej strony : Konwersja zdjęć do zadanego wymiaru. Wadą tego jest spora ilość reklam , które walą po oczach ale strona robi swoje prosto i szybko. Jak się tym posługiwać pisałem w tym artykule : artykuł. Jeśli mamy już przycięty obrazek kolejnym krokiem jest konwersja obrazka do formatu kolorów RGB565 ,którym posługuje się nasz wyświetlacz. Robimy to np. za pomocą programu : Program do konwersji bitmap do C dla Win. Program jest dla windy ale bez problemu działa pod Linuxem i emulatorem Wine. Jak dokonać konwersji , pisałem o tym w artykule
Dane jakie uzyskamy z programy konwertującego kopiujemy do pliku tekstowego o nazwie mikolaj.txt na naszym PC. Dane po skopiowaniu do pliku nie będą idealnie uporządkowane i będą wyglądały jak poniżej :


Musimy w drodze edycji doprowadzić do uporządkowania danych w wierszach i kolumnach w sumie to niewielka robota edycyjna. Po uporządkowaniu otrzymamy obrazek jak poniżej :


Jeśli nie uporządkujemy edycyjnie danych, będziemy mieć problemy z poprawnym wyświetlaniem obrazka. Po uporządkowaniu danych plik mikolaj.txt przegrywamy z naszego PC na kartę SD. Przydaje się w tym wypadku dodatkowy czytnik SD powiązany z naszym PC , ja takowy znalazłem w swoim laptopie a nawet nie wiedziałem, że go tam mam. Po przegraniu pliku na kartę SD otwieramy plik z karty i jeszcze raz dokładnie sprawdzamy czy nie ma dziur między danymi jeśli są to trzeba je zlikwidować. Poprawny format uporządkowanych danych musi wyglądać tak :

0x0000, 0x0023, 0x0140, ........

Takie uporządkowanie jest niezbędne ponieważ w procesie odczytywania danych posługujemy się funkcją biblioteczną FatFS - lssek(). funkcja ta przesuwa wskaźnik odczytu od początku pliku o zadaną wartość. Czyli odczytujemy pierwszą porcję danych 0x0000 (po jednym bajcie) a następnie aby odczytać kolejną porcję danych 0x0023, musimy przesunąć wskaźnik odczytu na wartość 8. Dlaczego 8 ? ano policzmy ile bajtów jest do początku drugiej porcji danych czyli 0x0023 wyliczamy "0x0000, " (cudzysłowie nie uwzględniamy, dałem je po to aby zobaczyć tę spację na końcu), liczymy pojedyńcze bajty czyli 0 x 0 etc ostatni bajt to spacja po przecinku. Jak by nie patrzył wychodzi 8 i o taką wartość musimy za każdą iteracją zwiekszyć wskaźnik odczytu. W programie znajdziemy na tę okoliczność taki zapis : licz = licz + 8 i lssek(.. ,licz);

Najważniejszym elementem programu jest funkcja DrawBitmapRGB565_withSDcard(); to w tej funkcji dzieje się cała magia odczytu danych z karty SD  i wyświetlania ich na wyświetlaczu. Definicje funkcji znajdziemy w pliku main.c. Zdziwi nas zapewne jeden z typów argumentu , który wygląda tak : const TCHAR* path. Biblioteka FatFs wprowadza swoją abstrakcję na typy danych i takie dziwolągi jak  DWORD, TCHAR etc nie powinny nas zdziwić. Typ TCHAR to po prostu char i tyle.
Argumenty jakie przekazujemy do funkcji DrawBitmapRGB565_withSDcard() to "nazwa pliku", szerokość i wysokość obrazka, oraz współrzędne początku rysowania. Użycie funkcji w naszym przypadku będzie wyglądać następujaco :

DrawBitmapRGB565_withSDcard("mikolaj.txt",160, 128, 0, 0);

Z rzeczy wartych wspomnienia o życiu wewnętrznym funkcji:

Za pomocą funkcji bibliotecznej FatFs  - f_read() odczytujemy za jednym zamachem paczkę 6 bajtów ponieważ jeden piksel opisany jest na 6 bajtach np 0x0023. Odczytane dane są w formacie znakowym czyli char. Musimy zatem skonwertować je do świata cyfr a zrobiłem to takim zapisem :

/*convert string to int, like this "0x0821" --> 2081*/
num = (uint16_t)strtol(Buff, NULL, 16);

odsyłam tutaj do opisu funkcji standardowej języka C  strtol() . Funkcja ta znajduje się w stdlib.h i ten plik musimy dołączyć do projektu.
W naszej magicznej funkcji znajdziemy również kombinację alpejską, która zamienia nam pozycjami rgb na brg. Tej kombinacji wymagał format danych jaki otrzymałem z programu konwertującego do RGB565. Jeśli w programie przed konwersją zaznaczymy opcję Big Endian to ta kombinacja alpejska będzie zbędna ale nie sprawdzałem tego.

No dobrze nie ma co się tutaj więcej rozwodzić bo najważniejszy jest soft , chwila na uporządkowanie kodu i wstawię go na GitHub. Załączę również dwa pliki z grafiką do wyświetlania - mikolaj.txt i pickup.txt, które trzeba koniecznie wgrać manualnie na kartę SD. Program wyświetla najpierw obrazek pickup.txt a po 1 s drugi obrazek mikolaj.txt. Można tych obrazków naćkać więcej i zrobić sobie pokaz slajdów :). Projekt ściągamy do MPLABX-IDE za pomocą opcji clone.
Zabawa z wyświetlaniem obrazków dała mi sporo radości. Co z tego, że praktycznego zastosowania może nie znajdę ale liczy się ta chwila radości z efektu pracy i tyle.



Pozdrawiam
picmajster.blog@gmail.com

Linki :

Brak komentarzy:

Prześlij komentarz