Fórum témák

» Több friss téma
Cikkek » Távirányítható hatcsatornás bemenetválasztó
Távirányítható hatcsatornás bemenetválasztó
Szerző: libesz, idő: Aug 9, 2011, Olvasva: 25305, Oldal olvasási idő: kb. 3 perc
Lapozás: OK   3 / 4

A működés egyszerű: az előlapon található gombok egyenértékűek a távirányító gombjaival, mindkettővel mindig kapcsolgathatunk. Bekapcsoláskor a legutóbb használt bemenetet választja ki, mivel minden átkapcsoláskor EEPROM -ba menti az állapotát. Szintén EEPROM-ban tárolja a távirányító-gombok bitmintáit.

Elég sok időt eltöltöttem vele, hogy megfejtsem az infrás távirányítók kommunikációját. Neten nézelődtem, láttam hogy rengeteg, többé-kevésbé szabványos protokoll van (pl. RC5 code, JVC panasonic code, JCC protocol, daewoo protocol, sony infrared remote protocol, stb.), de valahogy azok a távirányítók, amik nekem otthon voltak, nem passzoltak sehova.

Nem biztos, hogy a legjobban sikerült lemodelleznem a dolgot és szintén nem biztos, hogy az alábbi információkkal reprodukálható lenne például egy gombnyomás IR adása, de annyira mindenképpen elég, hogy bármely két gombnyomást meg tudjuk különböztetni egymástól a vevő oldalon.

Elég sok szenvedés után, a magam körül talált távszabályzók döntő többségénél azonosnak bizonyult a következő séma:

A TSOP31233 kimenete invertált, tehát üresjáratban a kimenete H. A startbit egy adott idejű L szintű szakasz, amit szintén egy adott hosszúságú H szakasz követ. Fontos, hogy ez a két időérték távirányítónként változik. Ezután következnek az adatbitek, amiknek a száma szintén eltérhet az egyes eszközöknél. Az adatbitek RZ kódolással érkeznek, vagyis minden bit információ egy LH és egy HL átmenetből áll, a bit értéke 0, ha a L és az H idő aránya 1:1, 1 pedig amikor ez az arány 1:3 (vagy esetleg 1:2). Az adásnak akkor van vége, amikor a TSOP kimenete sokáig (például öt adatbit idő) H -ban marad.

Viszonylag könnyű tehát felismerni az adás elejét, mert az üresjárat H szintjét a startbit hosszú L szintje töri meg, amit követ egy rövidebb H periódus. A startbit hossza többszöröse az adatbiteknek, így megkülönböztethetőek egymástól.

A program minden távirányítóval képes együtt működni, aminek az adására nagyjából igazak a fentiek (működött többek közt Samsung TV, régi 3M projektor, Technics CD deck, Gigabyte TV tuner kártya távszabályzójával, nem működött viszont például a UPC mediabox-éval).

Mivel ez a megoldás nem a szabványos gomb kódokra épül, szükségszerű tehát, hogy a szerkezet meg tudja tanulni a később felismerni kívánt gombokat.

Magáról a bemenetválasztóról még annyit, hogy tanuló üzemmódba akkor kerül, ha a bekapcsolás pillanatában az 1. bemenet panelen levő nyomógombját lenyomva tartjuk. Ilyenkor a bemenetek visszajelző LED -jei sorra felvillannak, ekkor a megfelelő gombot kell nyomkodni a távkapcsolón, majd ha elegendő egyforma mintát gyűjtött a szerkezet, elmenti és jön a következő.

Aki csak használni akarja a kapcsolást, az lapozhat is, a forráskódot letöltve és lefordítva már használhatja is a programot (legfeljebb a MAXTIME_STARTBIT (ir.h) konstanssal kell hangolni 1-1 távirányító esetében).

Akit érdekel a program, például további projekt fejlesztéséhez, annak adok egy kis útmutatást a függvénykönyvtárhoz, amit az alkalmazáslogikától (remélhetőleg ) teljesen elszeparáltam (ir.c és ir.h). Az infra kezelő rész két lényeges helyen kell hívódjon: az egyik helyen az időmérő rész, a másik helyen pedig amikor a TSOP kimenete változik:

  • ir_handle_timer() : ez a függvény végzi az infra adás darabjainak időmérését. Az ideális hívási frekvenciája 30kHz, ami például egy 8 bites timer előosztás nélküli túlcsordulási frekvenciájának felel meg 8MHz -es órajel esetében.
  • ir_handle_input( tsop_in ) : ez a függvény dolgozza fel a TSOP kimenetét. Meg kell hívni minden esetben, amikor változik az adott bemenet feszültségszintje, célszerű lehet például a TSOP -t egy külső megszakítás lábra kötni, és a megszakításkezelésből átadni a 0 vagy 1 értéket. Nem baj azonban, ha a main végtelen ciklusában hívogatjuk, nemcsak állapot váltáskor. Én is így használom, mivel a TSOP nem INT lábra került.
  • ir_is_recieve_ready() : ez a függvény mindig visszaadja a legutóbb fogadott jel sorszámát, ha felismert valamit. Mindig meg kell hívni, amikor kíváncsiak vagyunk, hogy történt-e valami az éterben . Ha nem volt értékelhető jel a hívás pillanatáig, akkor a visszaadott érték 0.

Még két fontos függvény a tanuló funkcióhoz:

  • ir_start_learning( number_of_the_signal ) : ez a függvény váltja át a rendszert tanulóüzemmódba. A hívás után az egymás után érkező jeleket összehasonlítja és ha megfelelő (állítható) számú egyforma jel érkezett, EEPROM-ba menti. Paramétere a megtanulni kívánt gomb sorszáma (ezt fogja visszaadni később az ir_is_recieve_ready() ). Tanulás közben fontos, hogy az ir_handle_input() és a ir_handle_timer() ugyanúgy meghívásra kerüljön a szokott helyeken.
  • ir_get_learning_state() : ez a függvény mondja meg, hogy az elkezdett tanulás milyen állapotban van. Ha megfelelő számú egyforma minta gyűlt össze és sikerült elmenteni, akkor a LEARNING_DONE konstanst adja vissza. Ha azonban egy bizonyos számú (állítható) jel fogadása után nem jöttek be az egyforma minták, a függvény a LEARNING_FAILED konstanst adja vissza. A függvény nem blokkol, ezért célszerű őt is cilkusban hivogatni.

Ha definiáljuk a DEBUG szimbólumot a fordítónak (ir.h), az USART-on egy halom információt kapunk a működésről (38400 bps, 8N1) :


A cikk még nem ért véget, lapozz!
Következő: »»   3 / 4
Értékeléshez bejelentkezés szükséges!
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem