Skip to content

Написал Бутылкус в рубрику Raspberry

Здравствуйте, друзья!

ИК-приёмник, ИК-пульт ДУ и ИК-диод-передатчик

ИК-приёмник, ИК-пульт ДУ и ИК-диод-передатчик

Было дело, закупился я двумя вот такими вот модулями. Они, как и все остальные, подключаются к GPIO и выполняют одну простую функцию. В данном случае — приём сигналов по воздуху, по ИК-технологии. В комплекте сразу идут пульты, сами приёмники в готовой обвязке и ИК-диоды (излучатели). Очень удобно.

И вот, спустя полтора года после покупки, я таки до них добрался. Тогда я с ними поковырялся, но с первого раза не завёл. Теперь я расскажу вам, как конкретно запустить всю связку и дойти до стадии «нажал кнопку на пульте — обработал это Python-скриптом».

Зачем оно надо

Дело в том, что у меня возникли проблемы при работе с физическими кнопками в умном доме. Нет, ничего страшного, просто накололся и не продумал сразу используемые технологии. Поэтому понадобился надёжный «аналоговый аналог» кнопок, но без помех. И таким выходом стали ИК-модули.

Давайте же погрузимся в замечательный мир беспроводных технологий!

Итак, нам нужно настроить связку lirc + Python3 + GPIO. Мы будет получать сигнал от ИК-пульта (нажатие нопки), регистрировать его через lircd (демон для работы с ИК-устройствами) и обрабатывать питоном. Поехали!

Для начала установим нужное ПО:

sudo apt update
sudo apt upgrade
sudo apt install lirc
sudo apt install liblircclient-dev
sudo pip3 install python-lirc
  1. Обновляем кеш пакетов и сами пакеты. Ибо это никогда не повредит.
  2. Устанавливаем lircd
  3. Устанавливаем библиотеку для разработчиков, чтобы сработала следующая команда
  4. Через pip3 устанавливаем модуль для Питона 3 версии. Если ввести pip, то будет установлен модуль для 2.7

Теперь можно начинать настройку и тесты.

Подключенный ИК-модуль

Подключенный ИК-модуль

Подключение модуля к Raspberry Pi

Я подключил модуль вот таким образом. С GND и Vcc, я думаю, вопросов нет (это -/земля и +5 соответственно), а вот сигнальный контакт подключен к пину GPIO27. На фотографии это жёлтый провод, ну и подпись на макетной плате можно разобрать.

Правильность подключения и работоспособности модуля можно проверить сразу двумя способами.

Во-первых, можно заметить, что диод тускло светится. Это говорит о том, что модуль готов к работе.

Мерцание приёмника

Мерцание приёмника

Во-вторых, используйте пульт из комплекта или вообще любой другой, понажимайте кнопки. Диод начнёт ярко мигать при приёме сигнала.

Если что-то пошло не так, проверяйте подключение модуля к Raspberry. Убедитесь в надёжном подключении к правильным ногам GPIO-порта.

С железной частью мы закончили, приступим к настройке системы.

Настраиваем Raspberry Pi

Для начала нам надо научить систему вообще распознавать ИК-приёмник как устройство. Для этого проделываем следующее.

Для начала редактируем конфигурационные файлы. Их несколько и все они открываются одинаково в любом удобном вам редакторе. Я использую mcedit, вы можете использовать nano или любой другой.

Для редактирования нужны права суперпользователя, используйте команду вида

sudo mcedit /path/to/file

Не забывайте изменять пин сообразно своей схеме подключения!

# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.

lirc_dev
lirc_rpi gpio_in_pin=27
# /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=""

В следующем файле найдите нужную строку, раскомментируйте и измените:

# /boot/config.txt

# Uncomment this to enable the lirc-rpi module
dtoverlay=lirc-rpi,gpio_in_pin=27

А следующий файл может не существовать, но редактор создаст его автоматически, поэтому смело командуем:

sudo mcedit /etc/modprobe.d/ir-remote.conf

и добавляем в него строку

options lirc_rpi gpio_in_pin=27

Перезагрузите систему

sudo reboot

Готово!

Приступаем к тестам ИК-приёмника

Теперь настало время проверить боеспособность системы. Давайте подгрузим модуль ядра:

sudo modprobe lirc_rpi

Теперь проверьте командой ps, запущен ли демон:

ps ax | grep lircd

452 ?        Ss     0:00 /usr/sbin/lircd --driver=default --device=/dev/lirc0 --uinput

Да, мы видим процесс с PID 452 (у вас может быть другой), а нам нужно освободить устройство, поэтому убиваем демона:

