Linux32 - Блог



LINUX32

Свобода выбирать


ArchLinux
Блог >> 2014 >> Март


23.03.2014

Управление компьютером с помощью ПДУ




Всем доброго дня.

Сегодня хочу рассказать про управление компьютером с помощью пульта дистанционного управления (приношу извинения за тавтологию). В Linux для этих целей есть замечательная программа Lirc которую даже портировали на Windows из-за ее замечательности (считаю это достижением для свободной и открытой программы). О ней и поведем речь.

Немного теории: lirc считает пульт обычной клавиатурой, вернее не совсем обычной, из-за ее "удаленного" подключения. lircd "слушает" сигналы, передаваемые пультом, переводит их с помощью своих конфигурационных файлов в формат, понятный для irexec, а тот в свою очередь уже запускает нужную программу или функцию. В Archlinux всем этим управляют с помощью трех конфигурационных файлов: lircd.conf, находящегося в папке /etc/conf.d и отвечающего за то какое устройство "слушать", какой драйвер использовать и за опции запуска lircd; опять же lircd.conf, но уже находящегося в папке /etc/lirc и содержащего названия и коды соответствующих кнопок и .lircrc, находящегося в домашней папке пользователя и отвечающего за связь кнопок пульта с выполнением различных задач на компьютере.

Теперь сама история: в моем компьютере есть PCI тв-тюнер, к которому сохранился родной пульт ДУ. Почти в самом начале моего освоения линкса я узнал про лирк - что с его помощью на компьютере пультом можно не только переключать телевизионные каналы, но и использовать его во множестве других программ, например смотреть фильмы, управляя плеером пультом лежа на диване и т. д. Я решил попробовать. В файле /etc/conf.d/lircd.conf прописал используемый драйвер и устройство "ввода". Затем командой

irrecord --device=<мое устройство> --driver=<драйвер> /etc/lirc/lircd.conf


создал файл, описывающий кнопки именно моего пульта. Замечу что таким образом можно "обучить" компьютер понимать практически любой пульт за исключением некоторых моделей Panasonic (если верить интернету). Далее описал реакции программ на нажатия кнопок пульта в .lircrc и запустил lirc и irexec

sudo systemctl enable lirc
sudo systemctl start lirc
irexec -d


Тут немного соврал: в то время я запускал lirc другой командой, так как systemd еще не было, но сейчас та команда запуска уже не актуальна. Да, нужно еще добавить в автозапуск irexec чтобы после перезагрузки все работало.

Перезагрузил компьютер для надежности и... все заработало! Теперь я управлял тв-тюнером, видео- и аудиоплейером с пульта. Мне это конечно очень понравилось и я стал искать другие возможности его применения. Позже выяснил что не все программы имеют встроенную поддержку lirc как мне хотелось бы, но большинство программ имеют поддержку "горячих" клавиш. Вот тут на помощь пришла небольшая утилита xdotool, которая эмулирует нажатия клавиш клавиатуры и мыши. В общем связка lirc, xdotool и irexec оказалась очень удачной!

Теперь продолжение: недавно мне захотелось вдохнуть новую жизнь в свой старый компьютер. Я снес с него винду и поставил arch с openbox чтобы был пошустрее, а также почти такой же тв-тюнер как и в новом компьютере, в основном для того чтобы была возможность управлять им с пульта (в тв-тюнере есть ИК-приемник). Правда пульт от этого тв-тюнера не сохранился, но я был убежден что раз с помощью irrecord компьютер можно обучить любому пульту, то это не проблема. Оказалось проблема...

Выяснилось что тв-тюнер работает только с родным пультом! Пришлось искать пути решения этой проблемы. Нашлись вот такие:

1) Купить готовый ик-приемник вместе с пультом;

2) Спаять самодельный ик-приемник по любой из множества представленных в интернете схем. Например по этой;

3) Использовать микрофонный вход встроенной аудиокарты компьютера в роли ик-приемника.

Я решил попробовать третий способ, не столько потому что он не требовал никаких материальных затрат, сколько потому что он самый экзотический из всех и мне было интересно, получится ли вообще что-нибудь из этой затеи. Все отличие этого способа в том что в lircd.conf нужно указывать драйвер audio_alsa и правильное устройство захвата звука. Здесь пульт выступает в роли микрофона, поэтому сигналы с пульта записывает устройство записи с именем вида: hw:#,# . Где первый символ # - это номер вашей аудиокарты в интерпритации alsa, второй # - номер устройства этой аудиокарты (по крайней мере так написано в документации Lirc). Сколько я не пробовал всевозможных вариантов обозначения устройства захвата при запуске lirc - ничего не выходило. Пока однажды где-то в интернете не заметил одну особенность: при запуске lirc устройство захвата обозначалось не hw:#,# , а default. То есть строка запуска lirc выглядела так:

sudo lircd --driver=audio_alsa --device=default


При таком написании lirc наконец-то заработал. Но, как обычно одно "но": Такой способ работал на моем новом компьютере, где и без него лирк отлично себя чувствовал с родным пультом от тв-тюнера и не работал на старом компьтере, ради которого все и начиналось.

Ничего не оставалось, кроме как использовать второй способ - спаять самодельный ик-приемник. Купил необходимые комплектующие, спаял (заодно и прокачал свой уровень владения паяльником). Настроил. Для настройки через com-порт нужно запускать lirc такой командой предварительно загрузив модуль ядра lirc_serial, освободив, если занят нужный com-port:

sudo setserial /dev/ttyS0 uart none
sudo modprobe lirc_serial
sudo lircd --driver=default --device=/dev/lirc0


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

Я очень удивился когда после перезагрузки пульт не заработал... Очень долго пытался найти причину, все перепробовал, но ни в какую. Даже решил уже бросить все это дело, раз оно упорно не хотело у меня получаться. Но как-то нечаянно, при очередной попытке все это заставить, наконец, работать, я перед всеми настройками ввел команду:

sudo setserial /dev/ttyS0 uart none


а после нее уже все как обычно настраивал дальше. И эта попытка оказалась удачной.

Дело оказалось вот в чем: com-порт при загрузке компьютера был постоянно занят системой, поэтому он не работал с ик-приемником. Если он занят, то, как уверяли во всех мануалах по лирку, модуль lirc_serial не загрузится. А чтобы его загрузить, нужно освободить com-порт, введя предыдущую команду. Так как во всех моих безуспешных попытках я проверял загружен ли lirc_serial и lsmod постоянно говорил мне что он загружен, причем безо всяких ошибок, то и найти причину такого поведения не мог.

Теперь, зная причину всего этого, я написал сервис lirc_serial.service для systemd, который освобождает com-порт и загружает модуль:

[Unit]
Description=Linux Infrared Remote Control

[Service]
ExecStartPre=/usr/bin/setserial /dev/ttyS0 uart none
ExecStart=/usr/bin/modprobe lirc_serial
ExecStop=/usr/bin/rmmod lirc_serial
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target


Кстати, если используется второй, третий,... com-порт, то необходимо вместо ttyS0 поставить соответствующую цифру.

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

Теперь уже точно можно сказать что пульт я настроил. Заодно и обучение прошел по настройке, проверке и использованию com-портов в Linux.

Тем, кто осилил всю статью до конца лучи добра. Оставляйте комментарии, обсудим.

Статья


Ваш комментарий:

Имя:
E-mail:
Код с картинки:
Комментарий: