マルチタスクは、効率、柔軟性、適応性と生産性を向上させる一つ以上のプログラム 組み込みシステムでは、マイクロコントローラはマルチタスクを処理し、現在の命令を停止することなく、複数のタスクを同時に実行することもで

このチュートリアルでは、ArduinoがArduino millis関数でマルチタスクを実行する方法を学びます。 一般的に、ledの点滅のような定期的なタスクのためにArduinoではdelay()関数が使用されますが、このdelay()関数はプログラムを一定時間停止させ、他の操作を実行 そこで、この記事では、delay()関数の使用を避け、millis()に置き換えて複数のタスクを同時に実行し、Arduinoをマルチタスクコントローラにする方法を説明します。 詳細に入る前に、マルチタスクを控えめにすることから始めましょう。

マルチタスクとは何ですか?

マルチタスクとは、単に複数のタスクまたはプログラムを同時に実行することを意味します。 ほとんどすべてのオペレーティングシステムはマルチタスク機能を備えています。 この種のオペレーティングシステムは、MOS(multitasking operating system)として知られています。 MOSは、モバイルまたはデスクトップPCオペレーティングシステムにすることができます。 コンピュータでのマルチタスクの良い例は、ユーザーが同時に電子メールアプリケーション、インターネットブラウザ、メディアプレーヤー、ゲームを実行し、ユーザーが閉じていない場合は、バックグラウンドで実行されるアプリケーションを使用したくない場合です。 エンドユーザーはこれらすべてのアプリケーションを同時に使用しますが、OSはこの概念を少し異なります。 OSがマルチタスクをどのように管理するかを説明しましょう。Arduinoのマルチタスクとは何ですか

図に見られるように、CPUは時間を三つの等しい部分に分割し、各部分を各タスク/アプリケーションに割り当てます。 これは、ほとんどのシステムでマルチタスクがどのように行われるかです。 時間分布が少し異なることを除いて、概念はArduinoのマルチタスクのためにほぼ同じになります。 Arduinoは低周波で動作し、RAMはラップトップ/モバイル/PCと比較しているため、各タスクに与えられる時間も異なります。 Arduinoには、広く使用されているdelay()関数もあります。 しかし、開始する前に、どのプロジェクトでもdelay()関数を使用すべきではない理由について説明しましょう。 なぜarduinoでdelay()をスキップするのですか?

Arduinoのリファレンスドキュメントを考慮すると、2つのタイプの遅延関数があり、最初のものはdelay()、2番目はdelayMicroseconds()です。 両方の機能は、遅延を生成するという点で同一である。 唯一の違いは、delay()関数では、渡されたパラメータ整数がミリ秒単位であることです。delay(1000)と書くと、遅延は1000ミリ秒、つまり1秒になります。 同様にdelayMicroseconds()関数では、渡されたパラメータはマイクロ秒単位です。delayMicroseconds(1000)と書くと、遅延は1000マイクロ秒、つまり1ミリ秒になります。

ここでポイントが来る、両方の関数は、遅延関数に渡された時間のためにプログラムを一時停止します。 したがって、1秒の遅延を与えている場合、プロセッサは1秒が経過するまで次の命令に進むことができません。 同様に遅延が10秒の場合、プログラムは10秒間停止し、プロセッサは10秒が経過するまで次の命令に進むことはできません。 これにより、速度と命令の実行の点でマイクロコントローラの性能が妨げられます。

遅延機能の欠点を説明する最良の例は、二つのプッシュボタンを使用しています。 2つのプッシュボタンを使用して2つのLedを切り替えたいと考えてみましょう。 したがって、1つのプッシュボタンが押された場合、対応するLEDは2秒間点灯し、2番目が押された場合は同様にLEDは4秒間点灯します。 しかし、delay()を使用すると、ユーザーが最初のボタンを押している場合、プログラムは2秒間停止し、ユーザーが2秒の遅延の前に2番目のボタンを押すと、プログArduinoの公式ドキュメントでは、Delay()関数の説明の注意事項と警告にこれが明確に記載されています。

