Raspberry Pi Zero Wに,RPZ-IR-Sensorを使って学習リモコンを作ってみる。
手持ちのパーツで自作しても良かったが,今回は,温度,湿度,気圧センサーも搭載されているRPZ-IR-Sensorを購入して使ってみることに。
以前使用していたLIRCを使って,学習リモコン機能を作ってみる。
Raspberry Pi Zero Wには,Raspbian Stretchが入っている。
lircをパッケージを使ってインストールする。
# apt-get install lirc
Raspbian Stretchの新しいものやBusterでは,Kernelが4.19以降が使われている。
Kernel 4.19以降の場合,デバイスドライバが変更になったので,変更されたデバイスドライバを使う必要があるのだが,その場合lircパッケージをそのまま使用すると,リモコンの受信がタイムアウトでうまく行かなかったり,送信もデバイスドライバの問題で256個以上のpulse/spaceを送信出来なかったり,トータル500ms以上のデータが送信出来なくなってしまった。
受信の問題は,lircをパッケージでインストールするのではなく,lircのソースに修正パッチを当ててビルドしたものを使うことで回避できる。
しかし送信の問題は,Kernelのソースコードの修正が必要なため,簡単に修正できない。
受信を改善するためにlircをビルドする場合は,kernel4.19用LIRCのビルドを参照。
LIRCが使用するデバイスドライバーを用意する。
/boot/config.txtを以下のように編集する。
/boot/config.txt
# Uncomment this to enable the lirc-rpi module dtoverlay=lirc-rpi dtparam=gpio_out_pin=13 dtparam=gpio_in_pin=4
Raspbian Stretchの新しいものやBusterではKernelが4.19以降に更新されていて,それによってlirc-rpiのDeviceTreeがサポートされなくなった。
このため上記の代わりに,/boot/config.txtを以下のように編集して,gpio-irとgpio-ir-txを使うようにする。
dtoverlay=gpio-ir,gpio_pin=4 dtoverlay=gpio-ir-tx,gpio_pin=13
編集が終わったらRaspberry Pi Zero Wを再起動する。
lsmodでlircモジュールがロードされているか確認する。
$ lsmod | grep lirc lirc_rpi 8001 2 lirc_dev 8313 1 lirc_rpi
Kernelが4.19以降では,以下のようになっているか確認する。
$ lsmod | grep gpio_ir gpio_ir_tx 3569 0 gpio_ir_recv 3095 0
/dev/lirc0が作成されているか確認する。
$ ls -l /dev/lirc* crw-rw---- 1 root video 243, 0 4月 3 14:55 /dev/lirc0
送受信には,/dev/lirc0が使われる。
Kernelが4.19以降では,/dev/lirc0,/dev/lirc1が作成されているか確認する。
$ ls -la /dev/lirc* crw-rw---- 1 root video 252, 0 8月 2 05:51 /dev/lirc0 crw-rw---- 1 root video 252, 1 8月 2 05:51 /dev/lirc1
/dev/lirc0が送信用のデバイスで,/dev/lirc1が受信用のデバイスになっていて,送信と受信で違うデバイスを使用するようになってしまった。
/etc/lirc/lirc_options.confを以下のように編集する。
/etc/lirc/lirc_options.conf
[lircd] nodaemon = False driver = default device = /dev/lirc0 output = /var/run/lirc/lircd pidfile = /var/run/lirc/lircd.pid plugindir = /usr/lib/arm-linux-gnueabihf/lirc/plugins permission = 666 allow-simulate = No repeat-max = 600
この設定で,LIRCの送受信にはデフォルトで/dev/lirc0を使用するようになる。
kernel 4.19以降では,受信の時(リモコン学習するときなど)に受信コマンドで使うデバイスを/dev/lirc1に指定しない場合は,このファイルのdeviceのところを,/dev/lirc1に書き換えるようにする。
リモコン信号を受信できるかどうか確認してみる。
lircdデーモンを一旦停止する。
# systemctl stop lircd.service
これしておかないと,mode2(リモコン信号をキャプチャするコマンド)実行時にデバイス使用中のエラーとなる。
リモコンの動作確認をする前に,mode2コマンドのバージョンを確認する。
$ mode2 -v mode2 0.9.4c
リモコン信号受光部に向けて,適当なリモコンからなんかのボタンを押して信号を送信してみる。
注意:kernel 4.19以降では,デバイスに/dev/lirc1を指定する。また,lircを修正したものが必要。
$ mode2 -d /dev/lirc0 Using driver default on device /dev/lirc0 Trying device: /dev/lirc0 Using device: /dev/lirc0 space 2610664 <--- リモコン受光モジュールにリモコンを向けてボタンを押すと受信する pulse 1202 space 476 pulse 1201 space 452 pulse 368 space 1215 pulse 364 :
このようなメッセージが表示されれば,リモコン信号が受信出来ている。 数字は,一つのパターンの長さ(時間)を表している。
リモコンデータを学習するので,デーモンが動いている場合は停止しておく。
# systemctl stop lircd.service
TVのリモコンを学習してみる。
注意:kernel 4.19以降では,デバイスに/dev/lirc1を指定する。また,lircを修正したものが必要。
$ irrecord -n -f -d /dev/lirc0 Using raw access on device /dev/lirc0 : Press RETURN to continue. <--- リターンを押す Checking for ambient light creating too much disturbances. Please don't press any buttons, just wait a few seconds... No significant noise (received 0 bytes) Enter name of remote (only ascii, no spaces) :TV <--- リモコン操作の名前(保存するファイル名)を入力 Using TV.lircd.conf as output filename Now start pressing buttons on your remote control. : Press RETURN now to start recording. <--- リターンを押す : Please enter the name for the next button (press <ENTER> to finish recording) power <--- リモコンのボタン名powerを学習させる Now hold down button "power". <--- リモコンの電源ボタンを押す Please enter the name for the next button (press <ENTER> to finish recording) volup <--- リモコンのボタン名volupを学習させる Now hold down button "volup". <--- リモコンのVolume↑ボタンを押す Please enter the name for the next button (press <ENTER> to finish recording) voldown <--- リモコンのボタン名voldownを学習させる Now hold down button "voldown". <--- リモコンのVolume↓ボタンを押す Please enter the name for the next button (press <ENTER> to finish recording) <--- 学習終了の場合はリターン。 Successfully written config file TV.lircd.conf
このようにして学習したリモコンデータを,/etc/lirc/lircd.conf.d/ にコピーする。
$ sudo cp TV.lircd.conf /etc/lirc/lircd.conf.d/
エアコンのリモコンも一応学習できた。
リモコンの定義データを確認する。
$ irsend LIST "" "" devinput devinput TV
のように,devinputが2個表示されたらdevinput.lircd.confファイルを削除する。
# rm /etc/lirc/lircd.conf.d/devinput.lircd.conf
デーモンをリスタートする。
# systemctl restart lircd.service
学習したリモコンデータを使って,なにか送信してみる。
$ irsend SEND_ONCE TV power
$ irsend SEND_ONCE TV power
power信号は,テレビをOn/Offするトグル動作になる。(OnのためのリモコンデータやOffのためのリモコンデータは無い)
ちなみに,リモコンデータを数回連続で送信したい場合は,
$ irsend -#5 SEND_ONCE TV volup
のようにする。(#の後に回数を指定する)
Kernel 4.19以降の場合,デバイスドライバの問題で256個以上のpulse/spaceを送信出来なかったり,トータル500ms以上のデータが送信できなくなっている。
これは,Kernelが修正されないと残念ながら解決できない。
また,この場合,1回irsendしただけだと機器が反応しない事があるようになった。
$ irsend -#3 SEND_ONCE TV volup
しょうがないんで,3回ぐらい連続で送ってちゃんと反応するようにした。
Kernelを4.14.98に戻した方が良いかも。
新しくコメントをつける