2013-01-09

Odbiornik podczerwieni/LIRC

Kolejnym moim testem jest podłączenie odbiornika podczerwieni.

Zakupiłem odbiornik IR typu TSOP4838.

Źródło: vishay.com

Nie mam dokładnej dokumentacji, ale z tego co wyczytałem pracuje na częstotliwości 38kHz, ma duży zasięg (niby do 35m), odbiór sygnału pod kątem do 45° i co najważniejsze dobrze pracuje na 3.3V. Można go dostać dość łatwo, mnie kosztował ~3 zł. 

UPDATE: dokumentacja TUTAJ


OSTRZEŻENIE !
Przy podłączaniu wszelkich kabelków należy zachować ostrożność, gdyż może zakończyć się to uszkodzeniem sprzętu lub uszczerbkiem na zdrowiu. Robisz to na własną odpowiedzialność.


UKŁAD
Podłączenie jest banalne, pierwszy pin do GPIO18 (6 z prawej), drugi pin to GND, trzeci pin to 3.3V.  


Instalujemy:
apt-get install lirc
Ładujemy moduł:
modprobe lirc_rpi
w syslogu powinno pojawić się
Dec 31 16:29:04 raspberrypi kernel: [11871.816457] lirc_rpi: auto-detected active low receiver on GPIO pin 18
powinno pojawić się też urzadzenie
# ls -la /dev/lirc0
crw-rw---T 1 root video 250, 0 Dec 31 16:29 /dev/lirc0
następnie
mode2 -d /dev/lirc0
bierzemy pilota (dowolnego - może być od telewizora) i każde wciśnięcie klawisza powinno generować komunikaty pulse space z numerkami...

Coś w tym stylu:
space 17826
pulse 129
space 803
pulse 174
space 790
pulse 100
space 18114
pulse 183
space 806
pulse 205
space 775
pulse 157
space 18484
pulse 222
space 1516
Są to "kody", które odpowiadają wciśnięciu poszczególnych klawiszy. Zamysł jest więc taki, żeby wychwycić taki kod i po jego wystąpieniu wywołać konkretne zdarzenie.

Skorzystamy więc z demona lirc.
LIRC to bardzo ciekawy projekt. Wiele mówiący skrót  Linux Infrared remote control. Polecam poczytanie dokumentacji i możliwości.
Projekt oferuje masę gotowych konfigów - lista supportowanych pilotów:
http://lirc.sourceforge.net/remotes/

Ja gdzieś wygrzebałem bardzo stary pilot, więc wygeneruję sobie plik konfiguracyjny sam.
Najpierw przyda się znajomość dostępnych nazw poszczególnych klawiszy.
irrecord --list-namespace
następnie odpalamy (tu zmiana (lircd.conf) dzięki komentarzom - dzięki:) )
irrecord -d /dev/lirc0 ~/lircd.conf
czyli generator konfiguracji. Każe nam powciskać różne klawisze, po czym mamy gotowy plik z kodami raw dla każdego klawisza pilota.
np dla klawisza 1 w moim pilocie raw_code wygląda tak:
          
name KEY_1

             9096    4465     621     515     619     520

              601     512     625     519     585     546

              600     517     620     517     616     521

              598     516     625    1649     600    1662

              610    1632     623    1653     599    1655

              616    1634     631    1646     597     517

              625     512     595    1659     620     517

              617     521     597     520     627     510

              616     522     594    1655     595    1658

              619     520     616    1633     632    1644

              599    1654     618    1636     620    1654

              600

Kopiujemy wygenerowany plik do /etc/lirc. Następnie musimy przygotować kolejny plik:

# cat /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=""
i możemy wystartować demon
/etc/init.d/lirc start
Weryfikujemy działanie przez komendę:
irw
przy wciśnięciu każdego zdefiniowanego klawisza powinna pojawić się jego nazwa:
0000000000000001 00 KEY_1 pilotMOJ
0000000000000002 00 KEY_2 pilotMOJ
0000000000000003 00 KEY_3 pilotMOJ
000000000000000b 00 KEY_OK pilotMOJ
Tak więc teraz możemy zmapować przycisk do dowolnej komendy. Tworzymy w katalogu domowym plik .lircrc i umieszczamy w nim definicję:
# cat ~/.lircrc
begin
 prog = irexec
 button = KEY_1
 config = echo "Klawisz '1' wcisniety!"