Arduinoの公式ドキュメントでは、delay()関数の説明の注意事項 あなたが通過し、それをより明確にするためにこれをチェックアウトすることができます。なぜmillis()を使用するのですか?

遅延を使用することによって引き起こされる問題を克服するために、開発者は習慣になると使いやすいmillis()関数を使用し、命令の実行に遅延を生 millis()は、Arduinoボードがプログラムをフリーズせずに現在のプログラムを実行し始めてから経過したミリ秒の量を返す関数です。 この時間数は、約50日後にオーバーフローします(つまり、ゼロに戻ります)。ArduinoがdelayMicroseconds()を持っているのと同じように、microバージョンのmillis()もmicros()として持っています。 Microsとmillisの違いは、micros()は50日であるmillis()と比較して、約70分後にオーバーフローすることです。 したがって、アプリケーションに応じて、millis()またはmicros()を使用できます。

Using millis() instead of delay():

タイミングと遅延にmillis()を使用するには、アクションが発生した時間を記録して保存して、時間を開始し、定義された時間が経過したかど 前述のように、現在の時刻を変数に格納します。p>

unsigned long currentMillis = millis();

必要な時間が経過したかどうかを調べるには、さらに二つの変数が必要です。 現在の時刻をcurrentMillis変数に保存しましたが、タイミング期間がいつ開始され、期間がどのくらいであるかを知る必要があります。 だから、間隔とpreviousMillisが宣言されています。 間隔は時間遅延を教えてくれ、previosMillisはイベントが最後に発生した時間を保存します。これを理解するために、単純な点滅LEDの例を見てみましょう。 Period=1000は、LEDが1秒間または1000ms点滅することを教えてくれます。

const int ledPin = 4; // the LED pin number connectedint ledState = LOW; // used to set the LED stateunsigned long previousMillis = 0; //will store last time LED was blinkedconst long period = 1000; // period at which to blink in msvoid setup() { pinMode(ledPin, OUTPUT); // set ledpin as output}void loop() { unsigned long currentMillis = millis(); // store the current time if (currentMillis - previousMillis >= period) { // check if 1000ms passed previousMillis = currentMillis; // save the last time you blinked the LED if (ledState == LOW) { // if the LED is off turn it on and vice-versa ledState = HIGH; } else {ledState = LOW;} digitalWrite(ledPin, ledState);//set LED with ledState to blink again }}

ここで、ステートメント<if(currentMillis-previousMillis>=period)>=period)>1000msが経過したかどうかを確認します。 1000msが経過すると、LEDが点滅し、再び同じ状態になります。 そして、これは続きます。 それはそれです、私たちは遅延の代わりにmillisを使うことを学びました。 このようにして、特定の間隔でプログラムを停止しません。

Arduinoの割り込みは、他のマイクロコントローラと同じように動作します。 Arduino UNOボードには、GPIOピン2と3に割り込みを接続するための2つの別々のピンがあります。 ここでは、割り込みとその使用方法についての詳細を学ぶことができます。ここでは、二つのタスクを同時に処理することによってArduinoのマルチタスクを示します。 タスクには、LEDのオン/オフ状態を制御するために使用されるプッシュボタンと一緒に、異なる時間遅延で2つのLedの点滅が含まれます。 そのため、3つのタスクが同時に実行されます。P>

Arduinoのマルチタスクのための回路図

必要なコンポーネント

  • Arduino UNO
  • 三つのLed(任意の色)
  • 抵抗(470、10k)
  • ジャンパー
  • ブレッドボード
  • 回路図

    arduino millis()の使用を実証するための回路図は非常に簡単で、以下に示すように添付する部品があまりありません。

    Arduino Millis()関数を使用してArduinoのマルチタスクのための回路図

    マルチタスクのためのArduino UNOのプログラミング

    マルチタスクのためのArduino UNOのプログラミングは、上記で説明したmillis()の動作の背後にあるロジックのみを必要とします。 マルチタスク用のArduino UNOのプログラムを開始する前に、ロジックを明確にし、millis()で快適にするために、millisを使用して点滅LEDを何度も練習することをお勧 このチュートリアルでは、割り込みはmultitaskingのためにmillis()と同時に使用されます。 ボタンは割り込みになります。 したがって、割り込みが発生するたびに、すなわち押しボタンが押されると、LEDはオンまたはオフ状態に切り替わります。

    プログラミングは、Ledとプッシュボタンが接続されているピン番号を宣言することから始まります。次は、将来の使用のためにLedの状態を格納する変数を記述します。

