2014年10月13日月曜日

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

Arduinoでエアコン制御 2-1の続き

(部分的に)成功スケッチ

const int irm = 2;
unsigned long time = 0;
unsigned long time_o =0;
volatile int itpt_st = 0;  //割込み確認フラグ

void setup() {
  pinMode(irm,INPUT);
  Serial.begin(9600); //Serial.print用 一般値
  attachInterrupt(0 ,rcv ,CHANGE);
}

void loop() {
  if (itpt_st == 1){
    if (digitalRead(irm) == HIGH) {
      Serial.print("-");
    }
    Serial.print(time-time_o);
    Serial.print(",");
    itpt_st = 0;  //フラグ初期化
  }
}

void rcv() {
  time_o = time;
  time = micros();
  itpt_st = 1;
}
ここでもいくつもの事を知る。
まず"micros()"はリファレンスにもある通り、戻り値を"unsigned long"で返す。
格納させる変数を気を付けないとオーバーフローさせてしまう。
割込み処理内で使う変数には"volatile"という装飾を付けるべきとの事。
シリアル通信のビットレートは9600[bps]が一般値らしい。
割込み関数を指定する"attachInterrupt"は1ピンに対して一種類の関数しか決められない。
同一ピンに対してFOLLINGとRISINGで2種類の関数を指定しようとしても、後で指定した関数しか動作しない。

下は結果をグラフにしたもの。
1つめ突き抜けているのは待機時間、以降Low 3.5、High 1.5強、Low 0.5弱[ms]…と"Arduinoでエアコン制御 2-1"で望んだ結果になった。

フォーマットの判断

ChaNさん秋月さんを参考にしました。

これまでさんざん0.5[ms]云々と書いてきたが、0.4[ms]が1単位になっているようである。
400[μs]を単位として考える方が整合性が取れる。
つまり"家電協フォーマット"になっていると思われる。

リーダコードとして(1)3.2,(0)1.6 [ms]。
カスタマーコードが16bit(なのか32bitなのか判然としないが)くるはず。
データコードが16bit程度?くるはず。
フレームスペースが13.2[ms]。
そして、再度リーダーコードから始まるリピートをするはずである。

うまく受信できたかのように思っていたが良く見ると同符号が連続している部分がたくさんある。
それは明らかにおかしい…。
"digitalRead"の処理の重さが原因で取りこぼしが出るのか、符号の付け間違いが生じるのか、あるいはその両方かもしれない。

"digitalRead"を消して実行させたところ"Serial.print"されるデータが8つ増えていた。
同符号が連続している箇所数は8以上ある為、上の予想はおそらく正しいのだろうと思われる。

割込み時に"FOLLING""RISING"のいずれで処理に入ったのか、その情報が取得できれば良いのだが、結局は明確な情報が見つけられなかった。

Arduinoでエアコン制御 2-3

0 件のコメント :

コメントを投稿