LIRC: dálkové ovládání pro váš Linux

6. 3. 2009
Doba čtení: 12 minut

Sdílet

Dnešní civilizace je líná. Lidé vymýšlejí nové hračky, které mají jediný úkol: udělat to tak, abychom se u toho co nejméně nadřeli. Velmi dobrým příkladem je ovladač k televizi. Kolikrát bychom se bez něj museli zvednout a změnit hlasitost nebo program? Díky projektu LIRC můžeme mít k Linuxu ovladač také.

Úvod

Možná před rokem jsem si trochu hrál s LIRCem. Stále mám v desktopu TV kartu ke které byl dálkový ovladač. Využil jsem ho pro ovládání TVTime, Mplayeru a MPD. Pak z jádra 2.6.22 Linus vyškrtl funkce životně důležité pro moje dálkové ovládání a přešel jsem opět na druhou klávesnici vedle postele. Nyní mě lenost donutila zase oprášit LIRC a rozjet ho, jak potřebuji.

Nejdříve štěstí nepřálo. GPIO funkce z jader 2.6.21 a níže měly být nahrazeny pomocí /dev/input. Jenže to nefungovalo tak jako dřív. Polovina tlačítek na ovladači se kódy shodovala a jako na potvoru nebyl ani jeden funkční blok vcelku. Tím mám na mysli třeba šipky nebo ovládání přehrávání. Nakonec jsem přišel na to, jak dostat plnou funkcionalitu na omezené množství tlačítek, ale o tom níže.

Bádání pokračovalo a dostala se mi do ruky satelitní karta. Ta obsahovala dálkové ovládání a přijímač pro sériový port. Náhodou se mi také podařilo sehnat USB IR receiver přesně pro tento ovladač. Výsledky byly dobré. Ovladač má snad shodné jen šipky s tlačítky na ovládání hlasitosti a přepínání programů, jinak jsou všechny kódy jedinečné.

Po několika dnech se mi podařilo optimalizovat svázání tlačítek s funkcemi a dodnes jsem velmi spokojený. Další pokusy se týkaly emulace klávesnice a myši. U myši jsem skončil dřív než jsem začal, protože můj ovladač vysílá kód při držení tlačítka pouze jednou. Všechno mi ale fungovalo, takže si ukážeme postup. Klávesnice mi dala zabrat trochu víc. Nejdříve mi fungovaly jen šipky a enter ani náhodou. Když jsem se k tomu po týdnu vrátil, fungovalo vše, jak má na původních konfiguracích, a tak tomu je do dnes. Netuším, kde bylo co špatně. Asi se nějak nepohodla Xka s irxevent daemonem.

Teď mohu říct, že mi funguje prakticky vše co jsem potřeboval, až na ovládání stolní lampy. To je ale otázka času.

LIRC jako takový je balík několika návodů a ovladačů (ve smyslu těch systémových), které dohromady dávají nástroj na ovládání vašeho počítače skrze prakticky jakékoli dálkové ovládání. Princip je následující: daemon lircd komunikuje se samotnými ovladači a další daemoni se připojují k lircd a získají z něj informace o zmáčknutých tlačítkách. Sami pak otevírají soubor lircrc a podle něj reagují.

Když se nám nakonec vše povede, tak výsledek může být třeba takový:

Co najdeme v /dev/input

Než se pustíme do samotné konfigurace, řekneme si co najdeme ve zmíněném adresáři /dev/input. LIRC pracuje s řadou zařízení. Těch je opravdu hodně, ale když máme k dispozici ovladač, který je součástí TV nebo satelitní karty, je možné, že ho najdeme právě v /dev/input. Kromě ovladače se tam bude krčit také myš, klávesnice a další polohovací zařízení, které k počítači připojíme. LIRC s tím počítá a díky podpoře /dev/input může být dálkovým ovladačem jakákoli klávesnice.

