Benutzer-Werkzeuge

Webseiten-Werkzeuge


rpi_kodi_irremote

IR-Remote mit Kodi

Autor: Niko, erstellt am 25.05.2019

Nachdem ich den einen oder anderen Filmeabend mit Kore auf dem Handy durchlebt habe, musste ich feststellen das mir für das Popcornfeeling noch die Haptik einer stinknormalen Fernbedienung fehlt - in das Handy wird schon zu oft und zu lange geglotzt :-). Die wohl einfachste Möglichkeit ist, ihr kauft euch eine namhafte Fernbedienung für ein MediaCenter die einen USB-IR-Empfänger dabei haben. Dann ist das meistens nur noch Plug&Play, alles ist Tutti und man ist 30€ und (viel) mehr ärmer.
Cooler ist die Wiederverwendung einer alten Infrarot-Fernbedienung, z.B. die eines Satellitenreceivers mit USB-Aufnahmefunktion der schon lange kaputt und entsorgt ist, aber die Fernbedienung irgendwie im Schrank überlebt hat.
Anleitungen wie man eine beliebige Infrarot-Fernbedienung mit Kodi zum Funktionieren bringt, gibt es wie Sand am Meer. Leider sind diese Anleitungen oft nicht, zum Zeitpunkt meiner Recherche, auf dem aktuellen Stand, lücken- oder fehlerhaft und Kodi bzw. LibreElec technisch schon mehrere Schritte weiter und alle Maßnahmen die Fernbedienung zum Laufen zu bekommen nur verschwendete Zeit. Leider.

Für mich hat letztendlich dieser beschriebene Weg geklappt, nur ca. 15€ gekostet und zum Ziel geführt meinen Kodi mit einer „normalen“ Fernbedienung komplett steuern zu können. Außerdem sieht es noch viel cooler aus und man hat es selbst gemacht - der RPi ist doch ein Bastelrechner,oder nicht. Die Fernbedienung muss nicht alle Tasten haben die ihr braucht, macht die Bedienung am Ende zwar schlüssiger, das kann man in den Konfigs alles zurecht biegen.

Du brauchst:
1x Raspberry mit LibreElec & Kodi
1x IR-Empfängermodul (sucht im Netz mal nach KY-022 Set IR Empfänger Infrarot Receiver CHQ1838 Sensor Modul, kosten ein paar Euro und erleichtert die Arbeit ungemein)
1x Jumperkabel female/female (dürfen die mit 30cm sein, die gibts immer in ganzen Strängen wo man sich die drei benötigten Kabel einfach abtrennen kann) 1x ausgediente funktionstüchtige IR-Fernbedieungung (im Idealfall mit allen Tasten, Play, Pause, Power, Kapitel+-, Vor/Zurück usw. usf.)
1x Universalfernbedienung mit allen nötigen Tasten (optional)

GPIO Header (Pin Kontakte)

Das IR-Modul wird am GPIO Header des RPi angeschlossen. Das ist der obere Bereich im Bild. Der GPIO Header umfasst am RPi 3 B+ 40 Pins.

Die Pin-Nummern beginnen unten links bei 1, Pin-Nummer 2 ist oben links, Pin-Nummer 3 ist der zweite unten links, Pin-Nummer 4 der zweite von oben links usw… Um die Verwirrung komplett zu machen wird manchmal von den GPIO-Ports und von Pins geredet, beide haben Nummern, ein Kabel an der falschen Nummer und … futsch …
Daher eine kleine Tabelle die der Draufsicht auf dem Bild entspricht und die Zuordnung vereinfacht.

GPIO Pins 2 - 40 der oberen Reihe

GPIO: 5V 5V M 14 15 18 M 23 24 M 25 8 7 ID M 12 M 16 20 21
PIN: 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40

GPIO Pins 1 - 39 der unteren Reihe

PIN: 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39
GPIO: 3V 2 3 4 M 17 27 22 3V 10 9 11 M ID 5 6 13 19 26 M

