[e-PAPER] STM32L0538-DISCO w praktyce [2]: podstawy obsługi wyświetlacza e-paper GDE021A1 [PRZYKŁADY]

Uwaga! Wszystkie opublikowane odcinki kursu są dostępne pod adresem.

 

W tej części artykułu pokażemy w jaki sposób włączyć wybrane piksele wyświetlacza e-paper i w jaki sposób wyświetlić na wyświetlaczu GDE021A1 wcześniej przygotowaną monochromatyczną bitmapę.

Wyświetlacz GDE021A1, zastosowany w zestawie STM32L0538-DISCO, wyświetla obrazy o rozdzielczości 172×72 pikseli w monochromatycznej skali barw. Aby wyświetlić dowolny piksel na wyświetlaczu stworzymy następującą funkcję w bibliotece stm32l0538_discovery_epd.c :

Parametr Xpos odpowiada za rząd w którym zostanie wyświetlony piksel na dłuższym boku wyświetlacza. Może przybierać wartości od 0 do 171 (zgodnie z długością wyświetlacza, czyli 172 piksele).

 

 

 

Parametr Ypos odpowiada za rząd w którym zostanie wyświetlony piksel na krótszym boku wyświetlacza. Wartości wysyłane wyświetlacza są ośmiobitowe: cztery bity dla rejestru odpowiadającego za rząd X i 4 bity dla rzędu Y. Parametr Ypos może przybierać wartości od 0 do 17. Każda wartość odpowiada 4 pikselom, więc Ypos = 0 odpowiada za piksele 0…3, Ypos = 1 odpowiada za piksele 4…7 itd. Całkowita szerokość  wyświetlacza to 18 pomnożone przez 4, czyli 72 piksele.

Parametr HEX pozwala na włączenie dowolnej kombinacji 4 pikseli, których dane są przesyłane w zapisie ośmiobitowym. Parametr HEX przybiera wartości w zapisie heksadecymalnym, od 0x00 do 0xFF. Pierwsza liczba (po lewej) wskazuje na dwa pierwsze piksele z czterech, po dwa bity na każdy piksel. Jeżeli chociaż jeden z dwóch bitów będzie miał wartość 0, piksel zostanie włączony, jeżeli oba będą mieć wartość 1, piksel będzie wyłączony. Liczba 0xFF oznacza wszystkie 4 piksele wyłączone, liczba 0x00 wszystkie włączone.


W funkcji main() deklarujemy użycie wyświetlacza za pomocą funkcji BSP_EPD_Init(); a następnie używamy następujących funkcji aby wyświetlić obraz na wyświetlaczu:

BSP_EPD_Clear(EPD_COLOR_WHITE);

BSP_EPD_Pixel(uint16_t Xpos, uint16_t Ypos, uint8_t HEX);

BSP_EPD_RefreshDisplay();

Funkcja BSP_EPD_Clear(EPD_COLOR_WHITE); zmienia wszystkie piksele wyświetlacza na białe pozwalając na wyświetlenie nowego obrazu.

Funkcja BSP_EPD_RefreshDisplay(); odświeża wyświetlacz i wyświetla piksele po załadowaniu ich danych do pamięci RAM mikrokontrolera.

Przykłady:

BSP_EPD_Pixel(0, 0, 0xFE); – włączenie piksela w punkcie 1×1

BSP_EPD_Pixel(0, 0, 0xFD); – włączenie piksela w punkcie 1×1, inny sposób

BSP_EPD_Pixel(99, 5, 0xFE); – włączenie piksela w punkcie 100×20

BSP_EPD_Pixel(99, 5, 0x80); – włączenie piksela w punkcie 100×23

BSP_EPD_Pixel(99, 5, 0x88); – włączenie pikseli w punktach 100×21 i 100×23

BSP_EPD_Pixel(99, 10, 0xFF); – włączenie pikseli w punktach 100×41, 100×42, 100×43 i 100×44

 

Wyświetlanie bitmap

Aby wyświetlić bitmapę na wyświetlaczu e-paper zestawu STM32L0538-DISCO, należy sformatować obraz i skonwertować go na kod możliwy do przesłania do pamięci RAM mikrokontrolera.

Wstępną edycję obrazu możemy dokonać w dowolnym programie graficznym. Programem, który umożliwi konwersję bitmapy na kod oraz edycję zapewniającą dobrą jakość wyświetlonego obrazu jest darmowy program XnView. Rozmiar obrazu nie może przekroczyć rozdzielczości wyświetlacza, czyli 172×72 pikseli, możemy tego dokonać wybierając opcję Zmień rozmiar… z zakładki Obraz .


Następnym krokiem jest zapisanie obrazu w czarno-białej skali barw, w zależności od obrazu wybieramy rodzaj konwersji zapewniający najlepszy efekt z zakładki Obraz i Konwertuj do czarno-białego .


Po konwersji część detali może zniknąć, możemy w tym momencie zapisać plik i dokonać jego edycji w dowolnym programie graficznym, np. Paint. Aby otrzymać obraz na wyświetlaczu odpowiadający naszej bitmapie, musimy obrócić go o 90° zgodnie ze wskazówkami zegara (jego rozmiar zmieni się z 172×72 na 72×172 pikseli).


Ostatnią częścią przygotowania obrazu jest zapisanie go w formacie XBM-X11 korzystając z opcji Zapisz jako… i wybraniu formatu z listy.

W utworzonym wcześniej projekcie w środowisku ARM-MDK otwieramy bitmapę zapisaną w formacie .xbm .


Kopiujemy cały kod oprócz definicji rozmiarów (możemy je skopiować i skomentować aby pamiętać o rozmiarze) do main.c jako prywatną funkcję, zmieniając static char x_bits[] = na static uint8_t x_bits[] = . W miejscu x_bits wpisujemy nazwę naszej funkcji, np. static uint8_t Logo[] = .

W funkcji main() deklarujemy użycie wyświetlacza za pomocą funkcji BSP_EPD_Init(); a następnie używamy następujących funkcji aby wyświetlić obraz na wyświetlaczu:

BSP_EPD_Clear(EPD_COLOR_WHITE);

BSP_EPD_DrawImage(uint16_t Xpos, uint16_t Ypos, uint16_t Xsize, uint16_t Ysize, uint8_t *pdata);

BSP_EPD_RefreshDisplay();

Funkcja BSP_EPD_Clear(EPD_COLOR_WHITE); zmienia wszystkie piksele wyświetlacza na białe pozwalając na wyświetlenie nowego obrazu.

Funkcja BSP_EPD_DrawImage(uint16_t Xpos, uint16_t Ypos, uint16_t Xsize, uint16_t Ysize, uint8_t *pdata); służy do przesłania danych naszego obrazu do wyświetlacza. Parametry uint16_t Xpos , uint16_t Ypos określają gdzie zostanie wyświetlony obraz. Aby obraz został wyświetlony poprawnie wartość parametru Ypos musi być podzielna przez 4. Parametry uint16_t Xsize , uint16_t Ysize określają rozmiar wyświetlanego obrazu, muszą być zgodne z rozmiarami naszego obrazu (maksymalnie uint16_t Xsize = 72 i uint16_t Ysize = 172). Parametr uint8_t *pdata wskazuje na dane o naszym obrazie, więc należy to wpisać nazwę funkcji pod jaką znajdują się dane skopiowane z pliku .xbm . Przykładowe wywołanie funkcji ma postać: BSP_EPD_DrawImage(0, 3, 48, 172, Logo); .

Funkcja BSP_EPD_RefreshDisplay(); odświeża wyświetlacz i wyświetla nasz obraz po załadowaniu jego danych do pamięci RAM mikrokontrolera.

Jakub Górnicki

Do pobrania

O autorze