以前、赤外線を利用してIntelNUCの電源のON/OFFをする方法を紹介しました。
今回はリモコンの任意のボタンを押したときに、任意のスクリプトが実行できるようにしてみます。基本的にはWiiリモコンで任意のスクリプトを実行する方法と同じです。/dev/input以下のeventを調べて標準ドライバから制御を奪取します。ただ、wiiリモコンと違ってつけ外しはしないので監視する必要はありません。
デバイスの確認
まずはデバイスの確認を行います。
$ cat /proc/bus/input/devices
結果の中から赤外線受信機を探します。
I: Bus=0019 Vendor=1050 Product=00c3 Version=0033 N: Name="Nuvoton w836x7hg Infrared Remote Transceiver" P: Phys=nuvoton/cir0 S: Sysfs=/devices/pnp0/00:05/rc/rc0/input3 U: Uniq= H: Handlers=kbd event3
これでイベントハンドラはevent3であることがわかりました。
ただ、この番号は接続されているデバイスや環境によって変化してしまうので以下のようなスクリプトで赤外線(CIR)デバイスのイベント番号を取得します。
力技(Bashの文字列処理)で”event3″というワードを抜き出しています。Nuvoton~の部分はNUCの世代や機種で変わるので自前の環境に書き換えて、CIRデバイスのイベントハンドラが返されることを確認してください。
#!/bin/bash RESULT=`cat /proc/bus/input/devices | grep -A 4 '"Nuvoton w836x7hg Infrared Remote Transceiver"' | grep "Handlers"` RESULT=`echo $RESULT | grep -o event[0-9]*` echo $RESULT
もっとスマートな方法がある方はコメント欄へお願いします。上記の場合、スクリプトを実行したときに”event3″が返ってくればなんでもよいです。
イベント処理を行うプログラム
指定したイベントハンドラのデバイスに割り込むプログラムをCで書きます。
$emacs irc.c
#include <errno.h> #include <fcntl.h> #include <linux/input.h> #include <linux/uinput.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/stat.h> #include <sys/types.h> #include <unistd.h> int main(int argc,char *argv[]) { char *INPUT_DEVICE =argv[1]; int input = open(INPUT_DEVICE, O_RDWR); ioctl(input, EVIOCGRAB, 1); for(;;) { struct input_event event; if (read(input, &event, sizeof(event)) != sizeof(event)) { break; } if(event.type ==1){ if(event.code==513 && event.value==1){ //1ボタン system("bash ./hoge1.sh"); } else if(event.code==514 && event.value==1){ //2ボタン system("bash ./hoge2.sh"); } else if(event.code==521 && event.value==1){ //9ボタン system("bash ./hoge9.sh"); } else if(event.code==512 && event.value==1){ //0ボタン //system("bash ./hoge0.sh"); } } } ioctl(input, EVIOCGRAB, 0); return 0; }
コンパイルは以下のコマンドです。
$gcc irc.c -o irc
正しく動いているか以下のコマンドで確認してください。
sudo ./irc /dev/input/event3
実行すれば待ち受け状態になるので、赤外線リモコンのボタンを押して、指定したスクリプトが実行されるかを確認してください。
また、プログラム内のevent.codeについては本記事の末尾に一覧を記載しました。
スクリプトの作成
上記で作成したプログラムを呼び出すスクリプトを作成します。
function searchIRimocon()は最初に”event3″を返すために作成した部分です。適宜書き換えてください。
$emacs irc.sh
#!/bin/bash function searchIRimocon(){ RESULT=`cat /proc/bus/input/devices | grep -A 4 '"Nuvoton w836x7hg Infrared Remote Transce\ iver"' | grep "Handlers"` RESULT=`echo $RESULT | grep -o event[0-9]*` echo $RESULT } function connectIRimocon(){ INPUTDEV=`searchIRimocon` if [ -n "$INPUTDEV" ];then IRCDEV="/dev/input/"$INPUTDEV ./irc $IRCDEV wait fi } SCRIPT_DIR=`dirname $0` cd $SCRIPT_DIR connectIRimocon
irc.shをサービスとして登録する
irc.shをマシン起動時に自動実行したいのでサービスとして登録します。
$sudo emacs /etc/systemd/system/irc.service
[Unit] After=network-online.target [Service] User=root ExecStart=/home/hoge/irc.sh [Install] WantedBy=multi-user.target
$sudo systemctl enable irc.service
以上で赤外線リモコンから任意のスクリプトを実行することができるようになります。
わたしは、VPNやSSH接続をするときだけ赤外線からコマンドを出してファイヤーウォールを空け、終わったら閉じる、というような用途に使っています。マシンのファイヤーウォールが完全に閉じられている状態でも外部からマシンにアクセスできるのがミソですね。
物理リモコン
今回の方法の最大の障壁は、スマートリモコンにどうやってメディアセンターのリモコンを登録するか、という点です。RATOCの家電リモコンにはASROCKとして登録されているのを確認していますが、他はわかりません。
登録作業がすごく楽になるので、活用するなら物理リモコンを買ってしまうのが正解です。一時期よりもメディアセンター系(XBOX系)リモコンが増えた気がします。
(おまけ)イベントコード一覧
irc.cではevent.codeによってどのボタンが押されたかを判断し、条件分岐しています。対応するイベントコード一覧を載せておきます。参考にしてください。
対応するキー | イベントコード |
---|---|
1 | 513 |
2 | 514 |
3 | 515 |
4 | 516 |
5 | 517 |
6 | 518 |
7 | 519 |
8 | 520 |
9 | 521 |
0 | 512 |
windows | 226 |
OK | 352 |
rec | 167 |
tempstop | 119 |
stop | 128 |
rew | 168 |
fwd | 208 |
play | 207 |
prev | 412 |
next | 407 |
back | 174 |
info | 358 |
vol+ | 115 |
vol- | 114 |
mute | 113 |
page+ | 402 |
page- | 403 |
clear | 111 |
Enter | 28 |
Intel NUC Core i5 搭載 小型 PC ベアボーン 2.5インチ/ M.2 SSD 対応 組立キット BOXNUC7I5BNH【日本正規...
コメント