2019年6月26日水曜日

kernel 4.14までを搭載したRaspiban Stretchでlircを利用する

はじめに

OSのベースのバージョンがStretchになったRaspbianではLIRCのバージョンが上がり、 その設定方法が書籍から若干変更されています。ここでは、その変更点をまとめていきます。

なお、この方法は kernel 4.14まででは動作しますが、kernel 4.19以降では動作しません。 aptコマンドでOSをアップデートするとkernel 4.19になってしまいこの方法では動作しなくなります。

整理すると、ここで解説する方法は「2019年4月にリリースされたNOOBS 3.0.1 (Raspbian 2019-04-08) およびそれ以前のバージョンをOSアップデートせずに利用する場合」にのみ動作します

それより新しいOSを用いた場合の方法は、以下のうち該当する方を参考にしてください。
  1. Raspberry Pi OS Buster / Bullseye でlircを利用する
  2. kernel 4.19以降を搭載したRaspiban Stretchでlircを利用する

インストール

さて、「2019年4月にリリースされたNOOBS 3.0.1 (Raspbian 2019-04-08) およびそれ以前のバージョンをOSアップデートせずに利用する場合」の設定を本書の流れに即して解説すると以下のようになります。
  • LIRCのインストール (p.141): 下記の2つのコマンドを一つずつ順に実行します。
    sudo apt update
    sudo apt install lirc
  • /etc/modulesへの lirc_dev の追加 (p.142): まず、下記のコマンドで /etc/modules を編集用に開きます。
    sudo leafpad /etc/modules
    そして、末尾に「lirc_dev」を書き加えてから保存してleafpadを閉じます。
  • /boot/config.txtへのdtoverlayの追加 (p.142~p.143): まず、下記のコマンドで /boot/config.txt を編集用に開きます。
    sudo leafpad /boot/config.txt
    そして、「#dtoverlay=lirc-rpi」という行を見つけ、その次の行に下記を追記してから保存してleafpadを閉じます。
    dtoverlay=lirc-rpi,gpio_in_pin=24,gpio_out_pin=25
次に、p.143末尾からの /etc/lirc/hardware.conf の編集ですが、このファイルは存在しませんので、 以下の設定に差し替えます。 まず、下記のコマンドをターミナルで実行し、設定ファイル /etc/lirc/lirc_options.conf を管理者権限のleafpadで開きます。
sudo leafpad  /etc/lirc/lirc_options.conf 
開いたファイルの中に、下記の2行があるのを見つけてください。
driver          = devinput
device          = auto
これを、以下のように編集し、編集が終わったら保存してleafpadを終了してください。
driver          = default
device          = /dev/lirc0
さらに、設定ファイル中に不要なファイルがあるので、ターミナルで下記の2つのコマンドを一つずつ順に実行し、 名前を変更します。
cd /etc/lirc/lircd.conf.d/
sudo mv devinput.lircd.conf devinput.lircd.conf.dist
以上で設定は終わりですので、Raspberry Piを再起動します。

irrecordの実行

次に、irrecordの実行です。Raspbian Stretch 以降では、この時点でLIRCが起動しています。さらに、LIRCが起動した状態でirrecordを実行するとエラーがでます。そのため、irrecordを実行するときは、ターミナルで下記のコマンドを実行し、LIRCを停止します。
sudo service lircd stop
そして、引き続きターミナルでirrecordを実行するのですが、その際のコマンド (p.145) は、下記のように末尾の「TV」をつけずに実行してください。
irrecord -n -d /dev/lirc0
その後、p.147からのリモコンの学習に移るのですが、開始時の手順が若干変更されています。
まず、下記のメッセージが出るので一回Enterキーを押します。
(略)
Please take the time to finish the file as described in
https://sourceforge.net/p/lirc-remotes/wiki/Checklist/ an send it
to  <lirc@bartelmus.de> so it can be made available to others.

Press RETURN to continue.
すると、下記のように光の状態のチェックに入りますので、終わるまで数秒待ちます。
Checking for ambient light  creating too much disturbances.
Please don't press any buttons, just wait a few seconds...
チェックが終わったら、下記のメッセージが現れますので、ここで「TV」を入力し、Enterキーを押してください。
Enter name of remote (only ascii, no spaces) :
つまり、こうですね。
Enter name of remote (only ascii, no spaces) :TV
すると、下記のようにもう一度Enterキーを押すことを促されます。これが、p.147末尾の「2度目の[Enter]キー」に該当しますので、Enterキーを押し、その後p.148の指示に従って様々なボタンを繰り返し押して行ってください。
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.
p.154までは書籍の指示通りで構いません。

なお、ピリオド文字「.」が画面を2行分埋め尽くすまでリモコンのボタンを押し続けるステップで、1行目と2行目の間に下記のメッセージが出ることがあります。
Cannot find any gap, using an arbitrary 50 ms one. If you have a
regular remote for e. g., a TV or such this is probably a point
where you hit control-C. However, technical hardware like air
condition gear often works without any gap. If you think it's
reasonable that your remote lacks gap you can proceed.
Press RETURN to continue.
これは「信号のギャップを見つけられない」というエラーを示しています。 この場合、そのまま作業を続けてもリモコンの認識に失敗しますので、一旦キーボードで「Ctrl-c」を入力してirrecordを終了してください。