Na kterém event zařízení leží náš ovladač zjistíme nejjednodušeji přes symlinky vytvořené z identifikace zařízení. Ty můžeme také použít kdekoli kde uvádím při konfiguraci nebo nahazování eventX.

cx@delorean:~ $ ls -l /dev/input/by-id
celkem 0
lrwxrwxrwx 1 root root 9 26. úno 22.11 usb-USB_IR_Receiver_USB_IR_Receiver-event-mouse -> ../event5
lrwxrwxrwx 1 root root 9  1. bře 02.58 usb-04f3_PS_2+USB_Mouse-event-mouse -> ../event4
lrwxrwxrwx 1 root root 9  1. bře 02.58 usb-04f3_PS_2+USB_Mouse-mouse -> ../mouse0
lrwxrwxrwx 1 root root 9 26. úno 22.11 usb-099a_EL_USB_Keyboard-event-kbd -> ../event2
lrwxrwxrwx 1 root root 9 26. úno 22.11 usb-099a_EL_USB_Keyboard-event-mouse -> ../event3 

Můj ovladač je na prvním místě.

Jak získat /etc/lircd.conf

V /etc/lircd.conf najdeme definice našich ovladačů. Když máme třeba dva ovladače, tak později si ukážeme, jak každý z nich použít pro jinou aplikaci. Mě by se něco podobného asi neosvědčilo, protože ztrácím i ten jeden.

Součástí LIRC stránek jsou konfigurační soubory pro opravdu velkou hromadu ovladačů. Pokud ale použijeme zařízení z /dev/input tak na ni rovnou můžeme zapomenou. Tyto zařízení se liší od toho na co je LIRC zvyklý a nebudou fungovat. Jednou z cest je vytvořit si konfigurační soubor svůj, třeba pomocí irrecord. Postup to není zrovna pohodlný a nakonec pravděpodobně skončíme s hexdump, abychom získali všechny tlačítka.

LIRC1

Dáme enter a mačkáme tlačítka, co to dá. Pak přestaneme a s trochou štěstí se dostaneme k volbě jednotlivých tlačítek.

LIRC2

Irrecond je fajn na vytvoření konfiguračního souboru se základními parametry, ale v mém případě nedá dohromady právě tlačítka.

LIRC3

Je tedy čas na hexdump.

LIRC5

Určení kódu tlačítka se ze začátku může zdát těžké, ale když budete sledovat čísla která se mění, tak se ke kódům dostanete. Na obrázku byly zmáčknuty tlačítka 1 až 4 a poslední bylo OK.

Kódy pak doplníme do předgenerovaného lircd.conf souboru. Výsledek může vypadat třeba takhle:

begin remote

  name  satelite
  bits           32
  eps            30
  aeps          100

  one             0     0
  zero            0     0
  gap          133005
  toggle_bit_mask 0x80050036

      begin codes
          MUTE                     0x00010032
          1                        0x00010002
          2                        0x00010003
          3                        0x00010004
      [...]
          STOP                     0x00010019
          EXT                      0x0001002f
      end codes

end remote] 

Našim úkolem je vyplnit jméno dálkového ovladače a doplnit tlačítka. Tlačítka se uvádějí mezi „begin codes“ a „end codes“. Prvním parametrem je název tlačítka. S tím budeme pracovat po zbytek konfigurace. Druhým je samotný kód. Dbejte na počet nul. 0× označuje, že se jedná o šestnáctkovou soustavu, tedy přesně to co vypadlo z hexdump. Je možné, že irrecord vám dá přesně to co potřebujete a tak hexdump můžete brát jen jako malé zpestření článku.

Pokud také vlastníte ovladač k satelitní kartě Technisat, tak můžete vyžít již vytvoření lircd.conf.

lircd

Od teď již bude práce příjemnější. Začneme nahozením daemona lircd, který se bude starat o naše dálková ovládání a umožní ostatním programům s nimi pracovat. Po spuštění se vytvoří virtuální zařízení /dev/lircd, přes které se tyto programy připojují.

O nahození lircd se starají init skripty distribuce. V Gentoo najdeme jejich konfiguraci v /etc/conf.d/lircd. Tam vyplníte pouze parametry které si hned ukážeme na příkladu.

Lircd spustíme na příkazové řádce jako root takto:

lircd -n -H dev/input -d /dev/input/event5 

Parametr -n říká, že se nemá lircd forkovat do pozadí, -H určuje, jaký ovladač (ve smyslu systémového ovladače) se má použít. Posledním parametrem -d říkáme lircd, kde najde zařízení ovladače. Pokud vše šlape dobře, můžeme si zkusit jestli nám dálkové ovládání reaguje. Nejlepším pomocníkem je program irw. Ten vypíše zmáčknutá tlačítka.

LIRC6

Na obrázku vidíme, že se irw připojil k lircd a získával z něj informace o zmáčknutých tlačítkách.

Pokud jsme se dostali až sem, tak už nám pravděpodobně pojede základní funkčnost LIRCu a můžete pro něj začít svazovat tlačítka s funkcemi. Než se dostaneme k této části, vyzkoušíme si lircmd pro emulaci myši.

lircmd

Lircmd je daemon, který vytvoří zařízení /dev/lircm a poté tam na základě kódů z ovladače posílá vše, co má správná virtuální Xková myš mít. Konfigurační soubor vypadá třeba takhle:

PROTOCOL IMPS/2

ACCELERATOR 1 30 1

BUTTON1_CLICK * RED
BUTTON3_CLICK * BLUE

TOGGLE_ACTIVATE * 6
MOVE_N * UP
MOVE_S * DOWN
MOVE_E * RIGHT
MOVE_W * LEFT 

Možností je ale daleko víc, hlavně pokud jde o směry. Možná vás už napadlo, že N, S, E a W znázorňují světové strany. Kromě těchto čtyřech můžeme použít také NE, SE a další. Více informací najdete třeba v příkladu na fedoranews.

Na řádcích, kde se definují směry znamená první parametr identifikátor směru, druhý je název ovladače a třetí tlačítko, jenž směr reprezentuje. Na dalších řádcích nastavujeme akceleraci, protokol a tlačítko, kterým se vypne nebo případně zapne naše virtuální myš. U akcelerace značí první číslo, o kolik se má posunout kurzor na začátku, druhé číslo označuje maximální posun a třetí je násobitel. Jak už jsem zmínil výše, tak lircmd je použitelný pouze, pokud váš ovladač posílá při stlačení tlačítka kódy pořád dokola a přestane až po uvolnění.

Zbývá jenom říci X serveru, kde má hledat naši novou virtuální myš:

Section "InputDevice"
    Identifier "LIRC-Mouse"
    Driver "mouse"
    Option "Device" "/dev/lircm"
    Option "Protocol" "IMPS/2"
    Option "SendCoreEvents"
    Option "Buttons" "2"
    Option "ZAxisMapping" "4 5"
EndSection 

Input sekce je prakticky stejná, jako když se jedná o normální myš, pouze nasměrujeme X server na /dev/lircm.

Nakonec přidáme myš do:

Section "ServerLayout"
    [...]
    InputDevice    "LIRC-Mouse"
    [...]
EndSection 

Myš bude fungovat, pouze pokud spustíme lircmd před startem X serveru. Lircmd by měl mít stejně jako další daemoni svůj init skript a priority spouštění by měl řešit vývojový tým distribuce. Občas je tomu potřeba pomoci.

irexec

Dalším velmi užitečným daemonem, který je na rozdíl od lircmd důležitou součástí základní funkčnosti, je irexec. Jeho úkolem je naslouchat zmáčknutým tlačítkům a jako reakci spouštět další programy. Je to daemon, který dělá LIRC tak silný. Dokáže totiž využít potenciál linuxu. Grafické programy lze ovládat přes dbus nebo dcop, na MPD použijeme mpc.

