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

Нажатия будем принимать с помощью YS-IRTM, это дешевая плата с ИК-приёмником и передатчиком, использует микроконтроллер на базе 8051, в котором прошивка для декодирования сигналов с пультов. Интерфейс подключения: UART 5V. Есть подробное описание в этом репозитории на GitHub.

Может читать NEC протокол, который используется на большинстве дешевых пультов. Но есть недостаток, не принимает коды повторов, если клавиша удерживается. Существуют и другие ИК-протоколы, например у Sony есть свой, поэтому пульты Sony не поддерживаются.

Подключение через USB-UART адаптер

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

Подключаем UART адаптер и ищем его в выводе lsusb:

ID 1a86:5523 QinHeng Electronics CH341 in serial mode, usb to serial port converter

Добавляем файл /etc/udev/rules.d/80-user.rules с таким содержимым:

# CH341 serial
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="5523", MODE="0666", TAG+="uaccess"

Достаточно переподключить адаптер и правило будет работать.

Приём сигнала с пульта

По протоколу нажатие передаётся как четыре байта, каждый второй байт это инверсия битов предыдущего.

Например: 40 bf 09 f6

Где первый байт - это идентификатор пульта, второй байт это инверсия первого. Третий байт и его инверсия - это код клавиши на пульте. Так как 8 бит мало для идентификатора, то некоторые производители используют второй байт не равный инверсии первого, то есть как 16-бит идентификатор. Поэтому YS-IRTM возвращает три байта.

Так можно прочитать нажатия на пульте через YS-IRTM подключенный к UART адаптеру:

$ stty -F /dev/ttyUSB0 9600 raw
$ hexdump -v -e '3/1 "%02x " "\n"' /dev/ttyUSB0

При желании можно написать скрипт на bash, который ждёт строки от hexdump и вызывает xdotool с разными параметрами в зависимости от результата. Вот заготовка:

#!/bin/bash
set -e
stty -F /dev/ttyUSB0 9600 raw
stdbuf -oL hexdump -v -e '3/1 "%02x " "\n"' /dev/ttyUSB0 | (
  while IFS= read s; do
    echo $s
    case "$s" in
    "40 bf 46") echo action1 ;;
    "40 bf 47") echo action2 ;;
    esac
  done
)

Чтение YS-IRTM на Си

Ниже пример на Си, что читает коды нажатых клавиш.

#define _GNU_SOURCE 1

#include <stdio.h>
#include <termios.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char **argv) {
	const char *dev = argc > 1 ? argv[1] : "/dev/ttyUSB0";
	int serial = open(dev, O_RDWR | O_NOCTTY | O_SYNC);
	if (serial < 0) return 1;

	struct termios tty = { 0 };
	cfsetispeed(&tty, B9600);
	cfsetospeed(&tty, B9600);
	tty.c_cflag = CS8 | CLOCAL | CREAD;
	tty.c_iflag = IGNPAR;
	tty.c_oflag = 0;
	tty.c_lflag = 0;
	tty.c_cc[VMIN] = 3; // min bytes required
	tty.c_cc[VTIME] = 1; // 1/10s between bytes
	tcflush(serial, TCIFLUSH);
	tcsetattr(serial, TCSANOW, &tty);

	for (;;) {
		unsigned char buf[3];
		int len = read(serial, buf, 3);
		if (len != 3) break;
		printf("%02x %02x %02x\n", buf[0], buf[1], buf[2]);
	}
	close(serial);
}

Теперь мы можем получать нажатия, но нужно их как-то передать системе как нажатия на клавиатуре. Для этого можно использовать библиотеку XTest для X11. Описание здесь.

Вызов выглядит так: XTestFakeKeyEvent(display, keycode, is_press, delay), где "keycode" это код на клавиатуре, "is_press" это состояние клавиши (нажали/отпустили), и "delay" это задержка в миллисекундах.

Пример, который получает код клавиши XK_Left, и зажимает её на одну секунду.

