Komputer samochodowy Mee 2.0 (1)

Komputer samochodowy Mee 2.0 (1)
Pobierz PDF Download icon
Współcześnie czas życia urządzenia jest krótszy, niż kiedykolwiek wcześniej, co tylko potwierdza obiegową opinię, iż rozwój elektroniki użytkowej jest teraz szybszy. Wystarczy zauważyć, że większość producentów urządzeń z tego obszaru, aktualizuje swoje produkty co najmniej raz w roku fundując przy okazji swoim klientom niezłą łamigłówkę decyzyjną. Z jednej strony wydaje się to irracjonalne, z drugiej, dzięki temu dostajemy coraz to nowocześniejsze i zwykle znacznie ładniejsze urządzenia. Dobrym przykładem może być tutaj motoryzacja, która jest świetną platformą prezentacji możliwości technologicznych producentów różnych gałęzi przemysłu, w tym elektroniki w szczególności. Wszak dzisiejsze samochody są syntezą wielu, czasami ekstremalnie nowoczesnych, rozwiązań elektronicznych, które to integrują w sobie systemy, o jakich jeszcze do niedawna mogliśmy wyłącznie pomarzyć. Rekomendacje: estetyczny komputer, który może usprawnić korzystanie ze starszego modelu samochodu lub być dobrym przykładem, jak takie rozwiązanie zaimplementować samodzielnie.

Kilku uznanych producentów samochodów (i nie tylko) deklaruje, iż w ciągu kliku lat wprowadzi do sprzedaży pojazdy samodzielnie poruszające się po drogach, zaś już teraz wyposaża swoje produkty w systemy, które pozwalają nazwać je autonomicznymi. Jako, że ostatnimi czasy miałem okazję „liznąć” tej nowoczesnej motoryzacji, muszę stwierdzić, że rzeczywiście robi ona piorunujące wrażenie, choć trzeba przyznać, że ta autonomiczność wymaga pewnego przyzwyczajenia. Z mojego punktu widzenia, osoby, która zajmowała się nieco grafiką komputerową i która to zwraca szczególną uwagę na formę prezentacji, szczególne wrażenie zrobiły wszelkiego rodzaju graficzne interfejsy użytkownika, prezentujące w piękny sposób zarówno dane pokładowe, jak i zawartości multimedialne, włączając w to coraz to częściej stosowane wirtualne zespoły zegarów w konsoli centralnej. Niby to nic nowego, bo zwykle nie pozyskujemy w ten sposób jakiś nowych, interesujących nas informacji, jednakże sposób ich „podania” budzi zachwyt i daje możliwość dowolnej personalizacji. Idąc tym tropem postanowiłem „zaktualizować” jeden ze swoich ostatnich projektów, a mianowicie uniwersalny komputer pokładowy Mee (EP 03/2015), wyposażając go w nowoczesny, piękny interfejs użytkownika zbudowany z wykorzystaniem kolorowego wyświetlacza TFT.

W tym momencie musiałem pokonać jeden z głównych problemów, na które napotykamy się za każdym razem, gdy sięgamy po element TFT, jego cenę! Moim głównym założeniem, podobnie, jak to miało miejsce, przy projekcie Mee, było przecież zbudowanie urządzenia dostępnego dla każdego, więc docelowy koszt jego budowy był głównym kryterium wyboru. Nie pozostało więc nic innego, jak znaleźć dobrej jakości, niewielki wyświetlacz TFT, którego cena pozwalałaby sprostać przyjętym założeniom. Na szczęście nie szukałem zbyt długo, gdyż jak zwykle mogłem liczyć na pomoc pana Sławomira Szwedy z firmy Unisystem, który dostarczył moduł RVT28AETNWN00 firmy Rivierdi wyposażony w popularny kontroler ILI9341, który to idealnie wpisuje się w nasze wymagania zarówno, jeśli chodzi o parametry techniczne, jak i bardzo niską cenę.

Zacznę nietypowo, bo od opisu wspomnianego modułu. Dlaczego warto poznać ten element? Po pierwsze, dlatego, że z uwagi na swoje parametry stał się dość popularny i łatwo kupić gotowe moduły z wygodnym złączem, a po drugie, jego niska cena powoduje, że znacznie chętniej będziemy sięgać po to nowoczesne rozwiązanie. Wyświetlacz firmy Rivierdi charakteryzuje się następującymi, wybranymi cechami funkcjonalnymi:

- Przekątna ekranu: 2,83” (obszar aktywny 43,2 mm×57,6 mm), bardzo mała grubość modułu – rzędu 3 mm.
- Rozdzielczość: 320x240 pikseli (możliwość pracy w trybie portret 240×320 pikseli lub pejzaż 320×240 pikseli).
- Liczba kolorów: 65 tys. /262 tys.
- Wbudowany filtr antyodblaskowy, podświetlenie LED.
- Interfejsy: 8-, 9-, 16- i 18-bitowa szyna danych, RGB, SPI/I2C (3- i 4-przewodowy), możliwość oddzielenia szyny danych od szyny rozkazów dla interfejsu równoległego.
- Możliwość wyposażenia w opcjonalny pojemnościowy lub rezystancyjny panel dotykowy,
- Taśma podłączeniowa typu ZIF 50 pinów (raster 0,5 mm).
- Napięcie zasilające 2,5…3,3 V.