end
uruchamiamy 
irexec
i wciskamy na pilocie przycisk 1, powinno się pojawić
Klawisz '1' wcisniety!
Inna opcja. Tworzymy skrypt, upewniamy się, że jest uruchamialny lub korzystamy z już utworzonego. Ja np po wciśnięciu OK chce mieć wyświetloną temperaturę na dworzu. Korzystam ze skryptu opisanego TUTAJ i dodaję:
begin
 prog = irexec
 button = KEY_OK
 config = echo "Temperatura w tym momencie:"; /projekty/temperatura/getTemp.sh
end

Możemy uruchomić irexec jako demon poprzez:
irexec -d

i aplikacja będzie działać na stałe w tle.

Dokumentacja z parametrami TUTAJ
Warto zwrócić uwagę na parametr repeat - czyli co się stanie jeśli drugi raz wciśniemy dany przycisk. Nieraz nie chcemy przecież, żeby dana aplikacja odpaliła się raz jeszcze, ale np chcemy żeby okno zrobiło się aktywne (np. wyskoczyło okno wcześniej zminimalizowane). Ogólnie jest to dość potężny projekt, więc da się z nim dużo zrobić.

No to teraz ogranicza nas już tylko wyobraźnia. Możemy podpiąć dowolną aplikację pod dowolny przycisk w pilocie i sterować różnymi zdarzeniami (np. uruchomienie XBMC, przeglądarki, wyłączenie systemu, zapalenie diody itp).

Jeszcze tylko dodam, że istnieje projekt umożliwiający współpracę z python-em. Więcej szczegółów http://pylirc.mccabe.nu/

Jest nawet w repozytorium Raspbian-a, więc można go zainstalować:
apt-get install python-pylirc

Inne zastosowanie. 
Np jeśli mamy problemy z libcec, a chcemy korzystać z pilota w XBMC (wspomniane TUTAJ), możemy podpiąć odbiornik i korzystać z dobrodziejstw pilota (jako, że sposób podłączenia jest banalny możemy to zrobić nawet bez płytki stykowej). Oczywiście nie musimy ograniczać się do XBMC - możemy wykorzystać pilota do innych aplikacji. Masa aplikacji multimedialnych ma gotowe konfigi dla pilotów.
Poza tym możemy podpiąć się do wielu domowych urządzeń (np. lampka nocna), czy całe systemy "home automation" i sterować nimi za pomocą zwykłego pilota. Tu prawie nie ma ograniczeń (aczkolwiek zazwyczaj przydaje się już nieco bardziej zaawansowana wiedza z zakresu elektroniki).


