ZL30ARM: zdalne sterowanie RC5 na STM32

Większość z tworzonych projektów wymaga zewnętrznej kontroli przez użytkownika, istnieje przy tym wiele sposobów na rozwiązanie tej kwestii. Od prostej obsługi bezpośredniej urządzenia, przy użyciu przycisków mechanicznych, pojemnościowych, kontroli przez ekrany dotykowe po sterowanie zdalne. W przypadku zdalnego sterowania także do wyboru jest duża liczba systemów i rozwiązań jakie można zastosować. Jednym z bardziej popularnych jest kontrola przy użyciu pilota działającego w podczerwieni.

W ramach działania w tym paśmie wiele firm stworzyło jeszcze większą liczbę metod kodowania transmitowanych danych. Do tych najbardziej rozpowszechnionych kodów należy zaliczyć: SIRC, RC5, RC6. W poniższym projekcie, na podstawie prostej aplikacji, przedstawiony został sposób obsługi jednego z nich – kodu RC5.

W projekcie wykorzystano zestaw ZL30ARM oraz wyświetlacz KAmodLCD1. Działanie przedstawionej aplikacji polega na przełączaniu stanu diod LED zestawu ZL30ARM przy użyciu pilota z kodem RC5, za pomocą klawiszy cyfrowych od 1 do 8. Odbiór sygnału podczerwieni odbywa się poprzez odbiornik TSOP31236 zamontowany na płytce zestawu ZL30ARM. Zestaw ten umożliwia „luźną” konfigurację, co daje możliwość dostosowania do własnej aplikacji. W poniższym projekcie połączenie poszczególnych elementów zostało wykonane zgodnie z rysunkiem 1.

 

Rys. 1. Połączenie poszczególnych elementów

Rys. 1. Połączenie poszczególnych elementów

 

Na wyświetlaczu modułu KAmodLCD1 prezentowane są wartości poszczególnych części kodu RC5. W linii oznaczonej jako „SB” przedstawiona jest wartość bitów startu, w linii „TB” zaprezentowana jest wartości bitu toggle, w linii „AB” zapisane są bity informujące o adresie docelowym urządzenia, natomiast w linii „CB” przedstawiona jest wartość rozkazu. Na rysunku 2 przedstawiony został wyświetlacz podczas pracy.

 

Rys. 2. Wyświetlacz modułu KAmodLCD1 podczas pracy

Rys. 2. Wyświetlacz modułu KAmodLCD1 podczas pracy

 

Przed opisem samego programu należy scharakteryzować kod podczerwieni RC5. Sama transmisja w podczerwieni stawia duże wymagania. Można stwierdzić, że do transmisji danych mamy do dyspozycji tylko jedną linię. Powoduje to, iż w transmitowanym sygnale należy zawrzeć, poza informacjami o wartości poszczególnych bitów, także informacje służącego do synchronizacji sygnału. W przypadku RC5 zostało to zapewnione przez zastosowanie kodowania Manchester, które polega na „naniesieniu” sygnału zegarowego na sygnał danych. W wyniku tej operacji otrzymujemy sygnał, w którym wartości poszczególnych bitów są identyfikowane z rodzajem zbocza jakie wystąpiło. Dla bitu o wartości ‘1’ mamy do czynienia ze zboczem opadającym, natomiast dla bitu o wartości ‘0’ ze zboczem narastającym, które następuje w połowie trwania bitu. Na rysunku poniżej przedstawiono przebieg sygnału dla obydwu przypadków.

 

Rys. 3. Przebiegi sygnałów bitów w kodzie RC5

Rys. 3. Przebiegi sygnałów bitów w kodzie RC5

 

Jak można zauważyć, w przypadku kodu RC5, czas trwania połowy bitu wynosi 899µs, co daje 1788µs dla całego bitu. Należy tu zaznaczyć, iż sygnał przedstawiony na przebiegach przedstawia sytuację na wyjściu z odbiornika IR, gdzie mamy do czynienia z sygnałem o niskim stanie aktywnym – w czasie braku odbioru sygnału na wyjściu z odbiornika utrzymywany jest stan wysoki.

Na rysunku 4 przedstawiono ramkę kodu RC5. Składa się ona z 14 bitów, które mają następujące znaczenie:

  • bity S1 i S2 – bity startu – standardowo oba bity przyjmują wartość ‘1’,
  • bit T – bit toggle – służy do przesłania informacji o ponownym wciśnięciu klawisza pilota (dla następnego wciśnięcia przycisku pilota wartość bitu zmieniana jest na przeciwną),
  • bity adresu – bity służące do identyfikacji urządzenia docelowego,
  • bity rozkazu – bity służące do określenia funkcji i numeru przyciśniętego klawisza pilota.

 

Rys. 4. Przekładowa ramka kodu RC5

Rys. 4. Przekładowa ramka kodu RC5

 

Znając czas trwania pojedynczego bitu oraz liczbę bitów w ramce łatwo można wyznaczyć czas trwania całej ramki, która wynosi około 25ms. Należy wiedzieć że długość ta jest zmienna, a wynika to z faktu, iż pierwszy bit tak naprawdę wykrywany jest dopiero w połowie jego trwania, natomiast ostatni bit może skończyć się w połowie trwania. Inną kwestią na jaką należy zwrócić uwagę jest to aby zadbać o dość sporą tolerancję trwania czasu połowy jak i całego bitu, wynika to z warunków w jakich rozchodzi się sygnał podczerwieni.

W tym momencie, gdy znana jest ogólna zasada budowy kodu RC5, można przejść do algorytmu dekodowania przesyłanego sygnału. Można go zrealizować na wiele sposobów, przedstawiony algorytm polega na sprawdzaniu stanu linii zaraz po sygnale synchronizacji, występującym w połowie trwania bitu. Problem jaki należało rozwiązać to wykrywanie dokładnie tego zbocza. Gdyż poza zboczem synchronizacji mamy także zbocza występujące w momencie transmisji kolejnych bitów, z różnymi wartościami.

Do tego celu posłużyła zmienna stan, która identyfikuje aktualny moment transmisji ramki. Kolejne stany pracy zostały zaznaczone na rysunku 3. Jak łatwo zauważyć w takim przypadku sprawdzanie wartości poszczególnych bitów jest realizowane w dla nieparzystej wartości zmiennej stan.

Natomiast samo wykrywanie zbocza zostało zrealizowane w bardzo prosty sposób poprzez stworzenie przerwania wywoływanego każdorazowo w momencie wystąpienia zbocza narastającego lub opadającego.

Kolejnym elementem, o jaki należało zadbać, jest aktualizacja wartości zmiennej określającej bieżącą wartość zmiennej stan. Zostało to zrealizowane poprzez odmierzanie czasu od wystąpienia ostatniego zbocza, w przypadku czasu równego (w przybliżeniu) długości trwania całego bitu wartość zmiennej aktualizowana jest o dwa. Natomiast dla czasu od wystąpienia ostatniego zbocza równego połowę trwania bitu wartość zmiennej jest zwiększana o jeden.

Sam program nie jest mocno złożony, pierwszymi jego działaniami jest inicjalizacja zegarów mikrokontrolera, konfiguracja przerwań, linii GPIO oraz liczników. W kolejnym kroku następuje inicjalizacja wyświetlacza oraz prezentacja na nim poszczególnych wartości. Następnie program przechodzi do nieskończonej pętli głównej, której fragment przedstawiono poniżej.

 

Listing 1. Nieskończona pętla programu główna

 

Program w pętli głównej oczekuje na ustawienie flagi rc5_ok, która informuje o odebraniu kodu wysłanego przez pilot, zgodnego z RC5. W momencie jej ustawienia, program wykonuje kopię odebranego kodu do zmiennej rc5_code. Następnie wyświetla wartości kolejnych elementów kodu RC5 (bitów startu, bitu toggle, bitów określających adres urządzenia docelowego, bitów określających rozkaz) na wyświetlaczu modułu KAmodLCD1.

