Raspi Infrarot-Empfänger für Fernbedienung (LIRC-Installation und IREXEC aktivieren)

TSOP4838-38khz

Raspi Infrarot-Empfänger für Fernbedienung (LIRC-Installation und IREXEC aktivieren)

Category : Raspberry Pi

Ausdrucken Ausdrucken

SONY DSC

Ohne Frage ist der Haupteinsatzbereich eines Raspberry Pi’s der eines Mediacenters.
Für rund 40 Euro (ohne das Beiwerk wie Netzteil, SD-Karte, HDMI-Kabel, Fernbedienung, …) bekommt man ein wirklich geniales kleines, genügsames Gerät um den Fernseher „Smart“ zu machen. Meistens hat man ja das weitere Zubehör noch irgendwo rumliegen und kommt dann vielleicht auf 10-15 Euro Zusatzkosten.

Ich nutze jetzt seit über einem Jahr einen Raspberry Pi 2 als Mediacenter und die kleine Kiste läuft Tag und Nacht, da sie ja auch sehr stromsparend ist. Tag und Nacht wären Pi mal Daumen rund 13 Euro Stromkosten im Jahr.
Auch muss ich nur ganz selten mal neustarten. Ein recht stabiles System und durch die ausreichende passive Kühlung (der Sommer 2015 war ja richtig heiß) ist er auch mucksmäuschenstill und mit einer entsprechenden Bedieneroberfläche kommt man auch ruckelfrei durch die Menüs der Mediacenter-Software.
Sogar HD-Material lässt sich ruckelfrei abspielen. Man hat Internetradio, Youtube, und viele weitere Dinge, die man durch Zusatzapps auf seinem Mediacenter installieren kann.

Wer also ein megagünstiges, aber dennoch gutes Mediacenter haben möchte, macht damit keinen Fehler.

Einziges Manko ist, dass wir ja nicht unbedingt eine Tastatur und Maus im Wohnzimmer haben wollen, um das Mediacenter zu bedienen. Sicher gibt es für das Mediacenter (wir werden Kodi verwenden) einige Apps für das Smartphone, mit dem man dann sein Mediacenter bedienen kann und der ein oder andere findet das toll, aber ich muss sagen, dass ich lieber eine richtige Fernbedienung benutze, denn man hat dort die Haptik der Tasten und keine plane Glasfläche auf die man immer erst schauen muss, wenn man eine Taste drücken möchte.
So kann man schön im Dunkeln liegen und mit einer herkömmlichen Fernbedienung sein Mediacenter blind steuern.

Unsere Methode ist die günstigste um den Raspi Fernbedienungstauglich zu machen, sie verbraucht keinen USB-Anschluss wie eine fertige Lösung, setzt aber ein wenig Bastelei voraus, aber wer hier liest, der will das ja auch so. 🙂

Und wir können jede x-beliebige Fernbedienung nehmen, da wir sie unter Linux kinderleicht anlernen können. Das geht recht fix und man kann seine Fernbedienung ganz individuell gestalten, oder aber auch die seines Lieblingsgeräts verwenden, an die man sich so sehr gewöhnt hat.

Fangen wir mit dem Hardware-Part an. Was brauchen wir? Zum Testen erstmal:

  • 1 x Raspberry Pi (mit lauffähigem Raspian)
  • 1 x Breadboard
  • 1 x Breakout-Board GPIO-Pins (optional. Alternativ gehen natürlich auch drei Drahtbrücken Male/Female)
  • 1 x Infrarot-Modul TSOP4838 (Kostenpunkt ~0,60 Euro)

Bei dem IR-Modul gehen auch alle anderen aus der 48er-Reihe. (Es gibt auch noch eine 22er-Reihe 2230, … Die müssten auch gehen, habe ich aber nicht ausprobiert. Falls vorhanden, einfach mal ausprobieren. Die 48er-Reihe deckt aber die wichtigsten Infrarot-Codeverfahren ab. Mehr Hintergrundinfo dazu hier.)
Die letzten beide Werte nach der Serie geben die Frequenz an, in der gesendet und empfangen wird. Unserer arbeitet im 38 kHz-Bereich.

Ein weiterer Vorteil dieses Moduls ist, dass es keinen direkten Sichtkontakt zum Sender benötigt. Man kann es also auch sehr schön etwas versteckt hinter dem Fernseher anbringen.