そして、部屋の照明の状態の変更(日光が部屋に入らないようにしたり、蛍光灯の状態を変えたり)を行うか、 赤外線受信モジュールとリモコンの位置関係を変えるなど、実験環境を変えて再チャレンジしてください。 ピリオド文字「.」の1行目と2行目の間に上記エラーが出ない状態を実現して演習を継続するようにしてください。

ピリオド文字「.」の1行目と2行目の間のメッセージが下記のようになっていれば正常なので、そのまま継続してください。
Got gap (XXXXX us)

Please keep on pressing buttons like described above.
irrecordの終了後、書籍では「TV」というファイルに設定が保存されましたが、Raspbian Stretch 以降では、TV.lircd.confという名前のファイルが生成されます。

次に、ターミナルで下記のファイルを実行し、ファイルを移動します。ファイルの移動先も変更を受けています。
sudo mv TV.lircd.conf /etc/lirc/lircd.conf.d/
そしてRaspberry Piを再起動するとLIRCが再び起動し、irsendコマンドが実行されるようになります。それ以降は書籍と同じです。

kernel 4.19以降を搭載したRaspbian Stretchでlircを利用する

はじめに

2021年11月時点で、kernel 4.19以降が搭載された Raspbaian Stretch ではそのままではlircは動作しません。 Raspberry Pi OS Buster や Raspberry Pi OS Bullseye では簡単に lirc を利用できるよう改善されております。以下で解説していますので、そちらを利用することを推奨します。
本ページは、それでもあえて「kernel 4.19以降が搭載されたRaspbaian Stretch」で lirc を利用したい、という方ための情報をまとめます。

kernel 4.19を搭載したRaspbian Stretchでlircを動作させるには、lircに kernel 4.19 用の変更(正確にはドライバであるgpio-ir用の変更)を加えてビルドしなおす必要があります。
その変更案を考え、こちらのフォーラムで紹介してきましたが、まとまってきたのでここに記します。

インストール前の準備

まず、aptコマンドでlircをインストールした方は、そのlircは動作しませんので、下記のコマンドで一旦削除します。
sudo apt remove liblirc0 liblircclient0 lirc
次に、以下の3つのコマンドを一つずつ順に実行し、lircをビルドする環境を作ります。
sudo su -c "grep '^deb ' /etc/apt/sources.list | sed 's/^deb/deb-src/g' > /etc/apt/sources.list.d/deb-src.list"
sudo apt update
sudo apt install devscripts


インストール (Raspbian Stretch + kernel 4.19の場合)

kernel 4.19が搭載されたRapsbian Stretchの場合は下記の10コマンドをひとつずつ順に実行してlircをビルドおよびインストールします。
sudo apt build-dep lirc
mkdir build
cd build
apt source lirc
wget https://raw.githubusercontent.com/neuralassembly/raspi/master/lirc-gpio-ir.patch
patch -p0 -i lirc-gpio-ir.patch
cd lirc-0.9.4c
debuild -uc -us -b
cd ..
sudo apt install ./liblirc0_0.9.4c-9_armhf.deb ./liblirc-client0_0.9.4c-9_armhf.deb ./lirc_0.9.4c-9_armhf.deb 
なお、このインストールが終わった後、OSのアップデートをすると、対策済lircが対策なしlircで上書きインストールされます。
そのため、liblirc0_0.9.4c-9_armhf.deb、liblirc-client0_0.9.4c-9_armhf.deb、lirc_0.9.4c-9_armhf.deb の3ファイルを保存しておき、必要に応じて最後のコマンドでインストールし直すのが良いでしょう
。その場合、冒頭のlircを削除するコマンドで対策なしlircを事前に削除する必要があるかもしれませんのでご注意ください。

インストール後の設定 (Raspbian Stretch + kernel 4.19の場合)

さて、インストール後の設定を本書の流れに即して解説すると以下のようになります。
  • /etc/modulesへの編集 (p.142): 今回の方法では/etc/modulesを編集する必要はありません。
  • /boot/config.txtへのdtoverlayの追加 (p.142~p.143): まず、下記のコマンドで /boot/config.txt を編集用に開きます。
    sudo leafpad /boot/config.txt
    なお、NOOBS 3.2.1 (Raspbian 2019-09-26) 以降ではテキストエディタとしてleafpadではなくmousepadを用います。
    sudo mousepad /boot/config.txt
    そして、「#dtoverlay=gpio-ir-tx,gpio_pin=18」または「#dtoverlay=lirc-rpi」という行を見つけ、その次の行に下記を追記してから保存してleafpadを閉じます。
    dtoverlay=gpio-ir,gpio_pin=24
    dtoverlay=gpio-ir-tx,gpio_pin=25
次に、p.143末尾からの /etc/lirc/hardware.conf の編集ですが、このファイルは存在しませんので、 以下の設定に差し替えます。

