IntelNUCで赤外線リモコンを使ってスクリプトを実行する方法

Intel NUC5i5RYH PC/デジモノ

以前、赤外線を利用してIntelNUCの電源のON/OFFをする方法を紹介しました。

今回はリモコンの任意のボタンを押したときに、任意のスクリプトが実行できるようにしてみます。基本的にはWiiリモコンで任意のスクリプトを実行する方法と同じです。/dev/input以下のeventを調べて標準ドライバから制御を奪取します。ただ、wiiリモコンと違ってつけ外しはしないので監視する必要はありません。

IntelNUCの赤外線で電源操作!
IntelNUCに標準搭載されている赤外線機能を使用して、赤外線リモコンで電源ON/OFFする方法を紹介します。
LinuxでWiiリモコンを使う方法
LinuxとWiiリモコンを接続して、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によってどのボタンが押されたかを判断し、条件分岐しています。対応するイベントコード一覧を載せておきます。参考にしてください。

対応するキーイベントコード
1513
2514
3515
4516
5517
6518
7519
8520
9521
0512
windows226
OK352
rec167
tempstop119
stop128
rew168
fwd208
play207
prev412
next407
back174
info358
vol+115
vol-114
mute113
page+402
page-403
clear111
Enter28
Intel NUC Core i3搭載 小型ベアボーン M.2 SSD対応 BOXNUC6I3SYK

Intel NUC Core i3搭載 小型ベアボーン M.2 SSD対応 BOXNUC6I3SYK

56,343円(04/16 02:49時点)
Amazonの情報を掲載しています

コメント