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ść:
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 |
|
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:
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 |
|
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ą poleceniamode2 -d /dev/lirc0
, wcześniej trzeba zatrzymać Lirc-asudo /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.