今回は、mBotプログラミングシリーズ(Arduino編)の第5回です。
この回では、mBotのプログラムをより高度にするために必要な「演算」と「条件分岐・繰り返し処理」について学んでいきます。
特に、センサー値を活用するためには、演算、条件分岐、繰り返し処理の理解が不可欠です。
これらの概念を活用することで、mBotがより柔軟に動作できるようになります。
全講座の一覧はこちら
目標
- 演算・条件分岐・繰り返し処理の基本を理解する
 - 条件分岐のフローとプログラミング方法を学ぶ
 - 繰り返し処理の種類と使い分けを知る
 
Arduinoプログラムファイルの作成
ここでは、プログラムファイルをイチから作成していきます。
Arduino IDEを立ち上げ、ファイル -> 新規スケッチで真っ新なプロジェクトを用意しましょう。

演算
Arduinoのプログラムでは、以下のような演算を使用できます。
算術演算(基本的な計算)
算術演算とは、数値の計算を行う演算のことです。
mBotのプログラムでは、モーターの速度計算やLEDの明るさ調整、センサーの値を処理する際に使用されます。
| 演算子 | 説明 | 例(a=5, b=3) | 結果 | 
|---|---|---|---|
| + | 加算 | a + b | 8 | 
| – | 減算 | a – b | 2 | 
| * | 乗算 | a * b | 15 | 
| / | 除算 | a / b | 1 | 
| % | 余り | a % b | 2 | 
比較演算(条件を判定する)
比較演算とは、2つの値を比較し、その結果として真(true)または偽(false)を返す演算のことです。
比較演算を使用することで、プログラム内で条件を作成し、mBotの動作を分岐させることができます。
| 演算子 | 説明 | 例(a=5, b=3) | 結果 | 
|---|---|---|---|
| == | 等しい | a == b | false | 
| != | 異なる | a != b | true | 
| > | 大きい | a > b | true | 
| < | 小さい | a < b | false | 
| >= | 以上 | a >= b | true | 
| <= | 以下 | a <= b | false | 
論理演算(条件を組み合わせる)
論理演算とは、複数の条件を組み合わせて「真(true)か偽(false)か」を判定する演算のことです。
mBotのプログラムでは、センサーの値を組み合わせて特定の条件を満たすかを判断し、動作を制御する際に使われます。
| 演算子 | 説明 | 例(a=5, b=3, c=7) | 結果 | 
|---|---|---|---|
| && | AND(両方が真) | (a > b) && (b > c) | false | 
| || | OR(どちらかが真) | (a > b) || (b > c) | true | 
| ! | NOT(否定) | !(a > b) | false | 
条件分岐(if文)
条件分岐は、プログラムの実行を特定の条件に基づいて変化させるための構文です。
主にif、else if、else文を使って実装します。
これにより、mBotが特定の状況下で異なる動作をするようにプログラムできます。
基本的なif文の構文
if (条件1) 
{
    処理1; // 条件1が真の場合に実行される処理
}
else if (条件2) 
{
    処理2; // 条件2が真の場合に実行される処理
} 
else 
{
    処理3; // すべての条件が偽の場合に実行される処理
}上記のコードをフローチャートで表現すると次のようになります。

- 条件1が真なら、処理1を実行する
 - 条件1が偽なら、条件2を判定する
- 条件2が真なら、処理2を実行する
 - 条件2が偽なら、処理3を実行する
 
 
条件2の判定が実施されるのは、条件1が偽の時のみであることに注意してください。
if文は次のように、else if 文やelse 文を省略することもできます。
- if文
 - if – else文
 - if – else if文
 
if (条件1) 
{
    処理1; // 条件1が真の場合に実行される処理
}
if (条件1) 
{
    処理1; // 条件1が真の場合に実行される処理
}
else
{
    処理2; // 条件1が偽の場合に実行される処理
} 
if (条件1) 
{
    処理1; // 条件1が真の場合に実行される処理
}
else if (条件2) 
{
    処理2; // 条件2が真の場合に実行される処理
} 
if文を使ったプログラム例
#include <MeMCore.h>
MeDCMotor MotorL(M1);
MeDCMotor MotorR(M2);
void setup() {}
void loop() {
  int distance = random(10);   // 距離を設定 ※乱数発生(0~9)
  if(distance >= 5)
  {
    MotorL.run(-100);  // M1モーターを前進
    MotorR.run(100);   // M2モーターを前進
    delay(1000);       // 1秒間継続
  }
  else
  {
    MotorL.stop();     // M1モーターを停止
    MotorR.stop();     // M2モーターを停止
    delay(1000);       // 1秒間継続
    }
}random(10);で0~9の乱数を発生させます。
乱数を、『障害物までの距離』と仮定して、以下の判定を行います。
- 条件「距離が5cm以上:真(True)のとき」
- mBotを1秒間前進
 
 - 条件「距離が5cm以上:偽(False)のとき」
- mBotを1秒間停止
 
 
繰り返し処理(for文・while文)
繰り返し処理は、同じコードブロックを何度も実行するための構文です。for文とwhile文が一般的に使われます。これにより、コードを簡潔かつ効率的に記述できます。
基本的なfor文の構文
for (初期化; 継続条件; 増減) {
    処理1;   // 繰り返し実行する処理
}上記のコードをフローチャートで表現すると次のようになります。

