Управление громкостью на Raspberry Pi c ИК-пульта дистанционного управления

Друзья, после установки Алексы на мой Raspberry Pi 3b (далее RPi) возникла идея управлять громкостью, так как зачастую я спрашиваю у Алексы включить музыку. Хорошего микрофона у меня пока еще нет и Алекса просто не слышит мою команду на остановку при громкой музыке. Но если бы микрофон и был, то это бы не решило проблему с уменьшением и увеличением громкости, так как AlexaPi не поддерживает такой функционал. Также, когда мне кто-нибудь звонит на телефон, убавить громкость я не могу и приходится физически отключать питание на RPi. Данная инструкция подойдет всем тем, кто хотел бы управлять громкостью на RPi или выполнять любую другую терминальную команду с помощью ИК-пульта. Дома у меня оказалось 3-и ненужных ИК-пульта, которые простаивали без дела и самый маленький из них я решил задействовать под RPi. Данную установку я проводил на системе Raspbian Buster Lite, версия ядра 4.19. И так, поехали.

Что вам понадобится:

Шаг 1 : Соединяем ИК-приемник с интерфейсом GPIO на RPi

Для начала настроим наш ИК-приемник без монтажа в корпус RPi. Данный ИК-приемник TSOP31238 поддерживает напряжение от 2.5 до 5.5 вольт, поэтому его можно запитать от разъема с напряжением 3.3 или 5 вольт. Соединительные провода можно взять “мама-мама”, но контакты ИК-приемника будут неплотно примыкать внутри данных коннекторов, и поэтому я решил взять провода “папа-мама” и концы с коннекторами “папа” спаять с контактами ИК-приемника для надежности соединения. Также важно знать частоту вашего пульта перед покупкой ИК-приемника, но обычно это 36 или 38кГц. Честно скажу, частоту своего ИК-пульта я не знал и купил на всякий случай второй ИК-приемник с частотой 36кГц, но в итоге он не потребовался.

Распиновка ИК-приемника TSOP31238

Обесточиваем RPi. Далее контакт №1 на ИК-приемнике подключаем к Ground на RPi (физический контакт №9). Контакт №2 на приемнике подключаем к 3V3 (физический контакт №1), а контакт №3 подключаем к GPIO 17 (физический контакт №11).

Диаграмма ввода/вывода общего назначения на RPi

Затем подаем питание, загружаем систему и входим на RPi через SSH c другой машины.

ssh pi@192.168.0.XXX #Локальный IP-адрес RPi

Шаг 2 : Установка LIRC и считывание кодов кнопок ИК-пульта

LIRC это открытый программный пакет, позволяющий принимать и передавать инфракрасные сигналы с помощью Linux.

Обновляем пакеты:

sudo apt-get update

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

sudo apt-get install lirc

Скорее всего установка приведет к ошибке — Failed to start Flexible IR remote input/output application support (Не удалось запустить поддержку приложения удаленного ввода / вывода Flexible IR), поскольку к некоторым конфигурационным файлам LIRCa добавлен суффикс .dist и его нужно удалить путем перемещения файлов с новым именем:

sudo mv /etc/lirc/lirc_options.conf.dist /etc/lirc/lirc_options.conf
sudo mv /etc/lirc/lircd.conf.dist /etc/lirc/lircd.conf

Снова устанавливаем LIRC:

sudo apt-get install lirc

Далее редактирем файл lirc_options.conf:

sudo nano /etc/lirc/lirc_options.conf

Меняем значения driver и device на следующие:

driver = default
device = /dev/lirc0

Открываем файл config.txt в папке boot:

sudo nano /boot/config.txt

Под строкой

# Uncomment this to enable infrared communication.

добавляем следующие значения:

dtoverlay=gpio-ir,gpio_pin=17

Далее останавливаем LIRC, снова запускаем и проверяем, что нет ошибок:

sudo systemctl stop lircd
sudo systemctl start lircd
sudo systemctl status lircd

Перегружаем систему:

sudo reboot

После перезагрузки системы нам нужно протестировать ИК-пульт.

Останавливаем LIRC:

sudo systemctl stop lircd

и вводим следующую команду:

sudo mode2 -d /dev/lirc0

Направляем наш ИК-пульт на ИК-приемник и нажимаем любые кнопки на пульте. Вы должны увидеть что-то похожее:

Using driver default on device /dev/lirc0
Trying device: /dev/lirc0
Using device: /dev/lirc0
Running as regular user pi
space 6169135
space 1853594
pulse 9020
space 4480
pulse 590
space 538
pulse 568
space 539
pulse 598
space 532
pulse 594
space 538
pulse 568
space 565
.....

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

Выйдите из данного режима нажав CTRL+Z.

Все ваши конфигурационные файлы ИК-пультов с расширением .conf должны помещаться в папку /etc/lirc/lircd.conf.d/. В данной папке уже находится файл devinput.lircd.conf, но в данной настройке он нам не потребуется и мы его скроем от LIRC простым перемещением с новым расширением:

sudo mv /etc/lirc/lircd.conf.d/devinput.lircd.conf /etc/lirc/lircd.conf.d/devinput.lircd.conf.copy

Далее нам нужно считать коды клавиш нашего ИК-пульта. В данной настройке я задействовал 4-е кнопки: VOL+, VOL-, зеленая кнопка для выключения/включения звука и красная кнопка для перезагрузки RPi.

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

Заходим в папку home:

cd ~

Вводим следующую команду и жмем Enter

sudo irrecord -d /dev/lirc0 -H default -f

Когда программа выведет:

Press RETURN to continue

Cнова жмем Enter.

Далее, после

Enter name of remote (only ascii, no spaces)

вводим имя пульта. В моем случае alexapi, у вас будет свое имя. Жмем Enter.

Затем программа выведет сдедующее сообщение:

Now start pressing buttons on your remote control.

It is very important that you press many different buttons randomly
and hold them down for approximately one second. Each button should
generate at least one dot but never more than ten dots of output.
Don't stop pressing buttons until two lines of dots (2x80) have
been generated.

Press RETURN now to start recording.

После нажатия Enter нужно в любом порядке нажимать клавиши на пульте, чтобы появилась хотя бы одна точка в терминале. Я каждую клавишу нажимал до появления 2-х точек.

Далее программа выведет сообщение:

Please enter the name for the next button (press <ENTER> to finish recording)

Нужно ввести зарегистрированное имя кнопок. В моем случае это были имена KEY_VOLUMEUP, KEY_VOLUMEDOWN, KEY_MUTE и KEY_POWER.

Если вы хотите узнать все зарегистрированные имена кнопок в irrecord, то до процедуры записи кнопок, можно ввести команду и узнать все имена:

irrecord --list-namespace

После ввода имени кнопки нажмите Enter программа попросит вас нажать соответствующую кнопку на пульте:

Now hold down button "KEY_VOLUMEUP".

Далее программа попросит ввести имя следующей кнопки:

Please enter the name for the next button (press <ENTER> to finish recording)

Если вы уже ввели все кнопки, то просто нажмите Enter

Программа сохранит данные в файл и скажет:

Successfully written config file alexapi.lircd.conf

Открываем данный файл:

nano alexapi.lircd.conf

и видим его структуру

begin remote
  name  alexapi
  flags RAW_CODES|CONST_LENGTH
  eps            30
  aeps          100
  gap          108034
    begin raw_codes
          name KEY_VOLUMEUP
             9018    4467     595     537     621     511
              575     531     597     536     623     513
              573     530     597     535     624     508
              567    1675     623    1620     596    1672
              572    1670     621    1622     600    1668
              577    1665     622    1620     594     538
              622    1620     593    1675     572    1670
              617    1625     600     532     627     505
              570     536     602    1666     568     538
              604     527     621     511     572     533
              596    1673     571    1671     626    1616
              597 
name KEY_VOLUMEDOWN
.....
name KEY_MUTE
.....
name KEY_POWER
.....
    end raw_codes 
end remote

В данном случае у нас считались коды кнопок в “сыром” виде. Их можно оставить как есть, но я предпочел их конвертировать в 32-х битное значение. Сразу сделать их 32-х битными не получилось, т.к. irrecord очень некорректно работает на Raspbian Buster Lite и после многочисленных попыток мне постоянно создавались файлы конфигурации с пустыми значениями кодов кнопок — 0x0. Именно поэтому я “граббил” коды кнопок в два этапа, т.к. эта схема в итоге сработала.

Закрываем файл и вводим команду:

sudo irrecord -d /dev/lirc0 -H default -a alexapi.lircd.conf

В терминале вы должны увидеть новую структуру файла:

begin remote
  name  alexapi
  bits           32
  flags SPACE_ENC|CONST_LENGTH
  eps            30
  aeps          100
  header       9018  4467
  one           598  1651
  zero          598   526
  ptrail        597
  gap          108034
  toggle_bit_mask 0x0
  frequency    38000
    begin codes 
        KEY_VOLUMEUP            0xXXXXXXXX
        KEY_VOLUMEDOWN          0xXXXXXXXX
        KEY_MUTE                0xXXXXXXXX
        KEY_POWER               0xXXXXXXXX
    end codes 
