iアプリでリモコンを送信する方法

2008年12月10日 このエントリをはてなブックマークに登録

当サイトでは、iRemo2で利用しているリモコン・データをこちらのDBで公開しています。
で、それをiアプリで使う方法をちょっとだけ説明
リモコンアプリの作成を考えてる人は参考にして下さい。

長くなったので折りたたみ↓↓↓

 iアプリでリモコンを扱うには、

パッケージ com.nttdocomo.device のクラス IrRemoteControl と IrRemoteControlFrame の2つのクラスを使います。

NECのTVの電源ボタンに割り当てられているデータは以下のようになっています。

割り当て信号
キャリア:132ns / 132ns
コード0 PT:0 600us/550us
コード1 PT:0 600us/1620us
ヘッダー:9000us/4500us
ストップ:600us/39200us
データ:0x18E710EF
ビット数:32bit
送信回数:1回
 

キャリア:132ns / 132ns
コード0 PT:0 600us/550us
コード1 PT:0 600us/1620us
ヘッダー:9000us/2200us
ストップ:0us/95200us
データ:0x00
ビット数:1bit
送信回数:無限
 

ボタン押下リピート:最終信号

割り当て信号は、上から順番に、フレーム1・フレーム2と一番下に、ボタンが押し続けられた場合の信号送信方法を示しています。
リモコンによっては、フレームが1つだけの物もあれば、複数フレームの物も有ります。

iアプリでは、複数のフレームを1度に指定して送信する事が可能です。
(ただし、キャリア / コード0 / コード1 は1つしか指定できないので、この3つの数値が異なるフレームは、複数回に分けて送信する必要が有ります。)

それでは、まず、IrRemoteControlFrameクラスで、データを用意します。

このデータの場合フレームは2つなので、2個の配列と実態を用意

	IrRemoteControlFrame [] irf = new IrRemoteControlFrame[2];
	irf[0]=new IrRemoteControlFrame();
	irf[1]=new IrRemoteControlFrame();

フレーム1のヘッダー / ストップ / データ / ビット数 / 送信回数 をセットします。

	// ヘッダー
	irf[0].setStartHighDuration(9000);
	irf[0].setStartLowDuration(4500);
	// ストップ
	irf[0].setStopHighDuration(600);
	irf[0].setFrameDuration(1072);
	// データ+ビット数
	irf[0].setFrameData(new byte[] {(byte)0x18,(byte)0xE7,(byte)0x10,(byte)0xEF},32);
	// 送信回数
	irf[0].setRepeatCount(1);

注意点は、setFrameDuration

これは、このフレーム全体の送信時間を指定する必要があって、自動で計算してくれないので自分で計算する必要があります。

ヘッダー時間+ストップ時間+データ送信時間

データ送信時間の計算が面倒。

18E710EFを2進に変換して、0の数 x コード0時間 + 1の数xコード1時間

16進 18E710EF > 2進 0001 1000 1110 0111 0001 0000 1110 1111

0 = 16個 / 1 = 16個

全部足すと

9000+4500+600+39200+16*(600+550)+16*(600+1620)
=107220us

指定は、0.1ms単位なので、1072が正解

続けて、次のフレームも設定します。

	irf[1].setStartHighDuration(9000);
	irf[1].setStartLowDuration(2200);
	irf[1].setStopHighDuration(0);
	irf[1].setFrameDuration(1075);
	irf[1].setRepeatCount(IrRemoteControlFrame.COUNT_INFINITE);
	irf[1].setFrameData(new byte[] {(byte)0x00},1);
setRepeatCountには、無限を表すIrRemoteControlFrame.COUNT_INFINITEを指定。

これで、フレームのデータ設定は終了

続いて、IrRemoteControlクラスを使って用意したフレームデータの送信です。

IrRemoteControlクラスの宣言と、キャリア / コード0 / コード1のセット

	IrRemoteControl ir = IrRemoteControl.getIrRemoteControl();
	ir.setCarrier(132,132);
	ir.setCode0(0,600,550);
	ir.setCode1(0,600,1620);

後は、送信

	ir.send(2,irf);

 これでは、10秒間でっぱなしなので、適当な所で

	ir.stop();

で止めると言った具合です。

リモコン送信 サンプル プログラム

参考用に、今回のプログラムのプロジェクトファイルをアップしておきます。
DoJa 3.5で作ってます。

irTest.zip

※2つ目のフレームの指定の表示が間違っていましたので、修正しました。(2009/2/16)

タグ: ,



コメント / トラックバック6件

  1. 河内 大介 より:

    こちらはとてもすばらしいアプリだと思います。
    ただ会社の携帯がdocomoでなんとか使用かのうですが、私用の携帯がsoftbankのためこちらも対応することは可能でしょうか。

  2. Futaba より:

    iRemoのことですよね?
    僕自身、docomoの携帯しか持ってないので・・・難しいですね。ごめんなさい。
    リモコンデータ公開してるので、誰か実機を持ってる人が作ってくれればいいのですがね

  3. g19 より:

    iRemoの記事を参考にdojaのプログラムで自宅のTVなどのリモコンをテストして遊ばせてもらっています。
    LIRCからテストしたい型番のデータを確認することができました。

    http://lirc.sourceforge.net/remotes/aiwa/RC-AAT11

    ただ、上記の形式のデータですと、ストップ信号などFutabaさんのデータベースに記載されている項目が載っていないため困っています。
    ストップ信号は算出できるものなのでしょうか。(gapの値から?)

    また、上記サイトのデータでは「pre_data_bits 26」、「pre_data 0x381E3F」とありますが、pre_dataを単純にカウントすると24bitなのでは?と困惑しています。
    勉強不足の致すところですが、ご教示もしくは参考になるURLなどご紹介いただけませんでしょうか。
    よろしくお願いいたします。

  4. Futaba より:

    >g19様
    コメントありがとうございます。
    申し訳無いですが、もう長くLIRCは触って無いので、データのフォーマットは忘れてしまいました。
    ですので、以下は推測ですが・・・

    ストップ信号については、逆算で求めるしか無いと思います。
    多分、gapがsetFrameDurationで、ptrailがsetStopHighDurationの値かなと思われます。

    pre_dataについては、「pre_data_bits」が正しくて、「pre_data 0×381E3F」は頭の0が省略されているだけでは無いかと思います。
    コードのデータでは0が省略されずに「0x000000000000807F」等と表示されているので、「0x381E3F」は「0x0000000000381E3F」と同等かなと思われます。

    以上、あくまでも推測ですので、正しいかどうかは自身がありません。
    時間があれば、LIRCのソースを見てみるのですが・・・

  5. g19 より:

    >Futabaさん
    早速のご回答ありがとうございます!
    糸口ありがとうございます。確認してみます。
    あともうちょい勉強もしときます。
    ありがとうございました。

  6. g19 より:

    >Futabaさん
    頂いた内容でリモコン、できました。

    「0×381E3F」については、教えていただいたように26bitになるよう先頭に0を送信するように組んで解決しました。
    gap、ptrailともに教えていただいた内容でいけました。

    結果的には、データが「POWER 0x00000000000000FF」の場合には、
    送信されたデータは「0E 07 8F C0 3F C0」の先頭42bitというようになりました。

    これでうちのリモコンも本体側の音量つまみも壊れたコンポの音量を操作できるようになりました。

    ありがとうございました!