Raspberry Pi Zero WにRPZ-IR-Sensorを使って学習リモコンを作る anchor.png

Raspberry Pi Zero Wに,RPZ-IR-Sensorを使って学習リモコンを作ってみる。
手持ちのパーツで自作しても良かったが,今回は,温度,湿度,気圧センサーも搭載されているRPZ-IR-SensorAmazonから5000円ぐらいで購入して使ってみることに。

RPZ-IR-Sensor.png

以前使用していたLIRCを使って,学習リモコン機能を作ってみる。

Raspberry Pi Zero Wには,Raspbian Stretchが入っている。

Page Top

LIRCのインストール anchor.png

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のビルドを参照。

Page Top

LIRCの設定 anchor.png

Page Top

デバイスドライバの設定 anchor.png

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が受信用のデバイスになっていて,送信と受信で違うデバイスを使用するようになってしまった。

Page Top

LIRC設定ファイルの修正 anchor.png

/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に書き換えるようにする。

Page Top

リモコン信号の受信の確認 anchor.png

リモコン信号を受信できるかどうか確認してみる。

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
 :

このようなメッセージが表示されれば,リモコン信号が受信出来ている。 数字は,一つのパターンの長さ(時間)を表している。

Page Top

irrecordでリモコンデータを学習する anchor.png

リモコンデータを学習するので,デーモンが動いている場合は停止しておく。

# 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
Page Top

リモコン信号の送信 anchor.png

学習したリモコンデータを使って,なにか送信してみる。

  • テレビをつけるデータを送信
    $ irsend SEND_ONCE TV power
    うまく送信されれば,TVがONする。この時,リモコン送信中を示す赤色LEDが一瞬点灯する。
  • テレビを切るデータを送信
    $ irsend SEND_ONCE TV power

power信号は,テレビをOn/Offするトグル動作になる。(OnのためのリモコンデータやOffのためのリモコンデータは無い)

ちなみに,リモコンデータを数回連続で送信したい場合は,

$ irsend -#3 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に戻した方が良いかも。


新しくコメントをつける

題名
ゲスト名
投稿本文
より詳細なコメント入力フォームへ

Front page   Freeze Diff Backup Copy Rename Reload   New Page Page list Search Recent changes   Help   RSS of recent changes (RSS 1.0) RSS of recent changes (RSS 2.0) RSS of recent changes (RSS Atom)
Counter: 1152, today: 2, yesterday: 2
Last-modified: 2020-12-26 (Sat) 15:08:03 (JST) (1069d) by yuji