Raspberry Pi: Mit LIRC Infrarot-Befehle senden (irsend)

Wie man mit einer Infrarot-Fernbedienung ein Python-Script und am Raspberry Pi angeschlossene Hardware steuern kann, hatte ich hier schonmal gezeigt. In diesem Beitrag soll es nun darum gehen, Infrarot-Befehle an ein beliebiges Gerät zu senden. Ich orientiere mich dazu weitestgehend an dem Ursprünglichen Beitrag, einige Dinge werden Euch also vielleicht bekannt vorkommen.

Raspberry Pi mit IR-Receiver und IR-Emitter

Raspberry Pi mit IR-Receiver und IR-Emitter

Für dieses Vorhaben verwende ich einen Raspberry Pi Modell B+, den 38kHz-IR-Empfänger TSOP 31238, einen IR-Emitter, den ich ganz billig in China geschossen habe, sowie einige female-female-Steckbrücken (40er-Pack). Dazu noch eine beliebige Fernbedienung, deren Befehle imitiert werden sollen. Bei mir ist das wieder die Apple Remote.

Inhalt

Schaltung aufbauen

Das Aufbauen der Schaltung ist schnell gemacht. Dem Datenblatt entnehmen wir die Anschlussbelegung des Infrarot-Empfängers: Mit der Wölbung nach oben und Blick auf die Anschlüsse zählen wir von links nach rechts: GND, VS, und mit etwas Abstand, Out.

Über die Belegung der GPIO-Anschlüsse hatte ich hier schonmal geschrieben. Wir verbinden also GND mit dem Pin 14, VS mit Pin 1 (3,3V) und Out mit einem beliebigen GPIO. Ich verwende den GPIO23, also Pin 16.

Den IR-Empfänger brauchen wir hier eigentlich nur, um eine Fernbedienung anlernen zu können. Für das reine Senden von IR-Signalen ist er nicht nötig. Vielleicht findet Ihr ja hier Eure Fernbedienung, dann könnt Ihr Euch die Mühe mit dem Anlernen sparen.

Infrarot-Empfänger

38kHz-IR-Empfänger TSOP 31238

Infrarot-Emitter

Open Smart IR-Emitter

Wie der Infrarot-Emitter angeschlossen werden soll, ist direkt auf der Platine aufgedruckt. Wir verbinden also GND mit Pin 20 am RPi, VCC mit Pin 2 (5V) und SIG wieder mit einem beliebigen GPIO. Hier nutze ich GPIO24 (Pin 18).

Raspberry Pi mit Infrarot-Empfänger und Infrarot-Emitter

Raspberry Pi mit IR-Empfänger TSOP 31238 und IR-Emitter

Linux Infrared Remote Control (LIRC)

Um die Signale, die der Infrarot-Empfänger an den Raspberry Pi weiterleitet, interpretieren und eigene Befehle über den Infrarot-Emitter senden zu können, verwenden wir LIRC. Im Paket enthalten ist alles, was wir für unser Vorhaben benötigen. Weiterführende Informationen zu LIRC findet Ihr hier.

Installation & Konfiguration

Per SSH verbinden wir uns auf den Raspberry Pi und installieren LIRC mit folgendem Befehl:

$ sudo apt-get install lirc

Damit LIRC korrekt funktioniert, müssen aber noch einige Einstellungen vorgenommen werden. Dazu ergänzen wir als erstes die Datei /etc/modules um einige Einträge. Wenn Ihr schon andere Hardware am Raspberry Pi angeschlossen habt, kann es sein, dass bei Euch schon Einträge vorhanden sind. Die neuen Einträge fügt Ihr einfach am Ende der Datei ein.

$ sudo nano /etc/modules

Im „Autostart“ laden wir die benötigten LIRC-Module:

# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
# Parameters can be specified after the module name.

lirc_dev
# GPIO in BCM-Zählweise
lirc_rpi gpio_in_pin=23 gpio_out_pin=24

Auf Zeile 9 geben wir in BCM-Zählweise an, welche GPIO wir mit LIRC nutzen wollen – also die GPIO-Nummern, nicht die Pin-Nummer. Wir verlassen den Editor und speichern die Änderungen.

Anschließend passen wir die Hardware-Konfiguration von LIRC an:

