なんと1年半ぶりの投稿です。仕事にかまけて趣味をさぼっておりました。ラズパイなど久しぶりにいじりましたが、完全に浦島太郎状態となっており、基本的なことをいろいろ思い出すまでに一か月くらいかかってしまいましたね。(;^_^A
今回からしばらくは安価なhome IoTの製作に取り組んでみようと思います。具体的にはラズパイから赤外線LEDを光らせてエアコンのオンオフを操作してみようと思います。
Googleで「raspberry pi エアコン」などと検索すれば結構たくさんの記事が見つかります。これらの記事ではlircという赤外線リモコンパッケージソフトがよく利用されているのですが、エアコンについてはテレビなどと違ってリモコンの信号が長いので、lircのirrecordという学習ソフトではうまく対応できません。そこでいろいろ調べたところ、ソースコードをちょこっと編集してインストールすることで対応できそうということでこれをやってみました。結論からいうとダメでした!(笑) しかしlircをラズパイ用にコンパイルして動くようにするには幾つか余分な(?)手順が必要で、折角なのでその手順を以下に残しておくことにします。なお、エアコンの信号についてはirrecordではなくmode2で比較的簡単に対応できます。これについては次回以降の記事で紹介しようと思います。
今回使用する私のラズパイ環境です。
- ラズパイ本体:Raspberry Pi Zero
- OS:Raspbian Stretch
まずは、もしlircが既にapt-getでインストールされている場合はアンインストールしておきます。
$ sudo apt-get remove lirc
エアコンのリモコンの信号は一回の信号に設定温度やルーバーの動きなどの全ての設定値をまとめて送信するために非常に長くなってます。lircのデフォルトでは対応する信号の長さの最大値が短く設定されているためにエアコンに対応できません。この最大値がconfigファイルなどの編集で簡単に設定変更できればよいのですが、ソースコードを編集しないと変更できない仕様になっているのですよね。(なんでだろう…)
というわけでlircのソースコードをディレクトリごとダウンロードします。
git clone git://git.code.sf.net/p/lirc/git lirc
なお、この現在のlircの最新のバージョンは0.11.0(開発版)でしたね…。(;^ω^)
リリース版は0.10.0ですね。以下でダウンロードと解凍ができます。
wget https://sourceforge.net/projects/lirc/files/LIRC/0.10.0/lirc-debian-src-0.10.0~rc3-1.tar.gz tar -zxvf lirc-debian-src-0.10.0~rc3-1.tar.gz
以下の手順は開発版の方で試した手順です。0.10.0のリリース版の方はdebian向けのパッケージのようですから以下の手順より簡単に済むかもしれないですね…。
ダウンロードしたディレクトリ内に移動します。
$ cd lirc
lirc/lib/irrecord.h の61行目の200という値をテキストエディタで600に書き換えます。ただし、結局これではエアコンの信号をirrecordで学習できるようにはなりませんでした。(ちなみにirrecord.h内には他のパラメータも定義されているので、これらを変更してコンパイルするとひょっとしたらうまくいくかもしれません…。)
$ sudo nano lib/irrecord.h
#define MAX_SIGNALS 600
次に、コンパイルに必要なautoreconfとxsltprocおよびpython3-yamlを事前にインストールします。
$ sudo apt-get install dh-autoreconf xsltproc python3-yaml
では、コンパイルとインストールを実行します。
$ sudo ./autogen.sh $ sudo ./configure $ sudo make $ sudo make install
共有ライブラリへのパスが通っていないので、新しくエイリアスを作成します。
$ sudo ln -s /usr/local/lib/liblirc.so.0.0.0 /usr/lib/liblirc.so.0 $ sudo ln -s /usr/local/lib/liblirc_client.so.0.6.0 /usr/lib/liblirc_client.so.0 $ sudo ln -s /usr/local/lib/libirrecord.so.0.0.0 /usr/lib/libirrecord.so.0 $ sudo ln -s /usr/local/lib/liblirc_driver.so.0.3.0 /usr/lib/liblirc_driver.so.0
lircの設定ファイルを編集します。
$ sudo nano /usr/local/etc/lirc/lirc_options.conf
3、4行目にあるdriverとdeviceの値を以下に書き換えます。
driver = default device = /dev/lirc0
次に/boot/config.txtを編集します。
$ sudo nano /boot/config.txt
lirc-rpiモジュールに関する項目があるので、dtoverlayの行頭の#をはずしてアンコメントし、以下のようにしてください。(gpioのアウトに17番ピン、インに18番ピンを使用する場合)
# Uncomment this to enable the lirc-rpi module dtoverlay=lirc-rpi:gpio_out_pin=17,gpio_in_pin=18,gpio_in_pull=up
ラズパイを再起動して以上の設定変更を有効にします。
$ sudo reboot
lircパッケージにあるmode2を使ってテレビなどの赤外線リモコンの信号を試しに受信してみましょう。
$ mode2 -d /dev/lirc0
上記コマンドで待ち受け状態になりますので、もし既にラズパイに赤外線受信器を接続済みであれば、受光部に向かってリモコンボタンを押してみましょう。うまく成功すればspaceとpulseが交互に表示されるはずです。適当なところで^C(ctrl + Cキー)を押してmode2を終了します。
次にirrecordの動作確認です。
$ irrecord -n
Using driver default on device auto irrecord - application for recording IR-codes for usage with lirc ...(中略) Press RETURN to continue.
上記のようにメッセージが出て待ち受け状態になればOKです。^C(ctrl + Cキー)で抜けます。
では、lircの本体であるlircdを起動してみましょう。まずはlircd.socketを起動します。
$ systemctl start lircd.socket ==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units === Authentication is required to start 'lircd.socket'. Multiple identities can be used for authentication: 1. ,,, (pi) 2. root Choose identity to authenticate as (1-2): 1 Password: ==== AUTHENTICATION COMPLETE ===
途中でパスワード認証が必要です。同様にlircd.serviceも起動します。
$ systemctl start lircd.service
正常に起動しているかどうかステータスの確認をしてみます。
$ systemctl status lircd.socket lircd.service
緑色にActiveと表示されていればOKです。
最後に、ラズパイの起動時に自動で立ち上がるように設定します。
$ systemctl enable lircd.socket ==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-unit-files === Authentication is required to manage system service or unit files. Multiple identities can be used for authentication: 1. ,,, (pi) 2. root Choose identity to authenticate as (1-2): 1 Password: ==== AUTHENTICATION COMPLETE === Created symlink /etc/systemd/system/sockets.target.wants/lircd.socket → /lib/systemd/system/lircd.socket. Created symlink /etc/systemd/system/multi-user.target.wants/lircd.service → /lib/systemd/system/lircd.service. ==== AUTHENTICATING FOR org.freedesktop.systemd1.reload-daemon === Authentication is required to reload the systemd state. Multiple identities can be used for authentication: 1. ,,, (pi) 2. root Choose identity to authenticate as (1-2): 1 Password: ==== AUTHENTICATION COMPLETE ===
なぜかlircd.socketを設定するとlircd.serviceも一緒に設定されました。
自動起動の設定が反映されているかを確認します。
$ systemctl is-enabled lircd.socket lircd.service enabled enabled
両方enabledになっていればOKです。念のためラズパイを再起動して確認するとより確実でしょう。
ちなみに自動起動を解除するには以下の方法です。
$ systemctl disable lircd.socket
手順としては以上になります。
apt-getでパッケージをインストールする場合とインストールされるディレクトリが異なるので注意が必要ですね。それからコンパイルに必要なソフトをいくつかあらかじめインストールする必要があるのと、共有ライブラリのパスがそのままだと通っていないのがハマりやすいポイントでしょうか。
それではまた次回。