読者です 読者をやめる 読者になる 読者になる

プログラミング素人のArduino

技術屋の末端。プログラミングは専門外。 電気回路も専門外です。 コードに間違いなど見つけられたら、気軽にコメントください。 VC#始めました。

リモコン解析2

さらにリモコン解析。

Arduinoでリモコン解析をしている例をいろいろ調べていると、もっと分かりやすくデータを取得できるんじゃないかと思えてきました。
単純に、一定時間ごとに出力を観測し、HIGH = 1 、LOW = 0として吐き出してくれば、その様子が見れるんじゃないかと。

また、リモコンには通常、スタートとストップ(または信号の終わり)を示すきまったパターンがあるということなので、
これを利用するともっとスマートに信号が取れそうということで。

マイコンの実験:赤外線通信実験2

ここを参考に、スタートは3.3m以上のLOWとした。
(引用元は3.4msとしているが、とくにこの差に深い意味はない)

  if (digitalRead(4) == LOW) { //リーダ部のチェック
    t = micros() ;
    while (digitalRead(4) == LOW) ; // HIGHになるまで待つ
    t = micros() - t ;     // LOWの部分をはかる
    
  }

  // リーダ部有り(3.3ms以上のLOWにて判断する)
  if (t > 3300)
 {

このように3.3ms以上のLOWがあったときを起点とする。

 for (i = 1; i < n; i++) {
   
      if (digitalRead(4) == LOW) {
        state[i] = 1;
        i++;
      }
      else {
        state[i] = 0;
        i++;
      }
      delayMicroseconds(80);
    }

つぎに、digitalReadがLOWかそうでない(HIGH)かによって、 1 or 0を吐き出す。
気持ちdelayを入れる。

delayMicroseconds(80);

delayは信号がうまく違いを取れることを目的に調整する。
ここでは、テレビのリモコンを使っているが、 1~12までの数字を押してみて、違いが現れるものをえらぶ。

なぜか少し大きめの数字のほうが上手くとれた。

   for (i = 1; i < n - 1; i++) {
      Serial.print(state[i]);
      Serial.print(",");
    }
    Serial.println(state[i]);
  }
  t = 0;

}

最後にまとめて、Printする。

printlnに限らないが、このような処理は時間を要してしまうので、samplingをしながら出力を行おうとすると、時間にずれが生じてしまうのは、以前書いた。
delayMicroseconds を利用しているときは特にである。

ここで変数としてstate[i] というものを定義した。
iには整数が入り、state[1], state[2], state[3], ...というような連続する変数を作ることができる。これは「配列」という。
ここでは、これに digitalReadの結果として、1 or 0 を連続的に格納する。
これを200個用意した。

unsigned long state[200];

[]の200が200こという意味になる。

unsigned long i = 0;
unsigned long t;
unsigned long state[200];
int n = 200; //繰り返し回数
void setup() {

  pinMode(4, INPUT);
  Serial.begin(9600);
}

void loop() {

  t = 0 ;

  if (digitalRead(4) == LOW) { //リーダ部のチェックを行う
    t = micros() ;
    while (digitalRead(4) == LOW) ; // HIGHになるまで待つ
    t = micros() - t ;     // LOWの部分をはかる
    
  }

  // リーダ部有り(3.3ms以上のLOWにて判断する)
  if (t > 3300) {
    for (i = 1; i < n; i++) {
   
      if (digitalRead(4) == LOW) {
        state[i] = 1;
        i++;
      }
      else {
        state[i] = 0;
        i++;
      }
      delayMicroseconds(80);
    }
 //   Serial.println(t); //デバック
    for (i = 1; i < n - 1; i++) {
      Serial.print(state[i]);
      Serial.print(",");
    }
    Serial.println(state[i]);
  }
  t = 0;

}