$ sudo nano /etc/lirc/hardware.conf

Hier tragen wir für LIRCD_ARGS, DRIVER, DEVICE und MODULES die Werte wie abgebildet ein.

# /etc/lirc/hardware.conf
#
# Arguments which will be used when launching lircd
LIRCD_ARGS="--uinput"

#Don't start lircmd even if there seems to be a good config file
#START_LIRCMD=false

#Don't start irexec, even if a good config file seems to exist.
#START_IREXEC=false

#Try to load appropriate kernel modules
LOAD_MODULES=true

# Run "lircd --driver=help" for a list of supported drivers.
DRIVER="default"
# usually /dev/lirc0 is the correct setting for systems using udev
DEVICE="/dev/lirc0"
MODULES="lirc_rpi"

# Default configuration files for your hardware if any
LIRCD_CONF=""
LIRCMD_CONF=""

Anschließend verlassen wir den Editor und speichern die Änderungen. Zuletzt müssen wir noch einen Eintrag in der Datei /boot/config.txt ergänzen.

$ sudo nano /boot/config.txt

Recht weit unten (bei mir Zeile 51) passen wir die Einstellungen wie folgt an:

# Uncomment this to enable the lirc-rpi module
dtoverlay=lirc-rpi,gpio_in_pin=23,gpio_out_pin=24

Wir verlassen den Editor und speichern die Änderungen. Nun ist es Zeit für einen Neustart:

$ sudo reboot

Erster Test von LIRC

Wenn der Raspberry Pi den Bootvorgang abgeschlossen hat, verbinden wir uns wieder per SSH. Nun können wir einen ersten Test starten und damit überprüfen, ob LIRC grundsätzlich funktionsfähig ist. Dazu stoppen wir den LIRC-Daemon…

$ sudo /etc/init.d/lirc stop

…und lassen uns die Empfangenen Rohdaten direkt im Terminal ausgeben, indem wir folgenden Befehl absetzen:

$ mode2 -d /dev/lirc0

Anschließend drücken wir ein paar Tasten auf der Fernbedienung. Der Inhalt des Terminalfensters sollte in etwa so aussehen:

Raspberry Pi: Rohdaten von LIRC im Terminal

Raspberry Pi: Rohdaten von LIRC im Terminal

Wenn wir genug davon haben beenden wir das ganze mit der Tastenkombination Strg+C.

Tasten-Mapping für die Fernbedienung erzeugen (lircd.conf)

Als nächstes erzeugen wir die Konfigurationsdatei lircd.conf. Diese wandelt die Rohdaten der empfangenen Signale in verständliche Zeichenketten um, die uns das weitere Vorgehen enorm erleichtern. Wenn Ihr ebenfalls eine Apple Remote verwendet, könnt Ihr diesen Schritt überspringen und Euch meiner Konfiguration (weiter unten) bedienen. Nutzt Ihr eine andere Fernbedienung, müsst Ihr entweder dieses Prozedere über Euch ergehen lassen, oder Ihr schaut (solltet Ihr wissen, wie die Fernbedienung heißt) ganz einfach mal hier nach, ob Ihr die passende lircd.conf vielleicht einfach downloaden könnt. Die angelernten Daten sind dann auch gleich die Informationen, die wir für das Senden von IR-Befehlen benötigen.

Zum Anlernen nutzen wir ein Tool namens irrecord, welches von LIRC mitgeliefert wird. Eine Sache gibt es hier zu beachten: die Tastenbezeichnung ist vorgegeben. Das bedeutet, dass wir nur Tastenbezeichnungen verwenden dürfen, die irrecord auch kennt. Das lässt sich zwar mit entsprechendem Parameter umgehen, jedoch kann man die Tastenbezeichnungen auch im Nachgang noch anpassen. Solltet Ihr Eure Fernbedienung in den erlaubten Tastenbezeichnungen nicht wiederfinden, könnt Ihr erstmal beliebige verfügbare Bezeichnungen nutzen, und im Nachgang die Bezeichnungen frei ändern. Bei Interesse findet Ihr hier die Dokumentation zu irrecord.

Die erlaubten Tastenbezeichnungen lassen wir uns mit folgendem Befehl in einer recht langen Liste ausgeben:

$ irrecord --list-namespace

Die Bezeichnungen, die mit KEY_ beginnen, bieten eine sehr vielfältige Auswahl, daher verwenden wir diese auch. Wir starten das Anlernen mit dem Befehl:

$ irrecord -d /dev/lirc0 ~/lircd.conf

Jetzt kommt einiges an Text, den man durchaus lesen sollte. Die wichtigsten Schritte erkläre ich hier kurz:

  1. Text lesen, Enter drücken.
  2. Nun soll man mehrere Tasten auf der Fernbedienung drücken, und das solange, bis zwei Zeilen mit Punkten voll sind. Im Anschluss geht es von alleine weiter.
  3. Jetzt geht es ans Anlernen der Tasten: Wir geben den Namen der ersten Taste ein, die wir anlernen wollen: KEY_UP und drücken Enter. Anschließend drücken wir auf der Fernbedienung die Taste mit dem Pfeil nach oben.
  4. Nächste Taste: Wir geben den Namen der zweiten Taste ein: KEY_DOWN, drücken Enter und betätigen auf der Fernbedienung die Taste mit dem Pfeil nach unten.
  5. Das wiederholen wir für jede Taste auf der Fernbedienung. Ich hab für die Apple Remote folgende Bezeichnungen gewählt: KEY_UP, KEY_DOWN, KEY_LEFT, KEY_RIGHT, KEY_OK, KEY_MENU und KEY_PLAYPAUSE.
Raspberry Pi: Tasten mit irrecord anlernen

Raspberry Pi: Tasten mit irrecord anlernen

Wenn alle Tasten angelernt sind, betätigen wir abermals die Enter-Taste. Nun wird die Konfigurationsdatei geschrieben.

Das war es noch nicht ganz, wir müssen der soeben angelernten Fernbedienung noch einen Namen geben. Dazu öffnen wir die lircd.conf in einem Editor…

$ nano ~/lircd.conf

…und tragen in Zeile 15 einen lesbaren Namen ein. Statt /home/pi/lircd.conf vielleicht appleremote oder einen sonstigen beliebigen Namen. Wer mag, kann auf den Zeilen 9-11 noch richtige Angaben machen. Ist aber nicht zwingend notwendig.

# Please make this file available to others
# by sending it to <lirc@bartelmus.de>
#
# this config file was automatically generated
# using lirc-0.9.0-pre1(default) on Tue Aug 18 19:23:09 2015
#
# contributed by
#
# brand:                       /home/pi/lircd.conf
# model no. of remote control:
# devices being controlled by this remote:
 
begin remote
 
  name  appleremote
  bits            8
  flags SPACE_ENC|CONST_LENGTH
  eps            30
  aeps          100
 
  header       9058  4422
  one           624  1595
  zero          624   497
  ptrail        623
  repeat       9058  2194
  pre_data_bits   16
  pre_data       0x77E1
  post_data_bits  8
  post_data      0x4E
  gap          107798
  toggle_bit_mask 0x0
 
      begin codes
          KEY_UP                   0xD0
          KEY_DOWN                 0xB0
          KEY_LEFT                 0x10
          KEY_RIGHT                0xE0
          KEY_OK                   0xBA 0x20
          KEY_MENU                 0x40
          KEY_PLAYPAUSE            0x7A 0x20
      end codes
 
end remote

Anschließend verlassen wir den Editor und speichern die Änderungen. Die Konfigurationsdatei bewegen wir noch an die richtige Stelle…

$ sudo mv ~/lircd.conf /etc/lirc/lircd.conf

…und starten LIRC wieder.

$ sudo /etc/init.d/lirc start

Tasten-Mapping testen

Um zu überprüfen, ob die vorigen Schritte alle richtig abgearbeitet wurden, lassen wir uns zunächst eine Liste mit den Tasten ausgeben, die dem System bekannt sind. Für appleremote setzt Ihr den Namen ein, den Ihr in der lircd.conf auf Zeile 15 vergeben habt.

$ irsend LIST appleremote ""

Wenn das funktioniert hat, lassen wir uns die empfangenen Tasten im Terminal ausgeben. Dazu setzen wir…

$ sudo irw

…ab und drücken ein paar Tasten auf der Fernbedienung. Die Ausgabe im Terminal sollte so, oder so ähnlich aussehen:

Raspberry Pi: Konfigurationsdatei lircd.conf testen

Raspberry Pi: Konfigurationsdatei lircd.conf testen

Wenn wir genug gesehen haben, beenden wir das Ganze mit der Tastenkombination Strg-C.

Aktionen erstellen (.lircrc)

Hier ein Schnitt.
Warum? Zum Senden von Infrarot-Signalen benötigen wir diese Aktionen nicht, sondern nur um empfangene Signale einfacher auswerten zu können. Wer’s doch braucht, schaut hier nach.

Infrarot-Signale senden…

…auf der Kommandozeile

An diesem Punkt sind wir schon in der Lage, Infrarot-Signale zu senden, und das testen wir gleich mal. Auf der Kommandozeile setzen wir folgenden Befehl ab:

$ irsend SEND_ONCE appleremote KEY_UP

Was ist nun passiert? Wir haben den Befehl, der mit der „Hoch“-Taste auf der Apple Remote ausgelöst wird, genau ein mal gesendet. Es ist jedoch auch möglich, den Befehl dauerhaft (wiederholt) zu senden. Der Befehl dafür lautet:

$ irsend SEND_START appleremote KEY_UP

Gesendet wird nun solange, bis das Ganze wieder gestoppt wird:

$ irsend SEND_STOP appleremote KEY_UP

Wer sich nicht sicher ist, ob die Hardware richtig funktioniert und die Signale auch wirklich korrekt gesendet werden, kann das ganz einfach überprüfen:
Auf der Kommandozeile den Befehl $ irsend SEND_START appleremote KEY_UP absetzen und die Diode ganz gerade in die Linse einer Digitalkamera halten. Auf dem Display sieht man sie dann blinken. 

Weitere Informationen zu irsend findet Ihr hier.

…mit Python

Für das reine Senden von Infrarot-Signalen benötigen wir keine weiteren Pakete, sondern können einfach loslegen. Wir nutzen dafür einfach die Möglichkeit, aus einem Python-Script heraus Kommandozeilenbefehle abzusetzen.

Dazu bauen wir ein einfaches Testscript. Das Script könnt Ihr einfach kopieren und unter beliebigem Namen (z.B. send-ir.py) auf dem Raspberry Pi im Benutzer-Home-Verzeichnis abspeichern.

#!/usr/bin/env python
#coding: utf8

import os
import time

while True:
    os.system("irsend SEND_ONCE appleremote KEY_UP")
    time.sleep (1)

Das Script noch ausführbar machen…

$ chmod +x ~/send-ir.py

… und starten:

$ ~/send-ir.py

Was nun passiert erklärt sich fast von selbst. Solange, wie das Script aktiv ist, wird der Befehl KEY_UP gesendet und anschließend eine Sekunde gewartet. Dann wieder der Befehl gesendet, gewartet, usw.

Das Script lässt sich mit Strg+C beenden.

Das war’s? Jup. Die Grundlagen habt Ihr. Jetzt könnt Ihr etwas eigenes daraus bauen. Viel Spaß dabei 😉

Sebastian

