プログラミング素人のはてなブログ

プログラミングも電気回路も専門外の技術屋の末端が勉強したことや作品をアウトプットするブログ。コードに間違いなど見つけられたら、気軽にコメントください。 C#、Python3、ラズパイなど。

リモコン解析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;

}