czwartek, 31 marca 2011

Podczerwień: RC-5 - Opis standardu


Autor: Dondu

Artykuł jest częścią cyklu: Podczerwień - Transmisja danych


Standard RC-5 powstał w okolicach 1980 roku. Opracowany został przez firmę Philips jako standard używany do sterowania produkowanych urządzeń domowych w szczególności sprzętu audio-wideo. Szybko został adoptowany przez innych producentów.

Ze względu na proste zasady tworzenia i dekodowania sygnału w standardzie RC-5, jest on bardzo popularny wśród hobbystów i wytwórców urządzeń o niskim nakładzie. Wpływa na to także obecność na rynku bardzo tanich pilotów RC-5 o różnych ilościach klawiszy, kształtach i wielkościach.


Standard RC-5

Standard RC-5 jest standardem transmisji szeregowej o następujących podstawowych parametrach:
  • kodowanie bifazowe typu Manchester,
  • częstotliwość sygnału nośnego 36kHz (ang. carrier frequency),
  • okres jednego bitu przesyłanej informacji równy 64 okresom częstotliwości nośnej.

Tylko tyle? Tak, ponieważ reszta wynika z powyższych założeń, co po kolei pokażę w niniejszym artykule. Na początek musisz jednak poznać kodowanie typu Manchester.





Kodowanie typu Manchester

Ten system kodowania opiera się o następujące zasady:

Zasada nr 1: 
Na początku sygnał przyjmuje stan odpowiadający jego wartości binarnej.

Należy to rozumieć następująco:
  • jeżeli wysyłany bit jest zerem, to na początku bitu w sygnale wyjściowym Manchester także mamy mieć zero.
  • jeżeli wysyłany bit jest jedynką, to na początku bitu w sygnale wyjściowym Manchester także mamy mieć jedynkę.




Zasada nr 2:
W połowie czasu transmisji bitu następuje zmiana sygnału na przeciwny.

Zmiana ta następuje zawsze, niezależnie, czy przesyłany bit jest zerem, czy jedynką.




Bardzo istotne jest byś zwrócił uwagę na to że:

W sygnale wyjściowym Manchester czas trwania zera lub jedynki:
  • nigdy nie jest dłuższy niż czas trwania transmisji jednego bitu,
  • nigdy nie jest krótszy niż połowa czasu trwania transmisji jednego bitu.

To bardzo ważne wnioski, które będą nam potrzebne do dekodowania sygnału w odbiorniku.


Te proste założenia kodowania bifazowego typu Manchester mają bardzo pożądane przez nas właściwości:
  1. ciągła synchronizacja transmisji pomiędzy nadajnikiem i odbiornikiem bez dodatkowej linii,
  2. duża odporność na zmiany szybkości transmisji.





Fala nośna 36kHz

Aby zwiększyć odporność na zakłócenia oraz umożliwić komunikację jednocześnie wielu pilotów nadających w tym samym obszarze (np. pomieszczeniu) stosuje się modulację fali nośnej.

W standardzie RC-5 jako fala nośna wykorzystywany jest przebieg prostokątny o stałej częstotliwości 36kHz.

RC-5 - Fala nośna o częstotliwości 36kHz.
RC-5 - Fala nośna o częstotliwości 36kHz.

Okres takiej fali wynosi:




W praktyce oznacza to, że dioda LED mruga z częstotliwością 36kHz, czyli co około 27,78μs.

Wypełnienie fali nośnej (ang. duty cycle)  wynosi od 25% do 33%. Jest to istotne w przypadku budowy pilota we własnym zakresie. Jeżeli jednak chodzi o odbiornik nie ma to dla nas prawie żadnego znaczenia, ponieważ pracę związaną z falą nośną wykona za nas czujnik IR.






Przesył danych, czyli modulacja fali nośnej.

Aby za pomocą fali nośnej przesłać dane należy modulować jej przebieg za pomocą danych do przesłania.
Do przesyłania danych za pomocą podczerwieni stosuje się modulację polegającym na naprzemiennym nadawaniu oraz przerwach w nadawaniu:


Podczerwień - Przykład sygnału modulowanego.
Przykład sygnału modulowanego.

W standardzie RC-5 przyjęto, że okres jednego bitu przesyłanej informacji jest równy 64 okresom fali nośnej.

RC5 - Fala nośna - okres dla przesłania jednego bitu danych.
RC5 - Fala nośna - okres dla
przesłania jednego bitu danych.


W związku z tym czas przesyłania jednego bitu wynosi:


RC-5 Okres przesyłania jednego bitu danych.
RC-5 Okres przesyłania jednego bitu danych.

Ponieważ kodowanie Manchester zmienia stan generowanego przebiegi w połowie każdego bitu stąd powinniśmy wiedzieć, że tzw: półbit trwa:


RC-5 Okres przesyłania połowy bitu danych.
RC-5 Okres przesyłania połowy bitu danych.


czyli sumarycznie możemy przedstawić falę nośną potrzebną do przesłania jednego bitu danych następująco:


RC5 - Charakterystyka czasowa przesyłania  bitu za pomocą fali nośnej.
RC5 - Charakterystyka czasowa przesyłania 
bitu za pomocą fali nośnej.


Skoro mamy już ustalone zasady dot. czasów przesyłania jednego bitu oraz wiemy, że kodowanie Manchester wymusza zmianę stanu sygnału wyjściowego na przeciwny w połowie nadawania bitu, stąd wnioskujemy, że możliwe są tylko dwa przypadki modulowania sygnału, poprzez przerwanie nadawania fali nośnej:
  1. nadawanie fali nośnej w pierwszej połówce przesyłanego bitu danych oraz przerwa w nadawaniu trwająca całą drugą połówkę,
  2. lub odwrotnie.
Przypadek nr 1 został w standardzie RC-5 przypisany nadawaniu logicznego zera:



Modulacja sygnału standardu RC-5: Logiczne zero
Modulacja sygnału nadawania standardu RC-5
Logiczne zero

Źródło: www.sbprojects.com


a przypadek nr 2 nadawaniu logicznej jedynki:


Modulacja sygnału nadawania standardu RC-5
Logiczna jedynka
Źródło: www.sbprojects.com

Zaraz, zaraz! Coś tu się nie zgadza!

Przecież pierwsze założenie kodu Manchaster brzmi: "Na początku sygnał przyjmuje stan odpowiadający jego wartości binarnej".

Dlaczego więc logiczne zero w pierwszej połówce nadaje falę nośną, a logiczne jeden nadaje ją w drugiej połówce? Powinno być przecież odwrotnie!

Jeżeli to zauważyłeś, to gratuluję! :-)

Tak, sygnały RC-5 w trakcie nadawania jest zanegowany ponieważ odbiornik ponownie go zaneguje w czasie odbioru. W ten sposób na wyjściu odbiornika, otrzymamy prawidłowy sygnał zgodny z kodowaniem Manchester. Przeczytasz o tym szczegółowo w artykule dot. dekodowania sygnału.


W praktyce wysyłanie danych wygląda więc tak:


Modulacja sygnału podczerwieni - układ nadajnika - animacja.
Modulacja sygnału podczerwieni.
Układ nadajnika.
Źródło: www.sbprojects.com

Nie sugeruj się ilością impulsów na powyższej animacji ponieważ nie jest ona zgodna ze standardem RC-5. Niemniej jednak pokazuje jak generowana jest zmodulowana fala nośna (wysyłane światło), przesyłająca zakodowane dane za pomocą podczerwieni.






Ramka danych RC-5

Standard RC-5 jest standardem transmisji szeregowej, która wykorzystuje tzw. ramki.

Ramka, to określony standardem zbiór pojedynczych bitów danych składający się na pakiet danych określony standardem. W przypadku standardu RC-5 pakiet ten składa się z 14 bitów podzielonych następująco:


Ramka nadawania danych standardu RC-5.
Ramka nadawania danych standardu RC-5.
źródło: www.sbprojects.com

Na powyższym rysunku przedstawiona jest ramka nadawania wraz z przykładem przesyłanych danych oraz opisem poszczególnych bitów. Czarne pola to fragmenty fali nośnej.

Ramka odbiorcza widziana przez mikrokontroler jest negacją powyższej ramki, co pokażę w artykule o dekodowaniu sygnału pilota.

Transmisja rozpoczyna się od bitu nr 1, a kolejne bity oznaczają:

Numer bitu Opis
1-2 Dwa bity startu zawsze będące jedynką.
3 Bit toggle, zmieniający wartość na przeciwną wraz z każdym naciśnięciem przycisku pilota. 
4-8 Numer sterowanego urządzenia (adres). W przypadku standardowych pilotów podczerwieni, to rodzaj urządzenia do którego pilot jest przeznaczony np. TV, DVD, itd.
9-14 Dane właściwe. W przypadku pilotów numer komendy do realizacji przez urządzenie.


Na powyższym rysunku widzimy więc:
  • dwa bity startu będące jedynkami,
  • bit toggle o wartości zero,
  • numer sterowanego urządzenia o wartości 5 (binarnie 00101),
  • komendę o wartości 53 (binarnie 110101).
Gdy w tabelkach poniżej odczytasz numer urządzenia (5) oraz komendy (53) stwierdzisz, że powyższy przykład ramki adresowany jest do urządzenia VCR1 (magnetowid) i żąda od niego włączenia funkcji odtwarzania (Play).


Przycisk trzymany dłużej - kolejne ramki

W przypadku pilotów standardu RC-5, gdy przycisk jest trzymany, ramki wysyłane są jedna za drugą w odstępach 114ms. Jeżeli więc świadomie i celowo trzymasz przyciśnięty przycisk, to pilot wysyła:

RC5 - Częstotliwość wysyłania ramek, gdy przycisk jest przyciśnięty.
RC5 - Częstotliwość wysyłania ramek, gdy przycisk jest przyciśnięty.

prawie 9 ramek na sekundę.


Bit toggle

Ponieważ z reguły naciśnięcie przycisku trwa dłużej niż 114ms, stąd w takim przypadku do odbiornika wysyłane jest co najmniej kilka ramek.

Aby sterowane pilotem urządzenie mogło rozróżnić, czy kolejna odebrana ramka oznacza przytrzymanie przycisku, czy też jego puszczenie i ponowne naciśnięcie, w standardzie RC-5 zastosowano dodatkowy bit zwany toggle bit (bit przełączający).

Pilot zmienia wartość tego bitu w przypadku wykrycia momentu naciśnięcia przycisku.

Jeżeli więc w dwóch lub więcej kolejnych ramkach bit toggle ma tę samą wartość oznacza to, że nie nastąpiło puszczenie przyciski i ponowne wciśnięcie.

Jeżeli w dwóch lub więcej kolejnych ramkach bit toggle zmienia wartość na przeciwną w stosunku do stanu bitu w poprzedniej odebranej ramce oznacza to, że nastąpiło puszczenie przyciski i ponowne jego wciśnięcie.

W ten prosty sposób, urządzenie odbiorcze może rozróżnić szybkie przyciskanie i puszczanie przycisku od przytrzymania go przez jakiś czas.


Standardowe numery urządzeń i komendy RC-5

Ponieważ standard RC-5 został opracowany przez firmę Philips, stąd istnieje zbiór standardowych numerów urządzeń sterowanych oraz komend. Poniższą listę należy traktować jako niepełną.

Więcej znajdziesz na angielskojęzycznej Wikipedii: tutaj