Wyświetlacz RVT28AETNWN00 doskonale spełnia nasze wymagania, a dodatkowo zastosowany w nim sterownik ILI9341 ułatwia wykonanie oprogramowania sterującego. W tabeli 1 umieszczono opis rozmieszczenia wyprowadzeń taśmy ZIF.

Moduł TFT wyposażono w wiele interfejsów sterujących, przez co jego zastosowanie w docelowym systemie mikroprocesorowym jest ułatwione. Wybór aktywnego interfejsu sterującego jest wykonywany za pomocą wyprowadzeń IM0…IM3 modułu (tabela 2).

Jak widać, jest w czym wybierać! Jednak z uwagi na fakt, że nie dysponujemy bardzo szybkim mikrokontrolerem (AVR ATmega), posłużymy się równoległym, 8-bitowym interfejsem danych/rozkazów sterujących, dla którego aktywowania piny IM3…IM0 powinny być wyzerowane. Oczywiście, można by zastosować 16-bitową magistralę danych, co zwiększyłoby szybkość transmisji (w procesorze 8-bitowym tylko nieznacznie), jednak w ten sposób zajmiemy cenne wyprowadzenia mikrokontrolera, które będą potrzebne do realizacji innych funkcjonalności. Zastosujemy jednak dwa inne rozwiązania, które pozwolą na zwiększenie prędkości przesyłania danych z mikrokontrolera do sterownika ekranu ILI9341. Po pierwsze, sygnał wyboru sterownika ekranu CSX przyłączymy na stałe do masy zasilania aktywując „na stałe” sterownik ILI9341, przez co funkcje odpowiedzialne za transfer danych nie muszą „obsługiwać” tegoż sygnału. Po drugie, przyjmiemy, że poziomem spoczynkowym sygnału wyboru rodzaju danych DCX będzie logiczna „1”, co oznacza, że przesyłane dane są domyślnie danymi treści obrazu lub danymi towarzyszącymi rozkazom sterującym. Pozwoli to na dalsze przyśpieszenie stosownych funkcji graficznych. Nasza biblioteka nie będzie również obsługiwać sygnału odczytu magistrali sterującej RDX, gdyż nie korzystamy w niej z możliwości odczytu danych ze sterownika ekranu. Sygnał ten na stałe ma poziom wysoki.

No dobrze, mamy już garść niezbędnych informacji dotyczących sterownika ekranu, więc pora zacząć „zabawę” w programowanie! Niezbędne są do tego dwie podstawowe funkcje, które pozwolą na wysłanie do wyświetlacza TFT rozkazu sterującego lub danych obrazu (w analogiczny sposób jak dane obrazu wysyłamy dane towarzyszące rozkazom sterującym). Interpretacja rodzaju danych, które są odbierane przez sterownik ekranu, jest zdeterminowana poziomem wyprowadzenia DCX. Poziom niski na tym wyprowadzeniu decyduje o tym, iż przesyłana wartość zinterpretowana zostanie jako komenda sterująca, zaś wysoki, iż dana zostanie potraktowana jako argument dla tegoż rozkazu sterującego lub dana pamięci ekranu (w zależności od przesłanego wcześniej polecenia). Wspomniane, podstawowe funkcje narzędziowe zamieszczono na listingu 1.

Teraz możemy przystąpić do inicjalizacji sterownika naszego modułu TFT, ponieważ wymaga on ustawienia szeregu rejestrów konfiguracyjnych. Funkcję inicjalizacyjną pokazano na listingu 2. Brak przeprowadzenia inicjalizacji sterownika ekranu w zasadzie uniemożliwia poprawne funkcjonowanie modułu TFT, gdyż domyślne ustawienia rejestrów sterujących układu ILI9341 zwykle odbiegają od tych, wymaganych przez producenta wyświetlacza. Aby jednak w pełni zrozumieć znaczenie poszczególnych ustawień sterownika ekranu, niezbędna jest znajomość zawartości pliku nagłówkowego zamieszczonego na listingu 3.

Dalej, na listingu 4,pokazano funkcję odpowiedzialną za ustawienie aktywnego obszaru ekranu, w którego ramach jest przeprowadzany jest zapis do pamięci ekranu sterownika ILI9341 – jej użycie upraszcza manipulacje w zakresie pamięci obrazu.

