2014年10月13日月曜日

Arduinoでエアコン制御 2-1 (受信編)

前置き

時系列順にまとめている。
長いので投稿を分けている。
それらしい結果になった内容はArduinoでエアコン制御 2-2に書く。
(ただし完成ではない――というより部分的に失敗しているといったほうが良いか)

ここでは途中経過や失敗を載せているに過ぎない。

とりあえずLチカから

const int led=13;
const int rcv=8;

void setup() {
  pinMode(led,OUTPUT);
  pinMode(rcv,INPUT);
}

void loop() {
  if (digitalRead(rcv)==HIGH){
    digitalWrite(led,LOW);
  } else {
    digitalWrite(led,HIGH);
  }
}
上スケッチの前段ではLEDがつきっぱなしで受信した瞬間だけ消えるという挙動になり悩む。
google先生にActive-HighとActive-Lowという観念がある事を教えてもらう。
データシートにもはっきり書いてあった。

キットオシロで受信モジュールを測定してみる

アタマが切れているが撮りなおすのが面倒なのでそのまま載せる。
ちなみにリモコンの"入/切"ボタンで起動させる時の信号を取っている。以下同じ。
一枚目は次のようなところか。
Low 3.5 (※見切れてる部分)、High 1.5強、Low 0.5弱、High 1.5弱 [ms]
それ以降の(二枚目の)Highは概ね0.5[ms]、Lowは0.5[ms]弱であるように見える。

キットオシロで送信機(リモコン)を測定してみる

リモコンを開けてGNDと赤外線LEDのアノード間で見てみた。
送信機側ではもっと細かい波形になっていた。
Low 3.5[ms]だと思っていた区間は0.5[ms]が1周期の信号の連続だった。
そしておそらく送信機が0.5[ms]の間にHighとLowを出力した信号を、受信モジュールは0.5[ms]のLowに変換しているのではなかろうか。

失敗スケッチ

const int rcv = 8;
const int led = 13;
int sw = 0;
int sw_o = 0;
long time = 0;

void setup() {
  Serial.begin(115200); //Serial.print用
  pinMode(rcv, INPUT);
  pinMode(led, OUTPUT);
}

void loop() {
  sw = digitalRead(rcv);
  
  if (sw == HIGH) {  //確認用Lチカ
    digitalWrite(led,LOW);
  } else {
    digitalWrite(led,HIGH);
  }

  if (((sw == LOW) && (sw_o == HIGH)) || (sw == HIGH) && (sw_o == LOW)) {
    if (sw == LOW){
      Serial.print("-");
    }
    Serial.print(micros() - time);
    Serial.print(",");
    time = micros();
  }
  
  sw_o = sw;
}
結果は下
まず、数字がめちゃくちゃである。
2つめの大きな数字は待機した時間として、次から3.5、1.5、0.5 [ms] (3500、1500、500 [μs])の羅列になっていてくれないと困る。
loop()が1週するのに思いの他時間が掛かっているのかもしれない。
このように随時変化を確認させるやり方は"ポーリング"と呼ばれるらしい。
そして、赤外線受信に関わらずスイッチやその他の入力に正確に応答させるには"割込み"という手段を取るべきだそうだ。

Arduinoでエアコン制御 2-2

0 件のコメント :

コメントを投稿