Arduinoの基礎 - 待機と時間計測

提供:MochiuWiki : SUSE, EC, PCB
2024年12月24日 (火) 11:15時点におけるWiki (トーク | 投稿記録)による版 (ページの作成:「== 概要 == Arduinoにおいて、delay関数およびmillis関数は、以下に示すように区別される。<br> <br> * delay関数 *: プログラムの実行を一時停止させる待機関数。 * millis関数 *: 待機時間を計測するための時間計測関数 *: ただし、millis関数は待機を行わない。 <br><br> == delay関数とmillis関数の違い == ==== delay関数のデメリット ==== * ブロッキング処理 *: delay関数を…」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

概要

Arduinoにおいて、delay関数およびmillis関数は、以下に示すように区別される。

  • delay関数
    プログラムの実行を一時停止させる待機関数。
  • millis関数
    待機時間を計測するための時間計測関数
    ただし、millis関数は待機を行わない。



delay関数とmillis関数の違い

delay関数のデメリット

  • ブロッキング処理
    delay関数を使用する場合、その間は他の処理が一切実行できない。
    例えば、delay(1000)を実行する場合は1秒間プログラムが完全に停止する。

  • マルチタスクの困難さ
    複数のアニメーションを同時に動かす場合は対応できない。
    ボタン入力等の他の処理も受け付けられない。


millis関数のメリット

  • ノンブロッキング処理
 unsigned long previousMillis = 0;
 const long interval = 1000;  // 1秒間隔
 
 void loop()
 {
    unsigned long currentMillis = millis();
 
    if (currentMillis - previousMillis >= interval) {
       previousMillis = currentMillis;
 
       // アニメーション更新処理
       updateAnimation();
    }
 
    // 他の処理も並行して実行可能
    checkButtonPress();
    updateOtherAnimations();
 }


  • 複数のタイミング制御
 unsigned long prevMillisAnim1 = 0;
 unsigned long prevMillisAnim2 = 0;
 
 const long intervalAnim1 = 50;   // 50[ms]間隔
 const long intervalAnim2 = 100;  // 100[ms]間隔
 
 void loop()
 {
    unsigned long currentMillis = millis();
 
    // アニメーション1の更新
    if (currentMillis - prevMillisAnim1 >= intervalAnim1) {
       prevMillisAnim1 = currentMillis;
       updateAnimation1();
    }
 
    // アニメーション2の更新
    if (currentMillis - prevMillisAnim2 >= intervalAnim2) {
       prevMillisAnim2 = currentMillis;
       updateAnimation2();
    }
 }


  • 正確なタイミング制御
    delay関数は処理時間による誤差が蓄積されやすい。
    millis関数は実際の経過時間に基づいて制御することが可能。


特に、アニメーションや複数の処理を同時に行う場合は、millis関数を使用することが推奨される。