ИК-дистанционное управление. Использование LIRC в Python


01.09.2015

Инфракрасное дистанционное управления давно стало обычным явлением и присутствует во многих бытовых приборах. К микрокомпьютеру Raspberry Pi можно подключить ИК-приемник и управлять им обычным пультом, например, от обычного телевизора.

Я приобрел плату с ИК-приемником и пультом. Но можно использовать в качестве ИК-приемника что-то попроще, например TSOP382. Его можно подключать напрямую, как показано на схеме. А в качестве пульта использовать любой пульт дистанционного управления от бытовых приборов.

raspberry_lirc00

LIRC - Linux Infrared Remote Control

LIRC стабильная и проверенная библиотека с открытым кодом, которая позволяет отправлять и получать команды по инфракрасному порту. LIRC поддерживается Raspbian.

Устанавливаем LIRC



sudo apt-get install lirc

Редактируем файл /etc/modules. Добавляем строки:

lirc_dev
lirc_rpi gpio_in_pin=23 gpio_out_pin=22

Где:

gpio_in_pin - Pin входа от приемника.
gpio_out_pin - Pin выхода для передатчика. В моем случае не используется из-за отсутствия передатчика.

Редактируем файл /etc/lirc/hardware.conf:

########################################################
# /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=""
########################################################

Обращаем внимание на строку: DRIVER="default"

Перезапускаем lircd:



sudo /etc/init.d/lirc stop
sudo /etc/init.d/lirc start

Редактируем файл /boot/config.txt. Добавляем строку:

dtoverlay=lirc-rpi,gpio_in_pin=23,gpio_out_pin=22

Где:

gpio_in_pin - Pin входа от приемника.
gpio_out_pin - Pin выхода для передатчика. В моем случае не используется из-за отсутствия передатчика.

Перезагружаем Raspberry Pi:



reboot

Тестируем IR (ИК) приёмник



sudo /etc/init.d/lirc stop
mode2 -d /dev/lirc0

Нажимаем на кнопки пульта и должны увидеть что-то похожее на это:

space 16300
pulse 95
space 28794
pulse 80
space 19395
pulse 83
space 402351
pulse 135
space 7085
pulse 85
space 2903

lircd.conf

Существует очень много различных ИК-пультов с разным форматом передачи данных, количеством кнопок и тому подобное. Для того, чтобы lircd нормально разбирал команды с пульта для каждого пульта нужен отдельный конфиг. Создать новый конфиг рекомендуется используя irrecord.

При использовании irrecord он будет просить вас несколько раз нажимать кнопки различным образом. Выполняйте все, как он просит. В конце надо привязать названия к кнопкам. Не обязательно ко всем, можно только к тем, которые планируете использовать.



irrecord -d /dev/lirc0 ~/lircd.conf

Копируем конфиг в нужное место:



sudo cp ~/lircd.conf /etc/lirc/lircd.conf

Перезапускаем lirc:



sudo /etc/init.d/lirc restart

Или:



service lirc start

Проверяем работу:



irw

При нажатии кнопок на пульте на консоли должна появляться информация, какая кнопка нажата.

irexec

irexec - это программа, которая выполняет команды, в соответствии с полученными ИК сигналами. Команды настраиваются с помощью файла ~/.lircrc

Пример файла:

begin
prog = irexec
button = KEY_1
config = echo "You pressed one"
repeat = 0
end

Запускаем irexec и при нажатии на "1" должны увидеть

You pressed one
You pressed one
You pressed one

python-lirc

python-lirc является расширение Python, которое дает нам возможность через настройки в конфиге ~/.lircrc получать сигналы от ИК пульта в собственном срипте. Сразу нам нужно добавить несколько строк в нашем ~/.lircrc:

begin
prog = irexec
button = KEY_1
config = echo "You pressed one"
repeat = 0
end

begin
prog = myprogram
button = KEY_1
config = one
end

begin
prog = myprogram
button = KEY_2
config = two
end

Теперь можем использовать ИК-пульт в собственном скрипте на Python:



import lirc
sockid = lirc.init("myprogram")
lirc.nextcode()
lirc.deinit()

raspberry_lirc01 raspberry_lirc02

Успехов.

Смотри также:

Коментарі:
Олег говорить:
25.10.2015 02:35
Вы не могли бы помочь советом? У меня все идет хорошо до шага когда нужно проверить работу записанных кнопок, по команде "irw".

Она не распознает записанные кнопки - при нажатии на них ничего не происходит. При этом файл конфета есть и выглядит нормальным:

begin remote

  name  /home/dog/lircd.conf
  flags RAW_CODES|CONST_LENGTH
  eps            30
  aeps          100

  gap          108169

      begin raw_codes

          name KEY_CHANNEL
             8994    4533     560     600     559     601
              558     602     558     600     567     593
              559     601     559     602     557     601
              559    1682     560    1684     557    1691
              552    1682     560    1681     561    1682
              559    1691     552    1683     558    1685
              557     601     558    1685     558     600
              559     607     553     601     559    1681
              561     599     560     600     559    1683
              559     602     564    1677     559    1682
              560    1683     559     600     559    1683
              566

      end raw_codes

end remote

В чем может быть дело? Заранее спасибо!

andre говорить:
26.10.2015 08:32
Тяжело сказать. Ну у меня конфиг немного по другому выглядит:

begin remote

  name  /root/lircd.conf
  bits           16
  flags SPACE_ENC|CONST_LENGTH
  eps            30
  aeps          100

  header       8919  4420
  one           581  1643
  zero          581   531
  ptrail        577
  repeat       8898  2193
  pre_data_bits   16
  pre_data       0xFF
  gap          106171
  min_repeat      1
#  suppress_repeat 1
#  uncomment to suppress unwanted repeats
  toggle_bit_mask 0xF8F8

      begin codes
          KEY_0                    0x6897
          KEY_2                    0x18E7
          KEY_1                    0x30CF
          KEY_3                    0x7A85
          KEY_4                    0x10EF
          KEY_5                    0x38C7
          KEY_6                    0x5AA5
          KEY_7                    0x42BD
          KEY_8                    0x4AB5
          KEY_9                    0x52AD
          KEY_PLAY                 0xC23D
          KEY_NEXT                 0x02FD
      end codes

end remote

Додати коментар
Code
* - обов'язкові поля

Архіви