2021年11月14日日曜日

Raspberry Pi OS Bookworm / Bullseye / Buster でlircを利用する

はじめに

Raspberry Pi OS Bookworm / Bullseye / Buster での lirc のインストールは容易です。下記の手順に従ってください。

インストール (Raspberry Pi OS Bookworm / Bullseye / Buster の場合)

Raspberry Pi OS Bookworm / Bullseye / Buster の場合は下記の2コマンドをひとつずつ順に実行してlircをインストールしてください。
sudo apt update
sudo apt install lirc
以上でインストールが完了します。

インストール後の設定

さて、インストール後の設定を本書の流れに即して解説すると以下のようになります。
  • /etc/modulesへの編集 (p.142): 今回の方法では/etc/modulesを編集する必要はありません。
  • /boot/config.txtへのdtoverlayの追加 (p.142~p.143): まず、下記のコマンドで /boot/config.txt を編集用に開きます。
    sudo mousepad /boot/config.txt
    そして、「#dtoverlay=gpio-ir-tx,gpio_pin=18」または「#dtoverlay=lirc-rpi」という行を見つけ、その次の行に下記を追記してから保存してpadを閉じます。
    dtoverlay=gpio-ir,gpio_pin=24
    dtoverlay=gpio-ir-tx,gpio_pin=25
    該当する行が見つからなかった場合は、ファイルの最後の行に上の内容を追記すればよいでしょう。


次に、p.143末尾からの /etc/lirc/hardware.conf の編集ですが、このファイルは存在しませんので、 以下の設定に差し替えます。

まず、不要なファイルの名前を下記のコマンドで変えます。
sudo mv /etc/lirc/lircd.conf.d/devinput.lircd.conf /etc/lirc/lircd.conf.d/devinput.lircd.conf.dist
次に、下記のコマンドをターミナルで実行し、設定ファイル /etc/lirc/lirc_options.conf を管理者権限のmousepadで開きます。
sudo mousepad  /etc/lirc/lirc_options.conf 
開いたファイルの中に、下記の2行があるのを見つけてください。
driver          = devinput
device          = auto
これを、irrecordを用いてリモコン信号を学習させる場合は以下のように編集し、編集が終わったら保存してmousepadを終了してください。
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 で表示されるメッセージは以下のようになっています(冒頭のいくつかの数字は人により異なります)。
502 ? Ss 0:00 /usr/sbin/lircd --nodaemon
これが表示されていれば、LIRC が正常動作しているということです。p.156 に示した旧バージョンの LIRC の表示とは異なりますのでご注意ください。

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

3 件のコメント:

  1. 「RaspberryPiで学ぶ電子工作」、「実例で学ぶRaspberryPi電子工作」は私にとってバイブル的な存在です。初心者にも理解できるように基礎的な内容から丁寧に解説され、手順等も大変判り易く説明されており、電子工作の喜びを実感できました。しかも、出版後の補足情報でフォローアップくださるのでOS改版などで書籍手順通りに進まない不安も解消され本当に助かっています。ありがとうございます。ところで、
    ここからが今回の投稿の本題なのですが、「実例で学ぶ・・・5章の家電リモコン」について、2021.11.14付け補足情報「Raspberry Pi OS Buster / Bullseye でlircを利用する」に従って進めているのですが、
    RasPiの再起動してもlircdが自動起動しません。grepをかけると「no deamon」となります。ターミナルから「sudo killall lircd」、「sudo lircd」を順にコマンド実行するとlircdが起動されますので、その後の手順「irrecordの実行(赤外線信号の登録、WebIOPiを使ってのリモコン利用)まで」を進めることは出来ました。
    ただ、リモコンとして利用するためには、lircdの自動起動が必須ですので解決策を教えていただけないでしょうか。(rc.localに前述の2コマンドを埋め込めば良いものと試みましたが、埋め込み方が悪いのかRasPi起動時の画面表示をみるとrc.localでエラーが生じてしまいました。今は元に戻しています)
    なお、RasPi-Zeroに21.1.30版RaspberryPi-OS(OS:bullseye,Kernel:5.10.63+)をインストールしています。以上、ご指導をよろしくお願いいたします。

    返信削除
    返信
    1. コメントありがとうございます。

      お使いのバージョンのOS(Bullseye初版)を用い、Pi ZeroとPi Zero2の両方でリモコンの演習を試してみました。

      演習を終えてRaspberry Pi を再起動すると、TVリモコンの設定(TV.lircd.conf)が読み込まれ、
      TVのオンオフが irsend コマンドでできるようになる、という実験です。

      結論としましては、Pi ZeroとPi Zero2の両方で、再起動と同時に irsend コマンドが使えるようになりました。

      一点気になったのは、

      > RasPiの再起動してもlircdが自動起動しません。grepをかけると「no deamon」となります。

      というコメントです。

      私の場合、再起動を掛けた状態で

      px ax |grep lirc

      と実行すると、下記の表示が現れます。

      502 ? Ss 0:00 /usr/sbin/lircd --nodaemon

      「--nodaemon」という表示は見られますが、この状態で irsend が実行できるようになっています。

      つまり、現バージョン lircd では、実行中の表示が p.156 の状態と異なる、
      ということになります。

      ですので、まずは「/usr/sbin/lircd --nodaemon」が表示されている状態で、
      irsend コマンドが実行可能かどうか、確認して頂けますでしょうか?
      (その場合、rc.local へのコマンドの記述は不要です)

      もし、問題ないようでしたら、補足ページにこの表示についての注釈も加えます。

      よろしくお願いします。

      削除
  2. 金丸先生、多用・多忙な中、早速にご回答くださり、ありがとうございます。

    改めて確認しまして、
    「/usr/sbin/lircd --nodaemon」が表示されている状態でも
    irsend コマンドが実行可能であることを確認いたしました。

    daemonとしてバックグラウンドで起動されている必要があるとの思い込みから
    別理由で生じていたirsend コマンド不可を「lircdが起動していない」と誤解釈
    していました。お騒がせしました。回答をいただき、安心して次の演習に進めます。
    本当に感謝です。ありがとうございました。

    返信削除