ワスレナグサ

気付いたら、夜は終わりはじめてる
<< March 2017 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 >>

スポンサーサイト

一定期間更新がないため広告を表示しています

- | permalink | - | -
<< Arduinoでリモコンの赤外線信号を読み取る | main | iPhoneで微速度撮影してみる >>

Arduinoでリモコンの赤外線信号を読み取る(その2)

さて、前回は赤外線リモコンの信号をArduinoといくつかの部品で読み取ってみたわけですが、前回のプログラムにはいくつか不満がありました。それはこんなとこ〜。

(1) デジタルデータなのにanalogReadを使っている。
(2) データ量が多くてあまり長い時間信号を記録できない。

今回はリモコンの信号の読み取りの2回目ということで、上の2つの問題を解決してみようと思います♪

まずは、(1)の問題から。これは簡単。赤外線センサーをデジタル入力ピンに接続すればいいです。

1.材料
これは前回と同じなので前回を参照してください。

2.ビルドアップ
前回からちょっとだけ変えて、次のように結線します。
 1) Arduino の5VをセンサーのVcc(一番右のピン)に
 2) Arduino のGndをセンサーのGND(真ん中のピン)に
 3) Arduino のDIGITALの2をセンサーのVout(一番左のピン)に

前回と変わったのは3)のだけ。

つないだ状態がこれ。

3.スケッチ
ここで、(2)の問題を解決します。まぁ、まずはソースコード。
// Record IR Pulse Data extracted from IR Sensor
#define IR_SENSOR 2 // 赤外線センサーのポート番号

int iSensorState = HIGH;
unsigned long ulReadTime = 0;
int iPreviousSensorState = HIGH;
unsigned long ulPreviousReadTime = 0;

void setup() { 
  Serial.begin(115200); // PCとの通信速度
  pinMode(IR_SENSOR, INPUT); // DIGITALの2番ピンを入力に設定
}

void loop() {

  iSensorState = digitalRead(IR_SENSOR); // センサー値を読み取る
  ulReadTime = micros();
  if (iSensorState != iPreviousSensorState) {
    Serial.println(ulReadTime - ulPreviousReadTime); // 前回センサー値が変化した時間からの経過時間を算出してシリアルに書き出し
    ulPreviousReadTime = ulReadTime;
    iPreviousSensorState = iSensorState;
  }

}

このソースコードは常にセンサー値読み取って、それが前回読み取った値と違っていたら以前にセンサー値が変化した時間と今の時間の差を計算してSerialに出力します。このプログラムの出力はHIGHか、LOWかセンサー値がその2つの状態を何マイクロ秒持続したかを出力するものになります。前回は時間軸に対して均等な間隔でサンプリングしたわけで、1サンプル当たりのデータ量は1byte(1bitじゃないよ※1)と小さかったのですが数秒とか長い時間を記録しようとすると無駄が多くなりました。

今回は"状態が持続した時間"を記録するので、データ量は記録時間ではなく何回状態が変化したかに依存することになります。1サンプルのデータ量はデータ型がunsigned longということで4byteと4倍になりましたが、記録時間の制限が無くなる事を考えると全体としてはかなりお得ということになると思います。(※1 普通booleanといえど使用メモリは生真面目に1bitになったりしません。簡単なプログラムで調べてみたところ、Arduinoではbooleanは1byte, intは2byte, longは4byteになるようです)

4.動作確認
これで取得した赤外線信号をプロットしてみたのが下の図。

Apple RemoteのVolume UpとVolume Downの2つを受信して、Serial出力をプロットしてみました。パルスの全体長は同じで、ほんの一部だけ異なっている事がわかりますね。最初のサンプルの値が大きいのはスケッチがAruduinoに転送されてから僕がリモコンを操作するまでの時間ですので特に問題はありません。おおむね十分な精度でデータがとれているんじゃないかと思います。

さて、本当は最初はpulseIn関数を使って状態が持続した時間をもっと直接的に取れるんじゃないかと思っていたのですが、これはうまくいきませんでした。ノイズが多い結果となってしまうんです。ちょっと謎が残りましたたが、まぁ上のスケッチも十分単純ですのでよしとしましょう。

さて、これでまた一つArduino学習リモコンに近づきました。っていうかまだパルスの再生をやってみてませんでしたね。ということで次回はパルスの再生をやってみます〜
クリエイティブ | permalink | comments(0) | trackbacks(0)

スポンサーサイト

- | permalink | - | -

この記事に対するコメント

コメントする









この記事のトラックバックURL
http://forget-me-not.jugem.jp/trackback/140
この記事に対するトラックバック