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:

  1. 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.
  2. 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.

  1. Zuerst die korrekte Schnittstelle für setserial ermitteln.
  2. 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
  3. Grundlegenden Test mittels xmode2 oder mode2. 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.
  4. 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
 space 809

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.