sudo kill 452

Для теста используем штатную утилиту. Она зарегистрирует нажатия на пульте и вы увидите принимаемые данные.

Запускаем mode2:

mode2 -d /dev/lirc0

и теперь при нажатии на кнопки пульта мы должны увидеть что-то подобное:

space 16777215
pulse 9044
space 4555
pulse 542
space 628
pulse 538
space 617
pulse 569
space 595
pulse 575
space 612
pulse 519
space 623
pulse 565
space 606
pulse 534
space 618
pulse 546
space 622
pulse 542
space 1703
pulse 568
space 1677

Всё в порядке! Система видит и понимает сигналы с пульта! Нажмите Ctrl+C, когда наиграетесь =)

Настраиваем кнопки ИК-пульта и готовим почву для Python

Вообще, независимо от задачи, которая будет решаться с помощью пульта дистанционного управления, главный затык у большинства новичков возникает именно здесь.

Проблема всплывает когда мы, начитавшись мануалов, бежим делать что-то суровое без полной настройки своей системы. В итоге половина кнопок окажется не задействована, а вторая половина будет работать абы как. Поэтому здесь важно максимально тщательно и скрупулёзно настроить каждую кнопку пульта.

Сначала нам нужен будет посмотреть, какие вообще виртуальные кнопки мы можем использовать.

Для этого мы воспользуемся следующей командой:

irrecord --list-namespace | grep KEY

Она выведет все доступные кнопки, к которым мы можем привязывать наши сигналы с пульта ДУ. Если вам лень сохранять их, то вот вам

Ну как, впечатляет? Собственно, мы можем превратить любой пульт хоть в клавиатуру, ведь у нас есть аналоги всех возможных физических клавиш.

Теперь можно приступать к собственно конфигурации. Вводите команду и следуйте инструкциям.

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

Главное на данном этапе, как уже сказано выше, не полениться прописать ВСЕ клавиши с пульта.

После того, как вы всё сделали, у вас должен получиться очень милый файл конфигурации, подобный этому:

begin remote

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

  header       9094  4521
  one           574  1674
  zero          574   589
  ptrail        576
  repeat       9095  2251
  pre_data_bits   16
  pre_data       0xFF
  gap          108350
  toggle_bit_mask 0x0

      begin codes
          KEY_0                    0x4AB5
          KEY_1                    0x6897
          KEY_2                    0x9867
          KEY_3                    0xB04F
          KEY_4                    0x30CF
          KEY_5                    0x18E7
          KEY_6                    0x7A85
          KEY_7                    0x10EF
          KEY_8                    0x38C7
          KEY_9                    0x5AA5
          KEY_LEFT                 0x22DD
          KEY_RIGHT                0xC23D
          KEY_UP                   0x629D
          KEY_DOWN                 0xA857
          KEY_OK                   0x02FD
          KEY_PREVIOUS             0x42BD
          KEY_NEXT                 0x52AD
      end codes

end remote

Как видите, у моего пульта 17 клавиш. Собственно, в начале этого поста есть фото. Каждая из них записана в этот конфиг.

Положим этот конфиг туда, где ему самое место:

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

и перезапустим демон lircd:

sudo systemctl restart lirc.service

Проверим результат. Запускаем irw и тычем в кнопочки на пульте. Мы должны видеть что-то подобное:

irw
0000000000ff6897 00 KEY_1 /home/pi/lircd.conf
0000000000ff9867 00 KEY_2 /home/pi/lircd.conf
0000000000ff9867 01 KEY_2 /home/pi/lircd.conf
0000000000ffb04f 00 KEY_3 /home/pi/lircd.conf
0000000000ff30cf 00 KEY_4 /home/pi/lircd.conf
0000000000ff18e7 00 KEY_5 /home/pi/lircd.conf
0000000000ff7a85 00 KEY_6 /home/pi/lircd.conf
0000000000ff7a85 01 KEY_6 /home/pi/lircd.conf
0000000000ff4ab5 00 KEY_0 /home/pi/lircd.conf
0000000000ff4ab5 01 KEY_0 /home/pi/lircd.conf
0000000000ff22dd 00 KEY_LEFT /home/pi/lircd.conf
0000000000ff22dd 01 KEY_LEFT /home/pi/lircd.conf
0000000000ff02fd 00 KEY_OK /home/pi/lircd.conf
0000000000ff02fd 01 KEY_OK /home/pi/lircd.conf

Самое время кричать УРА!!! и бить бокалы!

В прошлый раз на этом я и запоролся, так и не сумев увязать всё в рабочую систему.

