Управление громкостью на Raspberry Pi c ИК-пульта дистанционного управления
Друзья, после установки Алексы на мой Raspberry Pi 3b (далее RPi) возникла идея управлять громкостью, так как зачастую я спрашиваю у Алексы включить музыку. Хорошего микрофона у меня пока еще нет и Алекса просто не слышит мою команду на остановку при громкой музыке. Но если бы микрофон и был, то это бы не решило проблему с уменьшением и увеличением громкости, так как AlexaPi не поддерживает такой функционал. Также, когда мне кто-нибудь звонит на телефон, убавить громкость я не могу и приходится физически отключать питание на RPi. Данная инструкция подойдет всем тем, кто хотел бы управлять громкостью на RPi или выполнять любую другую терминальную команду с помощью ИК-пульта. Дома у меня оказалось 3-и ненужных ИК-пульта, которые простаивали без дела и самый маленький из них я решил задействовать под RPi. Данную установку я проводил на системе Raspbian Buster Lite, версия ядра 4.19. И так, поехали.
Что вам понадобится:
- ИК-приемник, TSOP31238, 38кГц – 1шт.
- Соединительные провода Female-Male Jumper Wire – 3шт.
- Паяльник
- Припой
- Термоусадка
- Паяльный фен
Шаг 1 : Соединяем ИК-приемник с интерфейсом GPIO на RPi
Для начала настроим наш ИК-приемник без монтажа в корпус RPi. Данный ИК-приемник TSOP31238 поддерживает напряжение от 2.5 до 5.5 вольт, поэтому его можно запитать от разъема с напряжением 3.3 или 5 вольт. Соединительные провода можно взять “мама-мама”, но контакты ИК-приемника будут неплотно примыкать внутри данных коннекторов, и поэтому я решил взять провода “папа-мама” и концы с коннекторами “папа” спаять с контактами ИК-приемника для надежности соединения. Также важно знать частоту вашего пульта перед покупкой ИК-приемника, но обычно это 36 или 38кГц. Честно скажу, частоту своего ИК-пульта я не знал и купил на всякий случай второй ИК-приемник с частотой 36кГц, но в итоге он не потребовался.
Обесточиваем RPi. Далее контакт №1 на ИК-приемнике подключаем к Ground на RPi (физический контакт №9). Контакт №2 на приемнике подключаем к 3V3 (физический контакт №1), а контакт №3 подключаем к GPIO 17 (физический контакт №11).
Затем подаем питание, загружаем систему и входим на 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.
Понравилась инструкция? Тогда поделитесь ей со своими друзьями или попробуйте написать свою собственную!
На 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
Тоесть регулируется основное устройство. Ну и способ выдёргивания текущего значения звука немного другой.