2015年9月20日日曜日

Arduino: MsTimer2, FlexiTimer2

Arduinoのタイマー機能についてです。
心理実験に使用することを目的としているので,一定の周波数でサンプリングしたいわけです。
I want analog data at a constant sampling rate to use an Arduino in psychological experiments.

Arduinoの時間関係の関数の簡単な奴としては,

millis()
 起動からの時間をミリ秒で返す,
micros()
 起動からの時間をマイクロ秒で返す
delay()
 次の処理までミリ秒単位で待つ

などの関数があります。

しかし,こいつらを使用して頑張ってみても,処理をしている間の遅れが蓄積していき,FB制御をしてもうまいこと一定間隔サンプリングができませんでした。この辺は私のプログラミング能力が不足しているためですが…。
I could not fulfill my purpose by using these functions.

ということで,時間割り込みとかなんとかいう関数を使用します。設定した間隔で処理を実行していくれる関数です。Arduino公式HPにて公開されているライブラリからダウンロードして下さい。
Then I used something time interruption functions. You need to download library files from the Arduino HP.
http://www.pjrc.com/teensy/td_libs_MsTimer2.html

MsTimer2
 ミリ秒単位の間隔で指定した処理を実行
FlexiTimer2
 マイクロ秒単位の間隔で指定した処理を実行

さて,実行してみましたが,一定間隔サンプリングは上手くいきませんでした。マジむかつきます。
I simply implemented it, but again I failed. Really annoying.

と思ったら,一定間隔で処理したい関数に

interrupts();

を入れることで問題が解消しました。これ見つけるのに半日使いました。
But congratulations, the problem was fixed after I put the above line into the function which I wanted to process at a constant intervals.

FlexiTimer2では,interrupts();を入れたらエラーが出て使えませんでした。FlexiTimer2を使いたいのですが,それ以上考えるのは面倒なので諦めました。誰か解決法教えてください。
ちなみに,dueでは両方の関数が使えず…。時間が立てば対応してくれるでしょうか?



アナログセンサーから一定間隔サンプリングをして,それをシリアルモニタに出力
A sketch which samples data from an analog port at a constant interval and outputs the data to a serial monitor.


#include <MsTimer2.h>

const int A0sensor = A0;

int sensorValue0;

void setup() {

  Serial.begin(115200);
  int a = 10;                    // 10ms intervals
  MsTimer2::set(a,sampling); 
  MsTimer2::start();
}

void loop() {

  // nothing
}

void sampling(){

   interrupts();
   sensorValue0 = analogRead(A0sensor);
   Serial.println(sensorValue0);
}

0 件のコメント:

コメントを投稿