Но наша задача сделать пульт ДУ для умного дома, помните?

Поэтому дальше мы будем ковыряться в питоне. Звучит мерзко, но на деле это приятно =)

Python3 + lirc = python-lirc

Эк завернул…

Указанный модуль представляет собой довольно простую прослойку для связи наших питоновых скриптов с ИК-модулем. Подключается к сокету и в соответствии с настройками lircrc возвращает объект, представляющий из себя список параметров для указанной в конфиге программы. Звучит дурацки, но так и есть.

Фишка в том, что модуль для начала получает конфигурационный файл lircrc и разжёвывает его для инициализации. Ему нужен валидный конфиг, поэтому опять же, не поленитесь прописать его в соответствии со своими кнопками. Сравните содержимое /etc/lirc/lircd.conf (чуть выше по тексту) и конфиг ~/.config/.lircrc:

Видите? Кнопки, которые уже описаны в конфиге демона, прописаны и в конфиге клиентской части. Это минимальный набор. Конечно, можно отказаться и от параметра repeat = 0, но в этом случае питон увидит то же самое, что вы видели в выводе irw — удержание кнопки запускает счётчик. Это может быть полезно, если в вашей программе будет предусмотрено долгое нажатие и реакция на него, но мне нужно разовое срабатывание клавиши.

Самое главное здесь три параметра:

  • button > отвечает за привязанную в lircd.conf клавишу
  • prog > вообще это программа в прямом смысле слова. Ей будет передана строка конфигурации из следующего параметра
  • config > то, что передаётся программе в качестве аргументов.

Как можно понять, для одной клавиши может быть несколько разных привязок программ. Скажем, если бы firefox умел обращаться к lirc, то можно было бы переключать вкладки стрелками и добавлять страницы в закладки, нажимая звёздочку. И при этом одновременно chromium был бы настроен иначе. А медиаплеер переключал бы песни. Один пульт — великое множество действий.

Но в нашем случае в качестве «prog» указаны абстрактные «num» и «control». Это я сделал для наглядности работы модуля python-lirc.

Вот исходный код:

#!/usr/bin/python3
#coding=utf-8
#Лицензия GPL v3
#Картинки взяты отсюда: http://www.oocities.org/wraithfivexwing/asciiart/asciisouthpark.txt

import lirc


print("Данная программа демонстрирует работу lirc в связке с Python")

print("Подключаемся к lirc...")
socket = lirc.init("num")
print("Сокет: {0}".format(socket)) 

counter = 0
print("У тебя {0} очков. Набей сто очков, нажимая цифровые клавиши.".format(counter))


while (counter < 100):
    answer = lirc.nextcode()
    if (len(answer) > 0):
        counter = counter + int(answer[0])
        print ("Ты нажал {0}, твой счёт {1}".format(answer[0], str(counter)))

lirc.deinit()

print ("Отлично! Ты набил {0} очков, теперь я жду нажатия ОК для выхода".format(counter))

socket = lirc.init("control")
print("Сокет: {0}".format(socket))

key = ""
while (key != "OK"):
    answer = lirc.nextcode()
    if (len(answer) > 0):
        key = answer[0]
        if (key == "OK"):
            continue
        print ("ты нажал {0}, а я жду OK!".format(key))

lirc.deinit()

print ("""
                            __  _
                  .===.:  ""  ;=====..
              _.-'    _;_. __;     . `"_
            ,          ' 'r-]           -
          .'                             '.
         r^                                .
        r            __       _             \\
        L         .:"--.==.==.--":.         |
   .-==.'________//      |  |   `^C\_.---.__====
   |~   --------//    .-.|  | ,    ] .---""     "
   '            |\     "/ /\ \'    ] |          :
    \            \'...-_,'  '_'...-_-         .'
     '            '---        -----          ]'
      `-_..                                _-'
          \                 -             .'
           `.                           .'
             =.          --__.         -
               "-__                 _.'
                   =.             ." 
                     "-._        /  
                         -.   -.'  
                          [----]:
                        :'      '.
                       -'        |
                                  \
    
                    MMMMKAAAAAYYYY!!!!!
    """)

Как видно из исходного кода, модуль инициируется дважды с разными именами программ для конфига.

Это очень удобно — при выполнении одной части программы мы игнорируем всё, кроме цифровых клавиш, в другой части — читаем только клавиши в верхней части пульта.

Таким образом достигается большая гибкость в использовании пультов.

Собственно, на этом всё =) Удачи и не забывайте подписываться на канал.


Метки: , , , ,