itoutline.me

 

Lirc i Raspberry Pi

Po dłuższym okresie czasu postanowiłem odkurzyć Harmony 900, od kiedy przesiadłem się na ATV zostałem przy natywnym pilocie do tego urządzenia. Trochę niesamowite jak fajny jest pilot do Apple Tv, jedyne czego mu brakuje to możliwość regulacji głośności. Przy okazji pomyślałem, że sprawdzę jak wygląda sytuacja z Lirc-em na RPi i okazuje się, że jest bardzo dobrze.

Podłączenie odbiornika IR

W swoim “magazynku” znalazłem czujnik TSOP34836 i przyznam, że wykorzystałem ten bo akurat taki miałem… Działa na zalecanym napięciu 3V (od 2,7 do 5,5V) i maksymalnie pobiera 3mA (w trakcie moich testów nie przekroczył 1,25mA), czyli nie powinien być żadnym problemem dla portu GPIO.

Podłączyłem go w następujący sposób:

  • Pin 1 - Pin 16 (GPIO 23 RPi)
  • Pin 2 - Pin 14 (GND RPi)
  • Pin 3 - Pin 1 (3,3V RPi)

Konfiguracja RPi

Instalacja Lirc-a:

sudo apt-get update
sudo apt-get install lirc

Dodanie sterowników do sudo vi /etc/modules:

lirc_dev
lirc_rpi gpio_in_pin=23 gpio_out_pin=22

gpio_in_pin=23 do pinu 23 podłączymy odbiornik podczerwieni a do 22 gpio_out_pin=22 nadajnik. Po wydaniu polecenia sudo modprobe lirc_rpi sterowniki powinny się załadować. Można to sprawdzić za pomocą polecenia lsmod | grep lirc, powinniśmy zobaczyć coś takiego:

% lsmod | grep lirc
lirc_rpi                7266  3
lirc_dev               10156  1 lirc_rpi

Następnie w pliku sudo vi /etc/lirc/hardware.conf umieszczamy poniższą zawartość:

(hardware.conf) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
########################################################
# /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=""
########################################################

W kolejnym kroku musimy skonfigurować jakiegoś pilota w pliku sudo vi /etc/lirc/lircd.conf. Ja akurat znalazłem w “szufladzie” coś takiego (opisany jako Microsoft Model 1039):

Pliki konfiguracyjne do naprawdę wielu różnych pilotów można pobrać z http://lirc.sourceforge.net/remotes/. Niestety są one różnej jakości, dlatego mimo wszystko postanowiłem przygotować swój za pomoca polecenia sudo irrecord -d /dev/lirc0 my_mce.conf ;) Trzeba przyznać, że proces jest dosyć żmudny ale w rezultacie wygenerowałem plik oparty na protokole RC6 (bardzo nie lubię plików RAW, są mocno nieprecyzyjne i pilot może działać różnie. Chociaż czasami nie ma wyjścia jeśli producent użył jakiegoś abstrakcyjnego protokolu IR). Wygląda on tak:

(my_mce.conf) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# Please make this file available to others
# by sending it to <lirc@bartelmus.de>
#
# this config file was automatically generated
# using lirc-0.9.0-pre1(default) on Thu Jul 11 13:36:11 2013
#
# contributed by itoutline.me
#
# brand:                      Harmony 900 (device profile MCE-1039)
# model no. of remote control: fully compatible with OEM MCE 1039 (P/N X801143-102)
# devices being controlled by this remote:
#
# Tested on RPi with TSOP34836 connected to gpio_in_pin 23

begin remote

  name MCE
  bits           13
  flags RC6|CONST_LENGTH
  eps            30
  aeps          100
  header       2677   873
  one           466   419
  zero          466   419
  pre_data_bits   24
  pre_data       0x1BFF83
  gap          105884
  min_repeat      3