int led1 = 6;int led2 = 7;int toggleLed = 5;int pushButton = 2;

次は、将来の使用のためにLedの状態を格納する変数を記述します。

int ledState1 = LOW;int ledState2 = LOW;

上記の点滅の例で説明したように、periodとpreviousmillisの変数は、Ledの遅延を比較して生成するように宣言されています。 最初のLEDは1秒ごとに点滅し、別のLEDは200ms後に点滅します。

unsigned long previousMillis1 = 0; const long period1 = 1000;unsigned long previousMillis2 = 0;const long period2 = 200; 

プッシュボタンを複数回押すのを避けるために、デバウンス遅延を生成するために別のmillis関数が使用されます。 上記と同様のアプローチがあります。

int debouncePeriod = 20; int debounceMillis = 0;

3つの変数は、押しボタンの状態を割り込み、トグルLED、押しボタンの状態として保存するために使用されます。

bool buttonPushed = false;int ledChange = LOW; int lastState = HIGH;

ピンのアクションを定義し、どのピンが入力または出力として機能するかを定義します。

 pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); pinMode(toggleLed, OUTPUT); pinMode(pushButton, INPUT);

ISRと割り込みモードの定義を持つ割り込みをアタッチすることにより、割り込みピンを定義します。 実際のデジタルピンを特定の割込み番号に変換するためにattachInterrupt()関数を宣言するときは、digitalPinToInterrupt(pin_number)を使用することをお勧めします。

attachInterrupt(digitalPinToInterrupt(pushButton), pushButton_ISR, CHANGE); 

割り込みサブルーチンが書き込まれ、buttonPushedフラグのみが変更されます。 割込みサブルーチンはできるだけ短くする必要があるので、それを書いて余分な命令を最小限に抑えるようにしてください。

void pushButton_ISR(){ buttonPushed = true; }

ループは、ループが反復するたびに経過した時間の値を格納するcurrentMillis変数にmillis値を格納することから始まります。マルチタスクには合計3つの機能があり、1秒で1つのLEDを点滅させ、200msで2番目のLEDを点滅させ、プッシュボタンを押すとLEDをオフ/オンにします。

unsigned long currentMillis = millis();

そこで、この作業を行うための3つの部分を記述します。

最初は、ミリ秒経過を比較することによって、1秒ごとにLED状態を切り替えます。同様に、2番目に、経過したミリ秒を比較することによって、200msごとにLEDを切り替えます。 説明はすでにこの記事の前半で説明されています。最後に、buttonPushedフラグが監視され、20msのデバウンス遅延を生成した後、割り込みとして接続されたプッシュボタンに対応するLEDの状態を切り替えるだけです。P>

 if (buttonPushed = true) // check if ISR is called { if ((currentMillis - debounceMillis) > debouncePeriod && buttonPushed) // generate 20ms debounce delay to avoid multiple presses { debounceMillis = currentMillis; // save the last debounce delay time if (digitalRead(pushButton) == LOW && lastState == HIGH) // change the led after push button is pressed { ledChange = ! ledChange; digitalWrite(toggleLed, ledChange); lastState = LOW; } else if (digitalRead(pushButton) == HIGH && lastState == LOW) { lastState = HIGH; } buttonPushed = false; } }

これでArduino millis()チュートリアルは終了します。 Millis()で習慣的になるためには、他のアプリケーションでこのロジックを実装することを練習してください。 また、モータ、サーボモータ、センサ、その他の周辺機器を使用するように拡張することもできます。 ご不明な点がある場合は、以下のフォーラムまたはコメントにお書きください。Arduinoでのmillis関数の使用を実証するための完全なコードとビデオを以下に提供します。

コメントを残す

メールアドレスが公開されることはありません。