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

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

リモコン解析

昨日の応用で、リモコン解析をします。

タクトスイッチでHIGH or LOW を作っていたところに、赤外線センサを取り付けます。
いくつかあらかじめ入手しておいた赤外線センサを使いますが、今日は昨日紹介したものがどこかにまぎれて見つからなかったので、SPS-442-1(38kH)を使いました。

akizukidenshi.com

昨日のタクトスイッチのdigitalReadにセンサの Vout を接続し、GNDとVCCを接続します。

Vout とはセンサ出力がでる端子、またはその出力のことをいい、VCCは動作電源です。

VCCはArduino の5Vに接続します。

このセンサは足が5本出ていますが、どの足がどの端子であるかはDataSheetをみれば分かります。購入したときについている場合もありますが、ついていなければ型番でぐぐるとすぐに見つかります。
ためしに動作させようとすると、何も受信していないのに波形が出てきました。
f:id:s51517765:20160919122219p:plain

よく分からないですが、一定の周期のHIGH / LOWです。

この後リモコン信号を受信させてみると、とくに問題なく受信できていそうなので、とりあえず良しとします。わからないけど。18000μsぐらいの周期でした。

良しとした根拠としては、リモコンを受信させてみると↓のように波形が取れていると判断したからです。
ちなみにPanasonicVIERAです。
f:id:s51517765:20160919122247p:plain

いくつかのボタンを試してみると、とても似通った波形が出てきます。
これは間違いなく違うパターンであるがその差はとても小さいように見えます。
ちょっと、プログラムを改良する必要がありそうです。

まず、信号を見ると、長いHIGHがあったあと、HIGH / LOWのパターンがあります。これをボタンが押されている間繰り返すようです。
おそらく、この長いHIGHがスタートでしょう。

この部分はだいたい75,000~81,000μsぐらいあるので、すこし余裕をとって70,000μs以上HIGHであれば記録開始するようにして、だいたい2回分が拾えるように17stepでstopするようにします。

f:id:s51517765:20160919122327p:plain

できたようなできてないような。

unsigned long time_m = 0;
unsigned long time_n = 0;
unsigned long time_nagasa = 0;
unsigned long time_total = 0;
unsigned long time_start = 0;
unsigned long time_start_section = 0;
int i = 0;

void setup() {

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

void loop() {
  while (digitalRead(4) == HIGH) { //HIGHであったら
    time_start = micros(); //start時刻を記憶し
    while (digitalRead(4) == HIGH) {
      time_start_section = micros() - time_start; //start区間の長さを測る
    }
  }

  if (time_start_section > 70000) {
    Serial.print("START  = ");
    Serial.println("0,0,1");
    time_total = time_total - time_start;
    for (i = 1; i < 14; i++) { //繰り返し範囲設定 無限繰り返し
      while (digitalRead(4) == HIGH) {}
      time_m = micros();
      time_nagasa = time_m - time_n; //スイッチが押下されていない時間を算出
      time_total = time_total + time_nagasa;

      Serial.print("---  = ");
      Serial.print("  ");
      Serial.print("--- ");
      Serial.print(",");
      Serial.print(time_total);
      Serial.println(",1");
      Serial.print("LOW  = ");
      Serial.print(time_nagasa);
      Serial.print(",");
      Serial.print(time_total);
      Serial.println(",0");
      delayMicroseconds(20);
      while (digitalRead(4) == LOW) {}
      time_n = micros();
      delayMicroseconds(20);
      time_nagasa = time_n - time_m; //スイッチが押下されて離された時間を算出
      time_total = time_total + time_nagasa;
      Serial.print("---  = ");
      Serial.print("  ");
      Serial.print("--- ");
      Serial.print(",");
      Serial.print(time_total);
      Serial.println(",0");
      Serial.print("HIGH = ");
      Serial.print(time_nagasa);
      Serial.print(",");
      Serial.print(time_total);
      Serial.print(",");
      Serial.println("1");
    }
  } //end if
  while (Serial.available() == 0) {
    Serial.println("Hit any key to start...     ");
    delay(100);
  }
} //end loop