Fernkontrolle via IR Port in OpenWrt

Als eine der interessanten Entwicklungsmöglichkeiten des Routers kann die Verwendungsmöglichkeit des IR-Übertragungskanales dienen. Es gibt viele Einsatzvarianten für die Verwendung der Fernsteuerung, und ich glaube, Sie können selbst entscheiden, wo man diese Option einsetzen kann. Meine Aufgabe ist zu zeigen, wie leicht es ist diese Funktionalität an den Router anzubinden.

Also, ein bisschen Theorie ))...

Der Infrarot-Übertragungskanal (IR) besteht mindestens aus 2 Bestandteilen: aus einem Empfänger- und einem Sendegerät. Sowohl Empfänger als auch Sendegerät ist nicht kompliziert selbst zusammenzusetzen, indem man diverse fertige Lösungen aus dem Internet verwenden kann. Ich schlage aber vor die betriebsfertige Geräte zu nehmen.

Als ein Sendegerät tritt hier ein Pult, als ein Empfängergerät tritt hier eine Rückmeldeeinrichtung, welche an den USB-Einganges angeschlossen wird.

Für den Betrieb des IR-Portes ist das Programm LIRC in Linux zuständig. Das LIRC gehört zu der Konfiguration von OpenWrt. Deshalb sind folgende Module auf der Konfigurationsstufe von OpenWrt auszuwählen:
Base system:
<*> busybox:
Linux System Utilities:
<*> lsusb
Kernel modules:
USB Support:
<M> kmod-usb-hid
Utilities:
<M> lirc:
<M> lircdaemonadd
<M> lirctools

Bevor wir mit dem Zusammenbau beginnen, sollen wir den Typ des unterstützten Treibers für LIRC selbst einzutragen. Als Standard-Einstellung wird das LIRC mit Unterstützung des Treibers mceusb zusammengesetzt, aber in unserem Falle ist der Treiber devinput zu verwenden. Dies wird ganz leicht gemacht. Machen wir die Datei OpenWtr/feeds/packages/utils/lirc/Makefile auf. Suchen wir nach dem Abschnitt CONFIGURE_ARGS in dieser Datei und ersetzen wir die Zeile --with-driver="mceusb" auf --with-driver="devinput".

Installieren wir die Pakete:

root@OpenWrt:/# opkg install kmod-usb-hid
Installing kmod-usb-hid (2.6.36.2-1) to root...
Downloading ftp://ftp:ftp@192.168.0.9/kmod-usb-hid_2.6.36.2-1_brcm47xx.ipk.
Installing kmod-hid (2.6.36.2-1) to root...
Downloading ftp://ftp:ftp@192.168.0.9/kmod-hid_2.6.36.2-1_brcm47xx.ipk.
Installing kmod-input-core (2.6.36.2-1) to root...
Downloading ftp://ftp:ftp@192.168.0.9/kmod-input-core_2.6.36.2-1_brcm47xx.ipk.
Installing kmod-input-evdev (2.6.36.2-1) to root...
Downloading ftp://ftp:ftp@192.168.0.9/kmod-input-evdev_2.6.36.2-1_brcm47xx.ipk.
Configuring kmod-input-core.
Configuring kmod-hid.
Configuring kmod-input-evdev.
Configuring kmod-usb-hid.

root@OpenWrt:/# opkg install udev
Installing udev (142-1) to root...
Downloading ftp://ftp:ftp@192.168.0.9/udev_142-1_brcm47xx.ipk.
Configuring udev.

root@OpenWrt:/# opkg install lirc
Installing lirc (0.8.7-1) to root...
Downloading ftp://ftp:ftp@192.168.0.9/lirc_0.8.7-1_brcm47xx.ipk.
Configuring lirc.

root@OpenWrt:/# opkg install lircdaemonadd lirctools
Installing lircdaemonadd (0.8.7-1) to root...
Downloading ftp://ftp:ftp@192.168.0.9/lircdaemonadd_0.8.7-1_brcm47xx.ipk.
Installing lirctools (0.8.7-1) to root...
Downloading ftp://ftp:ftp@192.168.0.9/lirctools_0.8.7-1_brcm47xx.ipk.
Configuring lircdaemonadd.
Configuring lirctools.

Jetzt möchte ich ein paar Worte daüber sagen, wie das Programm LIRC funktioniert. Beim Tastendrücken auf unserem Pult wird ein Befehl via IR-Port geschickt, dieser Befehl entspricht der gedrückten Taste. Der an den USB-Hub des Routers angeschlossene Empfängergerät empfängt diesen Befehl und sendet ein Signal zum LIRC mit der Code von diesem Befehl. Daemon des Befehls LIRC vergleicht die Befehlcode mit den Coden, welche ihm bekannt sind, und führt die Operation aus, welche dieser Code entspricht. Irgendwie so...

