さらにリモコン解析。
Arduinoでリモコン解析をしている例をいろいろ調べていると、もっと分かりやすくデータを取得できるんじゃないかと思えてきました。
単純に、一定時間ごとに出力を観測し、HIGH = 1 、LOW = 0として吐き出してくれば、その様子が見れるんじゃないかと。
また、リモコンには通常、スタートとストップ(または信号の終わり)を示すきまったパターンがあるということなので、
これを利用するともっとスマートに信号が取れそうということで。
ここを参考に、スタートは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; }