#include <X11/Xlib.h>
#include <X11/keysym.h>
#include <X11/extensions/XTest.h>
 
int main(int argc, char **argv) {
	Display *display = XOpenDisplay(NULL);
	if (!display) return 1;
	int keysym = XK_Left;
	int keycode = XKeysymToKeycode(display, keysym);
	XTestFakeKeyEvent(display, keycode, 1, 0);
	XTestFakeKeyEvent(display, keycode, 0, 1000);
 	XSync(display, False);
 	XCloseDisplay(display);
}

Компилировать так: cc -O2 example.c -o main -lX11 -lXtst. Вероятно, вам понадобится установка пакетов для разработки (пример для Ubuntu): sudo apt-get install libxtst-dev

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

Недостаток

Однако, есть проблема, про которую замечал в начале, YS-IRTM не принимает повторы клавиш, только начало нажатия. Для некоторых приложений, особенно игр, важна возможность удерживать клавишу нажатой. Поэтому придётся повторно тыкать на клавишу, или сделать клавишу переключателем (при первом нажатии клавиша считается нажатой, при следующем нажатии отпускается). Оба варианта мало подходят для игр, я попробовал. Так что остаётся только использовать для мультимедиа функций.

Через программируемые микроконтроллеры и ИК-приёмник (без чипа как в YS-IRTM) можно реализовать все протоколы и читать повторы, но придётся заморочиться куда больше.

