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


新しくコメントをつける

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

トップ   凍結 差分 バックアップ 複製 名前変更 リロード   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom
Counter: 1274, today: 1, yesterday: 1
最終更新: 2020-12-26 (土) 15:08:03 (JST) (1210d) by yuji