Dołączenie do STM32 manipulatora analogowego i wyświetlacza graficznego

Dołączenie do STM32 manipulatora analogowego i wyświetlacza graficznego
Pobierz PDF Download icon
W artykule przedstawiamy sposób podłączenia kolejnych urządzeń peryferyjnych do kontrolera STM32. Tym razem przykłady prostych procedur umożliwiających wykorzystanie manipulatora (joysticka) analogowego i wyświetlacza graficznego ze sterownikiem PCD8544.

Wyświetlacze ze sterownikiem PCD8544 były stosowane w starych modelach telefonów komórkowych Nokii. Obecnie łatwo dostępne i relatywnie tanie pozwolą poszerzyć możliwości urządzenia z STM-em.

Rysunek 1. Schemat ideowy joysticka PS2

Rysunek 2. Wygląd wyświetlacza Nokii 5110

Manipulator (joystick) analogowy

Tabela 1. Sygnały wyprowadzone na 2 złączach 8 stykowych

Manipulator może być wykorzystany jako wygodny w użyciu interfejs sterujący lub wprowadzający dane. Element użyty w przykładach nosi nazwę handlową "joystick PS2". Jego schemat elektryczny pokazano na rysunku 1. Niewielki manipulator ma wymiary 35 mm×27 mm×32 mm.

Listing 1. Konfigurowanie zegara oraz inicjowanie portów

Głównymi elementami są dwa potencjometry zamontowane na płytce drukowanej pod kątem prostym. Ośki potencjometrów połączone są z pionowym drążkiem za pomocą przegubu. Drążek ma możliwość wychylenia w płaszczyźnie X-Y a jego ruch przenoszony jest na ośki potencjometrów.

W zależności od położenia drążka napięcie na suwakach potencjometrów zmienia się w zakresie od 0 V do napięcia zasilania (na schemacie zaznaczone jako +5 V). Napięcie zasilania może mieć dowolną wartość a w układach z kontrolerem STM32 nie powinno przekraczać 3,3 V. Dodatkowo, naciśnięcie drążka powoduje zadziałanie przycisku SW zwierając do masy wyprowadzenie J-1.

Wyświetlacz graficzny

Jako wyświetlacz wybrany został moduł z wyświetlaczem LCD stosowanym kiedyś w telefonach Nokia 5110. Na rysunku 2 pokazano jego wygląd i wymiary. Monochromatyczny wyświetlacz ma rozdzielczość 84×48 piksele. Może być zasilany napięciem 3,3 V. W module można skorzystać z podświetlenia matrycy 4 białymi diodami LED. Pracą wyświetlacza steruje zamontowany na płytce modułu układ PCD8544 lub jego odpowiednik. W tabeli 1 umieszczono zestawienie sygnałów wyprowadzonych na 2 złączach 8 stykowych.

Format transmisji do wyświetlacza

Przesyłanie danych i rozkazów do wyświetlacza odbywa się w formacie podobnym do SPI. Wykorzystywane są trzy sygnały:

  1. SDIN linia szeregowa, po której przesyłane są dane.
  2. SCLK linia zegara, którego zbocza narastające zatrzaskują kolejne przesyłane bity danych.
  3. SCE - linia uaktywniająca dostęp do wyświetlacza, gdy jej poziom będzie niski.

Na rysunku 3 przedstawiono przebiegi czasowe podczas transmisji 1 bajtu do wyświetlacza. Do wyświetlacza można wysyłać większą liczbę danych przy sygnale SCE stale utrzymywanym na poziomie niskim.

Rysunek 3. Przebiegi czasowe podczas transmisji 8 bitów do wyświetlacza

Rysunek 4. Organizacja pamięci obrazu

Organizacja pamięci obrazu

Listing 2. Inicjowanie przetworników i kanału DMA

W module wyświetlacza z PCD8544 każdy piksel obrazu jest zapalany lub gaszony stanem pojedynczego bitu pamięci obrazu. Przy rozdzielczości matrycy 84×48 daje to 504 bajty. Cała pamięć zorganizowana jest w 6 bankach po 84 bajty każdy (rysunek 4). Po wpisaniu do pierwszego bajtu banku 0 wartości 0xFF w lewym górnym rogu wyświetlacza pojawi się pionowa linia o długości 8 pikseli.

Za pomocą rozkazów sterujących można określić miejsce w pamięci obrazu, do którego ma zostać wpisany bajt danych. Licznik wierszy można ustawić w przedziale od 0 do 5. Licznik kolumn można ustawić w przedziale od 0 do 83.