Czas na funkcje odpowiedzialne za rysowanie prostych elementów graficznych, to jest funkcje umożliwiające wyświetlanie wypełnionego i „pustego” prostokąta na ekranie wyświetlacza TFT – pokazano je na listingu 5. Te funkcje korzystają z dwóch zmiennych globalnych przechowujących bieżący kolor treści ekranu oraz kolor tła. Specyfikacja tych zmiennych przedstawia się następująco: uint16_t Colour, Background.

Na listingu 6 zamieszczono nieskomplikowaną funkcję umożliwiającą wyświetlanie plików graficznych na ekranie wyświetlacza. Jednym z argumentów jest wskaźnik na tablicę (elementów 16-bitowych) umieszczoną w pamięci programu (Flash), która zawiera wielkość obrazu (pierwszy element: szerokość à MSB, wysokość à LSB) oraz jego zawartość (pozostałe elementy, przy czym każdy z nich zawiera kolor kolejnego piksela obrazu w formacie RGB565). Jest to rozwiązanie bardzo proste, jednak obarczone pewną wadą. Jak łatwo się domyślić, tak przygotowane obrazki zajmują dość sporo cennej pamięci programu. Jak temu zaradzić? Odpowiedź wydaje się dość prosta! Należy zastosować jakąś metodę kompresji powtarzających się danych, co pozwoli na ograniczenie wynikowego rozmiaru tablicy przechowującej treść obrazu. Ideę działania zastosowanego algorytmu kompresji najlepiej prześledzić analizując przykładowe ciągi słów 16-bitowych reprezentujących kolory kolejnych pikseli (założono powtarzanie się pikseli o kolorze 0xAAAA), co przedstawiono w tabeli 3. Zasada działania wspomnianego algorytmu jest bardzo prosta, a pomimo tego, dla obrazków o dużych obszarach jednolitych kolorów, osiągany stopień kompresji jest całkiem spory. Wymownym dowodem powyższej tezy jest rysunek 1, na którym pokazano obrazek i wynikową tablicę elementów 16-bitowych, reprezentującą jego treść w przypadku stosowania jak i niestosowania wspomnianego algorytmu kompresji obrazu.

Do „pełni szczęścia” brakuje nam dedykowanej aplikacji, za której pomocą dokonamy konwersji typowego pliku BMP do postaci tablicy języka C (o wspomnianej wcześniej organizacji danych) i która to dodatkowo umożliwi nam skompresowanie wyjściowego obrazka wedle powyższego algorytmu. Na szczęście napisanie takiej aplikacji nie jest rzeczą nazbyt skomplikowaną i nawet mi, mimo że dawno nie zajmowałem się językiem programowania innym, niż C, nie nastręczyło wielu problemów. Specjalnie na potrzeby tego projektu wykonałem aplikację, która realizuje wymaganą funkcjonalność (rysunku 2). Myślę, że przedstawione oprogramowanie jest na tyle proste i czytelne, iż nie wymaga dodatkowego słowa komentarza. Jedyne, czego potrzebujemy to funkcja, która umożliwia wyświetlenie na ekranie wyświetlacza skompresowanego obrazka – pokazano ją na listingu 7.

   

Uff, przyszedł czas na obsługę ostatniego elementu interfejsów graficznych, czcionek ekranowych! Aby jednak umożliwić wygodną obsługę wielu czcionek ekranowych, konieczne było wprowadzenie nowego typu danych, którego definicję pokazano na listingu 8. Bazując na zdefiniowanej powyżej strukturze, wprowadzono funkcję, która korzystając z globalnej zmiennej static fontDescription CurrentFont pozwala na ustawienie bieżącej czcionki ekranowej (listing 9). W tym momencie w końcu przyszedł czas na przedstawienie funkcji umożliwiającej rysowanie znaków, przy użyciu bieżącej czcionki ekranowej – listing 10. Ta funkcja korzysta z argumentu uint8_t Transparency, który to decyduje o tym, czy tło bieżącej czcionki ekranowej będzie określone wartością globalnej zmiennej uint16_t Background (wartość argumentu równa w takim przypadku SOLID_TEXT), czy też tło wyświetlanej czcionki będzie niejako przeźroczyste (wartość argumentu równa tym razem TRANSPARENT_TEXT)! Na bazie tejże funkcji wprowadzono dwie, nowe, proste funkcje, które umożliwiają wyświetlenie ciągu znaków z pamięci RAM, jak i pamięci programu (Flash) – pokazano je na listingu 11.

 

 

Robert Wołgajew, EP


Artykuł ukazał się w
Elektronika Praktyczna
lipiec 2016
DO POBRANIA
Pobierz PDF Download icon
Materiały dodatkowe

Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik marzec 2024

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio marzec - kwiecień 2024

Świat Radio

Magazyn krótkofalowców i amatorów CB

Automatyka, Podzespoły, Aplikacje marzec 2024

Automatyka, Podzespoły, Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna marzec 2024

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Elektronika dla Wszystkich kwiecień 2024

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów