iアプリ 赤外線API備忘録

初一眼レフデジカメPENTAX k-xを購入して、インターバル撮影をしようとしたら・・・そんな機能無かった。
というわけで、無ければ作ればいいんだね。って感じで、PENTAX リモートコントロールFをベースに試行錯誤した備忘録です。
かつ、ネット上であまり情報が無かったので理解できた範囲で掲載します。

参考URL
Nicon用iアプリ「デジりも」→これを改造させて頂いています。
http://www.shirakami.or.jp/~ti/

PENTAX用iアプリの開発記(リモコンアプリ作成のタグから)
http://puriusu.blogspot.com/

リモートコントロールFの赤外線受信結果
http://hpv.cc/~maty/pukiwiki1/index.php?Arduino%2FPENTAX%A5%EA%A5%E2%A1%BC%A5%C8%A5%B3%A5%F3%A5%C8%A5%ED%A1%BC%A5%EBF#o1332633

IR remote shutter control for PentaxっていうPalmOS用プロジェクト
http://sourceforge.net/projects/prcf/

リモートコントロールFの赤外線仕様
ボタン一回押し(単位:100us)
46697 1287 296 101 98 100 98 101 97 100 98 100 97 100 100 98

リレーズ(ボタンを押し続けた場合)(単位:100us)
46697 1287 296 101 98 100 98 101 97 100 98 100 97 100 100 98
46697 397
24416 397
24416 397


上記の受信データをmsで切り上げると
ボタン一回押し(単位:ms)
47 13 3 1 1 1 1 1 1 1 1 1 1 1 1 1

リレーズ(ボタンを押し続けた場合)(単位:1ms)
47 13 3 1 1 1 1 1 1 1 1 1 1 1 1 1
47 4
25 4
25 4


図にすると、以下の様になる

DoJa-3.0プロファイルでの赤外線コントロールAPI解説
赤外線送信部プログラムの抜粋
--
import com.nttdocomo.device.*;

int nKhz = 38;

IrRemoteControl Ir = new IrRemoteControl();
Ir.setCarrier(5000/nKhz, 5000/nKhz);
Ir.setCode0(PATTERN_HL, 1000, 1000);
Ir.setCode1(PATTERN_HL, 3000, 3000);
IrRemoteControlFrame Irf = new IrRemoteControlFrame();
Irf.setFrameData(new byte[] { 0x00, }, 8);
Irf.setStartHighDuration(13000);
Irf.setStartLowDuration(3000);
Irf.setStopHighDuration(0);
Irf.setFrameDuration(320);
Irf.setRepeatCount(1);
--

各関数に渡す引数の詳細
setCarrier(int High, int Low);
データ搬送のための搬送波High時、Low時の周期
周波数38kHzの逆数1/38000=0.0000263157sが1周期に要する時間となる。
0.0000263157s=0.0263157ms=26.3157us
ドコモの仕様により、搬送波のHigh,Low時間は同一とする必要があるため、1周期の半分26.3157us/2=13.15785usを0.1us単位で引数として与えると
setCarrier(131, 131)またはsetCarrier(132,132)となる。

setCode0(int Pattern, int High, int Low);
setCode1(int Pattern, int High, int Low);

データ部のビット搬送のための論理0、論理1の設定

※SO505i(s)では、仕様上の制限がある。
setCode0とsetCode1のパターンが共にHigh先行の場合は、setCode0, setCode1, setStopHighDuration のHigh部長さを統一する必要がある。
setCode0とsetCode1のパターンが共にLow先行の場合は、setCode0, setCode1 のLow部長さを統一する必要がある(setStopHighDuration は常に0)。
setCode0とsetCode1のパターンがHigh先行、Low先行またはLow先行、High先行の場合はHigh部長さ、Low部長さまたはLow部長さ、High部長さを統一する必要がある(setStopHighDuration は常に0)。
詳しくは、http://www.nttdocomo.co.jp/english/binary/pdf/service/imode/make/content/iappli/caution/so505is_iappli_notes_1.pdfを参照

setFrameData(int duration);
IrRemoteControlFrameデータを送信するための、全体の時間を指定する。
13000(スタート部High時間)+3000(スタート部Low時間)+16000(setFrameDataで指定したデータを送るための総コスト→0を8bit分送るためには、setCode0で指定したHigh時間とLow時間を合わせた、bit数分の積=8*(1000+1000)=16000)+0(ストップ部)=32000us=32msを0.1ms単位とすると320
リピートしてフレームを送り続ける場合には、遅延時間を考慮する(例えば、25ms待機してデータがリピートされる様にするためには、320+250=570)。

inserted by FC2 system