Některé programy, jako třeba mplayer, mají podporu pro LIRC v sobě, a tak není potřeba se opírat o irexec a můžeme využít rovnou příkazů konkrétního programu.

Konfigurační soubor najdeme buď v ~/.lircrc nebo v /etc/lircrc.

irxevent

Dcop, dbus a podobné věci nedokáží nahradit kouzlo samotné klávesnice, pro takovéto případy tu máme irxevent. Je to také daemon a také se konfiguruje přes .lircrc. Kouzlo spočívá v tom, že jedné aplikaci můžeme jako reakci na zmáčknutí tlačítka ovladače poslat signál s tím, že se zmáčkla nějaká klávesa na klávesnici nebo rovnou klávesová zkratka. Osobně používám irxevent pro ovládání krusaderu a pomocí virtuálních šipek si vybírám, co si pustím. Také se mi osvědčil při používání mplayeru. Ten nemá ve svém portfóliu LIRC funkcí třeba roztahování obrazu, i přes to, že to bývá důležité u 4:3 videí na 16:10 monitoru.

Co je dobré vědět při problémech

Než se přesunu ke konfiguračnímu souboru, na jehož základě konečně uvidíme výsledky naší práce, ještě uvedu postup, jak najít co nejrychleji, kde je problém.

  1. Pomocí hexdump zjistíme jestli se na /dev/input/event* něco děje.
  2. Spustíme lircd v příkazové řádce a sledujeme výstup.
  3. Pomocí irw zjistíme, jestli lircd reaguje na tlačítka.
  4. Pokud lircd nereaguje a nic nehlásí, je problém v /etc/lircd.conf.
  5. Pokud irw jede a tlačítka, která jsme nakonfigurovali, ne, tak si ověříme, jestli běží daemoni irexec a irxevent.

.lircrc

Prvotní motivace pro rozchození LIRCu nebyla nějak velká. Stačilo mi v mplayeru zastavit přehrávání, když někdo přijde, a ovládat hlasitost. Dálkové ovládání se zdálo nejlepší, protože je jednoduší na něm něco najít potmě a už jsem měl průpravu z televize a dalších zařízení. Nakonec to vše skončilo u mnohem mocnějšího nastavení, které zpohodlní práci s multimédii ještě víc.

Konfigurační soubor .lircrc v sobě nezahrnuje nic záludného. Najdeme v něm definice pro jednotlivá tlačítka, kde můžeme nastavit, co se má udělat po zmáčknutí jakého tlačítka a případně opakování.

Tyto definice si pak můžeme rozdělit do několika módů a každý mód spouštět jiným tlačítkem. V praxi to pak funguje tak, že si třeba na tlačítko „1“ nastavíme zapnutí mplayer módu, na tlačítko „2“ zase mpd módu atd. Poté můžeme stejnými tlačítky na ovladači ovládat oba dva programy, aniž bychom museli hledat, které že tlačítko to máme ještě volné, a složitě si zapamatovávat, co dělá co. Módy zvyšují kapacitu tlačítek, obzvláště těch populárních jako jsou šipky, enter případně play, stop, next atd.

Jak nastavit tlačítko

Otevřeme si soubor ~/.lircrc a do něj vložíme následující řádky:

begin
    prog    = irexec
    remote  = *
    button  = DOWN
    repeat  = 0
    config  = amixer set PCM 5%-
end 

Nastavení každého tlačítka začíná begin a končí end. Řádky mezi začátkem a koncem obsahují některé více či méně důležité informace. To, co vidíte v ukázce, je asi to nejdůležitější, a tyto hodnoty by měla obsahovat přibližně většina sekcí tlačítek. V parametru prog nastavíme, jaký má být cílový program, remote označuje ovladač, na kterém se má hledat zmáčknutí tlačítka, v button nastavíme, o které tlačítko se jedná, repeat označuje opakování, kde 0 znamená, že se má daná akce provést jen jednou, tedy neopakovat. V posledním parametru nastavíme, co se má poslat vybranému programu, pokud bude tlačítko zmáčknuto. Config může být v u každého tlačítka i vícekrát. Pokud chceme, aby se akce opakovala, když držíme tlačítko zmáčknuté, tak nastavíme parametr repeat na číslo větší než nula, kde nastavené číslo označuje, kolikátý signál z vygenerovaných má být brán v potaz.