Numer
urządzenia
dec (hex)
Rodzaj
urządzenia
0 (0x00) TV1
1 (0x01) TV2
2 (0x02) Teletext
3 (0x03) Video
4 (0x04) LV1
5 (0x05) VCR1
6 (0x06) VCR2
7 (0x07) Experimental
8 (0x08) Sat1
9 (0x09) Camera
10 (0x0A) Sat2
11 (0x0B)
12 (0x0C) CDV
13 (0x0D) Camcorder
14 (0x0E)
15 (0x0F)
16 (0x10) Pre-amp
17 (0x11) Tuner
18 (0x12) Recorder1
19 (0x13) Pre-amp
20 (0x14) CD Player
21 (0x15) Phono
22 (0x16) SatA
23 (0x17) Recorder2
24 (0x18)
25 (0x19)
26 (0x1A) CDR
27 (0x1B)
28 (0x1C)
29 (0x1D) Lighting
30 (0x1E) Lighting
31 (0x1F) Phone
Komenda
dec (hex)
Komenda TV Komenda VCR
(0x00) 0 0
1 (0x01) 1 1
2 (0x02) 2 2
3 (0x03) 3 3
4 (0x04) 4 4
5 (0x05) 5 5
6 (0x06) 6 6
7 (0x07) 7 7
8 (0x08) 8 8
9 (0x09) 9 9
10 (0x0A) -/-- -/--
12 (0x0C) Standby Standby
13 (0x0D) Mute
16 (0x10) Volume +
17 (0x11) Volume -
18 (0x12) Brightness +
19 (0x13) Brightness -
32 (0x20) Program + Program +
33 (0x21) Program - Program -
50 (0x32) Fast Rewind
52 (0x34) Fast Forward
53 (0x35) Play
54 (0x36) Stop
55 (0x37) Recording

Na podstawie: www.sbprojects.com

W przypadku, gdy dysponujesz fabrycznym pilotem w standardzie RC-5 wystarczy odebrać jedną ramkę by dowiedzieć się, jaki numer urządzenia ma zakodowany pilot. Niektóre piloty mają możliwość sterowania kilkoma urządzeniami, będą więc generować różne numery urządzeń.

W przypadku, gdy budujesz własny pilot podczerwieni powinieneś wybrać numer urządzenia, którym pilot ma sterować.

W przypadku, gdy budujesz własnego pilota i własne urządzenie odbiorcze, masz pełną dowolność w wyborze zarówno numeru urządzenia jak i komend oraz ich znaczenia. Aby jednak nie narazić się na problem, że w kontakcie z innym pilotem Twoje rządzenie zaczyna "wariować" sugeruję wybranie wolnych numerów urządzeń. Warto także w miarę możliwości i potrzeb utrzymać numerów komend zgodnych ze standardem.


Nie rozumiesz czegoś? Masz wątpliwości?
Nie wahaj się pytać za pomocą systemu komentarzy do artykułu.

W następnym artykule z tego cyklu poznasz praktyczny przykład dekodowania kodu RC-5 przez mikrokontroler.

