You are currently viewing IR-Signale, LIRC und der Raspberry Pi
Über den TSOP4838 IR-Detektor kann ein Raspberry Pi auf eine IR-Fernbedienung reagieren

IR-Signale, LIRC und der Raspberry Pi

Einen Raspberry Pi per Infrarot-Fernbedienung anzusteuern ist interessant, weil damit ein von LAN/WLAN sowie SSH unabhängiger Weg geschaffen werden kann, um Bash-Skripte oder darin enthaltene Programme auszuführen. Der sehr kleine Raspberry Pi Zero W und dessen leistungsstarker Nachfolger Pi Zero2 W haben keine LAN-Buchse und müssen deshalb per SSH und WLAN angesteuert werden. Noch  preisgünstiger liegt der Pi Zero, der auch auf WLAN verzichtet. Völlig nutzlos? In Kombination mit einem I²C LCD-Display kann so ein Raspberry Pi Zero mit einem IR-Empfänger ausgestattet werden um dann über eine IR-Fernbedienung Signale zu empfangen. Während Taster am Raspberry Pi bzw. an Erweiterungsplatinen einen mechanisch festen Aufbau erfordern, ist der Aufwand bei Infrarot und LIRC sehr gering und es ist auch kostengünstig. Der TSOP4838 als IR-Detektor ist für unter 2€ zu bekommen. In meinem Buch verwende ich optional ein DOGM-204 LCD Display das für unter 15€ erhältlich ist. Eine erste Testschaltung ist auf dem Steckbrett schnell aufgebaut, wie in Kapitel 6 meines Buches beschrieben. Um auch Buster/Bullseye mit LIRC zu unterstützen, holen Sie sich bitte den neuesten Softwarestand zum Buch bei Hanser oder hier auf der Webseite.

Der TSOP 4838 als IR-Empfänger für LIRC

Jede Infrarot Fernbedienung sendet bei einem Tastendruck modulierte Signale aus. Ein IR-Empfänger wie der TSOP 4838 demoduliert diese Signale und liefert am Pin „Out“ eine binäre Impulsfolge. Es genügt also den IR-Detektor mit 3,3 Volt zu versorgen und dessen Pin „Out“ mit dem passenden GPIO-Pin am Raspberry Pi zu verbinden (Seite 364 im Buch). Man kann den TSOP 4838 direkt verdrahten und braucht für den Einstieg weder ein Steckbrett noch eine spezielle Platine.

Raspberry Pi Display, TSOP 4838 als IR-Detektor zur Infrarot Steuerung über LIRC
Das im Buch beschriebene Eingabemodul mit TSOP 4838 als IR-Empfänger für LIRC

In der Abbildung sehen Sie ein DOGM204-LCD-Display, das mit einer Platine verbunden ist, die am Raspberry Pi 3 aufgesteckt ist. Oberhalb der 4 Taster ist der TSOP 4838 eingelötet, damit die Infrarot Steuerung über LIRC funktioniert. Man kann sich leicht vorstellen, daß die Statusanzeige nach Betätigung einer Taste an der IR-Fernbedienung verschwindet und stattdessen ein Auswahlmenü erscheint. Wer kein Display einsetzen möchte, kann auch an eine Sprachausgabe denken (Seite 741 im Buch). Das wäre dann wie die Betätigung von Tasten beim Telefondialog. Bei einer komplett ausgedruckten Menüstruktur werden Sie kaum den Überblick verlieren, wenn jeder Menüwechsel von einer Durchsage begleitet wird und zusätzlich KEY_MUTE für diesen Zweck reserviert ist. Dies wäre zugleich eine Konfiguration, die von blinden oder stark sehbehinderten Menschen benutzt werden könnte.

GPIO-Pin, dtoverlay, Buster und Bullseye

