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

今回は評価用サンプルプログラムを説明します。とりあえず、「メモリ点灯」だけ固定で出力できるものを作成し、実際に照明が作動するところまで確認しました。

●処理概要

次の図は出力波形の抜粋ですが、一見複雑に見えますが、図の(A)~(E)の部分に処理を分けて、それを組み合わせると考えれば単純になります。

wave7

(C)~(E)とそれに続く(A)の繰り返しと(B)まで(コマンドに関係無く共通のパターン)は、リーダと機種識別のためのコードだと考えられますが、この部分は固定です。さらに(A)の部分はこれを1コマと考え、それを何回繰り返すかという風に考えると単純になります。

実際にプログラム上での処理は(A)~(E)のブロックに分けています。
それぞれは約13usのHレベル出力と約13usのLレベルの出力を規定回数繰り返し(38kHzのキャリアの一サイクル)、規定時間ディレイする、という処理になっていて、(A)~(E)のパート毎に各規定値が異なっています。

リモコンコードに依存する部分は(A)と(B)の組み合わせとなっているため、機能毎にそれぞれの処理の組み合わせを変えてやれば目的のパターン出力を得られます。

今回、(A)と(B)のパートはそれぞれ関数にして、さらに(A)は引数で繰り返し回数を指定すれば繰り返し(A)部分を出力できるようにしてあります。

なお、(D)以降のパターンは約9msのインターバルを置いてあと2回繰り返し出力しますが、この繰り返しは念入りのための処理のようで、省略しても作動します。今回のサンプルプログラムでは省略しています。

●サンプルスケッチ(“irRemoP02.ino”)

赤外線LEDはArduinoのD8に接続します。回路図は次のようにしました。図右側LEDは赤外線LEDが発光したときに同時に点灯します。赤外線発光を確認するためのものです。赤外線LEDにはOptoSupply OSI5LA5113A(φ5) 半値角:±7.5°  (秋月電子)を使用しています。

remo_tr2

プログラムを次に示します。1秒後に「メモリ点灯」のコマンドを発行して停止します。

/*
  アイリスオーヤマ LEDシーリングライト用赤外線リモコン評価
    CQカチャduino 応用アプリ

    copyright (c) 2013 www.wsnak.com

    13/10/16 新規作成

    IR-LED D8
*/

#define ON HIGH
#define OFF LOW

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

//
// 初期化
//
void setup(void) {

  int i;

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

  delay(1000);

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

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

  pulseB();             // (E)
  pulseA(7);            // (A)
  pulseB();             // (B)
  // ---------- 共通部分の終わり

  // コマンド依存部分 メモリ点灯
  pulseA(6);
  pulseB();
  pulseA(17);
  pulseB();
  pulseA(1);
  pulseB();
  pulseB();
  pulseA(1);
  pulseB();
  pulseB();
  pulseA(1);

  while(1);   // halt
}

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);
  }
}

void pulseB(void) {
  int i;

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

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

コマンド依存の(A)(B)パートはロジアナの測定結果に合わせて単純に関数を並べただけです。(A)~(E)のブロック、関数はほぼ同じ処理ですが、繰り返し回数やディレイ値が異なっています。実際のロジアナ波形を見ながらチューンナップしてあります。

このプログラムの実行結果は次の図のようになります(再掲載)。上(黄色)が製品リモコンの出力、下(緑色)がプログラムによる出力です。

wave5


次回はインターバルを付けてパルス出力を繰り返す処理と、複数コマンドの出力テストなどを行います。

(続く)

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