30 komentarzy:

  1. Hej,

    A orientujesz się jaki element mógłby posłużyć jako nadajnik podczerwieni? Chciałbym z poziomu R-Pi sterować wieżą (Użyć R-Pi jako pilota)

    Pozdrawiam
    Thot

    OdpowiedzUsuń
    Odpowiedzi
    1. Cześć!

      Można kupić diody nadawcze IR za mniej niż 1zł. Jest też możliwość zakupienia nadajnika IR działającego przez USB. Ja sobie niedawno zamówiłem diodę, jednakże nie miałem czasu jeszcze potestować tego rozwiązania. Mam nadzieję, że wkrótce się uda ....

      więc teoretycznie przy wykorzystaniu lirc (irsend) powinno dać się wysłać dany sygnał...

      pozdrawiam

      Usuń
  2. Witam!

    Miał może kolega problem z double press? Podczas korzystania z komendy irc, aby wywołać zdarzenie przyciśnięcia muszę dwa razy nacisnąć jakiś przycisk. Próbowałem różnych rozwiązań z zagranicznych for ale niestety żadne nie działało.

    Pozdrawiam

    OdpowiedzUsuń
    Odpowiedzi
    1. Witam!
      Przepraszam za czas odpowiedzi ale ostatnio mam sporo na głowie.

      Ja nie miałem takiego problemu. Wszystko zadziałało ok.

      Czy za każdym razem trzeba wcisnąć guzik 2 razy? Czy nieraz działa za pierwszym razem?

      Czy rozwiązanie ze strony projektu:
      http://www.lirc.org/faq.html
      "Most of the time I have to push a button twice for LIRC to recognize it. What's wrong?"
      nie pomaga?

      Ja w takiej sytuacji spróbowałbym może z innym pilotem albo
      przyjrzał się raz jeszcze konfiguracji (co prawdopodobnie już zostało zrobione).

      Pozdrawiam

      Usuń
    2. Witam!

      Nic nie szkodzi :)
      Tak za każdym razem należało wcisnąć 2 razy guzik. Nigdy nie działało za pierwszym razem.

      Posiadam wielofunkcyjny pilot(VIVANCO UR 89) zawierający przyciski TV, VCR, DVD itp. Chciałem ustawić, aby za pomocą przycisku TV mógłbym sterować telewizorem, a przyciskiem VCR raspberry. Do konfiguracji wykorzystałem irrecord. Niby wszystko działało, ale trzeba było za każdym razem wciskać każdy zdefiniowany przycisk 2 razy.

      Następnie na stronie projektu znalazłem plik konfiguracyjny mojego pilota, okazało się, że jedynie za pomocą przyciku TV można wykonać sterowanie. Przy każdym innym przycisku(VCR, DVD itp.) występował problem. Widocznie program koniguracyjny nie mógł do końca poradzić sobie z dekodowaniem sygnałów. W utworzonym pliku konfiguracyjnym brakowało pól bits, flags, one, zero itp. Mam nadzieję, że przyda się to osobom które miały podobny problem.

      Pozdrawiam :)

      Usuń
    3. Dzięki za podzielenie się tą wiedzą :)

      pozdrawiam

      Usuń
  3. Jest chyba literówka:
    "
    następnie odpalamy
    irrecord -d /dev/lirc0 ~/lirc.conf
    "
    Powinny być chyba lircd.conf
    Przynajmniej u mnie :)

    OdpowiedzUsuń
    Odpowiedzi
    1. cześć

      Ja korzystam z pliku lirc.conf - pod taką nazwą wygenerowałem sobie konfig.
      O ile się nie mylę nazwa pliku może być z resztą dowolna ;)

      pozdrawiam

      Usuń
    2. Tzn. chodzi mi o to, że robiłem wg. Twojego opisu (kopiuj, wklej), więc też wygenerowałem pod nazwą lirc.conf. Ale dopóki nie zmieniłem na lircd.conf to nie działało... Gdzieś pewnie można podać ścieżkę do pliku konfiguracyjnego, ale domyślna u mnie wydaje się być /etc/lirc/lircd.conf :)

      Usuń
    3. Dzięki za informację. Ja wygenerowałem pod nazwą lirc.conf i działało.
      No ale masz rację - moja wypowiedź nie jest w 100% jasna.

      Dodam do posta Twoją uwagę (jeśli nie masz nic przeciwko).

      A przy okazji na jakim systemie pracujesz?

      pozdrawiam

      Usuń
    4. Na malince Raspbian :)
      A na PC mam Ubuntu :)

      Oczywiście - nie mam nic przeciwko :)

      Przepraszam, że nie odpisywałem, ale nie dostałem maila o odpowiedzi :(

      Usuń
  4. Odradzam kupowanie IRDy na USB, ja kupiłem a dopiero później przeczytałem:
    "Is my USB IrDA dongle supported by LIRC?
    No, it's technically not possible to use USB IrDA dongles (as specified by the Infrared Data Association) with LIRC. This does not apply to USB receivers in general."
    http://www.lirc.org/faq.html

    OdpowiedzUsuń
    Odpowiedzi
    1. Dzięki za tą uwagę...
      mój błąd że podałem tą informację bez sprawdzenia... (ja nie używałem irdy przez usb)

      pozdrawiamm

      Usuń
  5. W opisie jest mowa że odbiornik IR na 3,3V
    Czy można podłączyć odbiornik IR na 5V ?

    OdpowiedzUsuń
    Odpowiedzi
    1. Szczerze mówiąc ja (zaznaczam że nie jestem specem od elektroniki) bym odradził podłączenie odbiornika bezpośrednio do 5V, gdyż urządzenie nie jest dostosowane do obsługi więcej niż 3.3V (brak żadnego zabezpieczenia prądowego). Grozi to conajmniej uszkodzeniem portu (a może być gorzej)....

      pozdrawiam

      Usuń
  6. Fajna sprawa. Po dwóch dniach walki udało mi się zamapować pilota od DVD Philipsa.
    Mam problem z wysłaniem klawisza BACKSPACE do xbmc.
    Próbowałem zamapować KEY_BACKSPACE pod różne klawisze pilota, ale zawsze działał tak jak KEY_DOWN.

    Czy macie jakieś sugestie co mogę jeszcze zrobić?

    Pozdrawiam

    OdpowiedzUsuń
  7. Witam.
    Mam taki mały problem, może byłbyś w stanie mi pomóc.
    IR zamontowane, sterowniki załadowane, wszystko pomapowane razem z plikiem konfiguracyjnym, problem pojawia się gdy chce odpalić IRW lub IREXEC, tak jakbym w ogóle nie miał tych narzędzi. LIRC zainstalowany poprzez apt-get.

    OdpowiedzUsuń
    Odpowiedzi
    1. Poradziłem sobie. Problemem był błąd jak już tutaj ktoś wyżej wspomniał w nazwie pliku. Zamiast lirc.conf powinien mieć lircd.conf. Pozdrawam ~drag_op.

      Usuń
  8. Witam, czy możliwe jest wykorzystanie LIRC jako bibliotekę w programie napisanym w C lub jak to zrealizować? Chciałbym zrealizować sterowanie silnikiem DC, obroty w lewo/prawo na podstawie przycisków wciśniętych na pilocie. Jest to do zrealizowania? Dzięki, pozdrawiam.

    OdpowiedzUsuń
    Odpowiedzi
    1. Sam czegoś takiego szukam, niekoniecznie do C++, może być również do pythona. Chciałbym sterować wyświetlanymi opcjami na wyświetlaczu 16x2 i uruchamiać z pilota pewne parametry.

      Usuń
    2. Udało mi się to zrobić, ale nie za pomocą LIRC'a. Zamist tego skorzystałem z gotowej biblioteki pigpio. Więcej pod tym linkiem (wraz z przykładami): http://abyz.co.uk/rpi/pigpio/

      Usuń
  9. Dobry poradnik, wszystko się udało. Niestety po podłączeniu karty wifi USB, pilot reaguje raz na kilka prób, a mode2 wypluwa cały czas kody jakby pilot był wciśniety. Sprawę rozwiązałem dając rezystor 100 Ohm na linię 3.3V i kondensator 4.7uF między 3.3V i GND. Teraz wszystkie śmieci są filtrowane. Może komuś się przyda :)

    OdpowiedzUsuń
  10. Fajnie opisane Pytanie do autora Czy opisałby jak podpiąć i skonfigurować kilka odbiorników podczerwieni Mam plan umieszczenia po jednym odbiorniku w każdym pokoju i kuchni (Razem 3)

    OdpowiedzUsuń
  11. Przydatne treści można znaleźć na tym blogu

    OdpowiedzUsuń
  12. Ciekawie wykonany test. Gratuluję pomysłowości i doskonałego wpisu.

    OdpowiedzUsuń
  13. Ten wpis jest bardzo interesujący

    OdpowiedzUsuń
  14. Pouczający jest ten wpis.

    OdpowiedzUsuń