15 komentarzy:

  1. Proszę mi powiedzieć czy za pomocą takiego odbiornika IR wymontowanego z TV i umieszczonej obok niego równolegle diody IR (np z pilota) można - kompletnie nie zwracając uwagi na bity ramki itd - zbudować z tego prosty czujnik ruchu, czy regulując moc diody nadawczej można ustawić próg zadziałania? dioda nadaje w eter, czujnik z TV jest w stanie odbierania i jeśli ktoś odbije sygnał diody i trafi on do czujnika z powrotem to jest sygnalizacja którą można odebrać mikrokontrolerem, (transoptory mają zasięg np 5cm a o większym są sporo droższe) zależy mnie na tym aby ktoś kto znajdzie się np w odległości metra dwóch od urządzenia został "wykryty", tak jak napisałem pomijając kodowania ramki i te wszystkie zależności, po prostu dioda nadaje, odbiornik odbiera i jeśli cokolwiek odbierze to mK to wychwytuje na pinie, w sumie pytanie moje - o ile to co wyżej napisałem da się zrealizować - zabrzmi wtedy: czy można odbiornik (bo diodę IR wiem jak podłączyć ;) czy odbiornik wylutowny z TV można podpiąć jak np transoptor, tzn zasilić to coś co ma trzy nogi i żeby sobie było w stanie odbierania, i drugie pytanie: czy odbiornik ma dekoder kodu RC5 w sobie czy robi się to w mK ?

    Z góry dziękuję za komentarz do mojego, pozdrawiam ekipe bloga i jak zawsze jestem wdzięczny za informacje tu zawarte bo nie raz i nie dwa skorzystałem :-)

    OdpowiedzUsuń
    Odpowiedzi
    1. Przepraszam, że tak długo nie odpowiadałem.

      1. Czujnik ruchu - można, ale pod warunkiem, że dioda będzie emitować falę nośną odpowiadającą zakresowi częstotliwości pracy odbiornika IR.

      2. Nie, odbiornik nie ma dekodera konkretnego kodu. On tylko odbiera światło, zamienia na sygnały elektryczne, wzmacnia je, eliminuje zakłócenia, i wypluwa sygnał na pin wyjściowy. Dekodowaniem sygnału musi zajmować się mikrokontroler i o tym jest ten cykl artykułów.

      Cieszymy się, że się przydajemy czasem :D

      Usuń
  2. :-):-):-):-):-):-):-):-):-):-):-):-):-)

    OdpowiedzUsuń
  3. Mam pytanie
    Jesli nadaje 1 to wysyłam 0 i 1
    Jesli nadaje o to wysylam 1i 0
    Pozniej odbiornik to neguje
    A czemu nie moge zrobic na odwrot czyli
    Jesli wysylam 1 to wysylam 1 i 0
    Jesli wysylam 0 to wysylam 0 i 1
    Odbiornik to neguje a ja w programie sprawdzam czy mam 0i1 jesli tak to daje 1
    A jesli mam 1i 0 to mam zero

    OdpowiedzUsuń
    Odpowiedzi
    1. W opisie chyba pomyliłeś kolejności. Jest tak jak napisałeś w drugiej części:

      "Jesli wysylam 1 to wysylam 1 i 0
      Jesli wysylam 0 to wysylam 0 i 1.

      Generalnie dla systemów cyfrowych nie ma znaczenia, czy wartość jest zapisana jedynką czy zerem - ważne natomiast jest, by je odpowiednio interpretować. Przykład: Dioda LED podłączona anodą do pinu zapalana jest jedynką, podczas gdy podłączona katodą do pinu zapalana jest zerem. Istotne jest jedynie toi, by program to uwzględniał.

      Czy teraz wszystko jest już jasne? :-)

      Usuń
  4. Mam pytanie. Jak mozna stad latwo obliczyc ten system jest w stanie wyslac zaledwie 588bitow na sekunde(czyli 74B/s = 0.074kB) to jest na prawde mala predkosc. Tutaj moje pyatnie, jak zwiekszyc ja zwiekszyc? moglbym obnizyc okres czestotliwosci fali nosnej z 64 do kilku? Dodatkowo moze zwiekszyc czestotliwosc z 36kHz na kilkaset? ale czy wtedy nie bedzie problemu z odczytywaniem danych? jak bylo napisane w artykule odbiornik musi wiedziec kiedy nastapil skak, co z kolei oznacza ze jego brobkowanie isie byc przynajmniej kilkanas - kilkanascie razy wyzsze od predkosci wysylanych danych. Np kiedy jeden bit jest wysylany z preskoscia 1ms to odbiornik musi probkowac czy nie nastapilo zbocze co okolo 100µs.

    OdpowiedzUsuń
    Odpowiedzi
    1. Przepraszam za bledy, ale cos mi szwankuje klawiatura, a nie psrawdzilem tekstu, teraz nie mam mozliwosci usuniecia.

      Usuń
    2. Nieco pomyliłeś się w obliczeniach, bo teoretycznie można przesyłać bity z częstotliwością 1/1778us=562,43bps, ale to tylko szczegół. Są jeszcze bity startu, itp. więc faktyczna przepustowość danych jest jeszcze mniejsza.

      Częstotliwość fali nośnej to podstawa do eliminacji zakłóceń. Teoretycznie mógłbyś w ogóle pominąć falę nośną i po prostu nadawać z maksymalną częstotliwością jak w światłowodzie. Ale niestety podczerwień jest czuła na zakłócenia, stąd fala nośna musi występować.

      Można by oczywiście zwiększyć częstotliwość fali nośnej, ale wtedy nie znajdziesz odpowiedniego odbiornika, a to jest bardzo istotne, ponieważ zawierają one w sobie bardzo skomplikowane moduły filtrujące, których realizacja we własnym zakresie będzie dość kosztowna i trudna.

      Możesz także oczywiście opracować własny protokół przesyłu danych skracając czasy jedynki i zera, ale w tym zakresie nie uzyskasz jakiegoś znaczącego przyspieszenia transmisji, także ze względu na ograniczenia odbiornika IR, za to znacząco wzrośnie poziom błędów odbioru.

      Jeżeli więc chcesz realizować szybsze transfery należy po prostu wykorzystać moduły radiowe.

      PS.
      Tekstem Twojego posta się nie przejmuj :-)

      Usuń
  5. Swietny artykul, w koncu ktos lopatologicznie wytlumaczyl jak dziala przesyl danych :D

    OdpowiedzUsuń
  6. Witam !
    Nie wiem czy dobrze trafiłem; mam problem przy sczytywaniu kodów z urządzeń audio/video.
    Urządzenie które sprawia mi dużo problemów to przedwzmacniacz Quadral Aurum P8, odtwarzacz CD Quadral Aurum C5, Cambridge Audio CXN. Do z czytania używam czytnika kodów IR marki RTI Corp.wraz z dedykowanym softem. Wszystkie piloty działają w standardzie RC-5. Mój problem polega na wykorzystaniu z czytanych kodów np. komenda odpowiadająca za Power On/Off (funkcja toggel) przy pierwszym wysłaniu włączy urządzenie ale już nie wyłączy, aby wyłączyć urządzenie muszę wysłać jakaś inna komendę i dopiero wysłać ponownie komendę Power On/Off choć to nie zawsze działa. Drugim sposobem jest różne z czytywanie komendy tzn. podczas z czytywania komendy dany przycisk naciskam szybko a następnie z czytuję ten sam przycisk ale już trzymając go dłużej. Obie komendy podkładam pod jeden przycisk tak aby naprzemiennie były wysyłane. To również działa średnio. Ciężko jest mi ustalić ile razy dana komenda ma zostać wysłana, jakie mają być przerwy między nimi. Mam podgląd do kodu HEX i graficzny WAVE danej komendy ale totalnie nie znam się na programowaniu itd. Posiadam pliki w od producentów z zapisem w jakim systemie zapisane są dane piloty np. Quadral to 31, do tego każda funkcja ma przypisaną jakąś cyfrę np.StandBy: 61. Próbowałem zamieniać te wartości w programie Pronto (Philipsa) ale tam jeszcze należy podać częstotliwość itd. Z artykułu zrozumiałem że problem może być w "bit toggle". Jak można poradzić sobie z tym problemem ? Próbowałem zmieniać il.wysyłanych komend, czas między komendami ale bezskutecznie.
    Z góry dziękuję za jaką kol wiek pomoc !!!

    OdpowiedzUsuń
  7. Super opisane w prosty oraz przejrzysty sposób.Takiego czegoś szukałem.Pozdrawiam autora.

    OdpowiedzUsuń
  8. Komenda 0x0B dla TV to przełączanie AV/TV

    OdpowiedzUsuń
  9. Witam,
    Mam pytanie odnośnie długości przewodu łączącego odbiornik podczerwieni (np TSOP) z mikrokontrolerem? Czy jest jakaś maksymalna zalecana długość tego przewodu, przy której transmisja działa prawidłowo? Czy kabel ten powinien być ekranowany. Czy przy długość przewodu powyżej 2m należy filtrować przewód sygnałowy, np za pomocą kondensatorów?

    OdpowiedzUsuń
  10. Witam,
    Mam diodę IR, którą chciałbym wykorzystać do budowy pilota do telewizora Sony Bravia, ale niestety nie mam odbiornika, żeby sprawdzić kody z oryginalnego pilota. Wie ktoś, czy ten telewizor obsługuje standard RC-5 i kody z podanych tabel?

    OdpowiedzUsuń