Комментарии (17)


  1. Javian
    03.05.2024 04:49
    +6

    Вспомнился Lirc... 2001 год и его версия Winlirc c плеером LightAlloy.

    PS и требовалось деталей всего-то приемник и резисторы со стабилитроном

    https://rumlin.narod.ru/DCD.html


    1. Vilos
      03.05.2024 04:49

      Многократно поддерживаю...когда можно сделать проще - нужно делать проще...в современном мире все с ума посходили от этих микроконтроллеров. Видел как то, тут же на хабре (если не изменяет память) статью, где умелец поворачивал солнечные батареи (мордашкой к солнцу) при помощи микроконтроллера...а всего то нужно фоторезисторы (/фотодиоды) и сельсины. И таких примеров много.

      В любом случае, то что написано в статье, это лучше чем использование всяких Ардуин или STM-ов. Поэтому автору статьи однозначно "+".


      1. Javian
        03.05.2024 04:49
        +8

        Посмотрел цены на новые сельсины... На микроконтроллере с дешевыми шаговиками будет выгоднее.


        1. Vilos
          03.05.2024 04:49

          ну дак кто ж запрещает вам использовать шаговики? Ими можно рулить и без Ардуино... Мой посыл был не о том. Я говорю о том что там где не обязательно использовать микроконтроллеры, не нужно их использовать; да, разработка схем будет несколько сложнее чем написать скетч, но надёжность простых схем и простых компонентов в разы выше, чем втыкать кучу микроконтроллеров, что бы поморгать светодиодом (утрированно говоря)


          1. Javian
            03.05.2024 04:49

            Что ставить - это решает бухгалтер. Если за надежность клиент не платит, то будет решение, которое попадет в рамки бюджета.


            1. Vilos
              03.05.2024 04:49

              Что ставить - это решает бухгалтер...

              А вот для этого и существуют в компаниях должности "Техдиректор", "Директор по техническому блоку" и ежи с ними...Который стукнет кулаком по столу и скажет дескать эксплуатировать эту технику будете не вы дорогой мой бухгалтер, а операционные расходы в виде сопровождения, а так же гарантийного и послегаранийного обслуживания никто не отменял, уж не говоря о лояльности потребителей и удовлетворенностью пользования продукцией.

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

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


              1. Javian
                03.05.2024 04:49

                Тогда бы у нас не было на рынке столько товаров made in China. Сегодня прочитал что РЖД закупил китайские путевые инструменты с качеством в лучших китайских традициях вместо отечественных.


                1. Vilos
                  03.05.2024 04:49

                  Дак я ж вроде дал ремарку "...если только это не госмонополия"

                  Что касаемо товаров made in China, то там так же все работает как я сказал, хочешь быстро срубить бабосиков и уйти с рынка, то там так можно, а если хочешь в долгую - делай качественно...и дааа...в Китае очень много качественной продукции...а что пожелаешь уж купить решай сам. Можно и дешевое можно и дорогое - выбор есть.


                  1. jpegqs Автор
                    03.05.2024 04:49
                    +1

                    хочешь быстро срубить бабосиков и уйти с рынка, то там так можно

                    С вашими рассуждениями в целом согласен. Но производители "плохого" товара нашли способ продолжать это бесконечно. Меняя названия моделей, а потом и бренда. После каждой смены названия покупатель не может найти плохие обзоры на предыдущие низкокачественные модели. Плюс у них есть тактика заваливания рынка большим количеством моделей на той же начинке, только с разным дизайном. Если покупатель не разбирается и ткнёт наугад, то с большой вероятностью попадёт в их продукцию.


          1. red_dragon
            03.05.2024 04:49

            А есть у Вас статистика, что надёжность схем из "простых" компонентов "выше в разы", чем надёжность схем из микроконтроллеров?


      1. NutsUnderline
        03.05.2024 04:49
        +1

        о что написано в статье, это лучше чем использование всяких Ардуин

        Критикую (очень сильно)! во первых, чисто по технике, тут вместо того чтобы использовать ОДНУ ардуину автор использовал ДВЕ платы с двумя контроллерами разными.

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

        Ну и вообще - тянем одеяло в сторону. Так то вообще можно сделать и проводной пульт, да че там просто грамофон - поставить и пружину завести, какие уж там.. сельсины.


        1. jpegqs Автор
          03.05.2024 04:49

          Одновременно с этим заказал на Али плату без контроллера, только с ИК-приёмником, у того же продавца. Там еще пульт в комплекте, но всё равно мелкое. Продавец почему-то оправил обе вещи отдельными пакетами и еще разным классом, так что придёт без контроллера по прогнозам лишь где-то в июне.

          Несмотря на недостатки, мне кажется этот YS-IRTM будет самым простым способом для чтения ИК-пультов с ПК, у которого своего ИК-приёмника нет (то есть не ТВ-бокс или плата разработчика). И компоненты дешевые (хоть и с контроллерами, за YS-IRTM и CH341T отдал в сумме менее 300 рублей), и управлять можно через bash скрипт.

          Кстати, для управления роботами не подойдёт, опять же из-за отсутствия чтения удержания клавиш.


          1. Heggi
            03.05.2024 04:49
            +2

            За 300 рублей можно купить адруинку и TSOP и с помощью https://github.com/Arduino-IRremote/Arduino-IRremote реализовать работу с абсолютно любым пультом (поддерживаемых протоколов там хватает)

            Да, это будет микроконтроллер, но это даст +100500 к гибкости решения.


            1. jpegqs Автор
              03.05.2024 04:49

              Можно, только еще нужно потратить время на изучение SDK для Ардуино (а также поиск и изучение библиотек, компилирование, прошивку и т.д.), а предложенное мной работает сразу. Для тех кто не хочет вникать в программирование микроконтроллеров.


      1. red_dragon
        03.05.2024 04:49
        +2

        Понятие "проще", весьма неоднозначно. Никто в современном мире с ума не сходил по микроконтроллерам. Просто, это одно из тех самых "проще".


  1. Jury_78
    03.05.2024 04:49
    +1

    Купил на барахолке ИК приемник с пультом OVU4003 -

    Использовал через Питон, но не помню есть повтор нажатия или нет.


    1. jpegqs Автор
      03.05.2024 04:49

      Он определяется как HID устройство и работает только с этим пультом, или может с других пультов принимать?

      На Али есть такой вариант.