Главная
Главная Руководства Raspberry Pi › IR Remote Shield v1.0, Raspbian Buster и lirc



Автор:

Статья опубликована: 2020-09-10 17:00:03
Последние правки: 2021-04-14 00:37:22

IR Remote Shield v1.0 - это плата, которую продают китайские братья и которая способна принимать и передавать сигналы в инфракрасном диапазоне, как это делают пульты от бытовых устройств. Добавим эту плату в Raspberry Pi 3 и настроим на работу с lirc.

  • Софт
    # 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 был "открыт" (без пайки сверху), поэтому пришлось взять в руки паяльник и запаять его.