家電製品を操作するリモコン。普段使わないボタンってありますでしょうか?
手元のチューナのリモコンは、「チューナー電源」「チューナー音量」のボタンの他に、「TV電源」「TV音量」といったボタンがありますが、普段は使っていません。
この普段使わないボタンで、TVではなく別の機器・・・・バースピーカーの電源や音量の操作ができれば便利かと思いまして。
その願いの実現のため。Raspberry Piを使って、任意のリモコンの赤外線を受信後、別のリモコンの信号をRaspberry Piから送信するようなシステムを構築してみたいと思います。
目次
Raspberry Piの赤外線受信/送信、受信後のコマンド実行設定
使用する機器
Raspberry Pi
GPIO端子のピンヘッダがはんだ付け済みのRaspberry Pi Zero WHを使用しましたが、どの機種でも大丈夫かと思います。赤外線受信/送信ユニット
リモコン信号の送受信にlircを使用しますが、基本的にGPIO端子に赤外線リモコン受信モジュールと赤外線LEDを取り付ければ大丈夫のようです。上記のセンサーユニットは送信用の赤外線LEDを3つ搭載しているため、部屋の隅々まで赤外線が送信されます。さらに送信時に赤色のLEDが光るため、動作を目視で確認可能です。
また赤外線LED/受信モジュールの他に、汎用的なボタンやセンサー(温度、湿度、気圧、光(照度))が付いていますので、Raspberry Piを赤外線リモコン以外の目的、たとえばお部屋の温度の確認・記録等に併用が可能です。具体的にこちらの記事になります。
OS
Raspbianを使用させて頂きました。
初期設定は宜しければこちらの記事を御覧ください。
lircd, irexec設定手順
Raspberry Pi設定の全体的な流れは以下になります。
- Linux赤外線リモートコントロール・デーモンlircd(Linux Infrared Remote Control Daemon)をインストールします。
- リモコンのボタン(赤外線信号)に名前をつけながら記録、リモコンのconfファイルを作成します。
- 赤外線信号を受信した時の動作を決めて、irexecのconfファイルを作成、irexecデーモンを実行します。
lircインストール
- /boot/config.txtを変更して、lircドライバを有効にします。
sudo vi /boot/config.txt
51行目付近、dtoverlay=lirc-rpi行を有効にして、さらに送信/受信用のGPIOピンを指定します。
dtoverlay=lirc-rpi dtparam=gpio_out_pin=13 dtparam=gpio_in_pin=4
- lircをインストールします。
sudo apt-get install lirc
- lirc_options.confを変更します。
sudo vi /etc/lirc/lirc_options.conf
driverをdefaultに変更、さらにdeviceを指定しました。
#driver = devinput driver = default #device = auto device = /dev/lirc0
- lircdサービスを有効にします。
sudo systemctl enable lircd
- 再起動して設定変更を反映します。
sudo reboot
- lircdサービスが動作していることを確認します。
sudo systemctl status lircd
driverがdevinputの場合、lircd実行時にエラーが表示されて、うまく動かない感じでした。defaultの場合、エラー表示無く動作しますが、赤外線データはraw形式で記録する必要がある感じです。(hex形式はエラーが出て記録できませんでした)
lircd(赤外線受信デーモン)設定
リモコンのconfファイルはこちらからダウンロードできるようです。
ダウンロードしたconfファイルは、/etc/lirc/lircd.conf.d/ディレクトリにコピー後、lircdサービスを再起動すると有効になるようです。
以下、自分でconfファイルを作成する手順になります。
リモコンを登録する際、ボタン(赤外線信号)に名前を付ける必要があります。あとでirexecサービスを使用する都合から、予め用意されているキー/ボタン名を付けようと思います。
次のコマンドで、キー/ボタン名の一覧を表示できます。
irrecord -l
たとえばチューナーのリモコンの場合、次のようにキー/ボタン名を割り当ててみました。ボタンは49個もあるのですね・・・。
チューナーリモコンのirrecordマッピングの例
No. | ボタン名 | マッピング |
---|---|---|
1 | 電源 | KEY_POWER |
2 | 画面切換 | KEY_SELECT |
3 | TV電源 | KEY_POWER2 |
4 | TVチャンネル先 | KEY_NEXTSONG |
5 | TVチャンネル前 | KEY_PREVIOUSSONG |
6 | TV音量増 | KEY_VOLUMEUP |
7 | TV音量減 | KEY_VOLUMEDOWN |
8 | TV消音 | KEY_MUTE |
9 | TV入力切換 | KEY_APPSELECT |
10 | 早戻し | KEY_REWIND |
11 | 再生/一時停止 | KEY_PLAY |
12 | 早送り | KEY_FORWARD |
13 | 前 | KEY_PREVIOUS |
14 | 停止 | KEY_STOP |
15 | 先 | KEY_NEXT |
16 | ホーム/現在番組 | KEY_DASHBOARD |
17 | 情報 | KEY_INFO |
18 | メニュー | KEY_MENU |
19 | 戻る | KEY_ESC |
20 | 上 | KEY_UP |
21 | 下 | KEY_DOWN |
22 | 左 | KEY_LEFT |
23 | 右 | KEY_RIGHT |
24 | 決定 | KEY_ENTER |
25 | AVeL | KEY_TV2 |
26 | テレビ | KEY_TV |
27 | 番組表 | KEY_EPG |
28 | データd | KEY_DATABASE |
29 | チャンネル先 | KEY_CHANNELUP |
30 | チャンネル前 | KEY_CHANNELDOWN |
31 | 字幕 | KEY_SUBTITLE |
32 | 音声切換 | KEY_AUDIO |
33 | 番号入力 | KEY_NUMLOCK |
34 | 1 | KEY_F1 |
35 | 2 | KEY_F2 |
36 | 3 | KEY_F3 |
37 | 4 | KEY_F4 |
38 | 5 | KEY_F5 |
39 | 6 | KEY_F6 |
40 | 7 | KEY_F7 |
41 | 8 | KEY_F8 |
42 | 9 | KEY_F9 |
43 | 10 | KEY_F10 |
44 | 11 | KEY_F11 |
45 | 12 | KEY_F12 |
46 | 青 | KEY_F13 |
47 | 赤 | KEY_F14 |
48 | 緑 | KEY_F15 |
49 | 黃 | KEY_F16 |
リモコンの登録手順
- lircdサービスを停止します。
sudo systemctl stop lircd
- irrecordコマンドを実行します。-fオプション付き(Raw記録モード)で実行しました。
irrecord -d /dev/lirc0 -f -H default
- Enterを押すと、環境光が測定されます。
- リモコンの名前を入力します。<メーカー名>_<リモコンに書いてある型番>を入力してみました。
- リモコン信号のギャップ測定の説明が表示されます。次のような内容です。
- リモコンのボタンをランダムに押しますが、1つのボタンは1秒くらい押します。ドット(.)が10個でると押しすぎです。
- ドット80個で1行、合計2行出るくらいまで、異なるボタンを押して下さい。
- エンターキーを押して、ギャップ測定を開始します。ドットが10個を超えない範囲で、リモコンのボタンを1つずつ変えながら押して行きます。
- ボタン名を入力します。電源ボタンとして、KEY_POWERを入力しました。
- 「Now hold down button “<ボタン名>”」が表示されたら、リモコンのボタンを押します。
- 13番~14番を繰り返して、ボタンを登録してゆきます。
- 最後にエンターキーのみ入力すると、10番で入力した<リモコン名>.confファイルが作成されます。
- 作成したconfファイルを/etc/lirc/lircd.conf.dディレクトリにコピーします。
sudo cp <リモコン名>.conf /etc/lirc/lircd.conf.d/
- devinput用のconfファイルはリネームしておきました。
sudo mv /etc/lirc/lircd.conf.d/devinput.lircd.conf /etc/lirc/lircd.conf.d/devinput.lircd.conf.bak
- lircdサービスを起動します。
sudo systemctl restart lircd
以上でリモコンの登録が完了しました。
赤外線の受信確認
irwコマンドで、赤外線信号の受信確認が可能です。
irw
赤外線の送信
irsendコマンドで、登録した赤外線を送信できるようです。
irsend SEND_ONCE <リモコン名> <ボタン名>
Raspberry Piで家電製品を操作したい場合、こちらのコマンドを実行するかたちです。
irexec設定
ここからは、Raspberry Piで赤外線を受信して、コマンドを実行する設定になります。
/etc/lirc/irexec.lircrcファイルにリモコンのボタンとコマンドの対応を書いておき、irexecデーモンを実行することで、リモコンのボタンで好きなコマンドを実行することができるようです。
最初に~/.config/lircrcファイルを作成、irexecコマンドを実行しながら動作を確認し、設定が完成したら/etc/lirc/irexec.lircrcにコピーすれば、設定中のサービスの再起動は必要無さそうです。
- lircrcファイルを作成します。
vi ~/.config/lircrc
たとえば次のような内容です。
begin prog = irexec button = KEY_POWER config = echo "Powerボタンが押されました" end begin prog = irexec button = KEY_F13 config = echo "青ボタンが押されました" end
- irexecコマンドで動作を確認します。
irexec
- Raspberry Pi起動時に、irexecが自動起動するようにする場合、/etc/lirc/irexec.lircrcファイルを作成します。
sudo vi /etc/lirc/irexec.lircrc
チューナーの「TV電源」ボタンが押されたら、バースピーカーの「電源」赤外線を送信するようにしました。
begin prog = irexec button = KEY_POWER2 config = /usr/bin/irsend SEND_ONCE yamaha_FSR77 KEY_SOUND end
- systemctlでirexecサービスを有効にします。
sudo systemctl enable irexec --now
irexecサービスを有効にしましたので、Raspberry Piを再起動しても、リモコンの受信→コマンド実行が動作するかと思います。
普段使わないリモコンのボタンにRaspberry Piのシャットダウン(/sbin/halt)を割り当ててみましたが、リモコンを使ってちゃんとシャットダウンできました。
もしも使ってない余ったリモコンがありましたら、たとえばGPIOに接続した機器を動かしたり、カメラで撮影したり等、Raspberry Piのコントロール用として使用するのも面白いかもしれませんね。