Po zapisaniu do pamięci obrazu danej, liczniki kolumn i wierszy zostaną automatycznie zwiększone. Zależnie od ustawionego wcześniej trybu pracy wyświetlacza inkrementacja liczników przebiegnie odmiennie. W trybie poziomym (horyzontalnym) zwiększany zostanie licznik kolumn.

Po osiągnięciu wartości 83 przed kolejnym wpisem do pamięci obrazu zostanie wyzerowany natomiast licznik rzędów zwiększy się o 1 (rysunek 5).

W trybie pionowym (wertykalnym) zwiększony zostanie licznik rzędów. Po osiągnięciu wartości 5 przed kolejnym wpisem do pamięci obrazu zostanie wyzerowany natomiast licznik kolumn zwiększy się o 1 (rysunek 6).

Rysunek 5. Wpisywanie bajtów do pamięci obrazu w trybie horyzontalnym

Rysunek 6. Wpisywanie bajtów do pamięci obrazu w trybie wertykalnym

Wyświetlacz rozkazy sterujące

Tabela 2. Rozkazy sterownika PCD8544

Oprócz rozkazów ustawiających liczniki kolumn i wierszy inne wpływają na tryb pracy, ustawienie kontrastu wyświetlacza itd. Przesyłane dane traktowane są jak komendy sterujące, gdy linia D/C jest wyzerowana.

Rozkazy sterownika PCD8544 zebrane zostały w tabeli 2, natomiast ustawienia bitów konfiguracyjnych w tabeli 3.

Przogram przykładowy

Tabela 3. Ustawienia bitów konfiguracyjnych

Przykładowy program ma działać tak by zamieniać wychylenie manipulatora na liczby odpowiednio dla osi X (poziomej) i Y (pionowej).

Chwilowa pozycja wskazywana przez joystik wyświetlana będzie na wyświetlaczu.

Ze względu na łatwość dołączenia wyświetlacza i manipulatora do testów użyty został opisywany we wcześniejszych numerach EP Panel Edukacyjny.

W tabeli 4 podano wykaz połączeń pomiędzy wyświetlaczem, manipulatorem a Panelem. Dodatkowo, w gnieździe J5 Panelu można zamocować wyświetlacz LCD 2×16.

Przykładowy program został przygotowany dla środowiska CooCox.

Procedury do obsługi joystika analogowego

Tabela 4. Wykaz połączeń pomiędzy wyświetlaczem, manipulatorem a Panelem Edukacyjnym

Ponieważ joystick dostarcza na wyjściach poziomy napięć proporcjonalne do ustawionej pozycji, w systemie z mikrokontrolerem należy je najpierw przekształcić do postaci cyfrowej. STM32F103RC zamontowany na Panelu wyposażony jest w konwerter analogowo-cyfrowy o rozdzielczości 12 bitów a więc zupełnie wystarczającej.

Przedstawiona dalej procedura została oparta na przykładzie z biblioteki stm3210x_stdpheriph_lib. Do obsługi konwersji napięć z dwu kanałów X i Y joystika wykorzystano interfejsy ADC1 i ADC3 przetwornika oraz DMA. Dzięki takiemu rozwiązaniu po jednokrotnej inicjacji konwersje przebiegają całkowicie automatycznie wraz z odświeżaniem wyniku we wskazanych rejestrach programu.

Zgodnie z tym, co zostało podane w tabeli, napięcie z potencjometru X manipulatora podawane jest na wejście portu PC2, zaś napięcie z potencjometru Y na wejście PC4. Oba porty podłączone są wewnętrznie w kontrolerze do kanałów 12 i 14 przetwornika A/C.

Listing 2. c.d.

Na początku należy zadeklarować adresy bazowe interfejsów ADC1 i ADC3 oraz zmiennych, w których po konwersji będą umieszczane wyniki dla kanału X i Y:

#define ADC1_DR_Address
((uint32_t)0x4001244C)
#define ADC3_DR_Address
((uint32_t)0x40013C4C)
uint16_t ADC1ConvertedValue,
ADC3ConvertedValue;

Listing 3. Wstępne ustawienia linii I/O

Potem do portów i DMA należy podłączyć wewnętrzny zegar i zainicjować porty w analogowym trybie pracy (listing 1). Kolejna procedura inicjuje interfejsy ADC1, ADC3, kanały DMA oraz uruchamia automatyczną konwersję. Zamieszczono ją na listingu 2.