Po tych czynnościach następuje sprawdzenie wartości bitu toggle, operacja ta realizowana jest poprzez wykonanie iloczynu logicznego kopii odebranego kodu RC5 z wartością 0x0800. Działanie to pozwala określić czy aktualnie odbierany kod jest wysyłany w wyniku ponownego wciśnięcia klawisza lub wciśnięcia innego klawisza, czy może wysyłany kod jest powtórzeniem już odebranego kodu (spowodowanym dłuższym przytrzymaniem przycisku pilota).

W momencie gdy odebrany kod jest „nowym” następuje odpowiednia reakcja sterowania diodami LED. Sprawdzenie, który klawisz został wciśnięty jest realizowane poprzez iloczyn logiczny odebranego kodu z wartością 0x003F i przyrównanie do kodu odpowiedniego klawisza. W następnym kroku, przy udanym przyrównaniu, następuje odpowiednia reakcja. Iloczyn logiczny z wartością 0x003F powoduje wyzerowanie wszystkich bitów poza tymi odpowiedzialnymi za określenie rozkazu. Takie działanie pozwala kontrolować aplikację niezależnie od przeznaczenia posiadanego pilota (telewizor, radio, wieża). Jedynym wymogiem jest aby pilot pracował w kodzie RC5 oraz posiadał klawisze cyfr.

Sam odbiór i dekodowanie wartości poszczególnych bitów realizowane jest w ramach obsługi przerwania od linii PB15. Na listingu poniżej przedstawiono kod obsługi przerwania.

 

Listing 2. Program obsługi przerwania

 

Kod obsługi przerwania może wydawać się bardzo rozbudowany, jednak w rzeczywistości jest bardzo prosty w działaniu. W pierwszym kroku, po wystąpieniu przerwania na linii PB15, do zmiennej licznik1 zapisywany jest stan licznika.

W kolejnym kroku następuje sprawdzenie czy nie mamy do czynienia z rozpoczęciem odbioru kodu RC5 (wartość zmiennej stan jest równa 0 oraz występuje stan niski na linii), w takim przypadku następuje wyzerowanie licznika i jego włączenie (licznik włączany jest tylko na czas dekodowania kodu RC5) oraz przygotowanie zmiennych, używanych w dekodowaniu kodu RC5.

W przypadku gdy nie mamy do czynienia z rozpoczęciem odbioru kodu RC5 (wartość zmiennej stan jest większa od 0) następuje sprawdzenie czasu jaki minął od ostatniego wywołania przerwania. Jeśli wartość ta jest równa połowie trwania bitu (uwzględniając tolerancję) następuje dodanie 1 do wartości zmiennej stan, jeśli czas jest równy trwaniu całego bitu (uwzględniając tolerancję) do zmiennej stan dodawana jest wartość 2.

W przypadku gdy czas, jaki minął od ostatniego wywołania przerwania, nie mieści się w granicach poprawnego czasu lub wystąpiła sytuacja, która nie powinna mieć miejsca, następuje wyzerowanie zmiennych oraz licznika i jego wyłączenie. Takie działanie wynika z faktu, iż otrzymywane dane z pewnością nie są poprawnym kodem RC5.

Ostatnim krokiem dekodowania kodu RC5, wykonywanym w przerwaniu, jest próbkowanie stanu zaraz po zboczu synchronizacji, w połowie trwania bitu. Realizowane jest to przez instrukcję switch dla nieparzystych wartości zmiennej stan. Szczególnym przypadkiem jest próbkowanie dla wartości zmiennej stan równej 27. Jest to bowiem ostatni bit, podczas próbkowania następuje wyłączenie licznika oraz ustawienie odpowiednich wartości dla zmiennych pomocniczych.

Na koniec obsługi przerwania następuje wyzerowanie flagi informującej o wystąpieniu przerwania linii PB15.

W celu zapewnienia wykrywania błędnie transmitowanych danych, nie będących kodem RC5 dodatkowo zaimplementowana została obsługa przerwania wywoływanego po uzyskaniu przez licznik wartości równej około dwukrotności czasu trwania bitu w kodzie RC5. Obsługa tego przerwania sprowadza się do wyzerowania zmiennych pomocniczych oraz licznika i jego wyłączenia.

Mariusz Dziębowski
m.dziebowski@interia.pl

Do pobrania