IR Empfänger am Raspberry Pi unter OpenELEC

OpenELEC hat einen Treiber für einen IR Empfänger an einem GPIO Port bereits fest eingebaut und wird bm Start automatisch geladen.

dmesg

[    5.199867] lirc_dev: IR Remote Control driver registered, major 248
[    5.227879] lirc_rpi: module is from the staging directory, the quality is unknown, you have been warned.
[    6.120921] lirc_rpi: auto-detected active high receiver on GPIO pin 18
[    6.121321] lirc_rpi lirc_rpi.0: lirc_dev: driver lirc_rpi registered at minor = 0
[    6.121343] lirc_rpi: driver registered!
...
[   13.352620] input: lircd as /devices/virtual/input/input0

Anschluss

Test, ob Treiber geladen ist und an welchen GPIO empfängt bzw. sendet:

cat /sys/kernel/debug/gpio

GPIOs 0-53, bcm2708_gpio:
 gpio-16  (led0                ) out hi
 gpio-17  (lirc_rpi ir/out     ) in  lo
 gpio-18  (lirc_rpi ir/in      ) in  hi
 gpio-23  (sysfs               ) in  lo
 gpio-24  (sysfs               ) out hi

Auf GPIO 18 (Pin 12) wird die Empfänger Diode angeschlossen, an GPIO 17 (Pin 11) die Sende Diode (falls erwünscht).

Pin Pi Funktion Pin IR
1 3,3V Vs
12 GPIO18 - Empfänger OUT
6 GND GND

Anderen Pin / GPIO für lirc_rpi verwenden

Der lirc_rpi Treiber wird in der Datei /usr/lib/modules-load.d/lirc_rpi.conf mit

lirc_rpi

geladen. Dem Treiber können Parameter beim Booten mitgegeben werde, welche die verwendeten GPIO festlegen. Eine Datei /storage/.config/modprobe.d/lirc_rpi.conf anlegen mit der Zeile:

options lirc_rpi gpio_in_pin=[GPIO-IN] gpio_out_pin=[GPIO-OUT]

Also zum Beispiel Pin 21 (GPIO9) für eingehende und Pin 23 (GPIO11) für ausgehende Signale:

options lirc_rpi gpio_in_pin=9 gpio_out_pin=11

Rapsberry Pi 2

Anscheinend wird das Modul nicht mehr automatisch geladen. Abhilfe schafft der Eintrag

dtoverlay=lirc-rpi

Mit anderen Pins:

dtoverlay=lirc-rpi,gpio_out_pin=14,gpio_in_pin=15

in der Datei /boot/config.txt. Editieren von config.txt:

mount -o remount,rw /flash
nano /flash/config.txt

Danach

mount -o remount,ro /flash

und neu booten.

dmesg | grep 'lirc'
[    3.667447] lirc_dev: IR Remote Control driver registered, major 248
[    3.681240] lirc_rpi: module is from the staging directory, the quality is unknown, you have been warned.
[    4.528984] lirc_rpi: module is from the staging directory, the quality is unknown, you have been warned.
[    4.575834] lirc_rpi: auto-detected active low receiver on GPIO pin 18
[    4.576185] lirc_rpi lirc_rpi: lirc_dev: driver lirc_rpi registered at minor = 0
[    4.576199] lirc_rpi: driver registered!
[    5.448860] input: lircd as /devices/virtual/input/input0

Test des Empfängers

Hilfreicher Thread aus dem Raspberry Forum: http://www.raspberrypi.org/forums/viewtopic.php?&t=26946.

Test, ob LIRC bereits Signale der FB verarbeitet:

irw

Mögliche Ausgaben:

9 0 KEY_8 devinput
9 0 KEY_8_UP devinput
6 0 KEY_5 devinput
6 0 KEY_5_UP devinput
5 0 KEY_4 devinput
5 0 KEY_4_UP devinput
9 0 KEY_8 devinput
9 0 KEY_8_UP devinput
6 0 KEY_5 devinput
6 0 KEY_5_UP devinput
5 0 KEY_4 devinput
5 0 KEY_4_UP devinput
16d 0 KEY_EPG devinput
16d 0 KEY_EPG_UP devinput

Test, ob überhaupt was ankommt

LIRC Dämon beenden und IR Device direkt abfragen:

killall lircd
mode2 -d /dev/lirc0

Tasten einer Fernbedienung sollten Ausgaben wie folgt erzeugen:

space 1010
pulse 940
space 488
pulse 479
space 530
pulse 430
space 538
...

Konfiguration von LIRC und XMBC/Kodi

Siehe Wiki Kodi/LIRC.

Mapping IR --> LIRC

Lirc mappt mit Hilfe der Konfigurationsdatei lircd.conf die Signale des IR Empfängers auf definierte Tastennamen. Die Konfigurationsdatei liegt üblicherweise unter /etc/lirc/lircd.conf, bei OpenELEC kann eine benutzerdefinierte Konfiguration unter /storage/.config/lircd.conf abgelegt werden.

begin remote

  name  /storage/.config/lircd.conf
  bits           13
  flags RC6|CONST_LENGTH
  eps            30
  aeps          100

  header       2861   921
  one           468   494
  zero          468   494
  pre_data_bits   24
  pre_data       0x1BFF83
  gap          106683
  toggle_bit_mask 0x8000
  rc6_mask    0x100000000

      begin codes
         KEY_1                    0x1BFE
         KEY_2                    0x1BFD
         KEY_3                    0x1BFC
         KEY_4                    0x1BFB
         KEY_5                    0x1BFA
         KEY_6                    0x1BF9
         KEY_7                    0x1BF8
         KEY_8                    0x1BF7
         KEY_9                    0x1BF6
         KEY_0                    0x1BFF
         KEY_EPG                  0x1BD9
         KEY_CONTEXT_MENU         0x1BA4
         KEY_MENU                 0x1BDB
         KEY_INFO                 0x1BE3
         KEY_EXIT                 0x1BDC
         KEY_ESC                  0x1BA3
         KEY_UP                   0x1BE1
         KEY_LEFT                 0x1BDF
         KEY_OK                   0x1BDD
         KEY_RIGHT                0x1BDE
         KEY_DOWN                 0x1BE0
         KEY_CHANNELUP            0x1BED
         KEY_CHANNELDOWN          0x1BEC
         KEY_BACK                 0x1BA1
         KEY_REWIND               0x1BEA
         KEY_PLAY                 0x1BE9
         KEY_PAUSE                0x1BE7
         KEY_FORWARD              0x1BEB
         KEY_RECORD               0x1BE8
         KEY_STOP                 0x1BE6
         KEY_NEXT                 0x1BA2
         KEY_VIDEO                0x1BB7
      end codes

end remote

Die Datei kann interaktiv aufgezeichnet werden mit:

killall lircd
irrecord /storage/.config/lircd.conf

Eine Liste der Tastennamen erhält man mit:

irrecord --list-namespace

Mapping LIRC --> XBMC/Kodi

Die Tasten aus LIRC werden nun auf XBMC/Kodi Tasten umgewandelt. Das geschieht durch Angabe eines Mapping in der Datei /storage/.xbmc/userdata/Lircmap.xml.

<lircmap>
    <remote device="devinput">

       <!-- 0..9 -->
       <one>KEY_1</one>
       <two>KEY_2</two>
       <three>KEY_3</three>
       <four>KEY_4</four>
       <five>KEY_5</five>
       <six>KEY_6</six>
       <seven>KEY_7</seven>
       <eight>KEY_8</eight>
       <nine>KEY_9</nine>
       <zero>KEY_0</zero>

       <!-- AV -->
       <display>KEY_VIDEOS</display>

       <!-- Guide, 16:9 -->
       <guide>KEY_EPG</guide>
       <title>KEY_CONTEXT_MENU</title>

       <!-- Menu, Info, Exit -->
       <menu>KEY_MENU</menu>
       <info>KEY_INFO</info>
       <back>KEY_EXIT</back>

       <!-- Return -->
       <back>KEY_ESC</back>

       <!-- Left, Right, Up, Down, OK -->
       <left>KEY_LEFT</left>
       <right>KEY_RIGHT</right>
       <up>KEY_UP</up>
       <down>KEY_DOWN</down>
       <select>KEY_OK</select>

       <!-- +, - -->
       <channelplus>KEY_CHANNELUP</channelplus>
       <channelminus>KEY_CHANNELDOWN</channelminus>

       <!-- Rewind, Play, Pause, Forward -->
       <reverse>KEY_REWIND</reverse>
       <play>KEY_PLAY</play>
       <pause>KEY_PAUSE</pause>
       <forward>KEY_FORWARD</forward>

       <!-- Skip Left, Record, Stop, Skip Right -->
       <skipminus>KEY_BACK</skipminus>
       <record>KEY_RECORD</record>
       <stop>KEY_STOP</stop>
       <skipplus>KEY_NEXT</skipplus>

       <!-- Volume Up,Down,Mute -->
       <volumeplus>KEY_VOLUMEUP</volumeplus>
       <volumeminus>KEY_DOLUMEDOWN</volumeminus>     
       <mute>KEY_MUTE</mute>

       <!-- Power -->
       <power>KEY_POWER</power>

       <!-- Red, Gree, Blue, Yellow -->
       <red>KEY_RED</red>
       <green>KEY_GREEN</green>
       <yellow>KEY_YELLOW</yellow>
       <blue>KEY_BLUW</blue>

       <!-- etc -->
       <subtitle>KEY_SUBTITLE</subtitle>
       <teletext>KEY_TEXT</teletext>
       <playlist>KEY_LIST</playlist>

    </remote>
</lircmap>

Die Standardbelegung ist hier zu finden: /usr/share/xbmc/system/Lircmap.xml
XBMC Kommandos stehen in remote.xml, siehe https://github.com/xbmc/xbmc/blob/master/system/keymaps/remote.xml
Die Namen der XBMC Tasten finde sich hier: http://wiki.xbmc.org/index.php?title=Action_IDs oder hier: https://github.com/xbmc/xbmc/blob/master/xbmc/input/ButtonTranslator.cpp

Links