PC fernsteuern mittels alter Fernbedienung und LIRC
Das Projekt LIRC (http://www.lirc.org) (Linux InfraRed Control) erlaubt das Fernsteuern des PCs mittels einer alten Fernbedienung. Dazu benötigt man etwas Hardware, die das IR-Signal aufbereiten und an den PC weitergibt sowie die Software, die aus dem Signal die Tastendrücke auf der Fernbedienung erkennt und auf irgendwelche Kommandos (Programmaufrufe, GUI-Steuerungen von Programmen) abbildet.
Die Hardware kann ganz unterschiedlich sein, je nachdem, über welche Schnittstelle man gehen will (seriell, parallel, USB). Die meiner Meinung nach einfachste Schaltung ist die serielle Anbindung, die auch unter www.lirc.org abgebildet ist. Leider haben neuere Notebooks und sogar Desktop-Rechner oft nur noch USB …
Hardware
Die oben erwähnte einfachste Schaltung habe ich nachgebaut. Nach einer dort genannten Idee habe ich die Schaltung in einer alte Maus eingebaut, die nun auf meinem Computer steht. Man entfernt die alte Elektronik und bricht alle Plastikstege etc. weg, die stören. Vorne wird ein Loch eingefeilt, in welches man den Sensor stecken und hinten ankleben kann.
Der Sensor (rechts) sowie die serielle Anbindung im Mausgehäuse
Bei der Hardware ist zu beachten, dass die Versorgungsspannung vom RTS-Signal der RS232-Schnittstelle abgeleitet wird. Unterschiedliche PCs geben da aber unterschiedliche Spannungen ab, insbesondere bei Notebooks kann es sein, dass die Spannung nicht ausreicht. Ich habe verschiedene Messungen gemacht:
Die Schaltung wurde testweise an ein regelbares Netzteil angeschlossen (RTS als +, GND für 0V) und der Signalausgang (DCD) an ein Oszilloskop. Ich habe die Spannung dann variiert und geschaut, was die Schaltung tut:
- Die Schaltung arbeitet bei +5V Signalhöhe an RTS nicht. D.h. ein Drücken einer Taste auf der Fernbedienung führt zu keinerlei Reaktion am Signalausgang DCD. Die Schaltung arbeitet unzuverlässig bei +6V Signalhöhe an RTS. D.h. ein Drücken einer Taste auf der Fernbedienung führt zu Signalausschlägen am Signalausgang DCD, die man im Oszilloskop sehen kann ( Zeitbasis auf 2 Mikrosekunden eingestellt, Y auf 2 Volt pro Skalenstrich). Die Schaltung arbeitet zuverlässig bei +7V Signalhöhe an RTS. Dann stehen am Ausgang des Regel-ICs 78L05 4,5 Volt an.
- Die Schaltung arbeitet zuverlässig bei +7,5V Signalhöhe an RTS. Ab dieser Spannung stehen am Ausgang des Regel-ICs 78L05 4,98 Volt an, d.h. der Regler kann ab hier die Spannung nicht nur durchleiten, sondern auch regeln.
Ein Anschluss an ein Motherboard ASRock P4V88 bringt 8,49V an RTS, damit ist der Betrieb der Schaltung also sehr gut möglich. Ein Anschluss an ein Notebook Dell Latitude C600 bringt 5,49V an RTS, damit ist der Betrieb nicht möglich (habe es erfolglos probiert).
Software
Das lirc-Paket war unter Suse 10.0 bereits installiert, desweiteren ein lirc-fähiger mplayer/gmplayer. Unter OpenSuese musste ich die Kernel-Module für den seriellen Port (in Yast nach lirc suchen) installieren. Der gmplayer muss u.U. erst mit lirc-Support übersetzt werden. Wenn mplayer/gmplayer mit lirc support compiliert wurde kommt folgende Ausgabe beim Start:
--- Setting up LIRC support... ---
In der Datei /etc/lircd.conf
müssen Daten zur Fernbedienung abgelegt werden.
Diese müssen mittels irrecord ermittelt werden. Ausgangsbasis für die eigene
Fernbedienung sollte eine ähnliche Fernbedienung sein, denn unter www.lirc.org
sind für viele Fbs schon passende Dateien vorhanden. Diese als Inputdatei für
irrecord nehmen. Nach „Anlernen“ der Fernbedienung dann die Datei unter
/etc/lircd.conf
ablegen.
Unter /etc/sysconfig/lirc
sind die grundlegenden Infos für
lirc abzulegen, bei mir z.B.:
LIRCD_DRIVER=“default” LIRCD_DEVICE="/dev/lirc" COM_PORT=/dev/ttyS0 LIRC_MODULE=“lirc_dev lirc_serial”
Unter /etc/init.d/boot.local
kann lirc dann bei jedem Booten initialisiert
werden:
setserial /dev/ttyS0 uart none modprobe lirc_serial sense=1 rclirc start
Die Daten müssen durch Probieren ermittelt werden, diverse Tutorials im Netz
helfen hier etwas. setserial
kann bei openSuse mittels Yast nachinstalliert
werden.
Fürs Probieren gilt:
Bevor man in den genannten Dateien was ändert, alles per Hand solange
ausprobieren bis es funktioniert. Erst dann das Ergebnis in
/etc/sysconfig/lirc
und /etc/init.d/boot.local
verewigen.
- Zuerst die korrekte Schnittstelle für
setserial
ermitteln. - Dann das passende Modul (passend zur Hardware) auswählen, bei mir lirc_serial
und lirc_dev. Bei modprobe muss ein active low-Receiver als active low
erkannt werden, statt active high. Der aus der Nachbauanleitung
bei www.lirc.org ist active low. Die Ausgabe beim
Laden des Moduls ist bei mir:
lirc_dev: IR Remote Control driver registered, at major 61 lirc_serial: Manually using active low receiver lirc_dev: lirc_register_plugin: sample_rate: 0
- Grundlegenden Test mittels
xmode2
odermode2
. Hiermit werden empfangene Signale (Highs und Lows) ausgegeben. Wenn da etwas kommt, klappt die physikalische Anbindung. Wenn der lircd läuft, funktionieren diese beiden Testprogramme nicht. Dateien unter /etc anpassen, testen ob nach boot mode2 noch tut. lircrc
erweitern für eigene Anwendungen, testen
Ausgabe von mode2 als root beim Drücken irgendwelcher Tasten:
soc:/home/dennis # mode2
space 16777215 pulse 972
space 810 pulse 1861
space 813 pulse 970
space 811 pulse 971
space 1700 pulse 1861
space 1703 pulse 1861
space 813 pulse 967
space 812 pulse 970
space 1702 pulse 972
space 812 pulse 1860
space 90778 pulse 972
space 812 pulse 1862
space 809 pulse 973
Die graphische Ausgabe von xmode2:
Ausgabe von xmode2 beim Drücken von Tasten der Fernbedienung
Ein simpler Eintrag für lircrc ist
begin remote = philips_rt150-211 button = Select prog = irexec repeat = 0 config
= echo "Hello world!"
end
wobei remote Ihre Fernbedienung wie in lircd.conf bezeichnet, button den Namen eines Buttons wie in lircd.conf genannt ist. irexec ist Teil des lirc-Pakets. In der Shell, in der der lircd gestartet wurde, wird nun der String „Hello world!“ ausgegeben.
Ein konkretes Kommando für meine Fernbedienung und das Programm mplayer ist z.B.:
begin remote = philips_rt150-211 button = Still prog = mplayer repeat = 0 config
= pause end
wobei pause ein Kommandoname ist, der durch das mplayer-Team so vorgegeben wurde. Mplayer besitzt noch dutzende andere solche Kommandos (siehe Dokumentation Mplayer).
LIRC auf neuem Gigabyte Motherboard (Gigabyte GA-G33-DS3R)
Dieses neuere Motherboard (2007) besitzt keine serielle Buchse an der Rückseite. Es hat aber immerhin einen “Header” auf dem Board, an den man ein hinzugekauftes RS232 Slotblech mit Kabel anschließen kann.
Tests mit diesem Motherboard haben bisher allerdings ergeben, dass das oben beschriebene Gerät nicht funktioniert, da das Motherboard die serielle Schnittstelle seltsam ansteuert: An RTS liegen immer ~11 Volt negativ an, sie werden auch nicht vom lirc_serial Treiber auf einen positiven Wert (wie das eigentlich sein sollte) umgeschaltet. Mit einer negativen Spannung funktioniert die Elektronik natürlich nicht. Ich habe probeweise externe +10V angelegt, dann funktioniert der Empfänger wieder. Leider wird mittels mode2 aber nichts erkannt. Also auch am Eingangspin geschehen merkwürdige Sachen. Googeln im Internet zeigt, dass das bei manchen Boards vorkommt.
Update: Nach ausführlichem Suchen habe ich das Problem lösen können: Das hinzugekaufte RS232 Slotblech (von Conrad) ist nicht 1:1 beschaltet. Durch Messen hat sich folgende Beschaltung ergeben:
RS 232 Buchse (male) am Slotblech | Buchse des Slotblechkabels |
---|---|
1 | 1 |
2 | 3 |
3 | 5 |
4 | 7 |
5 | 9 |
6 | 2 |
7 | 4 |
8 | 6 |
9 | 8 |
Das kann natürlich nicht funktionieren. Die Verpackung des Slotblechs gab darauf keinerlei Hinweise, eine Gebrauchsanweisung war ohnehin nicht dabei. Das Kabel lässt sich aber einfach umlöten, so dass 1 an 1, 2 an 2, 3 an 3 etc. hängt. Das habe ich gemacht, und der Anschluss funktioniert jetzt wunderbar.