- 繰り返し処理の最初で、ループカウンタを初期化
 - 継続条件が成り立つ(真となる)場合、
- 処理1を実行
 - ループカウンタを増減
 - 再度、継続条件を判定
 
 - 継続条件が成り立たない(偽となる)場合、
- 繰り返し処理を抜ける
 
 
for文を使ったプログラム例
#include <MeMCore.h>
MeDCMotor MotorL(M1);
MeDCMotor MotorR(M2);
void setup() {
  
  for (int i = 0; i < 5; i++) {
    MotorL.run(-100);  // M1モーターを前進
    MotorR.run(100);   // M2モーターを前進
    delay(1000);       // 1秒間継続
    MotorL.stop();     // M1モーターを停止
    MotorR.stop();     // M2モーターを停止
    delay(1000);       // 1秒間継続
  }  
}
void loop() {}上記は、『mBotの前進と停止を5回繰り返す』プログラムです。
ループカウンタ「i」を0で初期化し、iが5未満の間、処理を繰り返します。
「i」はfor文の中の処理が1度実行されるごとに、i++(インクリメント)して1ずつ加算されます。
for文1回目:i=0for文2回目:i=1- ・・・
 for文5回目:i=4
この結果、for文は5回繰り返されることになります。
基本的なwhile文の構文
while (条件) {
  // 繰り返し実行するコード
}上記のコードをフローチャートで表現すると次のようになります。

- 条件が成り立つ(真となる)場合、
- 処理1を実行
 - 再度、条件を判定
 
 - 条件が成り立たない(偽となる)場合、
- 繰り返し処理を抜ける
 
 
for文は、繰り返しの回数があらかじめ決まっている場合に適しているのに対し、while文は、条件が満たされるまで繰り返し処理を行いたい場合に適しています。
例えば、センサーの値が特定の範囲内にある間繰り返す処理や、ユーザーが特定の入力を行うまで待つ処理などに利用されます。
while文を使ったプログラム例
#include <MeMCore.h>
MeDCMotor MotorL(M1);
MeDCMotor MotorR(M2);
void setup() {
  int distance = 15;      // 距離を設定(15cm)
  
  while (distance > 3) {  // 障害物までの距離が3cm以上の場合
    MotorL.run(-100);     // M1モーターを前進
    MotorR.run(100);      // M2モーターを前進
    delay(100);           // 0.1秒間継続
    distance = random(1000); // 距離を設定 ※乱数発生(0~999)
  }
  MotorL.stop();        // M1モーターを停止
  MotorR.stop();        // M2モーターを停止
}  
void loop() {}上記は、『障害物との距離が3cm以下になるまで、mBotを前進させる(0.1秒前進を繰り返す)』プログラムです。
ここでは障害物との距離を乱数に置き換えています。
距離「distance」が3より大きい間は、mBotの0.1秒前進を繰り返します。
繰り返し処理1回ごとに距離「distance」を更新し、毎回新しい距離で判定を行います。
条件分岐、繰り返しと演算を組み合わせたプログラム
#include <MeMCore.h>
MeDCMotor MotorL(M1);
MeDCMotor MotorR(M2);
void setup() {
  int distance;        // 距離
  int speed = 200;     // 速度
  
  for (int i = 0; i < 10; i++) {
    distance = random(20); // 距離を設定 ※乱数発生(0~19)
    if(distance > 10){
      MotorL.run(-speed);       // M1モーターを前進(100%)
      MotorR.run(speed);        // M2モーターを前進(100%)
      delay(1000);              // 1秒間継続
    }
    else if(distance > 5){
      MotorL.run(-speed * 0.5);  // M1モーターを前進(50%)
      MotorR.run(speed * 0.5);   // M2モーターを前進(50%)
      delay(1000);               // 1秒間継続
    }
    else{
      MotorL.run(-speed * 0);  // M1モーターを停止
      MotorR.run(speed * 0);   // M2モーターを停止
      delay(1000);             // 1秒間継続
    }
  }
  MotorL.stop();  // M1モーターを停止
  MotorR.stop();   // M2モーターを停止  
}
void loop() {}上記は、障害物の距離に応じてmBotの速度を切り替える処理です。
- 繰り返し処理:mBotの速度切替動作を
for文で10回繰り返します。 - 条件分岐 :障害物との距離に応じて、処理を切り替えます。(>10cm、>5cm、それ以外)
 - 算術演算 :run関数の引数(速度)を割合で決定します。(100%、50%、0%)
 
まとめ
今回は、演算と条件分岐・繰り返し処理について学びました。
これらの基本的な概念を理解することで、mBotのセンサー値を取り入れた制御が可能となり、より複雑なプログラムを作成することができます。
これにより、プログラムの幅が広がり、より高度なプロジェクトに挑戦することができます。
次回は、光センサーを使って明るさを測定する方法を学びます。

mBlockを使ったmBotのプログラミング方法を丁寧に解説していておススメです。
mBotを使用した拡張的な遊びは『mBotでものづくりをはじめよう』が参考になります。mBotのパーツを段ボールと組み合わせてオリジナルのロボットを作るといったような拡張的な遊びが楽しめます。

  
  
  
  

					
					
Arduino IDEからmBotへ書き込みして、動作を確認してみましょう。