#  suppress_repeat 3
#  uncomment to suppress unwanted repeats
  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_BLUE                 0x1BA1
          KEY_RED                  0x1BA4
          KEY_GREEN                0x1BA3
          KEY_YELLOW               0x1BA2
          KEY_MENU                 0x1BDB #'Movies' on Harmony 900 LCD and 'DVD Menu' on MCE 1039 Remote
          KEY_INFO                 0x1BF0
          KEY_EXIT                 0x1BDC #'Back' on Harmony 900 LCD and MCE 1039 Remote
          KEY_UP                   0x1BE1
          KEY_DOWN                 0x1BE0
          KEY_LEFT                 0x1BDF
          KEY_RIGHT                0x1BDE
          KEY_OK                   0x1BDD
          KEY_VOLUMEDOWN           0x1BEE
          KEY_VOLUMEUP             0x1BEF
          KEY_MUTE                 0x1BF1
          KEY_START                0x1BF2
          KEY_CHANNELDOWN          0x1BEC
          KEY_CHANNELUP            0x1BED
          KEY_PLAY                 0x1BE9
          KEY_PAUSE                0x1BE7
          KEY_RECORD               0x1BE8
          KEY_STOP                 0x1BE6
          KEY_REWIND               0x1BEA
          KEY_FORWARD              0x1BEB
          KEY_PREVIOUS             0x1BE4
          KEY_NEXT                 0x1BE5
          KEY_ASCPECT              0x7BD8
          KEY_RECORDEDTV           0x1BB7
          KEY_LIVETV               0x1BDA
          KEY_MYRADIO              0x7BAF
          KEY_MYMUSIC              0x1BB8
          KEY_MYPICTURES           0x1BB6
          KEY_MYVIDEO              0x1BB5
          KEY_AUDIO                0x7BB3
          KEY_CLEAR                0x1BF5
          KEY_ENTER                0x1BF4
          KEY_NUMERIC_STAR         0x7BE2
          KEY_NUMERIC_POUND        0x7BE3
          KEY_AUDIO                0xEBB8
          KEY_POWER                0x7BF3
          KEY_OFF                  0x7BD5
          KEY_ON                   0x7BD6
          KEY_TELETEXT             0x1BA5
          KEY_SUBTITLE             0x7BB2
          KEY_GUIDE                0x7BD9
      end codes
end remote

Jak widać jest tutaj trochę zamieszane a to dlatego, że powyższy plik w pełni obsługuje również profil “MCE-1039” zdefiniowany na Harmony 900:

Czyli pilot ze zdjęcia powyżej działa prawidłowo jak i Harmony 900 ze zdefiniowanym urzadzeniem “MCE-1039”. W przypadku Harmony jest sporo dodatkowych przycisków, których nie ma na moim pilocie “Microsoft Model 1039”.

Kopiujemy wygenerowany plik (lub pobrany z sieci do naszego pilota) w miejsce /etc/lirc/lircd.conf i można uruchamiać Lirc-a sudo /etc/init.d/lirc start

Za pomocą polecenia irw możemy sprawdzić czy rzeczywiście polcenia wysyłane przez pilota są odbierane przez Lirc-a:

U mnie dopiero po restarcie RPi zaczęło to działać.

Go deep

Z uwagi na to, że mam akurat pod ręką oscyloskop postanowiłem zobaczyć jak w rzeczywistości wygląda jakieś polecenie, trafiło na KEY_DOWN 0x1BE0 = 110111110000. Sondę podłączyłem bezpośrednio do wyjścia odbiornika IR.

Przebieg wygląda następująco (RC6 używa “Manchester Encoding” do kodowania sygnału):

Ostatnie 13 bitów to kod polecenia (pokrywa się to z tym co mamy w lircd.conf), następnie są 24 “pre_data_bits” i po ich konwersji do hex otrzymujemy 0x1BFF83 czyli wartość “pre_data”.

W sumie wszystko by się zgadzało :)

Problemy

  • Jeśli wygrzebaliśmy pilota z “szuflady” to zaczynamy od sprawdzenia czy generuje w ogóle jakiś sygnał. Potrzebne jest do tego tak specjalistyczne narzędzie jak telefon z aparatem ;) Naciskanie przycisków powinno powodować pojawienie się fioletowego światła na ekranie telefonu. Szanse na to, że pilot wysyła sygnał ale jest on nieprawidłowy są bliskie 0.

  • Kolejnym krokiem jest sprawdzenie czy sterowniki są poprawnie zainstalowane, czyli lsmod. U mnie wygląda to tak:

  • Jeśli irw nic nie wyświetla warto sprawdzić czy coś w ogóle dociera do portu RPi za pomocą polecenia mode2 -d /dev/lirc0, wcześniej trzeba zatrzymać Lirc-a sudo /etc/init.d/lirc stop. Jeżeli zobaczymy tam jakieś dane to znaczy, że Lirc i konfiguracja pilota zdefiniowana w /etc/lirc/lircd.conf nie do końca chce współpracować z pilotem który mamy.

Comments