end remote

Копируем новое содержимое из терминала и открываем файл alexapi.lircd.conf:

nano alexapi.lircd.conf

Удаляем все строки из файла – CTRL+K и вставляем новые данные.

Сохраняем файл и перемещаем его в папку /etc/lirc/lircd.conf.d/:

sudo mv alexapi.lircd.conf /etc/lirc/lircd.conf.d/ alexapi.lircd.conf

Запускаем LIRC:

sudo systemctl start lircd

и тестируем наши кнопки введя команду:

irw

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

0000000000ff7887 00 KEY_VOLUMEUP alexapi

Проделайте тоже самое для всех кнопок, с которых вы “сграббили” коды.

Если вы видите вывод значений после нажатия кнопок на ИК-пульте, это значит, что коды нажатых кнопок корректно принимаются ИК-приемником и распознаются LIRCом.

Шаг 3 : Назначение команд кнопкам ИК-пульта

Далее нам нужно создать два bash файла, первый будет отвечать за увеличение громкости, а другой за уменьшение.

Заходим в /usr/bin/

cd /usr/bin

Создаем файл volup:

sudo nano volup

И вставляем в него следующее:

#!/bin/bash
sudo amixer set PCM -- $[$(amixer get PCM|grep -o [0-9]*%|sed 's/%//')+5]%

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

Сохраняем файл и делаем его исполняемым:

sudo chmod +x volup

Далее создаем файл voldown:

sudo nano voldown

и вставляем в него следующее:

#!/bin/bash
sudo amixer set PCM -- $[$(amixer get PCM|grep -o [0-9]*%|sed 's/%//')-5]%

Делаем его исполняемым:

sudo chmod +x voldown

Далее переименовываем файл /etc/lirc/irexec.lircrc.dist в /etc/lirc/irexec.lircrc простым перемещением:

sudo mv /etc/lirc/irexec.lircrc.dist /etc/lirc/irexec.lircrc

Открываем файл irexec.lircrc:

sudo nano /etc/lirc/irexec.lircrc

Стираем все строки, CTRL+K и вставлем в него следующее

 

begin
    prog   = irexec
    remote = alexapi
    button = KEY_POWER
    config = sudo shutdown -r now
end

begin
    prog   = irexec
    remote = alexapi
    button = KEY_VOLUMEUP
    config = sudo volup
end

begin
    prog   = irexec
    remote = alexapi
    button = KEY_VOLUMEDOWN
    config = sudo voldown
end

begin
    prog   = irexec
    remote = alexapi
    button = KEY_MUTE
    config = sudo amixer set PCM toggle
end

Сохраняем файл и далее запускаем команду:

/usr/bin/irexec /etc/lirc/irexec.lircrc

Пробуем нажать красную кнопку POWER на ИК-пульте, система должна перезагрузиться. Это значит что все работает и после перезагрузки системы нужно сделать irexec системным процессом, чтобы он автоматически запускался при старте системы:

sudo systemctl enable irexec

Снова перегрузите систему и ваш ИК-пульт будет готов к работе. По аналогии так можно запрограммировать любые кнопки на пульте с которых вы “сграббили” коды и назначить им терминальные команды в файле irexec.lircrc

Шаг 4 : Установка ИК-приемника в корпус RPi

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

Вам нужно будет отпаять провода от контактов ИК-приемника, затем наметить три отверстия согласно расположению контактов и просверлить их сверлом 1мм. ИК-порт можно приклеить к корпусу клеем ABRO Epoxy Steel. Время его схватывания 10 минут. Я также проклеил контакты с обратной стороны для более надежного сцепления с корпусом. Далее, нарезаем кусочки термоусадки, надеваем их на провода, припаиваем их к клеммам ИК-приемника согласно схеме, надеваем на место пайки термоусадки и паяльным феном усаживаем их.

Далее собираем корпус RPi, устанавливаем на нужно место и подаем питание.

Теперь звуком из вашего RPi можно управлять дистанционно!

Надеюсь Вам понравилась данная инструкция и вы сможете применить данные знания в своих собственные проектах с RPi.

Понравилась инструкция? Тогда поделитесь ей со своими друзьями или попробуйте написать свою собственную!

Регистрация на сайте

Отзывы

  1. TWIkZ,

    На Raspberry Pi 4 (Linux raspberrypi 5.10.63-v7l+) увеличить звук получилось так:
    amixer set Master — $[$(amixer get Master|grep -m1 -o [0-9]*%|sed ‘s/%//’)+5]%

    А выключить/включить звук amixer
    set Master toggle

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

Оставьте свой отзыв

Вы должны Войти, чтобы оставлять отзывы.