Arduinoからの受信データを時間軸で表示する



Arduino UNO

Arduinoを使ってみる

最終更新日:2014/12/30

Arduinoから受信したデータを時間軸情報を合わせて表示する方法を説明します。
先ずプログラム自体がどれくらいの時間で動いているか知る必要があり、使う関数は以下になります。

■millis()
Arduinoがプログラムを実行してから現在までの時間をミリ秒単位で返します。約50日でオーバーフローしゼロに戻ります。

スケッチ例は以下のとおりになります。
================================================
unsigned long time;
void setup()
{
    Serial.begin(9600) ; // シリアルモニターの初期化
}
void loop()
{
    time = millis();
    Serial.println(time);

    delay(1000) ;
}
================================================

■動作確認結果
結果は以下のとおりになります。こうして見るとdelay時間を1000にしているにも関わらず徐々に遅れが発生しています。 これはdelay時間に加え、プログラム自体の演算に時間を要してる為だと思われます。


■演算遅れを考慮したdelay時間の設定
演算周期にそこまでの精度を必要としない場合はこれでも問題ありませんが、なるべくいつも同タイミングで演算を実施したい場合は、 以下のとおり演算時間の遅れを考慮したdelay時間の設定をする必要があります。赤字が重要個所です。
================================================
unsigned long time;
unsigned long time2;
unsigned long time3;
unsigned long time4;

void setup()
{
    Serial.begin(9600) ; // シリアルモニターの初期化
}
void loop()
{
    time       = millis();
    time3     = time - time_old - time4; // 前回の遅れ時間
    time_old = time;                     // 次回計算用として、今回までの演算時間を格納
    time4     = 1000 - time3;         // 今回のdelay時間を決定
    Serial.print(time);
    Serial.print(" ");                      // 動作確認用の為、本来は不要
    Serial.println(time4);                // 動作確認用の為、本来は不要

    delay(time4);
}
================================================
■説明
スケッチ赤文字の部分が何を意味しているのか下図にて説明します。 オレンジ部分が前回処理で、青部分が今回処理を表してます。



①前回のメイン処理にかかった時間
 : time3(= time - time_old - time4)

time - time_oldが前回処理時間を表しており、そこからtime4を引いたのが前回のメイン処理にかかった時間(time3)とします。(厳密にはdelay時間の演算誤差もtime3に含まれます)

②今回のメイン処理時間
今回のメイン処理の時間は、前回のメイン処理時間と同じ時間とします。

③今回のdelay時間設定
メインの処理にtime3だけの時間がかかるとして、狙いの時間(1000ms)からtime3を差し引いてdelay時間を設定します。

■動作確認結果
変更前後の比較結果は以下のとおりになり、変更後がより精度の良いサンプリング時間を設定出来ているのが解ります。









サブチャンネルあります。⇒ 何かのお役に立てればと

関連記事一覧



Arduino UNO

Arduinoを使ってみる