今回は、mBotプログラミングシリーズ(Arduino編)の第9回です。
この回では、mBotの赤外線センサーを活用して、複数のロボットが協調して動くプログラムを作成します。
協調制御は、工場の生産ラインや配送ロボットの動きに応用される技術の基盤でもあります。
赤外線センサーを用いた基本的なデータ送受信の仕組みを理解し、それを用いた簡単な協調プログラムを実現します。
初心者でも安心して学べるよう、ステップごとに丁寧に解説していきます。
全講座の一覧はこちら
目標
- 赤外線センサーの仕組みを理解する。
 - データの送信と受信を学ぶ。
 - ロボット同士が協調してタスクを達成するプログラムを作成する。
 
Arduinoプログラムファイルの作成
ここでは、プログラムファイルをイチから作成していきます。
Arduino IDEを立ち上げ、ファイル -> 新規スケッチで真っ新なプロジェクトを用意しましょう。

mBotの赤外線センサーの基本
赤外線センサーとは
赤外線センサーは、目には見えない赤外線を利用して情報をやり取りする装置です。
mBotの基板上にある『IR_T』が送信側(Transmitter)、『IR_R』が受信側(Receiver)です。

mBotに搭載されている赤外線センサーは、赤外線リモコンからの信号を受信するだけでなく、他のmBotに信号を送信する機能も持っています。
これにより、簡単なメッセージを送り合いながら、複数のロボットを協調して動作させることが可能です。
赤外線センサーに関するAPI
API(Application Programming Interface)は、ソフトウェアやハードウェアが外部のプログラムとやり取りをするためのインターフェース(接点)です。
簡単に言うと、『決められたルールに従って機能を利用するための仕組み』です。
mBotのArduinoライブラリを使用すると、mBotのモーター、LED、ブザー、センサーなどの各機能を簡単に利用できます。
mBotの赤外線センサーを使用するためには、MeIRクラスを利用します。
このクラスを使うことで、赤外線センサーを簡単に制御できます。
赤外線センサーの制御には、以下の関数を使用します。
MeIR ir;                      // 赤外線センサー用のインスタンス(オブジェクト)を作成する
ir.begin();                   // 赤外線センサーの割り込みを初期化する
ir.decode();                  // 受信した赤外線メッセージをデコード化する
uint32_t value = ir.value();  // 受信した赤外線信号の値を取得
String code = ir.getString(); // 赤外線信号を文字列として取得
ir.sendString("String");      // 赤外線信号を文字列として送信APIを利用した簡単なプログラム
APIを用いて、次のような簡単なプログラムが作成できます。
赤外線リモコンのキー(A/B/Cボタン)を認識して、mBotのLEDライトを点灯させます。
#include <MeMCore.h>
MeIR ir;                        // 赤外線センサーのオブジェクトを作成
MeRGBLed rgb(7,2);              // LED制御用のオブジェクトを作成する
void setup() {
  ir.begin();                   // 赤外線センサーの割り込みを初期化する
}
void loop() {
  if(ir.decode()){              // デコードしたデータの準備ができているか
    int value = (ir.value >> 16) & 0xFF;  // 赤外線信号の上位16ビットを取り出す
    if(value == IR_BUTTON_A){   // Aボタンが押された
      rgb.setColor(0, 255, 0, 0);  // 赤
      rgb.show();                  // 設定した色を反映する
    }
    if(value == IR_BUTTON_B){   // Bボタンが押された
      rgb.setColor(0, 0, 255, 0);  // 緑
      rgb.show();                  // 設定した色を反映する
    }
    if(value == IR_BUTTON_C){   // Cボタンが押された
      rgb.setColor(0, 0, 0, 255);  // 青
      rgb.show();                  // 設定した色を反映する
    }
  }
}クラスとインスタンス(オブジェクト)について
このコードを理解するためには、「クラス」と「インスタンス(オブジェクト)」の概念を知ることが重要です。
クラスとインスタンス(オブジェクト)については、こちらで説明しています。
MeIRとは?
は、mBotの赤外線センサーを制御するためのクラスです。MeIR
このクラスは、Makeblockのライブラリ(MeIR.h)に含まれており、mBotの赤外線センサーを制御することができます。
class MeIR
{
public:
  MeIR();
  ErrorStatus decode();
  void begin();
  void end();
  void loop();
  boolean keyPressed(unsigned char r);
  int8_t decode_type;
  unsigned long value;
  uint8_t bits;
  volatile uint8_t *rawbuf;
  int rawlen;
  String getString();
  unsigned char getCode();
  void sendString(String s);
  void sendString(float v);
  void sendNEC(unsigned long data, int nbits);
  void sendRaw(unsigned int buf[], int len, uint8_t hz);
  void enableIROut(uint8_t khz);
  void enableIRIn();
  void mark(uint16_t us);
  void space(uint16_t us);
  ErrorStatus decodeNEC();
  int16_t irIndex;	
  char irRead;
  char floatString[5];
  boolean irReady;
  boolean irPressed;
  String irBuffer;
  String Pre_Str;
  double irDelayTime;
};irとは?
MeIR ir;このコードは、mBotの赤外線センサーを制御するためのインスタンス(オブジェクト)を作成しています。
MeIRはクラス(設計図)irはそのクラスから作られたインスタンス(オブジェクト)
また、赤外線センサーを制御するためのメソッドはいくつかあります。
mBotを制御する上でよく使用するものを次にご紹介します。
ir.begin()
MeIR ir;                      // 赤外線センサー用のインスタンス(オブジェクト)を作成する
ir.begin();                   // 赤外線センサーの割り込みを初期化する赤外線センサーの処理に関する割り込みを初期化します。
赤外線センサーを制御する場合は、最初にこのメソッドを呼び出しておきます。
ir.decode()
MeIR ir;                      // 赤外線センサー用のインスタンス(オブジェクト)を作成する
ir.decode();                  // 受信した赤外線メッセージをデコード化する受信した赤外線メッセージをデコード(復号)化します。
デコードとは、コードに変換されたデータを、元のデータを復元することです。
デコードが完了している場合は1、未完了の場合は0を返します。
ir.value
MeIR ir;                             // 赤外線センサー用のインスタンス(オブジェクト)を作成する
int value = (ir.value >> 16) & 0xFF; // 受信した赤外線信号の値を取得受信した赤外線信号の値を取得します。
32ビットのデータですが、mBotを制御する上で使用するデータ(赤外線リモコンのAボタンなどの情報)は上位16ビット分です。
使用する際には、右に16回シフトしたデータを使用します。