5V = 5 Volt
3V = 3,3 Volt
M = Masse
ID = ID EEPROM (Advanced Use only)
Raspberry GPIO Usage

IR-Modul anschließen

Das von mir verwendete IR-Modul ist ein CHQ1838 aus dem Arduino-Modul-Baukasten für eine Frequenz von 38kHz, theoretischer Reichweite von 18 Metern, einem Empfangswinkel von ±45º und einer Betriebsspannung von 2,7V bis 5,5V.
Bilder und technische Daten von arduinomodules.info
Die Belegung für das Modul ergeben sich aus dem Datenblatt des CHQ1838 bzw. erfolgt der Anschluss am RPi wie folgt:

Anschluss Pin/GPIO Anschluss am Modul
Masse - Pin 6 linker Anschluss auf dem rechten Bild
Vcc 3,3V Pin 1 mittlerer Anschluss auf dem rechten Bild
Send S Pin 12 = GPIO 18 rechter Anschluss auf dem rechten Bild

Verkabel sieht das dann so aus:
Rot = Vcc +3,3V, Schwarz = Masse, Braun = Send

Konfiguration anpassen

Die Kabel sitzen? Dann verbinde den RPi mit dem Netzteil und öffne auf deinem Linux-Desktop ein Terminalfenster.
* Verbinde dich per SSH mit dem RPi

ssh root@<RPi-IP>

Bei der ersten Verbindung solltest du das sehen:

The authenticity of host 'RPi-IP (RPi-IP)' can't be established.
ECDSA key fingerprint is SHA256:CJvXUC7vxK1XwaGQAbxoC5xyV5p6Qivqp9mTLMOWODc.
Are you sure you want to continue connecting (yes/no)?

Gib yes ein und drücke die Entertaste. Bei der kommenden Passwortabfrage gibst du das Kennwort für SSH-Verbindungen ein (Standard: libreelec). Wenn alles richtig ist bist du mittels der SecureSHell auf dem RPi:

##############################################
#                 LibreELEC                  #
#            https://libreelec.tv            #
##############################################
 
LibreELEC (official): 9.0.2 (RPi2.arm)
LibreELEC:~ # 
  • Das Systemlaufwerk auf dem Flashspeicher ist nicht beschreibbar. Um das zu ändern gib folgendes ein:
mount -o remount,rw /flash/
  • Anpassen der Systemkonfiguration
nano /flash/config.txt
  • Die Systemkonfiguration wird im Editor angezeigt. Bis zum Ende scrollen und die Zeile dtoverlay=gpio-ir einfügen.
...
################################################################################
# End of default configuration
################################################################################
 
dtoverlay=gpio-ir
 
################################################################################
# Include distribution specific config file if it exists.
################################################################################
...
  • Zum Speichern die Tastenkombination STRG+O dann Enter und zum Verlassen vom Editor STRG+X drücken
  • Den RPi zum Abschluss nochmal herunterfahren und vom Strom trennen um die Kabel nochmal zu checken, oder wenn alles passt rebooten.
shutdown now #fährt den RPi herunter, dann vom Strom nehmen
reboot now #bootet den RPi durch
  • Nach dem Bootvorgang wieder wie bereits beschrieben eine SSH-Verbindung öffnen.

IR-Modul und Empfang prüfen

mode2 --driver default --list-devices

Das sollte in etwa so aussehen:

/dev/lirc0 [(null):(null)] ? ? version: ? serial: ?

und jetzt

mode2 --driver devinput --list-devices

sollte da so etwas liefern

/dev/input/event4 [(null):(null)] ? ? version: ? serial: ?
/dev/input/by-path/platform-ir-receiver@12-event -> ../event4
ir-keytable

liefert in etwas das da