Schließen wir den Empfänger an den USB-Hub an und prüfen wir die Rückmeldung von Linux.

root@OpenWrt:/# dmesg
usb 1-1.4: new low speed USB device using ohci_hcd and address 4
usb 1-1.4: config 1 interface 0 altsetting 0 has 2 endpoint descriptors, different from the interface descriptor's value: 1
input: HID 073a:2230 as /devices/ssb0:1/usb1/1-1/1-1.4/1-1.4:1.0/input/input0
generic-usb 0003:073A:2230.0001: input: USB HID v1.10 Keyboard [HID 073a:2230] on usb-ssb0:1-1.4/input0

root@OpenWrt:/# lsusb
Bus 001 Device 001: ID 1d6b:0001
Bus 002 Device 001: ID 1d6b:0002
Bus 001 Device 002: ID 0a05:7211
Bus 001 Device 003: ID 0951:1603
Bus 001 Device 004: ID 073a:2230

Wie wir sehen können, wurde eine Einrichtung definiert und sie hat den Bezeichnungsnamen 073a:2230 Chaplet Systems, Inc.

Wir können auch prüfen, ob die Einrichtung im System mittels folgender Befehle richtig definiert wurde.

Es wurde eine Einrichtung im Verzeichnis /dev erstellt:

root@OpenWrt:/# ls -l /dev/input/
crw-r--r-- 1 root root 13, 64 Jan 1 00:01 event0

Es wurde eine Datei im Verzeichnis /proc erstellt:

root@OpenWrt:/# cat /proc/bus/input/devices
I: Bus=0003 Vendor=073a Product=2230 Version=0110
N: Name="HID 073a:2230"
P: Phys=usb-ssb0:1-1.1/input0
S: Sysfs=/devices/ssb0:1/usb1/1-1/1-1.1/1-1.1:1.0/input/input1
U: Uniq=
H: Handlers=event0
B: EV=10001f
B: KEY=837fff 2c3027 bf004444 0 fffff ffffffff 10c04 b27c007 ffa67bfa d941dfff febeffdf ffefffff ffffffff fffffffe
B: REL=343
B: ABS=1 30000
B: MSC=10

Wir können die Informationen über die Einrichtung mittels des Befehls udevadm bekommen:

root@OpenWrt:/# udevadm info --query=all --name=/dev/input/event0
P: /devices/ssb0:1/usb1/1-1/1-1.1/1-1.1:1.0/input/input1/event0
E: UDEV_LOG=3
E: DEVPATH=/devices/ssb0:1/usb1/1-1/1-1.1/1-1.1:1.0/input/input1/event0
E: MAJOR=13
E: MINOR=64
E: DEVNAME=input/event0

Prüfen wir, ob die vom Pult gesendeten Befehle das System bekommt. Starten wir den folgenden Befehl und drücken wir die Tasten auf dem Pult:

root@OpenWrt:/# cat /dev/input/event0 | hexdump
0000000 04ee 0000 fd21 0003 0004 0004 00ea 000c
0000010 04ee 0000 fd46 0003 0001 0072 0001 0000
0000020 04ee 0000 fd50 0003 0000 0000 0000 0000
0000030 04ee 0000 1641 0005 0004 0004 00ea 000c
0000040 04ee 0000 1666 0005 0001 0072 0000 0000
0000050 04ee 0000 1683 0005 0000 0000 0000 0000
0000060 04f1 0000 b1e3 0000 0004 0004 0028 0007
0000070 04f1 0000 b209 0000 0001 001c 0001 0000
0000080 04f1 0000 b213 0000 0000 0000 0000 0000
0000090 04f1 0000 cb11 0001 0004 0004 0028 0007
00000a0 04f1 0000 cb33 0001 0001 001c 0000 0000
00000b0 04f1 0000 cb4f 0001 0000 0000 0000 0000

Mit Hilfe des Programms irrecord kann man einen eigenen Namen für jede Taste des Pultes vorzugeben:
root@OpenWrt:/# irrecord -d /dev/input/event0 /etc/lircd.conf --disable-namespace

Für die Diagnose kann man auch das Programm mode2 verwenden.

Gehen wir weiter und beginnen wir mit dem Daemonstarten lircd. Die Datei /etc/lircd.conf ist eine Konfigurationsdatei des Daemons lircd. In dieser Datei wird der Name der Taste mit der Kode der Taste, welche via IR-Übertragungskanal empfangen wird, verglichen. Man kann diese Datei selbst erstellen, wobei man die Tastenwerte abliest und die Namen der Tasten vorgibt. Ich glaube aber, es wäre besser eine fertige Datei zu nehmen lircd.conf
Diese Datei sieht wie folgt aus:

begin remote
name ChapletSystem
bits 32
begin codes
POWER 0x40004 0x80010074
RADIO 0x40004 0x8001001e
TV 0x40004 0x80010014
DVD 0x40004 0x80010031
MUSIC 0x40004 0x80010032
PHOTO 0x40004 0x80010017
VIDEO 0x40004 0x80010012
DVD_MENU 0x40004 0x8001002f
MUTE 0x40004 0x80010042
BACK 0x40004 0x8001000e
GUIDE 0x40004 0x8001003b
VOLUME_UP 0x40004 0x80010073
VOLUME_DOWN 0x40004 0x80010072
CHANNEL_UP 0x40004 0x80010068
CHANNEL_DOWN 0x40004 0x8001006d
ARROW_UP 0x40004 0x80010067
ARROW_DOWN 0x40004 0x8001006c
ARROW_LEFT 0x40004 0x80010069
ARROW_RIGHT 0x40004 0x8001006a
ENTER 0x40004 0x8001001c
RECORD 0x40004 0x8001001d 0x40004 0x80010013
REPEAT 0x40004 0x8001002a 0x40004 0x80010013
PLAY 0x40004 0x8001002a 0x40004 0x80010019
PAUSE 0x40004 0x8001001d 0x40004 0x80010019
STOP 0x40004 0x8001001f
REWIND 0x40004 0x8001002a 0x40004 0x80010020
FORWARD 0x40004 0x8001002a 0x40004 0x80010021
PREV_TRACK 0x40004 0x8001001d 0x40004 0x80010030
NEXT_TRACK 0x40004 0x8001001d 0x40004 0x80010021
NUMPAD_1 0x40004 0x80010002
NUMPAD_2 0x40004 0x80010003
NUMPAD_3 0x40004 0x80010004
NUMPAD_4 0x40004 0x80010005
NUMPAD_5 0x40004 0x80010006
NUMPAD_6 0x40004 0x80010007
NUMPAD_7 0x40004 0x80010008
NUMPAD_8 0x40004 0x80010009
NUMPAD_9 0x40004 0x8001000a
NUMPAD_0 0x40004 0x8001000b
end codes
end remote

Starten wir den Daemon lircd:

root@OpenWrt:/# mkdir /var/run/lirc
root@OpenWrt:/# lircd -n --driver=dev/input --device=/dev/input/event0 --pidfile /var/run/lirc/lircd.pid

Wollen wir prüfen, wie er funktioniert. In einem anderen Fenster starten wir den Klienten irw. Der Klient irw liest die Daten von lircd ein und und zeigt das Ergebnis auf dem Monitorю Nach dem Starten drücken wir die Tasten auf dem Pult. Auf dem Monitor erscheinen die Tastennamen und die Kode:

root@OpenWrt:/# irw
0000000000040004 00 ENTER ChapletSystem
0000000000040004 00 VOLUME_UP ChapletSystem
0000000000040004 00 VOLUME_DOWN ChapletSystem
0000000000040004 00 ARROW_RIGHT ChapletSystem
0000000000040004 00 ARROW_UP ChapletSystem
0000000000040004 00 ARROW_DOWN ChapletSystem
0000000000040004 00 ARROW_LEFT ChapletSystem

Um eine bestimmte Funktion an eine Taste zu binden, gibt es die Datei lircrc.
lircrc
Ihr Format ist sehr einfach. Prüfen wir ein Beispiel:

begin
prog = irexec
button = ENTER
config = echo "It is button 'ENTER'"
end

begin
prog = irexec
button = VOLUME_UP
config = /home/my_script.sh
end

Beim Tastendrücken von ENTER auf dem Pult führen wir den Befehl echo "It is button 'ENTER'" aus oder Beim Tastendrücken von VOLUME_UP auf dem Pult führen wir das Skript /home/my_script.sh aus. Irexec - das ist ein Daemon, welcher mit dem Programmstart beim Tastendrücken auf dem Pult beginnt.

Prüfen wir, wie dies funktioniert. Starten wir den Daemon lircd in BG-Betrieb und beim Starten vom Daemon irexec zeigen wir ihm die Datei lircrc.

root@OpenWrt:/# lircd --driver=dev/input --device=/dev/input/event0 —pidfile
root@OpenWrt:/# irexec /home/lircrc
sh: /home/my_script.sh: not found
It is button 'ENTER'
It is button 'ENTER'
sh: /home/my_script.sh: not found /var/run/lirc/lircd.pid

Einen Satz von der IR-Fernkontrolle bei uns bestellen:

a set of IR remote control