Infrarot-Steuerung mit dem Raspberry Pi

Ein Experiment, inwieweit man den Raspberry Pi mittels Infrarot-Fernbedienung steuern kann oder gar als Universal-Fernbedienung nutzen kann.

Der fertige Aufbau
Der fertige Aufbau

1. Schritt: LIRC installieren

LIRC – Linux Infrared Remote Control – ist eine Bibliothek zum Zugriff auf Infrarot-Empfänger und -Sender. Auf dem Raspberry Pi installiert man LIRC mittels

sudo apt-get install lirc

Vor der Nutzung müssen noch zwei Dateien bearbeitet werden:

Die Datei /etc/lirc/hardware.conf muss wie folgt geändert werden:

# /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=""

(Es werden also Werte LIRCD_ARGSDRIVERDEVICE und MODULES geändert)

In der Datei /boot/config.txt die folgende Zeile einfügen:

dtoverlay=lirc-rpi,gpio_in_pin=23,gpio_out_pin=22

Anschließend den Raspberry Pi einmal neustarten.

2. Infrarot-Empfänger anschließen

Jetzt kann (bei ausgeschaltetem Raspberry Pi!) ein IR-Empfänger angeschlossen werden. Ich habe einen TSOP4838 (Conrad) für unter 2 EUR genommen. Den Empfänger kann man gemäß dem folgenden Bild direkt an die Pins des Raspberry Pi anschließen. Achtung: Dabei die Anschlüsse des konkreten Modells beachten – das zugehörige Datenblatt hilft!

Anschluss IR-Empfänger

Der Ausgang des IR-Empfängers kommt in diesem Fall an GPIO 23, das ist der Wert, den wir oben in den Dateien /etc/modules und /boot/config.txt eingetragen haben.

Jetzt kann der Empfänger ausprobiert werden. Zunächst wird der lircd gestoppt, anschließend kann man sich die empfangenen Rohdaten anschauen:

sudo service lirc stop
mode2 -d /dev/lirc0

Jetzt kann man auf einer beliebigen Fernbedienung irgendwelche Tasten drücken. Im Terminal müsste nun eine Ausgabe ähnlich der folgenden erscheinen:

space 2206719
pulse 9085
space 4409
pulse 694
space 436
pulse 617
space 514
pulse 651
space 462
pulse 688
space 439
pulse 618
space 516

Falls nicht, ist irgendwas schief gelaufen – nochmals alles überprüfen, ob alles richtig verkabelt ist.

Wenn wir irgendwas mit einer bestehenden Fernbedienung steuern wollen, benötigen wir eine Datei, die diese Rohdaten in Tasten „übersetzt“. Dazu kann man in der LIRC-Aufstellung schauen, ob es bereits eine fertige Config-Datei gibt. Wenn nicht, muss man eine eigene Datei erstellen. Das tut man, indem man

irrecord -d /dev/lirc0 fernbedienung.conf

startet und den Anweisungen folgt. Die Tastenbezeichnungen sind dabei vorgegeben, diese erfährt man hier oder über

irrecord -l

Das Ganze ist ein relativ langwieriger Prozess; zum Schluss hat man jedoch eine Datei, in der alle Tasten der Fernbedienung enthalten sind. Um diese Datei verfügbar zu machen, müssen wir sie (nach dem Anpassen der Angaben im Kopf) an die bestehende /etc/lirc/lircd.conf anhängen:

sudo cp fernbedienung.conf /etc/lirc/lircd.conf

Nur beim ersten Mal sollte man die mitgelieferte lircd.conf wirklich überschreiben, weitere Konfigurationen für zusätzliche Fernbedienungen fügt man mit

cat fernbedienung.conf | sudo tee -a /etc/lirc/lircd.conf

hinzu.

Jetzt kann man auch schauen, ob die Tasten korrekt erkannt werden. Der Befehl

irw

zeigt die jeweils an der Fernbedienung erkannten Tasten an.

Wenn das klappt, kann der Raspberry Pi bereits ferngesteuert werden. Dazu legt man eine Datei /etc/lirc/lircrc oder – für den aktuellen Benutzer – eine Datei ~/.lircrc an, in der steht, was beim Tastendruck passieren soll. Ein Beispiel:

begin
 prog = irexec
 button = KEY_1
 config = ls -l
end

Startet man nun

irexec

so wird beim Druck auf die Taste „1“ der Fernbedienung das Verzeichnis aufgelistet. Nicht sehr sinnvoll, zeigt aber das Prinzip.

3. IR-Sendediode integrieren

Wir haben Infrarot-Befehle empfangen, jetzt wollen wir sie auch senden. Hierfür brauchen wir ein paar mehr Teile, die zusammen knapp über 1 EUR kosten:

  • IR-Diode TSAL 6200 (Conrad)
  • Transistor BC547C NPN (Conrad)
  • Widerstand 20 Ω (Conrad) (Achtung: vermutlich besser einen Wert zwischen 34 und 39 Ω wählen, siehe Kommentar unten!)
  • Widerstand 220 Ω (Conrad(Achtung: vermutlich besser einen Wert um 2,6KΩ wählen, siehe Kommentar unten!)

Die Schaltung nach dem folgenden Schema aufbauen:

IR-Sender

Mit diesem Aufbau kann man nun mittels des Befehls

irsend SEND_ONCE Samsung_BN59-00861A KEY_VOLUMEUP

beispielsweise die „lauter“-Taste der entsprechenden Samsung-Fernbedienung an das Gerät senden.

4. Fazit

Damit sind die Grundlagen für eine universelle Fernbedienung geschaffen. Mit Hilfe einer Software wie lirc_web (Link, Beschreibung) kann damit eine Web-basierte Fernbedienung erreicht werden.

7 Antworten auf „Infrarot-Steuerung mit dem Raspberry Pi“

  1. Dear Joerg,

    I was looking into your project and i wanted to ask how did you determinated the values for the resistance.
    From my point of view both R1 but also R2 have wrong values but i also be wrong.
    According to the documentation, TSAL6200 have Vf=1.35-1.6V and Ifmax=100mA.
    You connected the LED to the 3.3V power supply which can only deliever max 50mA if you don’t want to break it( This type of projects are usually connected to the 5 V supply because can deliever more than 50mA.)
    Having those said the voltage drop will be 3.3V-1.35V=1.95V or 3.3V -1.6V=1.7V.
    Using R=V/I and knowing that I cannot be higher then 50mA(limitation on the 3.3V as presented earlier) results:
    R can be between 39Ohm and 34Ohm
    Because of that i find your value of 20ohm way to little and even if it’s working right now it can do damages.

    Regarding R2 where the value is 200Ohm i found this value also too littlte.
    For BC547 we have Icmax=100mA and Vbeon=500-700mV. Since GPIO will supply 3.3V then resitance will need to cover 3.3V-0.7V=2.6V. We know that Hfe(B)=Ic/Ib -> Ib=0.1/100=0.001A
    Using R=V/I we will have a resistance of 2.6/0.001=2600ohm=2.6Kohm
    Because of that i find your resistance of 220ohm way too little.

    Best regards,
    Iulian

  2. Iulian,

    thank you for your thoughts on the resistors. I have to admit that I didn’t do any calculations, but copied the values found elsewhere and tried it with these resistors.
    I will add your corrections to the article.

    Jörg

  3. Hallo Jörg

    Danke für die fantastische Hilfe, allerdings habe ich eine Frage.
    Meine Fernbedienung ist leider kaputt gegangen, deshalb wollte ich nun meine Soundanlage mit dem Raspberry Pi steuern. Da meine Fernbedienung aber Kaputt ist, kann ich nicht zuerst die Signale durch die Fernbedienung aufnehmen. Hast du eine Idee, wie ich sonst an die Signale, ohne Fernbedienung komme?

  4. Hallo Jörg,
    vielen Dank für die Schaltung. Habe das ganze auf eine kleine Platine gelötet und als Wiederstände 36Ω und 2,67kΩ verwendet. Hat auf Anhieb geklappt.

  5. Hey ,
    ich habe alles so gemacht wie du es gesagt hast. Das senden klappt aber leider nicht. Und ich weis nicht wieso .Es kommt auch keine Fehlermeldung. aber wenn ich einen irsend Befehl absende passiert nichts.(Lampe leuchtete nicht ,hab es ausprobiert und mit meiner handycamera nachgeshen ).

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.