Softwareseitig muß beachtet werden, ob Sie mit Raspbian Jessie, Stretch, Buster oder Bullseye arbeiten. Im Jahr 2019 wurde der Linux Kernel lirc-rpi durch gpio_ir und gpio-ir-tx ersetzt. Bei Raspian Jessie ist/war z.B. folgende Zeile in /boot/config.txt üblich:

# dtoverlay=lirc-rpi,gpio_in_pin=23

Diese auf Jessie bezogene Konfiguration steht im Buch. Bei den wesentlich aktuelleren Versionen Raspbian Buster oder Bullseye 32/64 Bit finden Sie hingegen (schon vordefiniert) folgende Zeilen:

# dtoverlay=gpio-ir,gpio_pin=17
# dtoverlay=gpio-ir-tx,gpio_pin=18

Sobald ein IR-Detektor (z.B. der TSOP4838) korrekt angeschlossen ist (also Pin 17 mit TSOP4838-Out), muß die dtoverlay Zeile aktiviert werden (das Zeichen # entfernen) und natürlich müssen auch alle für LIRC erforderlichen Pakete installiert sein bzw. werden, was nun ein Bash Skript macht.

Die LIRC Paketinstallation und der erste Empfangstest mit mode2

Die Konfiguration für Buster oder Bullseye starten Sie wie folgt im ProgPi/lirc Verzeichnis :

./setupLIRC.sh setup

So werden nötige Änderungen in /boot/config.txt und /etc/lirc/lirc_options.conf entweder weitgehend automatisch oder interaktiv über den Nano-Editor vollzogen. Im nächsten Schritt (und nach der Paketinstallation) starten Sie:

./setupLIRC.sh mode2

Damit überprüfen Sie Ihre IR-Fernbedienung und den Empfang der IR-Signale durch den TSOP4838. Für den TSOP4838 passt ein große Zahl an Fernbedienungen mit 2*1,5 Volt Batterie. Wie in meinem Buch beschrieben, sollten Sie nach jedem Tastendruck eine Abfolge von space/pulse Ausgaben mit nachfolgender Nummer sehen. Wenn das der Fall ist, gibt es 3 Möglichkeiten:

1. In ProgPi/lirc/ liegt bereits eine zu Ihrer Fernbedinung passende *.conf Datei
2. Eine passende *.conf Datei ist auf http://lirc-remotes.sourceforge.net/remotes-table.html zu finden.
3. Sie starten selbst ein Training mit Ihrer IR-Fernbedienung.

Die grundsätzliche Vorgehensweise ist dazu in ‚Raspberry Pi programmieren mit C++ und Bash‘ beschrieben.

Von mode2 zu irrecord

Das Kommando mode2 funktioniert auch ohne Skript und in jedem Verzeichnis. Ein eventuell laufender LIRC-Dienst müsste dann allerdings zuvor manuell gestoppt werden. Für Buster oder Bullseye gehen Sie nun so vor:

./setupLIRC.sh training

Das führt zum Start von irrecord nach folgender (hier gelb hinterlegten) Ausgabe des Skripts :

pi@raspi3:~/ProgPi/lirc $ ./setupLIRC.sh training
Raspberry Pi 3 Model B Rev 1.2
Aktives OS: „Raspbian GNU/Linux 11 (bullseye)“ 32-bit 2022-03-27
Mit diesem Skript werden Basiseinstellungen für LIRC gemacht:
Sie haben eine IR-Fernbedienung, die schon mit mode2 erfolgreich getestet wurde. Das ist die Basis. Nun sollen etwa 10 bis 15 Tastencodes erfasst werden und vorläufig in ‚IR-Fernbedienung.conf‘ gespeichert werden. Das Training verläuft so, wie im Buch ‚Raspberry Pi programmieren mit C/C++ und Bash‘ ab Seite 367 beschrieben. Der TSOP-IR Detektor sollte weder von der Sonne, noch von einer Lampe beschienen sein! Sie müssen sich jetzt ein paar Tastaturcodes merken.
Exemplarisch:

KEY_0   KEY_1   KEY_2   KEY_3   KEY_4
KEY_5   KEY_6   KEY_7   KEY_8   KEY_9
KEY_UP   KEY_DOWN   KEY_VOLUMEUP    KEY_VOLUMEDOWN   KEY_OK
KEY_LEFT   KEY_LEFTALT    KEY_LEFTBRACE     KEY_LEFTCTRL   KEY_LEFTMETA  
KEY_LEFTSHIFT   KEY_LEFT_DOW     KEY_LEFT_UP      KEY_RIGHT   KEY_RIGHTALT 
KEY_RIGHTBRACE   KEY_RIGHTCTRL   KEY_RIGHTMETA   KEY_RIGHTSHIFT    KEY_RIGHT_DOWN  
KEY_RIGHT_UP   KEY_STOP   KEY_STOPCD   KEY_STOP_RECORD   KEY_POWER
KEY_POWER2   KEY_PLAY   KEY_PLAYCD   KEY_PLAYER   KEY_PLAYPAUSE
KEY_BACK   KEY_BACKSLASH   KEY_BACKSPACE   KEY_FORWARD   KEY_FORWARDMAIL
KEY_PAUSE   KEY_PAUSECD   KEY_PAUSE_RECORD   KEY_REWIND   KEY_ENTER 

irrecord 0.10.1
Sind Sie bereit? (j/n) :

Wenn man etwas Geduld mitbringt und sich an die Anweisungen von irrecord hält, entsteht eine verwendbare *.conf Datei. Es ist sinnvoll zuerst nicht mehr als 10-15 Tasten einzutrainieren. Tasten deren Code nicht von Anfang an klar ist, sollte man zunächst meiden. Es genügen z.B. vorläufig KEY_0 bis KEY_9 sowie KEY_POWER und KEY_OK. Exemplarisch sieht das Resultat dann so aus:

begin remote
name XoroPlus
bits 32
flags SPACE_ENC|CONST_LENGTH
eps 30
aeps 100
header 9014 4439
one 636 1589
zero 636 488
ptrail 637
repeat 9015 2175
gap 107937
toggle_bit_mask 0x0
begin codes
KEY_1 0x00FD4AB5
KEY_2 0x00FD0AF5
KEY_3 0x00FD08F7
KEY_4 0x00FD6A95
KEY_5 0x00FD2AD5
KEY_6 0x00FD28D7
KEY_7 0x00FD728D
KEY_8 0x00FD32CD
KEY_9 0x00FD30CF
KEY_POWER 0x00FD9A65
KEY_OK 0x00FD58A7
end codes
end remote

Solch eine Datei xoroPlus.conf (der Name wird innerhalb von irrecord vergeben) wird nach dem Training zunächst in ProgPi/lirc abgelegt.

Die Auswahl der IR-Fernbedienung und irw mit konkreten Tastencodes

Im nächsten Schritt wird eine eventuell vorhandene Konfiguration aus /etc/lirc gelöscht:
./setupLIRC.sh clean

Danach starten Sie das Skript ohne Parameter:
./setupLIRC.sh

was auf zu folgender Ausgabe führt:

Mit diesem Skript werden Basiseinstellungen für LIRC gemacht:
./setupLIRC.sh mode2 : mode2 – TSOPxxxx Hardwaretest (jede Fernbedienung)
./setupLIRC.sh clean : löscht eventuell vorhandene IR-Fernbedienungen
./setupLIRC.sh setup : zeigt/modifiziert LIRC-Einstellungen
./setupLIRC.sh stop : beendet ggf. laufenden lircd
./setupLIRC.sh training : registriert eine neue IR-Fernbedienung
./setupLIRC.sh : *.conf zur IR-Fernbedienung laden, irw starten
Bisher existiert /etc/lirc/lircd.conf NICHT
-rw-r–r– 1 1269 2017-07-25 15:46 /home/pi/ProgPi/lirc/philipsDVD.conf
-rw-r–r– 1 1830 2022-07-06 20:29 /home/pi/ProgPi/lirc/SanyoVCR.conf
-rw-r–r– 1 1607 2022-07-06 15:53 /home/pi/ProgPi/lirc/xoroPlus.conf
Hardwaretest oder *.conf Datei der IR-Fernbedienung auswählen:
0 : Den TSOP und die IR-Fernbedienung mit mode2 testen
1 : /home/pi/ProgPi/lirc/philipsDVD.conf
2 : /home/pi/ProgPi/lirc/SanyoVCR.conf
3 : /home/pi/ProgPi/lirc/xoroPlus.conf
Nr=2

Unter den vorhandenen IR-Fernbedienungen wurde hier SanyoVCR.conf ausgewählt. Durch das laufende Skript wird nun die ausgewählte Konfiguration [hier 2] in /etc/lirc/ unter dem Namen lircd.conf auf /etc/lirc/ abgelegt (bzw. dorthin kopiert) und dann der LIRC-Service gestartet:

sudo cp /home/pi/ProgPi/lirc/SanyoVCR.conf /etc/lirc/lircd.conf
-rw-r–r– 1 1830 2022-07-06 21:46 /etc/lirc/lircd.conf
name SanyoVCR
bits 32
sudo systemctl restart lircd:
● lircd.service – Flexible IR remote input/output application support
Loaded: loaded (/lib/systemd/system/lircd.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2022-07-06 21:46:49 CEST; 62ms ago
CGroup: /system.slice/lircd.service
===================================
Prima: lircd ist aktiv und auf ‚running’….
ps awx | grep –color [l]irc
18992 ? Ss 0:00 /usr/sbin/lircd –nodaemon
Wenn /etc/lirc/lircd.conf zur Fernbedienung passt, kann für definierte Tasten der IR-Fernbedienung ein TastenCode kommen. Es wird jetzt irw gestartet (mit <Strg><C> abbrechen) und bei Tastendruck an der IR-Fernbedienung sollte irw jetzt einen konkreten Tastencode anzeigen:

Das Skript hat nun irw gestartet und dieses Programm aus dem LIRC-Paket wartet nun auf IR-Signale die am TSOP4838 eingehen und bei gpio_pin=17 ankommen. Drücken Sie nun in kurzer Abfolge die 1,2,3 auf der IR-Fernbedienung, was in etwa folgende Ausgabe durch das laufende Programm irw bewirkt:

000000008c7320df 00 KEY_1 SanyoVCR
000000008c7320df 01 KEY_1 SanyoVCR
000000008c73a05f 00 KEY_2 SanyoVCR
000000008c73a05f 01 KEY_2 SanyoVCR
000000008c73609f 00 KEY_3 SanyoVCR
000000008c73609f 01 KEY_3 SanyoVCR

EinTastendruck von 0,5 sec Dauer führt zur Ausgabe von etwa 2 bis 4 Codes. Wenn bei einem 1 sec langen Tastendruck der Taste2 lediglich einmal KEY_2 erscheint, dann haben Sie eine sehr träge IR-Fernbedienung. Es kann leider auch IR-Fernbedienungen geben, bei denen manche Tasten nur bei starkem Druck senden. Ebenso kann es sein, daß eine *.conf Datei aus dem Internet schlechter funktioniert als eine
eintrainierte Konfiguration.

Soweit das Paket „dialog“ installiert ist, erscheint nach 60 Sekunden vollformatig und für 10 Sekunden folgende Messagebox als ASCII-Grafik:

Messagebox während der LIRC Trainingsphase

Damit ist eigentlich alles gesagt. Und nachdem alle eintrainierten Tasten der IR-Fernbedienung zu einem korrekten Code geführt haben, können Sie das Skript setupLIRC.sh (bzw das laufende Programm irw) über <Strg>+<C> abbrechen.

Bash-Kommandos über irexec ausführen

Was ist bisher geschehen?

  1. Der TSOP4838 wurde passend zum dtoverlay-Eintrag in /boot/config.txt mit dem Raspberry Pi GPIO-Port verbunden.
  2. Über setupLIRC.sh wurden alle LIRC-Pakete installiert, und mode2 als Testprogramm ausgeführt.
  3. Über setupLIRC.sh wurde irrecord gestartet und es wurde eine konkrete IR-Fernbedienung mit z.B. 15 Tasten eintrainiert.
  4. Über setupLIRC.sh wurde eine Fernbedienung ausgewählt und irw hat (hoffentlich) korrekte Tastencodes für z.B. 15 Tasten geliefert.

Damit sind alle Voraussetzungen für einen „Echtbetrieb“ erfüllt:

./startLIRC.sh

Zum Zeitpunkt des Aufrufs von startLIRC.sh ist SanyoVCR.conf immer noch aktiv bzw. der laufende LIRC-Server arbeitet noch mit der schon geladenen und aktuellen /etc/lirc/lircd.conf Datei. Erneut sehen Sie die positive Meldung von ‚sudo systemctl status lircd‚ und wählen jetzt „0“ da SanyoVCR.conf schon geladen ist:

LIRC und TSOP für den Raspberry Pi

Der LIRC-Service bzw. das Programm irexec benötigen nun noch eine weitere Konfigurationsdatei, die jedem IR-Tastencode eine konkrete Aktion zuordnet. Die Konfigurationsdatei ‚tellme.lirc‘ ist schon vorhanden und hat exemplarisch folgenden Inhalt:

begin
prog = irexec
button = KEY_1
config = $HOME/ProgPi/lirc/tellme.sh Pi
end
begin
prog = irexec
button = KEY_2
config = $HOME/ProgPi/lirc/tellme.sh OS
end
begin
prog = irexec
button = KEY_3
config = $HOME/ProgPi/lirc/tellme.sh i2c
end
....

Jedem Eintrag „button“ entspricht eine in „config“ definierte Aktion. In jedem der definierten Blöcke steht auch irexec als ausführendes Programm. Das Skript startLIRC.sh kopiert nun die Datei tellme.lirc nach /home/pi/.config/lircrc was irexec befähigt die Konfiguration zu verwenden. Zusätzlich stellt das Skript startLIRC.sh jeden Block übersichtlich in einer Zeile dar:

cp tellme.lirc /home/pi/.config/lircrc
2022-07-06 22:17 /home/pi/.config/lircrc
/home/pi/.config/lircrc enthält:
KEY_1 $HOME/ProgPi/lirc/tellme.sh Pi
KEY_2 $HOME/ProgPi/lirc/tellme.sh OS
KEY_3 $HOME/ProgPi/lirc/tellme.sh i2c
KEY_OK echo; echo KEY_OK;
KEY_VOLUMEDOWN echo; echo VOLUMEDOWN;
irexec: Taste an der IR-Fernbedienung => Kommandostart…

Wenn Sie nun nacheinander die Tasten 1 und 2 an der IR-Fernbedienung drücken, werden folgende beiden Skripts gestartet:
$HOME/ProgPi/lirc/tellme.sh Pi
$HOME/ProgPi/lirc/tellme.sh OS

was zu folgenden beiden Ausgaben führt:

Raspberry Pi 3 Model B Rev 1.2
Aktives OS: „Raspbian GNU/Linux 11 (bullseye)“ 32-bit 2022-03-27

Sie haben damit durch eine Aktion an einer IR-Fernbedienung eine Ausgabe im Termnal des Raspberry Pi bewirkt.

Im Skript $HOME/ProgPi/lirc/tellme.sh können Sie nun beliebige Aktionen verankern, die vom übergebenen Parameter abhängen. Von der Ansteuerung eines LCD-Displays (Abschnitt 6.1.2 sowie Kapitel 15 im Buch) bis zur Audioausgabe oder Ansteuerung der PiCam.

Harald Schmidt

Buchautor, Softwareentwickler, Dipl.-Ing.

Schreibe einen Kommentar