ラズパイを赤外線リモコンで動かす

DIYは時給換算の世界じゃないが。。


2018にラズパイで音楽サーバーを作ってそろそろ二年。快適な音楽生活だが微妙に不満はあった。スマフォから操作可能でもWi-fiアクセスの反応が悪い。体感的には半分〜3割は反応せず通信回復に5分ぐらいかかる。曲をパスして飛ばしたい時に5分だと全部聴く羽目になるから・・・そもそもスマフォの画面ロックを解除するのも手間。アルバム単位flacとcueシートで管理してて、それをmpdから再生するとお気に入りリストが作れないという根本問題があるから、曲のパスの頻度は多いので

 

今回USB接続の赤外線リモコンをつなげて最後は無事に動いた。ついでにリモコンで電源を切れる仕組みにしたので音楽環境としては完璧。音楽リモコンのくせにボタンが多いしデザインもダサいが、これが一番安いし購入した2011年はこのタイプしかなかった記憶。

 

2年前にここまで取り組まなかったは「ちょっとの我慢解消のためにどれだけ時間を費やすか?」二の足踏んでたけどテレーワークで家にいる時間が増えたし、どんぴしゃの記事を見つけた。ところが書いてある設定をしても全く動かない。1時間未満で完了すると思いきや、、、8時間。時給換算でも8000円。おいおいラズパイの本体の値段を越してるぞ。。ラズパイで音楽サーバーを作るのは良質な音を求める限り必須ともいえるが、、私自身がPC&USB-DACとの違いを聴いて分かるレベルじゃないのも確か。。

 

「やった!できたー」でなく落ち込み系文章なのは、費やした時間の長さと、今から音楽サーバーを作る人はラズパイゼロで作ると思うから。さすがにラズパイ3や4は音楽サーバーにはオーバースペック。ゼロはUSBの口が少ないから赤外線リモコン使うのに電子工作が主流なる。それならまだbluetoothにすると思う。ただ、今回判明した方法ならば一時間未満でできる。私も色んな方の記事を組み合わせてやっと出来たから、お礼の意味も含めて書いておきます。

 

 

Linuxでの赤外線はlircパッケージが基本だけど、これをインストールすると失敗する事実に一番てこずった。

この赤外線リモコンはwindowsパソコンのコントロール用だが、今のラズパイでも普通に認識する。ところが再生ボタンや次の曲(NEXT)、前の曲(Prev)などのメディアボタンにLinuxが対応してない。すくなくともCUIベースのLinuxではどれだけ探しても情報が出てこなかった。。かつ確実にキーコードを認識するデバイスが「/dev/input/event2」だった。ここまで判明するのにかなり時間かった。なのでこのデバイスをリッスンする超簡単なプログラムが必要。。

 

.螢皀灰鵑鮗信機をつないだらEnterキーや矢印キーが動作することを確かめる。メディアボタンは変な記号がでるだけ。

/dev/input配下のdeviceを調べるために evtest を使う。複数のデバイスが出てくるから、ひとつずつ試す。

ボタン毎のキーコードが分かったらプログラムをこちらのように作る。この記事が無かったら8時間の3倍以上必要で、かつ失敗してたと思う。ほんと感謝してます。

 

ちなみにdumpkeysコマンドで調べたところ、以下のように大きな番号のファンクションキーに対応するが、このまま書いても認識しなかった。

Next 163 F90
Prev 165 F92
Stop 166 F93
Play 164 F91

 

左上端の赤いPowerボタンは認識しいない。隣ののE-mailボタンをshutdown、wwwボタンをrebootにしてます。あと大事な情報として、ボタンを一回押すとキーコードが二回出力される。リモコン側なのかデバイスドライバ側なのか原因不明だが、そのままだとNEXT押すと二曲先。play&pauseは二回押されてplayのまま。冗談みたいな世界。対処方法を色々悩んだが、必ず二回なので、二回連続読み込みで一回目は無視することに。赤と緑でreadが二度繰り返してるのはそのためです。

 

#include <stdio.h>
#include <stdlib.h>
#include <linux/input.h>
#include <unistd.h>

int main(void)
{
  for (;;) {
    struct input_event event;

 

    if (read(0, &event, sizeof(event)) != sizeof(event)) {
      exit(EXIT_FAILURE);
    }

    if (read(0, &event, sizeof(event)) != sizeof(event)) {
      exit(EXIT_FAILURE);
    }

    
switch(event.type) {
      case EV_KEY:
        switch(event.code) {
          case 163:
              system("mpc next");
            break;
          case 164:
              system("mpc toggle");
            break;

          case 166:
              system("mpc stop");
            break;

          case 165:
              system("mpc prev");
            break;

          case 115:
              system("mpc volume +2");
            break;

          case 114:
              system("mpc volume -2");
            break;

          case 155:
              system("shutdown -h now");
            break;

          case 172:
              system("reboot");
            break;


          default:
            break;
        }
        break;
      default:
        break;
    }
  }
}

このコンパイル結果をifrd.outという名前の実行ファイルにして、/etc/rc.localの最後に

/home/pi/ifrd.out < /dev/input/event2 &

と書いて終わり。

 

0



    コメント
    コメントする








       

    All List

    Categories

    Selected Entry

    links

    recent comment

    profile

    search this site.

    others

    mobile

    qrcode

    powered

    みんなのブログポータル JUGEM