pomo123の日記

2006-10-01

iアプリで赤外線リモコン信号を送信

注意点

  • IrRemoteControl.send()の引数の型は配列、IrRemoteControlFrame[]
  • send()はバックグランドで実行される(デフォルトで10秒間送信される)。送信中に再度send()すると例外が発生する。
  • IrRemoteControlFrame.setFrameDuration()の単位は0.1msec、他のメソッドはusec単位
  • 送信するデータはメーカー、モデル、コードから構成される。詳細はRed Snake Common
  • リモコンモニタなどで収集したデータを下にするときには、LSBファーストかどうかに注意
  • IrRemoteControl.setCarrier()の引数の単位は0.1msec、他のメソッドはusec単位。highDurationとlowDurationをそれぞれ指定するので、周波数が38kHzなら、1000/38k/210000/38k/2になる。

iアプリのコード


import com.nttdocomo.device.IrRemoteControl;
import com.nttdocomo.device.IrRemoteControlFrame;
import com.nttdocomo.ui.*;

public class irremotetest extends IApplication {

    int freq = 38; // KHz
    int base = 425; // usec
    boolean status = false;

    IrRemoteControl irc;

    public void start() {
        irc = IrRemoteControl.getIrRemoteControl();
        byte[] datas = new byte[6];

        try {
            Dialog dia = new Dialog(Dialog.BUTTON_OK, "IRリモコンテスト");
            dia.setText("送信します\n");
            dia.show();
            datas[0] = 1;
            datas[1] = 2;
            datas[2] = 3;
            datas[3] = 4;
            datas[4] = 5;
            datas[5] = 6;
            
            send(datas);
            Thread.sleep(10000);

            dia.setText("送信しました\n");
            dia.show();
            this.terminate();

        } catch (Exception e) {

        }

    }

    public void send(byte[] data) {
        irc.setCarrier(10000 / freq / 2, 10000 / freq / 2);
        irc.setCode0(IrRemoteControl.PATTERN_HL, base * 1, base * 1);
        irc.setCode1(IrRemoteControl.PATTERN_HL, base * 1, base * 3);

        IrRemoteControlFrame[] ircf = new IrRemoteControlFrame[1];
        IrRemoteControlFrame frame = new IrRemoteControlFrame();
        frame.setFrameData(data, data.length * 8);
        frame.setStartHighDuration(base * 8);
        frame.setStartLowDuration(base * 4);
        frame.setStopHighDuration(base * 1);
        frame.setFrameDuration(data.length * 8 * base * 4 / 100 + 60 + 85);
        frame.setRepeatCount(IrRemoteControlFrame.COUNT_INFINITE);
        ircf[0] = frame;
        irc.send(1, ircf);
        status = true;
    }
}

参考資料:ドコモの技術資料iアプリコンテンツ開発ガイド for DoJa-5.x 詳細編

すがりすがり 2006/10/19 10:03 気になったんですが、キャリアー周波数の所で何故割る2なんですか? これだと動かないと思いますが

pomo123pomo123 2006/10/19 23:59 これは罠です。
ドコモのDojaの仕様書をよく読むとわかりますが、
setCarrierの引数はhighDurationとlowDurationをそれぞれ指定します。
デューティ50%だったら、それぞれの時間は周波数の逆数の半分になります。

ひろかわひろかわ 2006/11/24 21:26 はじめまして、参考にさせていただきました。
ソースをほとんどそのまま、
流用させていただいちゃいましたがよかったでしょうか?
http://hirokawa.netflowers.jp/entry/662/

もし不都合がありましたらご連絡ください。

pomo123pomo123 2007/12/07 22:54 id:maskyさんへ、KHzをHzに変更するには、freqを(freq2/1000)に置換してはどうでしょう?DojaのIRリモコンAPIは単位がややこしい(0.1usecが単位だったりする)のでAPI仕様書(Javadoc)に目を通す、がいいと思います。

通りすがり通りすがり 2008/10/04 13:30 int base = 425; // usec の425は何の値でしょうか?また、この値は機種に依存して変更しなければならない値なのでしょうか?御面倒ですが、よろしくお願いいたします。

pomo123pomo123 2008/10/04 19:02 よくわかりませんが、家電のリモコンのフォーマットを決めた家製協フォーマットでは
350 < T < 500usec
になっているそうです。受信デバイスごとに差はあるのかもしれませんが、そんなに厳密ではないと思いますよ。いろいろトライしてみてください。ドコモのiアプリコンテンツ開発ガイド for DoJa-5.xあたりにも目を通すといいと思います。

通りすがり通りすがり 2008/10/05 19:12 ご回答ありがとうございます。とりあえず、for Doja-5.x を目を通してみます。また、よろしくお願いいたします。

通りすがり通りすがり 2008/10/06 21:35 「highDurationとlowDurationをそれぞれ指定するので、周波数が38kHzなら、1000/38k/2になる。
」とありますが、何が1000/38k/2になるのでしょうか?よろしくお願いいたします。

pomo123pomo123 2008/10/06 22:39 highDurationとlowDurationで1周期(周波数の逆数 1/38k [sec])になります。highDurationだけだと、その半分で、1/38k/2、さらに0.1msecに単位変換して、10000/38k/2です。※本文修正しておきます

通りすがり通りすがり 2008/10/10 10:33 ご回答ありがとうございます。理解できました。

通りすがり通りすがり 2008/10/22 21:35 setFrameDuration(data.length * 8 * base * 4 / 100 + 60 + 85);
の計算について教えてください。
100で割ってるのは0.1msec単位のためだと思うのですが
60 + 85 はどこからくる値なのでしょうか?

pomo123pomo123 2008/10/23 07:11 うーん、わすれてしまいました。
↓を参考にしたのかもしれません。
http://www.mdn.co.jp/webcre/Javaprog/Vol21/

通りすがり通りすがり 2008/10/23 17:04 回答ありがとうございます。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証