次に、下記のコマンドをターミナルで実行し、設定ファイル /etc/lirc/lirc_options.conf を管理者権限のleafpadで開きます。
sudo leafpad  /etc/lirc/lirc_options.conf 
なお、NOOBS 3.2.1 (Raspbian 2019-09-26) 以降ではテキストエディタとしてleafpadではなくmousepadを用います。
sudo mousepad  /etc/lirc/lirc_options.conf 
開いたファイルの中に、下記の2行があるのを見つけてください。
driver          = devinput
device          = auto
これを、irrecordを用いてリモコン信号を学習させる場合は以下のように編集し、編集が終わったら保存してleafpadを終了してください。
driver          = default
device          = /dev/lirc1
なお、今回の方法ではirsendを用いて信号を送信する場合は/etc/lirc/lirc_options.conf の上記の行を下記のように変更しなければなりません。演習後半でirsendコマンドを使うときはこれを忘れないよう注意してください。
driver          = default
device          = /dev/lirc0
以上で設定は終わりですので、Raspberry Piを再起動します。/etc/lirc/lirc_options.confを保存した場合は、Raspberry Piを再起動が必要です。

irrecordの実行

irrecord の場合は、上で注意したように /etc/lirc/lirc_options.conf の device 行が /dev/lirc1 に設定されていなければなりませんので注意してください。
そして、引き続きターミナルでirrecordを実行するのですが、その際のコマンド (p.145) は、下記のように末尾の「TV」をつけずに実行してください。
irrecord -n
その後、p.147からのリモコンの学習に移るのですが、開始時の手順が若干変更されています。
まず、下記のメッセージが出るので一回Enterキーを押します。
(略)
Please take the time to finish the file as described in
https://sourceforge.net/p/lirc-remotes/wiki/Checklist/ an send it
to  <lirc@bartelmus.de> so it can be made available to others.

Press RETURN to continue.
すると、下記のように光の状態のチェックに入りますので、終わるまで数秒待ちます。
Checking for ambient light  creating too much disturbances.
Please don't press any buttons, just wait a few seconds...
チェックが終わったら、下記のメッセージが現れますので、ここで「TV」を入力し、Enterキーを押してください。
Enter name of remote (only ascii, no spaces) :
つまり、こうですね。
Enter name of remote (only ascii, no spaces) :TV
すると、下記のようにもう一度Enterキーを押すことを促されます。これが、p.147末尾の「2度目の[Enter]キー」に該当しますので、Enterキーを押し、その後p.148の指示に従って様々なボタンを繰り返し押して行ってください。
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.
p.154までは書籍の指示通りで構いません。

なお、ピリオド文字「.」が画面を2行分埋め尽くすまでリモコンのボタンを押し続けるステップで、1行目と2行目の間に下記のメッセージが出ることがあります。
Cannot find any gap, using an arbitrary 50 ms one. If you have a
regular remote for e. g., a TV or such this is probably a point
where you hit control-C. However, technical hardware like air
condition gear often works without any gap. If you think it's
reasonable that your remote lacks gap you can proceed.
Press RETURN to continue.
これは「信号のギャップを見つけられない」というエラーを示しています。 この場合、そのまま作業を続けてもリモコンの認識に失敗しますので、一旦キーボードで「Ctrl-c」を入力してirrecordを終了してください。

そして、部屋の照明の状態の変更(日光が部屋に入らないようにしたり、蛍光灯の状態を変えたり)を行うか、 赤外線受信モジュールとリモコンの位置関係を変えるなど、実験環境を変えて再チャレンジしてください。 ピリオド文字「.」の1行目と2行目の間に上記エラーが出ない状態を実現して演習を継続するようにしてください。

ピリオド文字「.」の1行目と2行目の間のメッセージが下記のようになっていれば正常なので、そのまま継続してください。
Got gap (XXXXX us)

Please keep on pressing buttons like described above.
なお、途中で「ボタンの名前をキーボードで入力し、ボタンを押す」というプロセスがあります。このときはボタンの押す長さをやや長め(1秒程度)とすると成功しやすいでしょう。

irrecordの終了後、書籍では「TV」というファイルに設定が保存されましたが、現在は TV.lircd.confという名前のファイルが生成されます。

次に、ターミナルで下記のファイルを実行し、ファイルを移動します。ファイルの移動先も変更を受けています。
sudo mv TV.lircd.conf /etc/lirc/lircd.conf.d/
irsend を試す場合は、上で注意したように /etc/lirc/lirc_options.conf の device 行を /dev/lirc0 に変更しなければならないので注意してください。 そしてRaspberry Piを再起動するとLIRCが再び起動し、irsendコマンドが実行できるようになります。

なお、「ps ax |grep lircd」で LIRC の実行状況を確認した際、このバージョンの LIRC で表示されるメッセージは p.156 に示した旧バージョンの LIRC の表示とは異なりますのでご注意ください。 「 /usr/sbin/lircd 」という表示が見えれば LIRC が正常動作していると考えてよいと思います。

それ以降は書籍と同じです。