Mit einer Raspberry Pi IR Remote (Infrarot Fernbedienung) können Signale übertragen werden, woraufhin Programme gestartet oder Aktionen ausgeführt werden. Damit kann man sein Mediencenter (KODI, etc.) fernsteuern oder es für die Hausautomatisierung (FHEM) verwenden.
Wie man LIRC einrichtet, Codes der Fernbedienung ausliest, abspeichert und anschließend jene Tasten mit Funktionen belegt, wird in diesem Tutorial behandelt.
Geplant ist meinerseits ein Raspberry Pi Roboter, welcher unter anderem mit einer Infrarot Fernbedienung ferngesteuert werden kann. Aber natürlich kann eine solche Fernsteuerung auch in allen anderen Projekten ihren Einsatz finden.
Raspberry Pi IR Remote & Zubehör
- IR-Empfänger (TSOP4838 o.ä)
- IR Fernbedienung
- Jumper Kabel
Ich verwende hier ein Set aus IR Empfänger und Fernbedienung.
Welche alternative IR Fernbedienung (Universalfernbedienung oder mitgelieferte) verwendet wird, spielt keine Rolle. Allerdings sollte optimal keine Fernbedienung für vorhandene Geräte gewählt werden (außer für Testzwecke), da ansonsten beide Geräte angesprochen werden (sofern in Reichweite).
Verbindung zwischen Raspberry Pi und Infrarot Empfänger
Der Infrarot Empfänger hat genau 3 Pins: VCC, GND und den Datenpin. Falls du das Set, welches ich verwende, hast, dann wirst du feststellen, dass die Leitungen bereits beschriftet sind. Falls du ein Empfänger Modul wie den TSOP4838 (Datenblatt) verwendest, siehst du rechts die Belegung.
Wir schließen nun also VCC (Pin 3) vom IR Empfänger an 3.3V (Pin 1) des Raspberry Pi’s an, GND (Pin 2) an GND (Pin 6 vom Pi) und den Datenpin an einen freien GPIO des Raspberry Pi’s, wie z.B. GPIO17 (Pin 11).
Schematisch sieht der Aufbau dann folgendermaßen aus:
LIRC auf dem Raspberry Pi einrichten
Das beste Programm unter Linux Distributionen, welches Infrarot Signale auslesen kann, ist LIRC. Um es zu verwenden und einzurichten, müssen wir es zuerst installieren:
sudo apt-get install lirc
--yes
Nun laden wir die benötigten Module:
sudo modprobe lirc_dev
sudo modprobe lirc_rpi gpio_in_pin=17 gpio_out_pin=23
Falls du anschließend eine folgende Fehlermeldung bekommst (modprobe: ERROR: could not insert 'lirc_rpi': No such device
), liegt das daran, dass Modul noch nicht aktiviert ist. Dies machen wir im folgenden Schritt, wonach neu gestartet werden muss.
sudo nano /boot/config.txt
Ans Ende dieser Datei kommt folgende Zeile (gespeichert wird mit STRG+O, STRG+X):
1 |
dtoverlay=lirc-rpi,gpio_in_pin=17,gpio_out_pin=23 |
Falls du einen anderen GPIO als 17 verwendest hast, musst du dies wieder anpassen. Der Pin zum Senden (Out) ist dafür gedacht, falls du mit dem Raspberry Pi auch IR Codes senden möchtest. Falls nicht, kann dieser auch weggelassen werden. Kam nach dem Laden der Module eine Fehlermeldung, ist es jetzt an der Zeit neu zu starten (sudo reboot
).
Anschließend lassen wir uns das Device mittels ls -l /dev/lir*
anzeigen. Der Output sollte so aussehen:
crw-rw---- 1 root video 245, 0 Jul 3 22:42 /dev/lirc0
Zuguterletzt tragen wir das Device noch in der Hardware Konfiguration von LIRC ein, damit es später verwendet werden kann:
sudo nano /etc/lirc/hardware.conf
Hier findest du einige leere Parameter („DEVICE“, „MODULES“, etc.), welche folgendermaßen angepasst werden:
# Arguments which will be used when launching lircd
LIRCD_ARGS="--uinput"
DRIVER="default"
DEVICE="/dev/lirc0"
MODULES="lirc_rpi"
Nun können wir den Service neustarten, sodass alle Änderungen übernommen werden.
sudo /etc/init.d/lirc restart
Raspberry Pi IR Remote Control einrichten
Um LIRC und unsere Fernbedienung zu initialisieren, tippen wir folgendes ein:
sudo /etc/init.d/lirc stop
mode2 -d /dev/lirc0
Anschließend werden ein paar Tasten der IR Fernbedienung gedrückt. Nun sollte ein Output ähnlich zu folgendem erscheinen:
space 2207679 pulse 8992 space 4523 pulse 519 ...
Die Codes werden also erkannt und wir können fortfahren. Falls keine Codes zu sehen sind, bedeutet das, dass entweder der Empfänger nicht richtig angeschlossen oder erkannt wurde (Neustart nicht vergessen?) oder dass die Codes der Fernbedienung nicht erkannt wurden, da es sich z.B. um eine 433Mhz Funkfernbedienung handelt.
Hat allerdings alles bis hier funktioniert kannst du diesen kleinen Test mit STRG+C abbrechen.
Wir haben nun zwei Möglichkeiten: Entweder wir suchen uns hier die Konfigurationsdateien für eine bereits existierende Fernbedienung eines Herstellers. Den entsprechenden Inhalt fügen wir dann in die Datei /etc/lirc/lircd.conf
ein.
Alternativ nehmen wir die Codes der Fernbedienung selbst auf. Es gibt eine bestimmte Anzahl an vergebbaren Namen, welche mittels irrecord -l
angezeigt werden können. Die Aufnahme wird folgendermaßen gestartet:
irrecord -d /dev/lirc0 ~/lircd.conf
Ließ dir die Hinweise durch und starte danach mit zweimaligem Drücken der Enter-Taste. Folge außerdem den Anweisungen (verschiedene Tasten drücken), bis du die Namen für bestimmte Tasten vergeben kannst. Hier kannst du jeweils einen der vorher angezeigten Namen (z.B. KEY_1, KEY_VOLUMEUP, etc.) eingeben und anschließend die zugehörige Taste drücken. Sobald du alle benötigten Tasten abgespeichert hast, kannst du durch drücken der Enter Taste die Konfiguration fertigstellen.
Nun kopieren wir die erstellte Konfigurationsdatei noch in das LIRC Verzeichnis, damit es verwendet werden kann.
sudo cp ~/lircd.conf /etc/lirc/lircd.conf
Um die Änderungen zu übernehmen, starten wir den Service erneut. Außerdem können wir mit irw
die Codes erkennen und testen, ob alle richtig empfangen werden:
sudo /etc/init.d/lirc start irw
Bei meiner kleinen Fernbedienung ergibt es folgende Ausgabe, wenn ich die Tasten nacheinander drücke:
0000000000ff6897 00 KEY_0 /home/pi/lircd.conf 0000000000ff30cf 00 KEY_1 /home/pi/lircd.conf 0000000000ff18e7 00 KEY_2 /home/pi/lircd.conf 0000000000ff7a85 00 KEY_3 /home/pi/lircd.conf 0000000000ff10ef 00 KEY_4 /home/pi/lircd.conf 0000000000ff38c7 00 KEY_5 /home/pi/lircd.conf 0000000000ff5aa5 00 KEY_6 /home/pi/lircd.conf 0000000000ff42bd 00 KEY_7 /home/pi/lircd.conf 0000000000ff4ab5 00 KEY_8 /home/pi/lircd.conf 0000000000ff52ad 00 KEY_9 /home/pi/lircd.conf 0000000000ffe01f 00 KEY_VOLUMEDOWN /home/pi/lircd.conf 0000000000ffa857 00 KEY_VOLUMEUP /home/pi/lircd.conf 0000000000ff22dd 00 KEY_PREVIOUS /home/pi/lircd.conf 0000000000ff02fd 00 KEY_NEXT /home/pi/lircd.conf 0000000000ffa25d 00 KEY_CHANNELDOWN /home/pi/lircd.conf 0000000000ff629d 00 KEY_CHANNEL /home/pi/lircd.conf 0000000000ffe21d 00 KEY_CHANNELUP /home/pi/lircd.conf 0000000000ffc23d 00 KEY_PAUSE /home/pi/lircd.conf
Übrigens: Falls du eine IR Sendediode angeschlossen hast, könntest du die eingespeicherten Codes auch senden (z.B. irsend SEND_ONCE /home/pi/lircd.conf KEY_0
).
Wer sich LIRC genauer ansehen will, kann einen Blick in die Dokumentation werfen.
Infrarot Raspberry Pi Universalfernbedienung – Programme starten
Anschließend wollen wir ein Skript starten lassen, welches auf Signale wartet. Dafür gibt es verschiedene Möglichkeiten. In diesem Tutorial zeige ich die Verwendung mit irexec
. Aber auch für Python gibt es eine eigene LIRC Bibliothek, falls jemand auch darüber Signale abfangen möchte.
Im Homeverzeichnis muss eine Konfigurationsdatei erstellt werden, in welcher wir zu übergebene Parameter festlegen (mehr Details dazu findest du hier und hier):
sudo nano ~/.lircrc
In meinem Beispiel erstelle ich Codes für das Programm irexec
, welches wir anschließend aufrufen. Außerdem belege ich die Taste VOLUME_UP und erstelle einen Aufruf, falls KEY_0 und danach KEY_1 aufgerufen werden. Dies ist nur ein Ausschnitt und kann natürlich entsprechend erweitert werden (siehe die Links oben dazu):
1 2 3 4 5 6 7 8 9 10 11 12 13 |
begin button = KEY_VOLUMEUP prog = irexec config = echo "VOL UP"; echo "2nd print" end begin button = KEY_0 button = KEY_1 prog = irexec config = echo "Key 0, then 1 pressed"; echo "ADD Line" >> ~/test.txt end |
Statt dem verwendeten echo ".."
kann auch jeder andere Terminal Befehl verwendet werden (z.B. python skript.py
). So lassen sich einfach Programme und Befehle auf Knopfdruck starten. Um auf IR Codes der Fernbedienung zu warten, müssen wir das Programm starten. Dazu einfach folgenden Befehl in das Terminal eingeben:
irexec
Die Ausgaben von echo ".."
sollten also direkt nach Tastendruck angezeigt werden.
Automatisch im Hintergrund starten lassen
Um irexec nicht jedes Mal per Hand starten zu müssen, können wir den Daemon außerdem beim Start aufrufen. Dazu bearbeiten wir die Datei
sudo nano ~/.profile
und fügen ans Ende folgende Zeile an:
/usr/bin/irexec -d
In meinem Beispiel wird jedes Mal, wenn Taste 0 und 1 hintereinander gedrückt werden, ein Output an die Konsole geschickt und in eine Datei des Homeverzeichnisses (test.txt) geschrieben. Somit kannst du feststellen, ob nach einem Neustart auch alles reibungslos funktioniert, da jedes Mal eine weitere Zeile angehängt werden müsste.
Neben üblichen (Universal)Fernbedienungen haben auch die meisten neueren Smartphones eine Infrarot Sende-Diode, womit mit einer entsprechenden Fernbedienungs-App sich auch jene zur Steuerung des Raspberry Pi’s eignen.
Abschließend gibt es den Prozess der Einrichtung einer Taste auch noch als Video:
33 Kommentare
Hallo,
Das Tutorial ist echt toll!! Weiter so.
Jetzt die Frage 🙂 Wie bekomme ich es hin, dass beim Drücken der Power Taste (auf der Fernbedienung) das der Raspberry herunterfährt?
Mfg
wenn Du bei Empfang der Power Taste den Befehl „shutdown -h now“ sollte der Pi herunterfahren, nur mit dem wieder starten wird es schwierig, da der der Pi keine meines Wissens Standby Modus kennt. Siehe auch http://www.computerhope.com/unix/ushutdow.htm
Gruß
Rainer
Beim wieder hochfahren würde ich z,B nen esp8266 nutzen, der wiederum brauch auch ein IR Modul und muss mit Strom versorgt werden.
Ich nutz dafür aber das WLAN modul und starte den Pi mit meinem Smartphone^^
Cooles Tutorial, danke.
Habe den oben genannten IR Empfänger in meinem OSMC (Kodi) verbaut, war sehr erstaunt , dass 3 Pins anschliessen und die entsprechende Fernsteuerung, in meinem Fall die vom iPod aktiviert, angeschlossen und es hat alles fuktioniert. Das ohne Eintrag ind /boot oder Aufzeichnung von Keys, durch das Tutorial habe ich jetzt auch die Hintergrundinfo dazu.
Rainer
Ich besitze mehere VS 1838B mit gleicher Anschlussbelegung wie der TSOP4838. Im Datenblatt gibt der Hersteller an das man zwischen VCC und OUT einen Widerstand von >20KOhm schalten soll. Dies nur als Tip für VS 1838B Besitzer 😉
Hallo,
ich habe die selbe Fernbedienung wie du genommen und wollte mir die Datei des Herstellers raussuchen.
Da auf der Fernbedienung Car mp3 steht, handelt es sich um den Ordner caraca.
Schon mal vielen Dank für die Antwort.
Gruß Paul
Hallo. Kann mir vielleicht jemand helfen?
Bin Raspberry Neuling und auf solche Tutorials angewiesen.
Wenn ich folgendes eingebe:
irrecord -d /dev/lirc0 ~/lircd.conf
kommt bei mir diese Fehlermeldung:
irrecord: file „/home/pi/lircd.conf“ does not contain valid data
in der lircd.conf werden die Konfigurationsdaten gespeichert. Diese scheinen fehlerhaft zu sein. Entweder du korrigierst sie oder löschst und erstellst sie neu (sudo rm ~/lircd.conf)
Danke für die schnelle Antwort.
Habe die Datei gelöscht und Neu erstellt.
Jetzt funktioniert es und ich kann weiter machen.
Vielen Dank nochmal
Sehr gut 🙂
Kann man für die IR-Diode auch andere GPIO benutzen, wenn einige durch HM-OCCU-SDK belegt sind?
Ja, musst den GPIO aber entsprechend in der Config Datei definieren.
hey, wenn ich hardware.conf öffne finde ich eine absolut leere datei vor?! bin neuling und fühle mich damit etwas überfordert
Ich habe leider auch eine leere Datei, /etc/init.d/lirc existiert nicht, und Output nach mode2… gibt es auch nicht. Habe lirc schon neuinstalliert, es passiert aber nichts.
Scheinbar hat sich in der neuen version unter debian stretch einiges an der configuration geändert.
Die hardware.conf existiert zum Beispiel nicht mehr.
Mir hat letztendlich dieses tutorial geholfen „https://github.com/josemotta/IoT.Starter.Api/tree/master/gpio-base“
Im Endeffekt musste ich, nachdem die oben beschriebenen Schritte nicht funktionierten, folgende Schritte durchführen:
Change to driver default
Edit file /etc/lirc/lirc_options.conf and change:
from:
driver = devinput
device = auto
to:
driver = default
device = /dev/lirc0
Außerdem hat sich
sudo /etc/init.d/lirc start
zu folgendem geändert:
sudo /etc/init.d/lircd start
(lircd statt lirc)
Ich hab noch nicht alles getestet, also am besten die anleitung in git studieren und alles von anfang an richtig machen.
Gruß Stephan
Hallo,
ich bekomme auch das lircd mit dieser Anleitung nicht richtig zum Laufen.
Auch mit den Änderungen von Stephan nicht.
Hat jemand eine Anleitung, die auf die aktuellen Versionen passt?
Hallo,
noch eine ergänzende Information:
a) ich kann Befehle aufzeichnen.
b) sudo /etc/init.d/lirc stop und mode2 -d /dev/lirc0 funktioniert
c) irw gibt keinen Output
Ich bitte um Hilfe. Ich habe ein „Universal“ Set der Marke PCremote, wo der Empfänger(wohl auch auf Infrarot Basis) am USB angeschlossen wird. Das geht für diverse Betriebssysteme wie Windows als auch Linux ohne Treiber. Ich benutze einen Raspberry 3 B sowie einen 3 B+. 75% der Tasten funktionieren auch. Bei einigen tut sich absolut nichts. Z.B. die rote ein/aus Taste oder die e(Internetexplorer) ibleibt beim Drücken irgendwie ohne Reaktion. Gibt es eine Möglichkeit, Tasten so umprogrammieren, dass ich z.B ein Shellscript starten kann oder mit einer Taste den Krempel runterfahren kann. Ich habe mit GPIO jetzt wenig am Hut. Falls es aber keine Möglichkeit gibt, bitte ich um Information was für einen Empfänger ich kaufen muss, damit es mit der Fernbedienung die ich habe auch geht. Wie ich das einbauebn soll weiss ich auch nicht, hab ein Gehäuse und die signale werden innen wohl nicht verarbeitet. Zur Not bin ich bereit das nach der Anleitung umzustellen.
pi@fridolin:~ $ sudo /etc/init.d/lirc stop
sudo: /etc/init.d/lirc: Befehl nicht gefunden
pi@fridolin:~ $ mode2 -d /dev/lirc0
Using driver devinput on device /dev/lirc0
Trying device: /dev/lirc0
Using device: /dev/lirc0
Partial read 8 bytes on /dev/lirc0pi@fridolin:~ $
???
Hallo zusammen,
Ich habe das selbe Problem wie Wolfram Christoph Eckard,
a) ich kann Befehle aufzeichnen
b) sudo /etc/init.d/lircd stop und mode2 -d /dev/lirc0 funktioniert
Aber Irw gibt keinen Output
-in /boot/config.txt steht in der letzten Zeile
dtoverlay=lirc-rpi,gpio_in_pin=26,gpio_out_pin=23,gpio_in_pull=up
-Die mit irrecord angelernte Fernbedienung ist in /etc/lirc/lircd.conf gespeichert
-in /etc/lirc/lirc_options.conf wurde
driver=default
device=/dev/lirc0
angepasst
Was mache ich falsch?
Hallo zusammen,
habe das gleiche Problem wie Mario und Wolfram Christoph Eckard. Habe ebenfalls die entsprechenden Hinweise zu den Änderungen mit der neuen lirc Version befolgt.
Über konstruktive Hinweise würde ich mich sehr freuen!
VG
Hallo,
ich habe das Szenario nachgespielt. Ich habe nur das Problem, dass in beiden Ordnern (init und init.d) lirc nicht erzeugt wird. Darum findet er diese auch nicht. Welche Optionen habe ich noch?
Vielen Dank für die Hilfe im voraus.
VG
Hallo zusammen,
zuerst einmal eine gute Nachricht: bei mir läuft alles, was in diesen Raspberry-IR-Tutorials angesprochen wird. Vorausgesetzt: die Raspberrys sind per Ethernet-Kabel mit dem Router verbunden. Ich kämpfe jedenfalls seit einer Woche mit folgendem Phänomen:
Normalerweise sind meine Raspis über WLAN erreichbar (ssh mit putty) und funktionieren problemlos.
Der Befehl „mode2 -d /dev/lirc0“ liefert jedoch sofort jede Menge von irgendwelchen nicht nachzuvollziehenden Werten. Schließe ich jetzt diesen Raspberry mit einem Ethernet-Kabel an meinen Router an (bei mir über einen Switch), wartet er richtig auf Signale von meinem IR-Sender und reagiert exakt darauf. Das habe ich auf 2 Systemen getestet.
Ich würde mich sehr freuen, wenn jemand eine Erklärung dafür hätte.
Meine Testumgebung:
IR-Device: VS1838B
Raspberry Pi 3 Model B Rev 1.2
Linux Pi-3-1 4.14.79-v7+ #1159 SMP Sun Nov 4 17:50:20 GMT 2018 armv7l
Raspberry Pi Model B Plus Rev 1.2
Linux RWS2 4.14.79+ #1159 Sun Nov 4 17:28:08 GMT 2018 armv6l
mode2 0.9.4c
Danke und Gruß Wilfried
PS: Auf den Zusammenhang mit der Ethernet-Konnektion bin ich durch folgenden Beitrag in einem (mir nicht mehr bekannten) Forum gekommen:
Re: LIRC: mode2 continuously receiving pulses from TSOP85
I have the same problem. but it’s working if I have the network cable plugged in…
Ich habe mich damit auseinander gesetzt.
Die Anleitung ist veraltet. Sie funktioniert schon lange nicht mehr. Am ehesten in veralteten Systemen mit alten Kernel bzw. alter Version.
1. Die Module müssen noch geladen werden!
2. Es gibt schon lange die Datei /etc/lirc/hardware.conf nicht mehr!
Hier gibt es ein interessantes Video…
Gibt es eine mögleichkeit mehrere infarot empfänger am Raspberry zu instalieren, damit die steuerung von jedem winkel aus einwandfrei funtioniert?
Eine ausgezeichnete Frage. Ich denke, richtig angeschlossen kann man im Verzeichnis /boot/config.txt die Pinbelegung der anderen IR Empänger richtig eingetragen, dann funktionieren sie auch. Was spricht gegen eine kleine Bastelarbeit? Man schaltet in Serie 2-3 IR Empänger und passt die Ausrichtung an. Bei gleicher Spannung und gleicher Pinbelegung funktionieren alle mit einer minimalen Zeitverzögerung. Wenn man jetzt nicht zu schnell die Tasten auf der Fernbedienung drückt, dann ist es kein Problem. Wir reden hier vom 1/100 Sekundenbereich.
Hallo,
Ich habe das Problem, dass der Raspberry direkt bei der 2. eingegebenen Zeile, also das Testen des Moduls „lirc_dev“ nicht erkennt. Ich bin noch nicht allzu vertraut mit dem Raspberry Pi und würde mich darum über eine schnelle Antwort sehr freuen. Mit freundlichen Grüßen, Mathias
Diese Anleitung ist veraltet! Schau dir das Video vom 23.06.2019 an!
Hallo Felix,
habe nun endlich den IR-Empfänger TSOP4838 aber leider funktioniert die Anleitung mit Raspbian GNU/Linux 10 (buster) nicht mehr.
Könntet Du sie bitte aktualisieren?
Viele Grüße
Hubby
Bin ebenfalls am suchen…
Wäre auch für eine Anleitung mit Buster.
Klappt leider nicht mehr
Hallo,
mit dieser Anleitung hat es bei mir geklappt den IR Empfänger zu installieren.
https://www.instructables.com/Setup-IR-Remote-Control-Using-LIRC-for-the-Raspber/
Hey ich möchte für eine Hausautomatisierung meine dezentralen Lüftungsanlagen mit dem raspberry selbst steueren, aktuell geht das nur mit einer Fernbedienung (sie sendet infrarot auf Sicht Signale) das ist alles was ich weiß kann ich hiermit das ganze automatisieren? Also dass ich die Signale aufzeichne und dann der rapberry pi die signale selbst schickt wenn ich das möchte?