カテゴリ
リンク

当サイトは、玄箱PRO (KURO-BOX/Pro)を中心とした組み込み、Linuxと電子工作を扱っています。
会社案内

情報セキュリティおよび個人情報の取り扱いについて


コメントとトラックバックは、spamを予防するために、編集担当が公開の作業をするまで非公開になっています。コメントはそれぞれ投稿した人のものです。

Arduinoを使った回路
 RI端子につなぐ回路にはArduinoを使いました。トランジスタを使った回路でRI端子に5[V]/開放の信号を作る送信回路(2SA1015)と受ける受信回路(2SC1815)としています。RI端子の信号はArduinoで解析してシリアル・ポートに送り、シリアル・ポートから受け取ったコマンドをRI端子へ出します。

Arduino-RI.png
Arduinoを使ったRI端子と玄箱のUSBポートにつなぐ回路


ブレッドボードに組んだ回路
 ブレッドボードに組んだ回路は写真のようになりました。配線が長いので、煩わしく見えますが、すごくシンプルです。

20111112_150749.JPG
Arduinoとブレッドボードに組んだ回路

 RI端子へは3.5φモノラル・プラグの先端を使います(手持ちがなかったのでステレオ・プラグを使っている)。グラウンドはRCAプラグのグラウンド側を使い、アンプの空き端子につなぎます。

20111112_150808.JPG
アンプにつなぐ端子(RCAプラグ(上)と3.5φステレオ・プラグ(下))

Arduinoのスケッチ
 スケッチのloop関数でRI端子とシリアル・ポートを見張ります。RI端子に変化があったとき(トランジスタで論理を反転しているのでLOWになる)、recieve関数(以下)で読み取ります。1ビットの長さは1msあるので、その中央でピンのHIGH(0)/LOW(1)を読み取るようにします。そのため、最初に関数が呼び出されてから0.5[ms]後に1ビット読み、1[ms]待って次のビットを読みます。6回繰り返したら、sig2byte関数で6ビットから4ビットに変換をしています。

long recieve(bool s)
{
  long r = 0;
  byte recv[6];
  unsigned long time = micros() + 500;

  delayMicroseconds(500);
  
  for (int j=0; j<6; j ++) {
    for (int i=0; i<6; i ++) {
      if (digitalRead(pinRIin) == HIGH) {
//        Serial.print("0,");
        recv[i] = 0;
      } else {
//        Serial.print("1,");
        recv[i] = 1;
      }
      while ((micros() - time)<1000) {}
      time += 1000;
    }
    int b = sig2byte(recv);
    if (b>=0 || r>=0) {
      r = (r<<4 | b);
      if (s)
        Serial.print(b, HEX);
    } else {
      r = -1;
      if (s)
        Serial.print('X', BYTE);
    }
  }
  if (s)
    Serial.println();

  return r;
}

 シリアル・ポートからのデータは1バイトずつ受信し、改行コードを受信したらRI端子から送信します。6バイトを超えた場合には不正なデータとして破棄しています。スケッチの全体はOnkyoIntec205-111112a.zipです。Arduinoに書き込んでください。

  // シリアルから文字を受信したとき
  if (Serial.available()) {
    int b = Serial.read();
    if (b == '\r' || b == '\n') {
       if (len == 6) {
         send(cmd);
         if (strncmp(cmd, S_ALL_POWER_ON, 6) == 0) 
           power = true;
         else if (strncmp(cmd, S_ALL_POWER_OFF, 6) == 0) 
           power = false;
       }
       len = 0;
    } else {
      if (len<6) {
        cmd[len] = b;
        len ++;
      } else {  // 6バイト以上送られてきたときは受信した文字を捨てる
        len = 0;
      }
    }
  }