Více informací o tom co můžeme do konfiguračního souboru napsat najdeme v dokumentaci.

Druhou věcí, o které jsem se zmiňoval, jsou módy. Změna módu jako reakce na tlačítko může vypadat třeba tahle:

begin
    prog   = irexec
    remote = *
    button = 1
    repeat = 0
    delay = 0
    mode = mplayer
end 

Kromě parametru mode se tu setkáváme i dalším parametrem, a to delay. Ten můžeme použít i v předchozím případě a označuje, kolik opakovaných signálů se má vynechat, než se začnou brát potaz. Zabraňuje to občasnému dvojitému spuštění akce při použití opakování. Parametr mód nastaví pomyslnou proměnnou módu. V našem případě to je mplayer, ale název je čistě na uživateli.

Mód máme nastavený, teď je potřeba vytvořit podmínku, na kterou bude lircd hledět při hledání, ke kterému tlačítku patří jaká akce.

begin mplayer
    include ~/.lircd/mplayer
end mplayer 

V našem příkladě si oddělíme sekce tlačítek pro mplayer do dalšího souboru. Nic nám ale nebrání psát je rovnou podmínky nebo spíše sekce s mplayerem.

Kromě umístění na ~/.lircrc se může tento soubor nacházet také v /etc/lircrc. Větší prioritu má ten, který je uložený v home adresáři.

Můj .lircrc

Stejně jako s /etc/lircd.conf, tak i s .lircrc si uvedeme pár příklad. K dispozici dávám následující konfigurační soubory, které definují ovládání níže zmíněných vlastností programů mplayer, mpd, tvtime a nemůžeme zapomenout ani na Xka resp. na šipky a enter v aktuálním okně.

mplayer

  • Stop
  • Přehrát
  • Pauza
  • Přetočit dopředu
  • Přetočit dozadu
  • Upravit šířku obrazu
  • Posunovat titulky
  • Hlasitost
  • Celá obrazovka

X

  • Šipky
  • Enter

mpd

  • Stop
  • Přehrát
  • Výběr písničky
  • Pauza
  • Hlasitost

tvtime

  • Výběr kanálu
  • Hlasitost
  • Celá obrazovka
  • Spuštění

Závěr

Já jsem velmi minimalistický uživatel. Nemám proto zkušenosti s větší sortou programů, než které jsem uvedl. LIRC ale podporuje velké množství linuxových aplikací, takže stačí jen hledat. Podpora pro LIRC byla obsažena také v KDE 3, ale v KDE 4 jsem na nic podobného nenašel. Ovládání prostředí proto zůstane v rukou lircmd nebo irxevent.

Nastavení LIRCu se může zdát trochu komplikované, možná až geekovské. Pokud se ale rozhodnete postavit si třeba IR přijímač vlastní, ten by měl v LIRC, hlavně s irrecord, fungovat lépe.

ict ve školství 24

S LIRCem jsem velmi spokojený a ta námaha s jeho konfigurací za to stála. Během té doby se většinou nedařilo vše na poprvé, často jsem některé postupy získal starým, ale dobrým stylem pokus/omyl. Pokud by se vám z nějakého důvodu nedařilo, pomůže dokumentace na stránkách projektu.

Jaké máte zkušenosti s LIRCem vy?

Autor článku

Adam Štrauch je redaktorem serveru Root.cz a svobodný software nasazuje jak na desktopech tak i na routerech a serverech. Ve svém volném čase se stará o komunitní síť, ve které je již přes 100 členů.