Digilent Pmod i STM32 (cz. 2) – PmodHYGRO i PmodOLEDrgb
PmodOLEDrgb
Moduł PmodOLEDrgb zawiera kolorowy wyświetlacz graficzny typu OLED o przekątnej 0,95 cala ze sterownikiem SSD1331. Wyświetlacz ma rozdzielczość 96×64 pikseli i 16-bitową głębię kolorów RGB (5:6:5). Zastosowany sterownik SSD1331 posiada wewnętrzną pamięć o rozmiarze 96x64x16 bitów, a także wsparcie sprzętowe m.in. dla operacji czyszczenia ekranu, rysowania linii i prostokątów. Dzięki takiemu rozwiązaniu rysowanie podstawowych kształtów wymaga zdecydowanie mniejszej ilości danych przesyłanych do wyświetlacza w porównaniu do standardowego podejścia polegającego na rysowaniu piksel po pikselu.
Podłączenie PmodOLEDrgb do KAmeleona
PmodOLEDrgb zawiera 12-pinowe złącze z interfejsem SPI i dodatkowymi pinami kontrolującymi moduł. Odpowiada ono złączu typu 2A z niepołączonym pinem MISO i pinami INT oraz RESET zamienionymi na sygnały kontrolne wyświetlacza. Ze względu na wykorzystanie pinów 9 i 10 na złączu, modułu nie można podłączyć do gniazda Pmod-SPI w zestawie KAmeleon. Dlatego na potrzeby przykładu PmodOLEDrgb został podłączony do złącza oznaczonego jako ARDUINO CONNECTOR. Rozkład pinów na złączu oraz sposób podłączenia do zestawu KAmeleon zostały przedstawione w tabeli 2.
Tabela 2. Podłączenie modułu PmodOLEDrgb do złącza ARDUINO zestawu Kameleon
Sygnał | Numer pinu PmodOLEDrgb | Numer pinu Kameleon ARDUINO CONNECTOR | Pin mikrokontrolera |
CS | 1 | D10 | PB12 |
MOSI | 2 | D11 | PB15 |
N/C | 3 | – | – |
SCK | 4 | D13 | PB10 |
GND | 5 | GND | – |
VCC | 6 | +3,3 | – |
D/C | 7 | D6 | PD10 |
RES | 8 | D7 | PB11 |
VCCEN | 9 | D8 | PD11 |
PMODEN | 10 | D9 | PB13 |
GND | 11 | – | – |
VCC | 12 | – | – |
Kod do obsługi wyświetlacza – konfiguracja
Do obsługi wyświetlacza została wykorzystana biblioteka udostępniona przez firmę Digilent na stronie modułu: https://reference.digilentinc.com/pmod/pmod/oledrgb/example_code
Znajdująca się na stronie wersja sterownika PmodOLEDrgb dla środowiska MPIDE na potrzeby przykładu zmodyfikowano tak, aby współpracowała z biblioteką STM32Cube_FW_L4 i środowiskiem Atollic TrueSTUDIO. Źródła sterownika, znajdujące się w katalogu Drivers/OLEDrgb, zaimplementowano w języku C++, dlatego też przykładowy projekt skonfigurowano dla tego języka.
W celu uruchomienia wyświetlacza należy utworzyć obiekt klasy Oledrgb, której interfejs znajduje się w pliku Drivers/OLEDrgb/OLEDrgb.h. Za konfigurację mikrokontrolera oraz inicjalizację wyświetlacza jest odpowiedzialna metoda Oledrgb::begin, wywołująca kolejno dwie inne metody: Oledrgb::OledrgbHostInit oraz Oledrgb::OledrgbDevInit. Pierwsza z nich konfiguruje SPI oraz wymienione w tabeli 3 piny mikrokontrolera. Sygnał zegarowy SPI jest ustawiony w trybie 3 (Mode = 3, CPOL = 1, CPHA = 1), dane są 8-bitowe, natomiast sygnał CS jest kontrolowany programowo. Druga z wymienionych metod konfiguruje wyświetlacz zgodnie z sekwencją opisaną w dokumentacji modułu dostępnej na stronie: https://reference.digilentinc.com/reference/pmod/pmodoledrgb/reference-manual
Metody do obsługi wyświetlacza
Po zakończonej konfiguracji dostępnych jest kilka metod umożliwiających pracę z wyświetlaczem. Wymienione są one w tabeli 3. Do oryginalnej biblioteki zostały dodane dwie metody pozwalające na wyświetlanie pojedynczych znaków i całych napisów. Funkcja wyświetlająca znaki, pokazana na listingu 4, generuje lokalną bitmapę zawierającą znak na tle o kolorze zdefiniowanym w argumencie. Jest to optymalizacja zapobiegająca ustawianiu na wyświetlaczu pojedynczych pikseli, co znacząco wpływa na szybkość wyświetlania. Funkcja obsługuje czcionkę o nazwie font zdefiniowaną w pliku Drivers/OLEDrgb/Font.c.
Tabela 3. Lista metod do obsługi wyświetlacza PmodOLEDrgb
Metoda | Opis |
Oledrgb::DrawRectangle | Rysowanie prostokąta (wsparcie sprzętowe). |
Oledrgb::DrawLine | Rysowania linii (wsparcie sprzętowe). |
Oledrgb::DrawPixel | Rysowanie piksela. |
Oledrgb::DrawBitmap | Rysowanie bitmapy. |
Oledrgb::DrawString | Rysowanie napisu (dodane do oryginalnej biblioteki). |
Oledrgb::DrawChar | Rysowanie znaku (dodane do oryginalnej biblioteki). |
Listing 4. Funkcja wyświetlająca znaki
void Oledrgb::DrawChar(uint8_t col, uint8_t row, char character, uint16_t color, uint16_t bgColor) { uint8_t bitmap[FONT_WIDTH * FONT_HEIGHT * 2] = {0}; for(int i = 0; i < FONT_WIDTH * FONT_HEIGHT; i++) { bitmap[2 * i] = (bgColor >> 8) & 0xFF; bitmap[2 * i + 1] = bgColor & 0xFF; } uint8_t charIndex = character - ' '; for(int i = 0; i < 6; i++) { for(int j = 0; j < FONT_HEIGHT; j++) if ((font[charIndex][i] << j) & 0x8000) { bitmap[2 * (i + (j * FONT_WIDTH))] = (color >> 8) & 0xFF; bitmap[2 * (i + (j * FONT_WIDTH)) + 1] = (color) & 0xFF; } } this->DrawBitmap(col, row, col + FONT_WIDTH - 1, row + FONT_HEIGHT - 1, bitmap); }
W funkcji main przykładu generowana jest bitmapa zawierająca powtarzające się poziome paski w trzech głównych kolorach: czerwonym, zielonym i niebieskim. Na bitmapie wyświetlany jest także napis „Hello KAMELEON!”. Do generacji kodów kolorów wykorzystywano metodę Oledrgb::BuildRGB, która konwertuje trzy 8-bitowe wartości (RGB) na jedną liczbę 16-bitową. Efekt działania programu przedstawiono na fotografii 7.
Fotografia 7. Efekt uruchomienia przykładowego programu dla PmodOLEDrgb