ir.getString()
MeIR ir;                      // 赤外線センサー用のインスタンス(オブジェクト)を作成する
String code = ir.getString(); // 赤外線信号を文字列として取得受信した赤外線信号を文字列として取得します。
ir.sendString(“String”)
MeIR ir;                      // 赤外線センサー用のインスタンス(オブジェクト)を作成する
ir.sendString("String");      // 赤外線信号を文字列として送信赤外線信号を文字列として送信します。
最後に紹介したメソッドを例に、コードの意味を説明すると、
①mBotの赤外線センサーを制御できるオブジェクトが生成され、
②sendString() メソッドを使って文字列「String」を赤外線通信で送信することができます。
mBotの赤外線センサーを使った協調制御プログラム
以下のコードは、『2台のmBotが赤外線通信を行い、協調制御する』プログラムです。
この例では、送信側mBotが信号を送信し、それを受け取った受信側mBotが動作を実行します。
送信側mBotのプログラム
#include <MeMCore.h>
MeIR ir;                        // 赤外線センサーのオブジェクトを作成
MeUltrasonicSensor ultr(PORT_3);
int distance;                   // 障害物との距離
void setup() {
  ir.begin();                   // 赤外線センサーの割り込みを初期化する
}
void loop() {
  distance = ultr.distanceCm();   // 超音波センサーの値(障害物までの距離)を取得
  if(distance < 10){              // 障害物との距離が10cm未満は「danger」を赤外線送信
    ir.sendString("danger");      // 赤外線信号を文字列として送信
  }
}受信側mBotのプログラム
#include <MeMCore.h>
MeIR ir;                        // 赤外線センサーのオブジェクトを作成
MeRGBLed rgb(7,2);              // LED制御用のオブジェクトを作成する
void setup() {
  ir.begin();                   // 赤外線センサーの割り込みを初期化する
}
void loop() {
  if(ir.getString() == "danger"){ // 文字列「danger」を受信したか
    rgb.setColor(0, 255, 0, 0);  // 赤
    rgb.show();                  // 設定した色を反映する
  }
  else{
    rgb.setColor(0, 0, 0, 0);    // 消灯
    rgb.show();                  // 設定した色を反映する
  }
}送信側mBotが10cm未満の距離に障害物を検出すると、受信側mBotのLEDライトが赤色に点灯して危険を知らせます。
ここでは、文字列「danger」を赤外線通信で受け渡しています。
これにより、複数のmBotが協調して動作することが可能になります。
まとめ
今回は、赤外線センサーを用いてロボット間でデータを送受信する方法を学びました。
このスキルは、ロボットの協調制御や簡易的な通信システムを構築するための基礎となります。
現実世界では、自律型ロボットが連携して動作する場面が増えており、今回学んだ内容はその基盤となるはずです。
次回は、ボード上のボタンを使った制御について学びます。
mBlockを使ったmBotのプログラミング方法を丁寧に解説していておススメです。
mBotを使用した拡張的な遊びは『mBotでものづくりをはじめよう』が参考になります。mBotのパーツを段ボールと組み合わせてオリジナルのロボットを作るといったような拡張的な遊びが楽しめます。

  
  
  
  


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