Od tego momentu zmienne ADC1ConvertedValue, ADC3ConvertedValue będą automatycznie odświeżane po zakończeniu kolejnej konwersji. Ponieważ przetwornik pracuje z 12 bitową rozdzielczością wyniki konwersji umieszczane w zmiennych będą mogły przyjąć wartość od 0 do 4095.

Procedury obsługi modułu wyświetlacza

Listing 4. Procedura programowej transmisji przez SPI do PCD8544

Najpierw należy zadeklarować porty kontrolera, które będą sterować odpowiednimi liniami wyświetlacza. Połączenia pomiędzy portami Panelu i liniami wyświetlacza podane zostały w tabeli. W procedurach zamiast nazwą portu wygodnie jest posłużyć się etykietą:

  • PCD8544_SCLK_WY - PA0, sygnał SCLK wyświetlacza.
  • PCD8544_DN_WY - PA1, sygnał DN wyświetlacza.
  • PCD8544_DnC_WY - PA2, sygnał D/N wyświetlacza.
  • PCD8544_RST_WY - PA5, sygnał RESET wyświetlacza.
  • PCD8544_SCE_WY - PA6, sygnał SCE wyświetlacza.

Listing 5. Procedura inicjacji sterownika PCD8544

Najpierw znanym sposobem należy podłączyć sygnał zegarowy do portów (w tym przypadku PA) i zainicjować je w trybie wyjścia z podciąganiem GPIO_Mode_Out_PP. Potem wstępnie ustawiamy odpowiednie poziomy na poszczególnych portach - listing 3.

Podstawowa procedura transmisji pojedynczego bajtu do modułu wyświetlacza może być taka, jak na listingu 4. Na tej procedurze oparto procedury transmisji danych do pamięci obrazu oraz wysyłania rozkazów sterujących. Wyglądają one następująco:

Listing 6. Procedura ustawienia pozycji kursora

//procedura zapisu danej obrazu do sterownika PCD8544
void WriteData_PCD8544(unsigned char dana)
{
GPIO_PCD8544_Low(PCD8544_SCE_WY);
GPIO_PCD8544_High(PCD8544_DnC_ WY);//wysyłanie danych obrazu WriteSPI_PCD8544(dana);
GPIO_PCD8544_ High(PCD8544_SCE_WY);
}
//procedura zapisu rozkazu do sterownika PCD8544 void WriteCmd_ PCD8544(unsigned char dana)

Listing 7. Konwersja łańcucha znaków na ich reprezentację graficzną przesyłaną do wyświetlenia

{
GPIO_PCD8544_ Low(PCD8544_SCE_WY);
GPIO_PCD8544_ Low(PCD8544_DnC_ WY);//wysyłanie komend WriteSPI_PCD8544(dana);
GPIO_PCD8544_High(PCD8544_SCE_WY);
}

Po opisanym wcześniej zainicjowaniu portów kontrolera należy wywołać procedurę inicjacji samego wyświetlacza. Sprowadza się ona do przesłania do wysłania sekwencji komend a na koniec do wyczyszczenia pamięci obrazu. Całą sekwencję zaprezentowano na listingu 5.

Kolejna procedura służy do ustawienia licznika wierszy i kolumn na pożądaną wartość. Ustawienia te wyznaczą na wyświetlaczu pozycję, od której rozpocznie się wyświetlanie nowego tekstu (listing 6). Następne procedury konwertują łańcuch znaków na ich graficzną reprezentację przesyłaną do wyświetlenia. Kształt każdego znaku zapisany jest w tabeli-matrycy znaków 5*8 pikseli. Zamieszczono je na listingu 7.

Główna pętla programu

Listing 8. Pętla główna programu

W głównej, nieskończonej pętli programu (listing 8) następuje:

  • Przekształcenie otrzymanych po konwersji wartości do zakresu odpowiadającego rozdzielczości poziomej i pionowej.
  • Wymazanie poprzednich napisów na wyświetlaczu.
  • Wyświetlenie informacji o nowej pozycji joysticka.

Program demonstracyjny został przygotowany jako pakiet środowiska programistycznego CooCox.

Ryszard Szymaniak, EP

Artykuł ukazał się w
Elektronika Praktyczna
październik 2015
DO POBRANIA
Pobierz PDF Download icon
Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik grudzień 2024

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio listopad - grudzień 2024

Świat Radio

Magazyn krótkofalowców i amatorów CB

Automatyka, Podzespoły, Aplikacje listopad - grudzień 2024

Automatyka, Podzespoły, Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna grudzień 2024

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Elektronika dla Wszystkich grudzień 2024

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów