PR

【Arduino】void loopを終了させるには?繰り返し回数の指定も併せて解説!

こんにちは、メカ旦那です!

メカ坊や
メカ坊や

Arduinoのvoid loopって永遠に繰り返しますよね。何か終了させる関数はあるんでしょうか…

メカ旦那
メカ旦那

ありますよ!繰り返し回数に応じて何通りかあるので解説します!

void loopの終了方法

以下の説明では7ピンに接続したLEDが1秒ごとに点灯するコードを用います。
各関数の意味はこちらのブログで解説しています。

void setup() {
    pinMode(7, OUTPUT);
}

void loop() {
    digitalWrite(7, HIGH);
    delay(1000);
    digitalWrite(7,LOW);
    delay(1000);
}

1回で終了する時はexit(0)を最後に記載しよう

void setup() {
    pinMode(7, OUTPUT);
}

void loop() {
    digitalWrite(7, HIGH);
    delay(1000);
    digitalWrite(7,LOW);
    delay(1000);
    exit(0);
}

void loopを1回だけ実行する際は、exit(0)を最後に記載しましょう。例えば上記のコードで2回目のdelay(1000) を実行した後、exit(0)でプログラムを終了することができます。つまり、LEDが1回だけ点灯して終了します。このexit(0)で終了させる方法はC言語でもよく使われます。

何回か繰り返す場合はwhile、forもしくは無限ループを使おう

 exit(0)だけだとvoid loop内を1回実行して終了します。そのため、先ほどのコードだとLEDが1回だけ点灯して終わります。正直あっという間ですよね。

何回か実行した後終了する場合はwhilefor、もしくは無限ループを使いましょう。

while文の場合

/* LEDが5回点灯して終了 */
/* while文を使う */

int i = 0;

void setup() {
    pinMode(7,OUTPUT);
}

void loop() {
  while(i<5){
    digitalWrite(7,HIGH);
    delay(1000);
    digitalWrite(7,LOW);
    delay(1000);
    i++;
 }
 exit(0);
}

whileの()の条件が成立する間は{}の処理が実行されます。

まず、冒頭で変数iを宣言し、初期値0を代入します。

その後void setupを実行し、void loopに移ります。i = 0 < 5で()内の条件を満たしているため、{}内の処理を実行します。そして、i++でiの値が1増加します。

そしてwhile冒頭に戻ります。i = 1 < 5で()内の条件を満たすため、先ほどと同様の処理を繰り返します。

iが5になった後、条件 i < 5 を満たさなくなるので、whileの外に出ます。そしてexit(0)を実行するのでプログラムが終了します。

このように、whileexit(0)を使うことでvoid loop内を任意の回数繰り返すことができます。

for文の場合

/*  LEDが5回点灯して終了 */
/*  for文を使う */

void setup() {
    pinMode(7,OUTPUT);
}

void loop() {
  for(int i=0; i<5; i=i+1){
    digitalWrite(7,HIGH);
    delay(1000);
    digitalWrite(7,LOW);
    delay(1000);
 }
 exit(0);
}

forの()内の条件が成立する間は{}内の処理を実行します。

()内では

  • 変数の宣言初期化 (int i = 0)
  • 条件式 (i < 5)
  • 変化式 (i = i + 1)

を記入します。
この場合ならまず変数iに初期値0を代入し、{}内を実行した後、iに1加えて再度同じ処理を繰り返します。i = 5になった時点で条件式(i < 5)を満たさなくなるのでfor文の外に出ます。そしてexit(0)を実行しプログラムが終了します。

このように、forexit(0)を使うことでvoid loop内を任意の回数繰り返すことができます。

ちなみに i = i + 1 は i++でも同じ意味になります。1減少させるならi–と書きます。

無限ループの場合

/* LEDが5回点灯して終了 */
/* 無限ループ(while(1)とif)を使う */

int i = 0;

void setup() {
    pinMode(7,OUTPUT);
}

void loop() {
    digitalWrite(7,HIGH);
    delay(1000);
    digitalWrite(7,LOW);
    delay(1000);
    i++;
    
 if(i>=5){
   while(1){
     
   }
 }
}

無限ループとはwhileの()内に1を入力することで、{}内の処理を永遠に実行する関数です。

この場合、 {} 内を空白にし、何も実行しない状態を繰り返すことで、停止させたように見せかけます。何も実行しない状態でも一応Arduino は起動したままなので、電力を消費し続けます。

また、if内に無限ループを入れて、iが5以上になったら実行するようにします。
iが5以下の場合はdigitalWrite(7,HIGH) ~ i++を繰り返します。

好きな時に終了する場合は白紙のコードを転送する

関数を使わず、好きな時に終了する場合は、白紙のコードを転送しましょう。

またこの方法はArduinoを遊び終わる際にも役立ちます。

遊び終わる際、みなさんはUSBケーブルを抜きますよね。Arduinoは最後に転送されたコードを記憶するため、別日にUSBケーブルを繋いだ瞬間、接続された部品に関係なく、最後のコードを即座に実行します。「Upload」ボタンを押さなくてもです。

そのため、コードに合わない部品が接続されると、最悪の場合部品が故障します。

LED点滅のコードを記憶したままモーターに指示を出すArduino君

そのため、遊び終わる際は白紙のコードを転送し、Arduinoの記憶を削除しましょう。次回USBケーブルを接続した際に何も実行されないので、故障がおきません。

まとめ

void loop の終了方法をまとめると、

  • 1回で終了       →  exit(0)
  • 回数を指定して終了   →  while、for、無限ループ
  • 任意のタイミングで終了 →  白紙のコードを転送

になります。場合に応じて使い分けてくださいね!

メカ旦那

旧帝大工学部を卒業後、FA業界で会社員をしています。
電子工作の面白さを伝えるべく、ザックリ解説します!

メカ旦那をフォローする
Arduino
ザックリ解説Web

コメント

スポンサーリンク