- Софт
# uname -r 5.4.51-v7+ # cat /etc/os-release PRETTY_NAME="Raspbian GNU/Linux 10 (buster)" # lircd -v lircd 0.10.1
- Железо
У меня уже есть IR Remote от Xiaomi - это такая круглая коробочка, которая должна была мне помочь управлять всеми устройствами в комнате, способными принимать команды в IR диапазоне. Но что то пошло не так, коробочка оказалось привязана к китайскому региону, работала медленно, а прямого управления через неё вообще не нашел, оказывается, только через сценарии.
Поэтому я решил пойти другим путем, а именно - сделать пульт из Raspberry Pi. Колхозить приемопередатчик не хотелось и на всем известном сайте я нашел то, что нужно - IR Remote Shield v1.0, для которого продавец обещал работу через lirc. Какие то две недели и заветная плата у меня.
Поставил, включил, нашел инструкцию как всех подружить и обломался. На моей малинке была установлена Ubuntu 20.04 и инструкция почему то под неё совсем не подошла - ну хоть убей, а /dev/lirc0 не появлялось. Я поменял ОС на Raspbian Buster, ниже вы можете почитать, что получилось и запилить себе тоже самое.
- Поехали!
Файл /boot/config.txt. Нужные строки в нем уже есть, их нужно только раскомментировать и поменять местами пины, у нас прием на 18-м пине, а передача - на 17-м:dtoverlay=gpio-ir,gpio_pin=18 dtoverlay=gpio-ir-tx,gpio_pin=17
Чтобы устройства /dev/lircX не бегали туда-сюда, можно зафиксировать их названия при помощи udev. Создаем файл /etc/udev/rules.d/71-lirc.rules со следующим содержимым:ACTION=="add", SUBSYSTEM=="lirc", DRIVERS=="gpio_ir_recv", SYMLINK+="lirc-rx" ACTION=="add", SUBSYSTEM=="lirc", DRIVERS=="gpio-ir-tx", SYMLINK+="lirc-tx"
Ставим lirc:sudo apt-get update sudo apt-get dist-upgrade sudo apt install -y lirc
Файл /etc/lirc/hardware.conf БОЛЬШЕ НЕ ИСПОЛЬЗУЕТСЯ!
Файл /etc/lirc/lirc_options.conf параметры там уже есть, нужно только поменять значения на свои:driver = default device = /dev/lirc-tx
reboot
Что видим после перезагрузки?# ls /dev | grep lirc lirc0 lirc1 lirc-rx lirc-tx
Из других изменений - служба lircd теперь управляется при помощи systemd:# systemctl enable/start/stop/restart/status lircd
- Проверяем приемник
Утилита mode2 печатает все полученные от пульта сигналы. Запускаем команду, направляем любой пульт ДУ на малинку и начинаем давить кнопки. Все, что давили, должно быть отображено в консоли.mode2 -d /dev/lirc-rx
- Проверяем передатчик
Так как у нас в системе два устройства, lirc-tx и lirc-rx, то они могут работать независимо друг от друга. Передатчик и приемник на плате расположены рядом, поэтому даже экрана не надо.
Вначале, идем на сайт с базой пультов, если повезет, то находим там свой, а если не повезет, то берем любой. Качаем файл и копируем его в папку /etc/lirc/lircd.conf.d/. Внутри файла есть параметр name, например, "name Sony_RM-ED035" и названия кнопок с их кодами, например, "KEY_MUTE 0x290". Перезапускаем lircd:# systemctl restart lircd
Запускаем mode2 на прием (см.выше). Затем, подключаемся к серверу второй консолью и в ней выполняем:# irsend send_once Sony_RM-ED035 KEY_MUTE
Смотрим в первой консоли, поймала ли mode2 нашу передачу или нет. У меня поймала.# mode2 -d /dev/lirc-rx Using driver default on device /dev/lirc-rx Trying device: /dev/lirc-rx Using device: /dev/lirc-rx Running as regular user pi space 16777215 pulse 2546 space 579 pulse 587 space 549 pulse 669 space 525 pulse 1277 space 512 pulse 649 space 547 pulse 1254 space 586 pulse 622 space 523 pulse 674 space 522 pulse 1279 space 510 pulse 673 space 523 pulse 672 space 523 pulse 654 space 543 pulse 670 pulse 130563
- Запись команд пульта
Не буду подробно останавливаться на этом процессе, он хорошо описан в интернетах, скажу только, что у меня ничего не получилось. Команды записывались, но телевизор отказывался их принимать. Есть подозрение, что из-за смены драйверов в ядре 4.x и выше на gpio-ir, lirc криво передает команды так как заточен под использование старого lirc_dev, который из ядра выпилен.
UPD 2021.04.12: купил очередную малинку (ту, на которой тренировался раньше, стала сервером умного дома), решил продолжить, и расследование показало, что проблемы начались ещё с ядра 4.19 и до сих пор (ядро 5.10) никто не чешется. Проблема не при передаче (с этим как раз порядок), а при приеме. Так что если вы собираетесь использовать утилитки irrecord, mode2, irw или irexec для приема данных, то путь вам патчить исходники. Вот тут один добрый человек рассказывает, как все поправить. Я выполнил то, что там написано (с учетом того, что сейчас версия lirc не 0.10.1-6.2 а аж 0.10.1-6.3) и о чудо, у меня получилось через irrecord по-быстрому сделать файлик с 7 кнопками для пульта Yamaha RAV534.
Итак, теперь можно рассказать про строчку для запуска утилиты, которая из команд от пульта делает файл, который потом можно скормить lircd. В примере в качестве имени пульта я буду использовать YAMAHA_RAV534.# systemctl stop lircd # irrecord -d /dev/lirc-rx
Утилита подробно описывает, что вам надо делать с пультом, если все OK, то вы получите файл вида YAMAHA_RAV534.lircd.conf. Этот файл необходимо скопировать в /etc/lirc/lircd.conf.d, после чего запустить (перезапустить) lircd:# systemctl start lircd
Из полезного ещё запишу команду для просмотра допустимых названий для кнопок пульта:# irrecord --list-namespace
- Передача команд устройствам
Не просто, а очень просто. Для этого есть утилита irsend, я уже писал ней выше. Вспоминаем, как послать одну команду:$ irsend send_once YAMAHA_RAV534 KEY_POWER
Эта команда включит ресивер. Если послать эту команду снова, то ресивер выключится.
- Проблемы (куда ж без них)
- На плате возможна установка двух передающих диодов, но на моей был установлен только один. Для того, чтобы он мог работать в одиночестве, переключатель SJ1 должен быть замкнут (именно так на фото). У меня же SJ1 был "открыт" (без пайки сверху), поэтому пришлось взять в руки паяльник и запаять его.
Статья опубликована: 2020-09-10 17:00:03
Последние правки: 2021-04-14 00:37:22
IR Remote Shield v1.0 - это плата, которую продают китайские братья и которая способна принимать и передавать сигналы в инфракрасном диапазоне, как это делают пульты от бытовых устройств. Добавим эту плату в Raspberry Pi 3 и настроим на работу с lirc.