Found /sys/class/rc/rc0/ (/dev/input/event4) with:
	Name: gpio_ir_recv
	Driver: gpio_ir_recv, table: rc-rc6-mce
	lirc device: /dev/lirc0
	Supported protocols: other lirc rc-5 rc-5-sz jvc sony nec sanyo mce_kbd rc-6 sharp xmp 
	Enabled protocols: lirc nec rc-6 
	bus: 25, vendor/product: 0001:0001, version: 0x0100
	Repeat delay = 500 ms, repeat period = 125 ms

Sollte bei dir die Ausgaben leer bleiben, gehe nochmal die Verkabelung usw. durch. Oft liegt der Fehler im Detail. Erst wenn die oberen Abfragen ein Ergebnis geliefert haben kannst du den IR-Empfang prüfen.

  • IR-Empfang prüfen
mode2 -d /dev/lirc0 
	Using driver default on device /dev/lirc0
	Trying device: /dev/lirc0
	Using device: /dev/lirc0
	Warning: Running as root.
  • Jetzt einfach mal die Fernbedienung auf den Empfänger richten und ein paar Tasten drücken. Der Output sollte etwas in dieser Richtung liefern. Da kommt schnell viel Output zusammen. Zum beenden STRG+C drücken.
space 16777215
pulse 75
pulse 125718
space 862386
space 845173
pulse 247
space 44475
pulse 8988

Verwendetes Protokoll ermitteln

Der Befehl „ir-keytable“ hat vorhin eine Zeile mit den unterstützen Protokollen ausgegeben, erinnerst du dich? Supported protocols: other lirc rc-5 rc-5-sz jvc sony nec sanyo mce_kbd rc-6 sharp xmp.
Jetzt geht es darum das Protokoll zu ermitteln, damit wir anschließend die Keycodes auslesen können. Dazu testen wir ein Protokoll nach dem anderen bis wir einen Output erhalten.

ir-keytable -p jvc -t
      Protocols changed to jvc 
      Testing events. Please, press CTRL-C to abort.

Ein paar Tasten auf der Fernbedienung drücken. Kommt kein Output mit STRG+X abbrechen und das nächste Protokoll checken.

ir-keytable -p nec -t
      Protocols changed to jvc 
      Testing events. Please, press CTRL-C to abort.

Hier habe ich eine Ausgabe erhalten die in etwa so aussieht. Interessant wird jetzt das was hinter scancode steht ;-):

459.223349: lirc protocol(nec): scancode = 0x43
459.273334: lirc protocol(nec): scancode = 0x43 repeat
459.850004: lirc protocol(nec): scancode = 0x43
459.903331: lirc protocol(nec): scancode = 0x43 repeat
460.360003: lirc protocol(nec): scancode = 0xd
460.413331: lirc protocol(nec): scancode = 0xd repeat
461.000023: lirc protocol(nec): scancode = 0x15
461.220021: lirc protocol(nec): scancode = 0x14
461.273333: lirc protocol(nec): scancode = 0x14 repeat
461.606706: lirc protocol(nec): scancode = 0x46
461.659999: lirc protocol(nec): scancode = 0x46 repeat
462.273343: lirc protocol(nec): scancode = 0x13
462.326664: lirc protocol(nec): scancode = 0x13 repeat
462.636667: lirc protocol(nec): scancode = 0x50
462.686663: lirc protocol(nec): scancode = 0x50 repeat
463.043350: lirc protocol(nec): scancode = 0x3

Keytable-File erstellen

