Abstrakt: Článek popisuje komunikační protokoly používané v dálkových ovladačích spotřební elektroniky. Pomocí jednoduchého rozšiřujícího modulu lze přes FITkit ovládat jiná zařízení a dekódovat příchozí signál z ovladače.
Jako světelné zdroje se v dálkových ovladačích používají luminiscenční diody infra-LED, emitující paprsek záření o vlnové délce kolem 950nm. Jelikož při posílání informace způsobem log.1 = "infra-LED svítí", log.0 = "nesvítí" by bylo obtížné zajistit bezchybný přenos datového rámce z důvodu vysokého rušení (zdrojem takového infračerveného záření je i slunce či obyčejná žárovka), využívá se modulace.
Při modulaci logickou úrovní 1 se infra-LED budí obdélníkovým nosným signálem o dané střídě a frekvenci, typicky mezi 30-56kHz. Tento stav se nazývá značka (ang. mark). Po dobu logické úrovně 0 není dioda aktivní, nastala mezera (ang. space). Dobu trvání značky a mezery, stejně tak jako jejich význam specifikuje použitý protokol. V klidu, tj. když neprobíhá přenos rámce, setrvává vysílač ve stavu log.0. Přijímač signálu je nastaven na použitý nosný kmitočet. Tím, že ostatní kmitočty odfiltruje, účinně zamezuje možnému rušení okolním světlem.
Mezi nejznámější protokoly patří RC5, původně vyvinutý firmou Philips. Datový rámec protokolu se skládá z celkem 14 bitů, jež jsou vyslány v tomto pořadí:
2 start-bity (zahájení komunikace)
toggle bit (zabezpečovací mechanismus)
5 bitů pro adresaci zařízení (televizní přijímač, videorekordér, satelit ...)
6 bitů vyhrazených pro příkaz (změna hlasitosti, přepnutí kanálu, atp.)
Oba start-bity jsou vždy logické úrovně 1 a kromě indikace začátku datového rámce podle nich přijímač automaticky dolaďuje zisk a citlivost na příchozí infračervený signál (ang. AGC = Automatic Gain Control).
Hodnota toggle (čes. překlápěcího) bitu se při každém novém stisku klávesy mění na opačnou. Díky němu lze na přijímací straně rozlišit mezi trvale stisknutým tlačítkem a jednotlivými stisky po sobě. Pokud je například trvale držena číslice 1 na dálkovém ovladači televizního přijímače, nedojde ani po vložení a následném odstranění překážky v cestě IR paprsku k přepnutí na jedenáctý kanál.
Následují bity reprezentující adresu zařízení a kód příkazu, přičemž v obou případech se nejvýznamnější bit (MSB) vysílá jako první.
Protokol RC5 pracuje na nosné frekvenci 36kHz a pro odesílání dat se používá kódování Manchester. Toto kódování, někdy též zvané jako bifázová modulace, spojuje datový signál se synchronizačním. Bitový interval je rozdělen na dvě stejně velké části a doprostřed intervalu je vložena změna signálu. Hodnota bitu je pak dána směrem hrany signálové změny. Pro RC5 je bit o log.0 definován změnou ze značky na mezeru, opačně pak pro logickou 1, viz obrázek výše. Bitový interval má konstantní délku rovnou 64 periodám nosného kmitočtu, tedy 64 / 36kHz = 1778us. Odtud platí, že odeslání všech 14-ti bitových intervalů potrvá 14 x 1778us = 25ms. Doba značky či mezery je složena z 32 period nosné, tj. 889us.
Rámec bude opakovaně vysílán, dokud bude drženo tlačítko na dálkovém ovladači. Perioda opakování, počítáme-li jí jako čas mezi začátky obou rámců, odpovídá době odeslání 64 bitů, čili 113,7ms. Pro připomenutí, hodnota toggle bitu se v průběhu opakovaného vysílaní téhož rámce nemění.
RC5X
Šestibitová hodnota příkazu v protokolu RC5 se časem ukázala jako nedostačující, což vedlo k přidání dalšího bitu a zvýšení počtu možných příkazů na 128. Přidaný sedmý bit nahrazuje druhý start-bit, navíc je jeho hodnota invertována. Inverze zaručuje zpětnou kompatibilitu s původním protokolem RC5: pro příkazy 0-63 bude negovaný sedmý bit roven logické 1 a zařízení vybavené starším standardem RC5 jej proto bude chápat jako obyčejný start-bit. Rozšířenému protokolu se dostalo názvu RC5X, z anglického Extended RC5.
Tento protokol, vytvořený společností NEC Electronics, je používán ve spotřební elektronice většiny japonských výrobců, například Pioneer, Onkyo, Hitachi, NEC, Teac, či Yamaha. Mezi jeho přednosti patří možnost kontroly dat proti chybám a také adresování až cca 65000 zařízení v rozšířeném módu.
Protokol operuje na nosné frekvenci 38kHz a pro kódování bitů se používá pulzně poziční modulace. Pulzy jsou při této modulaci vždy stejně dlouhé, a to 560us. Hodnota bitu je potom definována dobou mezi začátky těchto dvou pulzů. Pro logickou hodnotu 1 činí tato doba 2,25ms, pro logickou 0 přesně polovinu, tedy 1,125ms.
Datový rámec protokolu NEC lze rozdělit na 3 hlavní části:
hlavička, ang. leader code,
část pro adresu zařízení nebo kód výrobce, zvaná též custom code,
datová část obsahující ovládací příkaz.
Hlavička protokolu vždy začíná 9ms značkou následovanou mezerou. Délka mezery rozlišuje typ rámce. Novější specifikace protokolu totiž umožňuje vyslání jednoho celého rámce a poté, v případě, že je tlačítko stále stisklé, se vysílá pouze krátká informace o opakování předchozího rámce. Tato vlastnost, v anglické dokumentaci označovaná jako one-shot transmission mode, snižuje spotřebu energie až o jednu třetinu. Taktéž se s její pomocí dá rozpoznat trvalý stisk tlačítka a opakovaný stisk. Bude-li tedy doba výše zmíněné mezery rovna 2,25ms, jedná se o opakovací kód a kromě 560us značky ukončující tuto mezeru se další data nevyšlou. Doba 4,5ms naopak signalizuje, že hlavička bude následována zbývajícími 32 bity rámce. Doba k opětovnému vyslání rámce, příp. opakovacího kódu činí 108ms.
Blok adresy se skládá z 16 bitů, kódovaných podle uvedené modulace. Jako první se odesílá nejméně platný bit (LSB). V původní verzi protokolu obsahoval nižší byte adresu cílového zařízení, ve vyšším byla uložena její invertovaná podoba využitá při kontrole při příjmu. Novější specifikace dovoluje adresu rozšířit na celých 16 bitů. Připravíme se tak sice o možnost kontroly správnosti, výrazně ale vzroste počet možných adres.
Podobně jako předchozí část, i část pro příkaz obsahuje 16 bitů a jako první se vysílá nejméně platný bit. Zde ovšem zůstala zachována redundance v podobě negované informace v horním bytu. Počet příkazů tedy dosahuje maximálně 256 možných variant. Horní negovaný byte bude využit po přijetí rámce k ověření validity dat.
Mezi poslední představitele rozšířenějších komunikačních protokolů patří SIRC (Serial Infra-Red Control) od japonské firmy Sony. Přenášená data jsou kódována pulzně šířkovou modulací a následně vysílána na nosné frekvenci 40kHz. Hodnota bitů se při této modulaci rozlišuje délkou trvání značky. Značka o délce 1,2ms představuje logickou jedničku. Logická nula trvá poloviční dobu, 600us. Značky od sebe odděluje mezera s konstantní dobou 600us.
Začátek rámce tvoří úvodní 2,4ms trvající značka, po níž následuje 600us mezera a pak již vlastní data, přičemž jednotlivé části jsou vysílány od nejméně významného bitu. Postupným vývojem vznikly 3 varianty tohoto protokolu, lišící se však pouze počtem bitů:
12-ti bitová verze odesílá 7-mi bitový příkaz, poté 5-ti bitovou adresu zařízení,
15-ti bitová varianta pouze rozšiřuje adresu na 8 bitů,
20-ti bitový protokol vychází z 12-ti bitového, za adresovou část navíc připojuje osmibitová rozšířující (ang. extended) data.
Rámec je periodicky vysílán, dokud je drženo tlačítko na ovladači. Doba, za kterou dojde k opakovanému vyslání, se rovná 45ms od začátku rámce.
HW přípravek obsahující přijímací a vysílací část je připojen ke konektoru JP10, na FITkitu se nachází úplně dole. Situaci poněkud komplikuje fakt, že prvních 6 vývodů X0-X5 je použito k interním účelům, například X0 funguje jako výstup z řadiče přerušení. Prvním pinem, který lze využít pro vlastní účely, pin X6. Kolíky číslo 11 a 12 nejsou u FITkitu verze 2.0 zapojeny, díky tomu se pin X6 posouvá až na kolík 13, na kterém je ve verzi 1.2 připojen bod X8. Při použití jiné verze FITkitu je proto důležité správně upravit názvy pinů v kódu top_level.vhd.
Z obrázku je patrné, že napětí +5V včetně nulového bodu GND, potřebné pro napájení přijímače TSOP a vysílací infra-LED se nachází ve spodní řadě za sebou. Pro připojení přípravku tedy vystačíme s jednořadou dutinkovou lištou, začínající na levé straně spodní poloviny konektoru. Využijeme lištu o délce deseti dutinek, která se běžně vyrábí.
K příjmu signálu všech tří frekvencí (36kHz, 38kHz, 40kHz) postačí integrovaný přijímač s nosným kmitočtem 40kHz, tedy TSOP1740. Pomalejší kmitočty totiž dle katalogového listu splňují pravidlo minimální délky trvání pulzu (10 period nosné) a proto budou přijímačem bezchybně dekódovány.
Kondenzátor C1 a rezistor R3 společně tvoří filtr, který potlačuje rušení vzniklé v rozvodu napájecího napětí a které by jinak nepříznivě ovlivnilo spolehlivou činnost přijímače. Vysílací část tvoří tranzistor T1 v zapojení se společným emitorem, v jehož kolektorovém obvodu je připojená infračervená LED1 s vlnovou délkou 950nm. Rezistor R1 omezuje proud tekoucí infra-LED a pomocí něho lze měnit vyzářený světelný výkon diody. Pro správnou funkci přípravku je nutné u starší verze FITkitu propojit výstup z přerušení FPGA s mikrokontrolérem. Přerušení je vyvedeno na pin X0 a protože použitá dutinková lišta SV1 tento pin zakrývá, je nutné jej vyvést na desku HW přípravku (JP1) a následně tento nový kolík propojit drátem s vývodem 26 na konektoru JP9. Při použití nového FITkitu verze 2.0 slouží k tomuto spojení propojka J5, zmíněný drát není nutné připojovat.
JP1 |
pin S1G01 |
SV1 |
dutinková lišta BLW810G |
R1 |
22R |
R2 |
4k7 |
R3 |
100R |
C1 |
4,7uF/16V |
LED1 |
LD274-3 |
T1 |
BC337-40 |
IR1 |
TSOP1740 |
Pro korektní funkci knihovny infra_comm
je nutné mít správně nastavenu bázovou adresu SPI řadiče a přiřazeny offsety k použitým transceiverům. Výchozí hodnota bázové adresy INFRA_BASE_ADDR
se rovná 90h. Knihovna předpokládá použití pouze jednoho SPI dekodéru pro všechny transceivery. Konkrétní transceiver se vybírá prostřednictvím nejnižších bitů adresy, která se získá součtem patřičného offsetu s bázovou adresou. Pokud například požaduji aplikaci pouze s transceiverem protokolu RC5X, nastavím konstantu IR_RC5_OFFSET
na hodnotu 0, transceiver tak bude přístupný přímo přes bázovou adresu. K různým aplikacím se může hodit různá velikost přijímací či vysílací fronty, jejich implicitní pětimístnou velikost lze upravit změnou konstant IR_RX_BUF_LEN
a IR_RX_BUF_LEN
.
Počáteční inicializaci knihovny zajišťuje procedura infra_init()
, která uvede interní proměnné do výchozího stavu. Test na prázdnost některé z front realizují funkce infra_rx_empty()
a infra_tx_empty()
. V některých situacích se může hodit i kontrola, zda jsou vysílací části transceiverů v klidovém stavu, k tomuto účelu slouží funkce infra_no_tx_transmit()
.
Následující rutiny se používají k vlastnímu přenosu dat. Procedura infra_rx_interrupt_handler(unsigned char proto_type)
přečte v obsluze přerušení data z FPGA a uloží je do přijímacího bufferu. Parametr proto_type
přitom určuje typ protokolu, a může nabývat těchto hodnot:
IR_RC5
,
IR_NEC_NORM
,
IR_SIRC_12B
,
IR_SIRC_15B
,
IR_SIRC_20B
.
Pomocí typu se určuje offset, který bude připočten k bázové adrese. Ke čtení položky z bufferu slouží funkce infra_read(unsigned char *proto, unsigned char *data)
. Parametry jsou předávány odkazem, do prvního funkce uloží typ protokolu a do druhého se nahrají data z bufferu. Druhý parametr musí být typu pole o délce 3 byty. Data jsou v poli zarovnána způsobem, kde je spodní byte z FPGA uložen do prvku s indexem 2, zatímco horní byte do prvku s nejnižším indexem, tj. 0. Po provedení této rutiny se přečtená položka z bufferu automaticky odstraní. Návratová hodnota funkce je při úspěšném čtení rovna jedné, jinak nula. Funkce infra_send(unsigned char proto, unsigned char *data)
slouží k zápisu dat do bufferu a k jejich odvysílání. Její parametry se prakticky shodují s výše uvedenými, pouze k typu protokolu přibyla možnost IR_NEC_REPEAT
, při jejímž zvolení se místo klasického rámce NEC posílá rámec opakovací.
Ke správné činnosti algoritmu je zapotřebí do obsluhy přerušení přidat také volání funkce infra_tx_interrupt_handler()
, které bude vykonáno po obdržení přerušení informující mikrokontrolér o navrácení vysílačů do klidového stavu. Díky této funkci následně dojde k automatickému odvysílání další položky z fronty.
Jako primární způsob ovládání aplikace jsem zvolil komunikaci přes terminálové okno. Po spojení s počítačem je možné z něj vyslat libovolný kód, případně nastavit i počet opakování. Po příjmu sekvence z dálkového ovladače a po jejím dekódování se výsledek automaticky odešle na obrazovku terminálu. Seznam příkazů včetně syntaxe lze zobrazit příkazem HELP
. Pro ilustraci uvádím odeslání dvou totožných rámců protokolu RC5X:
REPEAT 2 RC5 00 0C
První příkaz nastaví (globálně) počet opakování rámce, zatímco druhý již nese vlastní data. Při opakovaném zadávání příkazů RC5X se toggle bit mění automaticky v aplikaci, není proto nutné jej uvádět. Hodnoty v hexadecimálním tvaru značí v uvedeném případě adresu/zařízení 00h (televizní přijímač), a hodnota 0Ch příkaz k přechodu televize do pohotovostního režimu. U protokolu NEC dochází při nastavení opakování na hodnotu větší než 1 k odeslání pouze jednoho datového rámce, zbytek vysílání bude tvořen opakovací sekvencí. Obrázek níže zachycuje obsah terminálového okna po příjmu dvou rámců a po odeslání jedné datové sekvence protokolu SIRC.
Jinou možnost odeslání kódu nabízí použití klávesnice a LCD displeje. Sekvence určená k odeslání je v tomto případě uložena ve zdrojovém kódu aplikace a pro její změnu je nutné aplikaci znovu přeložit a nahrát do FITkitu. Není to příliš flexibilní způsob, použití nalezne spíše jako náhrada dálkového ovladače, poté co jsme požadované kódy odladili přes terminál. Tlačítkem #
lze přepínat mezi různými protokoly, přičemž ke každému z nich může být přiřazena rozdílná sada kódů. LCD displej informuje uživatele o aktuálně zvolené sadě (protokolu). Přepínání toggle bitu protokolu RC5X, stejně jako vysílání opakovacího rámce NEC, probíhá automaticky a není vyvedeno na žádnou klávesu.
Ukázkový program se nachází v seznamu projektů ve skupině "Demo aplikace" pod názvem "InfraRed komunikace". Dvojitým poklepáním na označenou položku se automaticky spustí překlad projektu a následně se nahraje do připojeného FITkitu. Aplikace ke své činnosti vyžaduje propojit výstup přerušení z FPGA JP10(5) se vstupem mikrokontroléru JP9(26). V případě FITkitu verze 2.x k tomuto účelu slouží propojka J5.
SB-Projects: IR remote control: Philips RC-5; http://www.sbprojects.com/knowledge/ir/rc5.htm
SB-Projects: IR remote control: NEC protocol; http://www.sbprojects.com/knowledge/ir/nec.htm
MOS INTEGRATED CIRCUIT uPD6121, 6122; http://www.datasheetcatalog.org/datasheet/nec/UPD6122G-002.pdf
SB-Projects: IR remote control: SIRC protocol; http://www.sbprojects.com/knowledge/ir/sirc.htm