Ok, werfen wir zuerst mal einen Blick ins Datenblatt der TSOP48xx-IR-Diode … Wir sehen dort die Pinbelegung der drei Pins und einen Spannungsbereich, der zwischen 2,5 V und 5,5 V liegt.
Auf der zweiten Seite des Datenblatts sehen wir auch noch eine Beispielschaltung. Hier werden optional noch ein Widerstand und ein Elektrolyt-Kondensator verwendet um Spannungen zu glätten.
Darauf kann man aber verzichten. Ich denke mal, dass der Spannungsregler im Raspi einwandfrei arbeitet, dann kommt es auch nicht zu großen Spannungspitzen.

Pinbelegung TSOP48xx

Pinbelegung TSOP48xx

 

So, jetzt haben wir alle Informationen die wir benötigen und bauen eine Testanordnung auf einem Breadbord auf:

 

Zum Vergrößern Bild anklicken

Zum Vergrößern Bild anklicken

 

Hier auch noch einmal der Schaltplan:

Zum Vergrößern Bild anklicken

Zum Vergrößern Bild anklicken

Zum Vergrößern Bild anklicken

Das ist auch schon alles. Jetzt müssen wir natürlich noch dafür sorgen, dass das Infrarotmodul auch softwareseitig arbeitet.
Dazu starten wir unseren Raspberry. Ich setze voraus, dass ein installiertes lauffähiges Raspian auf dem Raspberry läuft.

Falls Ihr eine grafische Benutzeroberfläche benutzt, so öffnet einen Terminal um auf die Konsolenebene wechseln zu können.

Im folgenden Schritt werden wir LIRC installieren. LIRC steht für „Linux Infrared Remote Control“. Es ist ein Programm für Linux, mit dessen Hilfe man Befehle von IR-Fernbedienungen in Programmbefehle umsetzen kann. Nötig ist dafür lediglich ein Infrarotempfänger und den haben wir ja an unserem Raspberry am Pin 18 hängen.
Da unsere Fernbedienung noch nicht mit dem IR-Empfänger vertraut ist, müssen diese beiden Teile jetzt aufeinander abgestimmt werden. Mit einfachen Worten: Wir werden, nachdem wir LIRC installiert haben, unsere Fernbedienung anlernen.

Die Installation von LIRC geht dabei ganz einfach mittels sudo und apt-get.

Eventuelle Fragen mit Yes beantworten.

Um die benötigten Module per Hand zu laden und diese zu testen gibt es den Befehl modprobe. Bei dem lirc_rpi ist im weiteren Verlauf die korrekte Belegung der GPIO Pins zu beachten! In unserem Falle hängt der IR-Empfänger ja mit der DATA-Leitung an Pin 18.

Wir geben nun folgendes ein und bestätigen mit Return:

Sollte nun gar nichts passieren ist alles in Ordnung und LIRC ist bereit. Falls nicht, erscheint eine Fehlermeldung in Form von

Falls das passiert ist, müsst Ihr Euch mal im Netz umschauen. Der Fehler könnte dann viele Gründe haben, die ich jetzt an dieser Stelle gar nicht alle berücksichtigen kann. Es würde dann aber definitiv nicht an dem IR-Modul, oder dem Aufbau liegen, da ja der LIRC-Treiber unabhängig von der Hardware installiert wird. Das Problem ist dann in der Linux-Konfiguration zu suchen.

Jetzt müssen wir dafür sorgen, dass beim Bootvorgang die LIRC-Unterstützung immer geladen wird. Dazu müssen wir eine Datei im /boot-Verzeichnis bearbeiten. Ich verwende als Texteditor VIM. Wenn Ihr nano verwendet, dann statt „vi“ „nano“ tippen.

In die config.txt fügen wir folgende Zeile an das Ende der Datei ein:

Habt Ihr einen anderen Pin als 18 genommen, so müsst Ihr den verwendeten Pin statt der 18 an dieser Stelle eintragen.
Wir speichern die Datei nun ab und schließen sie wieder.

Jetzt müssen wir noch eine Datei anpassen. Ruft dazu folgenden Befehl auf:

In dieser Textdatei tragen wir auch am Ende des Inhalts folgende zwei Zeilen ein:

Auch hier beachten, dass der korrekte Pin eingegeben wird, falls abweichend von meinem Tutorial.
Wir speichern und schließen die Datei.

Jetzt können wir das LIRC-Device in unserem /dev-Verzeichnis ermitteln. Hierzu tippen wir folgendes ein:

und es muss als Ausgabe das Device lirc0 erscheinen.

Abschließend muss in der Config-Datei von LIRC das Device und die Module eingetragen werden:

Wir tragen folgendes entweder neu ein, oder ändern vorhandenes auf die folgenden Einstellungen:

Jetzt sind wir so weit fertig und starten den LIRC-Demon neu. Dieser sollte nun ohne meckern neu starten:

 

Test unseres IR-Empfängers

Jetzt kommen wir zu dem Punkt, an dem wir unseren Empfänger (und unseren Sender) auf ihre grundlegende Funktionalität hin überprüfen müssen. Wir können hierzu mode2 nutzen um die RAW-Ausgabe unseres Empfängers zu sehen. Beim Drücken von beliebigen Tasten auf einer IR-Fernbedienung sollten abwechselnd space und pulse Einträge erscheinen. Kleiner Hinweis: Es gibt ein paar ganz wenige Fernbedienungen die nicht geeignet sind für diese Herangehensweise. Ich hatte so eine von T-Online die mit dem Gerät „T-Online Vision S100“ mitgeliefert wurde. Sieht zwar aus wie eine Fernbedienung, fasst sich auch an wie eine Fernbedienung ist aber bei genauerer Betrachtungsweise gar keine Fernbedienung, sondern ein Gerät mit einer Tastaturemulation. Diese Art von Fernbedienung funktioniert nicht. Sind aber eher die Ausnahmen solche Fernbedienungen.

Ok, testen wir. Hierzu müssen wir den eben neu gestarteten LIRC-Demon stoppen, denn mode2 läuft nicht mit gestartetem Demon.

Danach starten wir mode2 mit folgendem Befehl:

Jetzt halten wir unsere Fernbedienung vor den Empfänger und drücken mal ein paar beliebige Tasten. Wird die Fernbedienung erkannt, rattern Wort- und Zahlenpaare (pulse und space) herunter.

Beispielausgabe:

Dann haben wir alles richtig gemacht und unser TSOP4838 erkennt unsere Fernbedienung und jetzt, vereinfacht ausgedrückt, müssen wir der Fernbedienung nur noch beibringen, was sie zu sagen hat, damit unser Raspberry weiß, was er mit dem Befehl xyz anzufangen hat.

Hierzu konfigurieren wir nun unseren Sender, sprich unsere Fernbedienung.

 

Senderkonfiguration

Es gibt eine initiale Konfigurationsdatei namens lircd.conf, die in der Regel leer ist. Es können nun entweder bestehende Konfigurationsdateien genutzt werden, so fern es eine Konfigurationsdatei für diese Fernbedienung gibt, oder man lernt sie einfach an.
Auf den Sourceforge-Projektseiten von LIRC findet man eine Reihe von verschiedenen Fernbedienungen diverser Hersteller. (http://lirc.sourceforge.net/remotes/) Falls die passende Datei dabei ist, dann öffnet diese am einfachsten im Browser, markiert den gesamten Inhalt, öffnet mittels

die lircd.conf-Datei und fügt den kopierten Inhalt dort rein.
Alternativ unter der Kommandozeilenebene wie folgt (an Hand eines Beispiels für eine Yamaha-RAX9-Fernbedienung) die vier Zeilen nacheinander abarbeiten:

Auch gibt es auf Eurem Raspi ein LIRC-Verzeichnis „/usr/share/lirc/remotes/“, in dem Fernbedienungsconfig-Dateien gefunden werden können.

Bei einem Fund könnt Ihr ganz einfach die Datei kopieren (als Beispiel Acer Aspire 6530G):

Zum Vergrößern Bild anklicken

Zum Vergrößern Bild anklicken

Ich habe meine angelernt, da ich hier eine Fernbedienung von einem nicht mehr genutzten Mediacenter hatte (Modell eGreat) und diese natürlich nicht zu finden war.

Dafür gehen wir wie folgt vor:

Falls der LIRC-Demon noch läuft, so müssen wir ihn zuerst stoppen:

Jetzt starten wir das Tool mit dem wir die Tasten unserer Fernbedienung aufzeichnen können. Als Beispiel nehme ich meine eGreat-Fernbedienung:

Der Parameter „-H“ ist der Treiber. Den können wir auf „default“ setzen, da wir ja vorhin „default“ in der LIRC-Config-Datei eingetragen hatten.
Der Parameter „-d“ ist unser IR-Empfänger, das ja auf den Namen lirc0 hört.
„eGreat.conf“ ist der Name der Aufzeichnungsdatei und vor dem .conf ist gleich der Name der Fernbedienung innerhalb der Datei, die hier erstellt wird.

Es folgt ein Startbildschirm mit viel Text und der Aufforderung die Aufzeichnung nun mit „Return“ zu starten.

Im nächsten Schritt wird man aufgefordert viele unterschiedliche Tasten auf der Fernbedienung nach Möglichkeit je Taste für eine Sekunde zu drücken. Sie erzeugt dann einen Punkt auf dem Bildschirm. Es sollten aber pro Taste nicht mehr als zehn Punkte sein (also nicht zu lange auf eine Taste drücken) und man sollte mindestens 80 Zeichen auf dem Bildschirm – was umgerechnet 2 Zeilen sind – eingeben, bevor man aufhört.

Wir starten jetzt mir „Return“ und tippen auf unserer Fernbedienung los. Nach der ersten Reihe kommt eine kurze Ausgabe die ungefähr wie folgt lautet:

Also noch eine Reihe. Man sollte nicht zu lange Pause dazwischen machen, denn nach 10 Sekunden Inaktivität erfolgt ein Abbruch. Dann muss man von Vorne beginnen.
Haben wir auch brav die zweite Reihe abgeschlossen, erscheint eine Meldung mit ungefährem Inhalt:

Unsere Fernbedienung wurde analysiert und nun können wir die Button-Namen für unsere Tasten zuordnen.
Hier mal eine Liste mit allen rund 450 möglichen Tasten die man vergeben kann. Wir benötigen sie später, damit wir mit der entsprechenden Button-Taste eine Aktion zum Durchführen zuordnen können. Die meisten Button-Namen sind ja selbsterklärend.
Die Liste kann man auch mit dem folgenden Parameter aufrufen:

Nehmen wir mal an, es gibt eine Taste „1“ auf unserer Fernbedienung, dann tippen wir jetzt „KEY_1“ ein

Es folgt die Anweisung nun die entsprechende Taste „1“ zu drücken:

Das machen wir nun für alle Tasten auf der Fernbedienung, oder zumindest wenigstens für die, die wir später in unserem Mediacenter benutzen wollen.
Als Endergebnis sieht meine „eGreat“-Datei dann so aus:

Solltet Ihr den Vorgang abbrechen, oder unter dem gleichen Dateinamen noch einmal starten und es existiert diese Datei bereits,  wird das mit folgendem Fehler quittiert:

Dann löscht einfach die Datei und dann könnt Ihr die Anlernprozedur noch einmal durchführen.

Um den Vorgang zu beenden lasst Ihr das Key_-Input-Feld leer und drückt Return, dann wird die Datei gespeichert.

Um das Ganze jetzt abzuschließen, müssen wir die eben erstellte Datei als lircd.conf in das entsprechende Verzeichnis kopieren bzw. anhängen.

Anhängen deshalb, weil wir auch mehr als nur eine Fernbedienung in der lircd.conf hinterlegen können. Hierzu legen wir eine neue Anlernprozedur wieder mit

an und wiederholen die Schritte von Oben.

Nun müssen wir LIRC natürlich wieder neu starten mit

Jetzt machen wir den alles entscheidenden Test und prüfen, ob unsere eben zugeordneten Tasten auch zu unseren Tasten passen, die wir auf unserer Fernbedienung drücken.
Dazu starten wir das Tool „irw“ mit einem einfachen

Jetzt drücken wir eine Taste auf unserer Fernbedienung und es muss die entsprechende Ausgabe herauskommen. Nehmen wir die Taste „1“ die wir mit „KEY_1“ belegt haben (wir hätten sie auch „KEY_EJECTD“ nennen können. Es geht nur darum, dass dieser Name später intern herangezogen wird um eine Aktion durchzuführen.) als Beispiel und drücken sie, dann erscheint auf dem Monitor folgendes:

Das heißt, die Taste 1 wird richtig erkannt für die Fernbedienung „egreatIR“. Hätten wir weitere Fernbedienungen, würde beim entsprechenden Tastendruck der Name der entstprechenden Fernbedienung erscheinen. Ich kenne aber keinen, der mehr als eine eingetragen hat, aber wie immer: „Machbar ist alles“ 🙂

 

IREXEC aktivieren

Wollen wir zum Beispiel unabhängig von einem Mediacenter mit einer bestimmten Taste eine Aktion am Computer ausführen lassen, müssen wir irexec aktivieren, denn der LIRC-Demon dekodiert zwar die Signale der Fernbedienung, kann aber selbst keine Befehle ausführen.
Im LIRC-Paket ist daher ein Tool namens irexec, das eine Auswertungsdatei namens .lircrc benötigt.
Es können alle Befehle auf Tastendruck ausgeführt werden, die man auch in einem Terminal ausführen kann und darf.

Die Datei .lircrc sollte als versteckte Datei im Homeverzeichnis des Benutzers angelegt sein. Dort wird auch beim Ausführen von irexec als Erstes gesucht.
Damit diese Datei von allen Benutzern verwendet werden kann, muss man sie mit root-Rechten versehen und als /etc/lircrc und als /etc/lirc/lircrc ablegen.

Die .lircrc-Datei ist eine Textdatei und beinhaltet die Anweisungen, die mit den Tastendrücken der Fernbedienung ausgewertet werden sollen.
LIRC-Demon liest bei jeder Betätigung einer Fernbedienungstaste die Datei von oben nach unten ein und die Treffer werden der Reihe nach abgearbeitet.
Wichtig! Denn die Reihenfolge ist für den Befehl „mode“ oder „flags“ sehr wichtig.
Alle Anweisungen sind jeweils zu Blöcken zusammengefasst und starten mit einem „begin“ und enden mit einem „end“. Andernfalls kann der Befehl nicht abgearbeitet werden und es kommt zu seltsamen Fehlern.

Hier mal ein Beispiel. Die folgende Anweisung bewirkt, dass beim Drücken der „Eject“-Taste (KEY_EJECTD haben wir ja LIRC weiter oben beigebracht) der Fernbedienung eine Glocke ertönt und danach der Rechner neu startet. Unabhängig, ob ich das im Kodi-Mediacenter mache, oder in der Eingabeaufforderung, da LIRC ständig im Hintergrund aktiv ist.

Nur so am Rande: In dem „bellring“-Script ist der Befehl

hinterlegt. „aplay“ ist ein kleines Tool, welches Sounds abspielt (kann auch mit apt-get installiert werden. aplay ist Bestandteil des Pakets alsa-utils. sudo apt-get install alsa-utils) und in dieser Konfiguration den Sound über das HDMI-Kabel an den Fernseher weiterleitet.

Detaillierte Informationen zu den Befehlen innerhalb der .lircr-Datei könnt Ihr am Besten hier auf der Ubuntuusers-Wiki nachlesen.

Damit irexec auch nach jedem Rechnerneustart aktiv ist, müssen wir das Ganze nun automatisch starten lassen.

Hierzu legen wir uns auch gleich ein elegantes Start/Stop-Script an, das wir in das /etc/init.d-Verzeichnis legen können.

sudo vi /etc/init.d/irexec

In die Datei schreiben wir folgenden Inhalt:

 

Ich arbeite mit SUDO, daher „su“ (Mein Benutzer hat in der sudo-Datei den Eintrag „BENUTZERNAME ALL=(ALL) NOPASSWD: ALL“.
Euer Benutzer muss die Datei ausführen, so wie die .lircrc öffnen dürfen und darüber hinaus die Rechte haben, die Anweisungen innerhalb der Datei ausführen zu dürfen. Den Befehl „shutdown“ wie in meinem Beispiel darf ja nicht jeder Benutzer ausführen.

Jetzt müssen wir das Script noch ausführbar machen:

Und am Ende wollen wir es ja mit dem Autostart verbinden:

 

So, wir haben es geschafft. Wenn wir nun unseren Rechner neu booten wird jedesmal LIRC und IREXEC gestartet und wir können die Anweisungen, die wir in der .lircrc-Datei erfasst haben, jederzeit mit unserer Fernbedienung ausführen lassen.

Im nächsten Teil werden wir unseren Versuchsaufbau als Endergebnis umsetzen. Die Schaltung ist ja nicht wirklich ein Hexenwerk, aber man kann Kabel löten üben in Verbindung mit dem Einsatz von Schrumpfschlauch.

Im übernächsten Teil werden wir Kodi installieren – und noch viel wichtiger – die Keymaps konfigurieren, damit unsere Fernbedienung sich geschmeidig in das Mediacenter einfügt und nicht nur mit den Standard-Tasten läuft.


Schreibe einen Kommentar