■MPDクライアントの動作を考える
 MPDからの音声信号はアンプ(Onkyo A-909)のCD端子につなぐことにします。MPDとアンプの連動としては、以下が考えられます。

  1. ミニコンポのリモコン(アンプ)を操作したときに、自動的にアンプの電源を入れ、MPDの再生を始める
  2. ミニコンポの電源がOFFになったとき、MPDの再生を止める
  3. ミニコンポのリモコン操作にMPDの動作を対応させる
  4. MPoDや、そのほかのMPDクライアントからMPDの操作があったとき、自動的にアンプの電源を入れる
 1から3はRI端子の信号を見張って(ri_check関数)、MPDへコマンドを送る(mpd_send_cmd関数)ことで、4はMPDの状態を見張って(mpd_get_status関数)、RI端子にコマンドを送れば(ri_send関数)実現できます。詳細は省きますが、main関数の以下のループで実現をしています。プログラム全体はintec205mpd.tar.gzですので、ダウンロードしてコンパイルしてください。

  while (1) {
    /* RI 端子の信号をチェックする */
    ri_cmd = ri_check(asy);
    if (ri_cmd > 0) {
      //fprintf(stderr, "%06x\n", ri_cmd);
      if (ri_cmd == CD_PLAY) {
	// 再生ボタンが押されたら、mpdにplayを送って、アンプの電源を入れる
	mpd_send_cmd(s_mpd, "play\n");
	mpd_playing = 1;
	ri_send(asy, ALL_POWERON);
	ri_send(asy, AMP_XXX);
	ri_send(asy, AMP_SELCD);
      } else if (ri_cmd == CD_PAUSE)
	mpd_send_cmd(s_mpd, "pause\n");
      else if (ri_cmd == CD_STOP || ri_cmd == ALL_POWEROFF)
	mpd_send_cmd(s_mpd, "stop\n");
      else if (ri_cmd == CD_NEXT)
	mpd_send_cmd(s_mpd, "next\n");
      else if (ri_cmd == CD_PREV)
	mpd_send_cmd(s_mpd, "previous\n");
      else if (ri_cmd == CD_RANDOM) {
	if (mpd_status.random == 0)
	  mpd_send_cmd(s_mpd, "random 1\n");
	else
	  mpd_send_cmd(s_mpd, "random 0\n");
      } else if (ri_cmd == CD_REPEAT) {
	if (mpd_status.repeat == 0)
	  mpd_send_cmd(s_mpd, "repeat 1\n");
	else 
	  mpd_send_cmd(s_mpd, "repeat 0\n");
      }
    }
    // mpd の状態をチェックする
    if (s_mpd > 0) {
      if (mpd_get_status(s_mpd, &mpd_status) < 0) {
	/* エラーの場合は接続を切る */
	shutdown(s_mpd, SHUT_RDWR);
	close(s_mpd);
	s_mpd = -1;
      } else {
	if (strcmp(mpd_status.state, "play") == 0) {
	  if (mpd_playing == 0) {
	    // 再生が始まったら、アンプの電源を入れる
	    // fprintf(stderr, "Start playing\n");
	    ri_send(asy, ALL_POWERON);
            ri_send(asy, AMP_XXX);
	    ri_send(asy, AMP_SELCD);
	  }
	  mpd_playing = 1;
	} else {
	  mpd_playing = 0;
	}
      }
    }
    usleep(100*1000);
  }

■おわりに
 MPD とアンプが連動すると、ほんとにミニコンポみたいな使い勝手になります。MPoDでアルバムを選択すれば、あとはアンプのリモコンで操作できます。とくに便利なのが電源OFFです。INTEC 205シリーズをお持ちの方はお試しください。
(光永 法明)

 カテゴリ 

  ,

トラックバック(0)

このブログ記事を参照しているブログ一覧: MPD (Music Player Daemon) とミニコンポを連動させる (2/2)

このブログ記事に対するトラックバックURL: http://www.eleki-jack.com/mt/mt-tb.cgi/6142

コメントする

おすすめ書籍
Powered by
Movable Type 4.1
/*yahoo remove*/