Dieser Schritt besteht aus eigentlich zwei Schritten. Dazu machst du am Besten noch eine zweite SSH Session in einem zweiten Konsolenfenster wie oben beschrieben auf. Ich nenne die Sessions der Übersicht halber SSH1 und SSH2. In SSH1 erstellen wir die sog. Keytable und in SSH2 ermitteln wir die Keycodes der Fernbedienung. Jede Aktion weißt einem sogenannten Keyword den Scancode zu. Keywords sind zwar frei wählbar, das erfordert aber im Nachgang noch einen hohen Konfigurationsaufwand. Die standardmäßig vorhandenen Keywords reichen für unseren Zweck vollkommen aus. Eine Überisicht aller Keywords kannst Du z.B. in einem dritten Konsolenfenster SSH3 folgendermaßen erhalten cat /usr/share/kodi/system/Lircmap.xml - die letzten beiden Abschnitte des XML <remote device=„devinput“>…</remote>. Hier werden den Tasten (Keys) die Keywords zugewiesen. Zum Beispiel hat die Aktion/Taste Stop das Keyword KEY_STOP, usw. usf.
<left>KEY_LEFT</left>
<right>KEY_RIGHT</right>
<up>KEY_UP</up>
<down>KEY_DOWN</down>
<select>KEY_OK</select>
<enter>KEY_ENTER</enter>

In SSH1 erstellen wir nun die Zuordnung von Keyword → Scancode oder in anderen Worten von Aktion → Transpondersignal, also genau das was später passieren soll, wenn man die Taste auf der Fernbedienung drückt.

nano /storage/.config/rc_keymaps/MyRemote

Die erste Zeile enthält den Namen der Keytable und das ermittelte Protokoll. Danach eine Leerzeile, und jetzt die Keywords. In dem Beispiel ordnen „erschaffen“ wir 19 Aktionen. Wenn bei dir ein anderes Protokoll funktioniert hat, dann schreibst du das anstelle von nec. MyRemote ist auch nicht in Stein gemeiselt und frei wählbar.

# table MyRemote, type: nec 
 
KEY_UP
KEY_DOWN
KEY_LEFT
KEY_RIGHT
KEY_OK
KEY_BACK
KEY_CONTEXT_MENU
KEY_EXIT
KEY_INFO
KEY_SUBTITLE
KEY_AUDIO
KEY_PLAY
KEY_PAUSE
KEY_STOP
KEY_FASTFORWARD
KEY_REWIND
KEY_NEXT
KEY_PREVIOUS
KEY_POWER
IR Scancodes auslesen

In SSH2 ermitteln wir die Keycodes/Scancodes für die jeweilige Aktion.

ir-keytable -p nec -t
      Protocols changed to nec 
      Testing events. Please, press CTRL-C to abort.

Jetzt fangen wir mit der Taste „UP“ (das ist bei mir ein Steuerkreuz mit hoch, runter, links, rechts und ok) und drücken die Taste für KEY_UP auf der Fernbedienung. Das erzeugt pro Taste eine Ausgabe mit unterscheidlichem scancode. 0x13 für UP, 0x41 für DOWN, 0x44 für LEFT, 0x57 für RIGHT, 0x50 für OK. Das machen wir, bis wir für jede definierte Aktion (KEYWORD) eine Taste auf der Fernbedienung gedrückt haben. Das machst Du für jede Taste die du definieren möchtest. Das Wörtchen repeat interessiert uns nicht, es hat was mit der Widerholrate zu tun.

2322.563151: lirc protocol(nec): scancode = 0x13
2335.003164: lirc protocol(nec): scancode = 0x41
2335.053148: lirc protocol(nec): scancode = 0x41 repeat
2341.056483: lirc protocol(nec): scancode = 0x44
2341.109811: lirc protocol(nec): scancode = 0x44 repeat
2341.856491: lirc protocol(nec): scancode = 0x57
2343.396489: lirc protocol(nec): scancode = 0x50
2343.449813: lirc protocol(nec): scancode = 0x50 repeat
</bas>
Diese Codes notieren wir uns und übertragen sie in das Tablefile in SSH1.
<code bash>
# table MyRemote, type: nec 
 
0x13 KEY_UP
0x41 KEY_DOWN
0x44 KEY_LEFT
0x57 KEY_RIGHT
0x50 KEY_OK
0x11 KEY_BACK
0x7 KEY_CONTEXT_MENU
0x47 KEY_EXIT
0x5e KEY_INFO
0x4b KEY_SUBTITLE
0x40 KEY_AUDIO
0x49 KEY_PLAY
0x5a KEY_PAUSE
0x1d KEY_STOP
0x1b KEY_FASTFORWARD
0x54 KEY_REWIND
0x4a KEY_NEXT
0x4d KEY_PREVIOUS
0x1e KEY_POWER

Sofern du alle Scancodes ermittelt hast kannst du SSH2 und SSH3 mit dem Befehl exit verlassen.

Testen der neuen Keymap

Zuerst leeren wir die Defaultwerte. Wer wissen will was die Defaulwerte sind kann mit ir-keytable -r nachschauen.

ir-keytable -c
      Old keytable cleared
Eigene Keymap laden
ir-keytable -w /storage/.config/rc_keymaps/MyRemote 
      Read MyRemote table
      Wrote 19 keycode(s) to driver
      Protocols changed to nec 
ir-keytable -r

Hier sieht man das unsere Scancodes auf das definierte Protokoll „nec“ gemapped wurden. FAST GESCHAFFT!! Wer jetzt auf der Fernbedienung die Steuertasten Hoch (UP), Runter (DOWN) etc. benutzt sieht das sich auch auf dem Bildschirm was tut :-)
Leider ist die geladene Konfiguration nach einem Reboot des Raspberries wieder weg. Schade eigenltich. Jetzt müssen wir Kodi nur noch beibringen, das beim Start unsere Keytable geladen wird.

Keytable rebootsicher machen

nano /storage/.config/rc_maps.cfg

Es genügt folgende Zeile einzutippen zu speichern STRG+O und den Editor mit STRG+X zu verlassen.

* * MyRemote
  • Wer möchte kann nochmal testen
ir-keytable -c
      Old keytable cleared
ir-keytable -w /storage/.config/rc_keymaps/MyRemote 
      Read MyRemote table
      Wrote 19 keycode(s) to driver
      Protocols changed to nec 
ir-keytable -r

Feintuning

Wer möchte kann hier noch etwas Feintuning betreiben.
Der erste Stern steht für den Driver (Treiber), der Stern lädt einfach alle.
Der zweite Stern steht für die Table, der Stern lädt einfach alle.
Der dritte Eintrag verweist auf unsere selbst erstellte Keytable MyRemote unter /storage/.config/rc_keymaps/
Es ist unerlässlich das der Dateiname Keytable genau so heißt wie der Eintrag im File /storage/.config/rc_maps.cfg

  • Um das Konfigfile noch etwas zu verfeinern können wir den Driver und die Table ermitteln:
ir-keytable
Found /sys/class/rc/rc0/ (/dev/input/event4) with:
	Name: gpio_ir_recv
	Driver: gpio_ir_recv, table: rc-rc6-mce
	lirc device: /dev/lirc0
	Supported protocols: other lirc rc-5 rc-5-sz jvc sony nec sanyo mce_kbd rc-6 sharp xmp 
	Enabled protocols: lirc nec 
	bus: 25, vendor/product: 0001:0001, version: 0x0100
	Repeat delay = 500 ms, repeat period = 125 ms

Interessant ist diese Zeile: Driver: gpio_ir_recv, table: rc-rc6-mce

  • Nun nochmal das Konfigfile rc_maps.cfg bearbeiten
nano /storage/.config/rc_maps.cfg

In dem .cfg File steht nun diese Zeile:

gpio_ir_recv rc-rc6-mce MyRemote

Speichern STRG+O, Editor beenden STRG+X und rebooten.

reboot now

GESCHAFFT!!! Jetzt hast Du eine „alte“ Fernbedienung mit Kodi „verbunden“ und du kannst bei Bedarf die genutzten Tasten deiner Universalfernbedienung beibringen und das Original wieder beiseite legen.

rpi_kodi_irremote.txt · Zuletzt geändert: 20.06.2019 11:07 von radirgummir

Seiten-Werkzeuge