LEDシーリングライト用赤外線リモコンの製作(4)アイリスオーヤマ用

今回は複数コマンドを出力して最終形態に近づけます。

●プログラム概要

今回は最終的な出力フォーマットの評価用として、製品のリモコンと同様に3回リピート出力するようにしました。また、2つのコマンドが切り替えて出力できるようにしました。「メモリ点灯」と「消灯」の2つのコマンド出力が可能です。

まだスイッチ関係を実装していないため、一旦「消灯」したあと、2秒後に「メモリ点灯」するようにしました。

また、パルス出力部分は関数化し、コマンド種別を与えるとそれに応じた出力が得られる要にしてあります。

●プログラム(irRemoP03.ino)

スケッチのコードを示します。

/*
  アイリスオーヤマ LEDシーリングライト用赤外線リモコン評価

    copyright (c) 2013 www.wsnak.com

    13/10/16 新規作成

    一旦消灯して2秒後にメモリ点灯する
*/

/*
    ディジタル・ポート・アサイン
      IR発光(LED)  D8
*/

#define ON HIGH
#define OFF LOW

#define IR_OFF digitalWrite(8, LOW);    // IR LED(D7)
#define IR_ON  digitalWrite(8, HIGH);   // IR LED(D7)

//
// 初期化
//
void setup(void) {
  int i;

  pinMode(8, OUTPUT);   // IR発光 (IR-LED)
  IR_OFF;

  delay(500);

  irOut(0);         // 消灯

  delay(2000);

  irOut(1);         // メモリ点灯

  while(1);   // halt
}

//
// リモコン コマンド出力
//
void irOut(byte sw) {
  int i, j, k;

  // (C)
  for(i = 0; i < 74; i++) {
    IR_ON;
    delayMicroseconds(9);
    IR_OFF;
    delayMicroseconds(10);
  }
  delay(1);

  // ********* リピート部分 ************
  for(k = 0; k < 3; k++) {

  // 共通部分
  // (D)
    for(i = 0; i < 205; i++) {
      IR_ON;
      delayMicroseconds(9);
      IR_OFF;
      delayMicroseconds(10);
    }
    delay(1);

    pulseB();       // (E)
    pulseA(7);
    pulseB();
    // 共通部分終わり

    // コマンド依存部分
    switch(sw) {
      case 0:     // 消灯
        pulseA(4);
        pulseB();
        pulseA(19);
        pulseB();
        pulseA(1);
        pulseB();
        pulseB();
        pulseB();
        pulseB();
        pulseA(1);
        pulseA(1);
        break;

      case 1:     // メモリ点灯
        pulseA(6);
        pulseB();
        pulseA(17);
        pulseB();
        pulseA(1);
        pulseB();
        pulseB();
        pulseA(1);
        pulseB();
        pulseB();
        pulseA(1);
        break;
    }
    delay(9);
  }
}

//
// パルス(A)出力
//
void pulseA(int n) {
  int i, j;

  for(j = 0; j < n; j++) {
    for(i = 0; i < 19; i++) {
      IR_ON;
      delayMicroseconds(9);
      IR_OFF;
      delayMicroseconds(9);
    }
    delayMicroseconds(520);
  }
}

//
// パルス(B)出力
//
void pulseB(void) {
  int i;

//  for(i = 0; i < 57; i++) {
  for(i = 0; i < 55; i++) {
    IR_ON;
    delayMicroseconds(9);
    IR_OFF;
    delayMicroseconds(10);
  }
  delayMicroseconds(520);
}

//
// メインループ
//
void loop(void) {
}

出力部分は関数”irOut()”にまとめてあります。この関数は共通部分を出力したあと、switch文でコマンドを切り替えて出力し、それら一連の処理を3回繰り返すようになっています。なお、(C)のパートはリピートさせずに1回限りの出力なので、3回の繰り返しループの外にあります。

コマンドを増やす場合は、”irOut()”のswitch文のcaseをコマンドの数だけ増やして対応します。

パルスのパターン出力の処理は、コマンド毎にパターンの入ったテーブルを用意して、それを出力時に参照して出力させるとスマートですが、条件判定など処理が入ると波形に影響してたぶん再調整が必要になるので、今回は単純に関数を並べるようにしました。


次回は4つのスイッチでコマンドを切り替えるようにします。

(続く)

コメントは受け付けていません。