30 Comments

  1. Antworten Thomas Kalt

    Hi Sebastian,
    Danke für diesen Beitrag.
    Kannst du sagen, welche LIRC version du installiert hast?
    Danke

    • Antworten Sebastian

      Hi Thomas,

      ich kann Dir nicht 100%ig sagen, mit welcher Version damals dieser Beitrag entstanden ist. Da aber auf meinen sonstigen Pi überall 0.9.0~pre1-1.2 läuft, wird das hier sicher auch der Fall gewesen sein.

  2. Antworten Ingmar

    Hi Sebastian,
    vielen Dank erstmal für die super Anleitung. Ich möchte den Power Befehl einer Samsung TV Fernbedienung empfangen und den Einschaltbefehl an eine Logitech Audio Anlage senden. Kann man das mit dem gleichen Device “ „/dev/lirc0“ machen, oder muss man hier für 2 Devices anlegen „/dev/lirc0“ und „/dev/lirc1“? Für beide Fernbedienungen gibt es fertige lircd.conf Dateien. Muss ich die dann einfach in eine lircd.conf zusammenpacken?

    Danke und viele Grüße

    Ingmar

    • Antworten Sebastian

      Hi Ingmar,
      Es reicht ein Device, wenn Du, genau wie Du schon geschrieben hast, die lircd.conf entsprechend mit Befehlen für beide Geräte ausstattest.
      Voraussetzung ist jedoch, dass beide mit demselben IR-Emitter (Frequenz) kompatibel sind.

      • Antworten Ingmar

        Hi Thomas,
        vielen Dank für Deine schnelle Rückmeldung. Hardwareseitig gibt es doch einen IR-Empfänger und einen IR-Emitter, warum müssen dann beider auf der gleichen Frequenz liegen? Gibt es eine Möglichkeit die Frequenz der Fernbedienungen herauszufinden?

        Ich bin auf dem Gebiet noch Anfänger und arbeite mich gerade erst in die Materie ein:)

        • Antworten Sebastian

          Ich meinte damit, dass der Emitter mit beiden Geräten kompatibel sein muss, wenn Du zwei Geräte damit steuern willst (Samsung TV und Logitech).
          Die Frequenz zu bestimmen geht eigentlich am einfachsten mit einer Google-Suche oder einfach ausprobieren. Klingt ja so, als hättest Du schon alles da.

          PS: ich heiße Sebastian, nicht Thomas 😉

  3. Antworten Ingmar

    Sorry Sebastian für die falsche Anrede, aber ich konnte es leider nicht mehr ändern 🙂 Danke für Deine Tipps. Die Hardware ist leider noch nicht da, aber ich lese mich schon mal in das Thema ein 🙂

  4. Antworten Marius

    Hallo,

    danke für den Beitrag 😀 allerdings funktioniert bei mir der mode2 Befehl nicht… es wird folgendes ausgegeben: Cannot initiate device /dev/lirc0

    leider habe ich auf Google nichts gefunden, was mir weitergeholfen hat…

    hast du vllt eine Idee?

    Danke 🙂

    • Antworten Sebastian

      Klingt für mich so, als wäre vorher bei der Konfiguration etwas schief gegangen. Ich würde das nochmal Schritt für Schritt prüfen.
      Oder hast du vielleicht einfach nur vergessen, vor dem Test den LIRC-Daemon zu stoppen?

    • Antworten Sebastian

      Hi Alex,
      Hab vielen Dank für den Hinweis. Das erspart mir und sicher auch anderen einiges an Arbeit.

  5. Pingback: Technik Spielerrei – Mailandt

  6. Antworten Mario

    Hallo, ich habe ein kleines Problem:
    mode2 -d /dev/lirc0 funktioniert, es werden mir verschiedenen Werte angezeigt, je nach Tastendruck
    bei
    irrecord -d /dev/lirc0 ~/lircd.conf werden allerdings keine Tasten mehr erkannt und irgendwann bricht das Programm dann von alleine ab.
    Wo könnte der Fehler stecken?

    • Antworten Sebastian

      Ich weiß nicht genau wie sich irrecord verhält, wenn die Datei schon existiert. Hast du sie mal gelöscht oder einen anderen Namen ausprobiert?

  7. Antworten Robert

    Hey Sebastian,

    deine Anleitung an sich ist echt super! Jedoch funktioniert bei mir der letzte Schritt für das Empfangen von IR-Daten leider nicht ;/

    sudo irw

    Obwohl ich die Konfigurationsdatei erfolgreich nach „/etc/lirc/lircd.conf“ kopiert habe und auch getestet habe ob LIRC die abgespeicherte Fernbedienung kennt (mit: irsend LIST MEINE_FERNBEDIENUNG „“ –> lieferte mir die keycodes), gibt irw leider nichts aus :/

    Ich bin echt am verzweifeln, da alles bis auf der letzte Schritt funktioniert -.-
    Eine Rückmeldung wäre sehr freundlich 😉
    LG
    Robert

    • Antworten Sebastian

      Hi Robert,
      hier ist deine Rückmeldung. Nur leider weiß ich nicht, was ich dir empfehlen soll. Sicherlich bist du der Anleitung Schritt für Schritt gefolgt – und eigentlich sollte das auch weitestgehend funktionieren.

      Was vielleicht sein kann: läuft denn LIRC überhaupt? Das könnte ein Grund sein, warum sudo irw nichts liefert.

      $ sudo /etc/init.d/lirc start

  8. Antworten Dehmoli

    Hallo Sebastian,

    vielen Dank für die super Anleitung. Selbst für einen Laien wie mich ist diese super verständlich. Leider habe ich nach wie vor ein Problem beim Anlernen der Befehle:
    Im mode 2 empfängt mein Pi2 mit Ubuntu bzw. Openhab Daten sobald ich Tasten drücke. Wenn ich keine Tasten drücke werden keine Signale empfangen (Hiermit schließe ich Störsignale aus). Der Schritt bei welchem viele verschiedene Tasten gedrückt werden sollen funktioniert ebenfalls noch einwandfrei. Jedoch nach der Benennung der zu definierenden Taste kommen folgende Fehlermeldungen:

    Now hold down button „KEY_UP“.
    Something went wrong: Cannot decode data
    Please try again. (28 retries left)
    …..
    Now hold down button „KEY_UP“.
    Something went wrong: Cannot decode data
    Please try again. (0 retries left)
    Now hold down button „KEY_UP“.
    Something went wrong: Cannot decode data
    Too many errors
    Check TROUBLESHOOT in irrecord(1) manpage
    or try using the -f option.
    unrecoverable error: cannot decode data
    Giving up
    Check TROUBLESHOOT in irrecord(1) manpage

    Ich weiß nicht wie ich auf den Troubleshoot zugreifen kann bzw. an was es liegen könnte.
    PS: ich habe es bereits mit verschiedenen Fernbedienungen probiert. Mit jeweils dem gleichem Ergebnis.

    Vielen Dank im Voraus.

    Grüße
    Dehmoli

  9. Antworten Daniel

    Hallo Sebastian,

    Nochmal eine Frage, sorry fürs nerven, aber ich bin da etwas nervös ( Informatiker, kein E-Techniker 😀 ): wenn ich das mit dem anderen IR Empfänger und einem pi Zero baue: besteht da Brandgefahr, oder gehen im worst case nur die Komponenten kaputt und das war es ? Wenn das im 24/7 Betrieb ist, will ich nicht die Bude Abfackeln wenn ich nicht da bin. Ich habe gesehen du bist E-Techniker und hast da sicherlich den richtigen Blick auf die Dinge. Danke dir für deine Hilfe!

  10. Antworten peterLustig

    hi kurze frage, wäre es möglich mittels IR-Empfänger eine Fernbedienung quasi als Input her zu nehmen und deren befehle dann abgeändert über einen IR-Sender auszugeben, also quasi einen Konverter zu erstellen?
    Nehmen wir an – Input FB ist ein eine mit Powercode 0x003, dieser wert wird nun im Eingang empfangen, in einen anderen Code umgewandelt – bspw. 0x00B und dann entsprechend über die Sender-Diode ausgegeben?

      • Antworten peterLustig

        im codeschnipseln bin ich leider absoluter Neuling – hättest du evtl. 1-2 Zeilen Test Code, wie das ganze aussehen könnte?
        Würde als Beispiel die appleremote aus der Anleitung mit einer fertigen Config (https://sourceforge.net/p/lirc-remotes/code/ci/master/tree/remotes/creative/RM-1000.lircd.conf) zu zusammengepackt werden?
        In meinem begrenzten wissen denke ich an eine einfache abfrage wie bspw.

        #!/usr/bin/env python
        #coding: utf8
        import lirc
        import time
        
        sockid=lirc.init("appleremote", blocking = False)
        while True:
            codeIR = lirc.nextcode()
            if codeIR != []:
                if codeIR[0] == "KEY_UP":
        irsend SEND_ONCE rm1000w KEY_1 ;
        
        time.sleep(0.05)
        

        vielen dank für deine schnelle Antwort.

        • Antworten Sebastian

          Das sieht doch schon ganz gut aus. Ich hab jetzt gerade keine Zeit das zu testen, aber der Weg scheint mir der richtige zu sein

  11. Antworten Karolos

    Danke für den interessanten Beitrag. Ich habe das Problem mit Raspberry Zero W, Buster, dass kein /dev/lirc0 vorhanden ist.

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht.

WordPress Cookie Hinweis von Real Cookie Banner