こんにちは、イシイです。

自動で部屋をキレイにしてくれるロボット掃除機としては、iRobot社から発売されているルンバが有名ですが、今回は同じiRobot社から発売されているロボット掃除機「iRobot Create® 2」を、Arduinoを使って思い通りに動かしてみたいと思います。

iRobot Create® 2を制御するにあたっての要点

iRobot Create® 2 (以下、iRobotと呼ぶ) は、ルンバ 600シリーズをベースに作られたプログラマブルなロボット掃除機で、iRobotを制御するにあたっては、オープンインターフェースが公開されています。

オープンインターフェースのマニュアルを見る限り、内蔵している様々なセンサーデータまで扱えることがわかりますが、すべて追いかけるのも骨が折れるので、今回のエントリーで必要そうなところだけピックアップします。

  • iRobotとの相互通信はシリアル通信で行う
  • 通信レートは115200bpsと19200bpsの2種類があり、初期状態では115200bps
  • 起動モードにはPassive Mode / Safe Mode / Full Mode があり、モードに応じてできることが異なる
  • 主な動作命令はOpcodeに応じて実行され、各種センサーデータなどの取り扱い時には、さらにPacket IDに分化される
  • iRobotは15ms毎に処理更新されるので、それよりも速い間隔でコマンドを送らない

大体このくらいをおさえておけば大丈夫かと思います。

今回用意するもの

  • Arduino Uno
  • iRobot Create® 2
  • ダイオード(1N4001) x 2
  • トランジスタ(2N4403)
  • ブレッドボード or ミニDINプラグ7P
  • ジャンパーピン

今回使用したダイオード(1N4001)とトランジスタ(2N4403)は、千石電商さんで購入しました。

配線

配線に関しては、iRobot社が提供しているArduinoチュートリアルを参考にしていますが、シリアルコンソールにログを出しながら確認するためにハードウェアシリアルを使いたかったため、今回のエントリーでは若干配線を変えます。iRobot側の入力口はミニDIN7ピンです。

ミニDIN7ピン

ここにジャンパーピンを挿していっても良いのですが、千石電商さんで7P ミニDINプラグストレートも取り扱っているので、ダイオードとトランジスタを揃えるついでに、こちらも購入して作れば着脱時は便利になります。
ちなみに、7P ミニDINプラグストレートを分解してはんだ付けし、ケーブル化してみたものがこちらです。

ケーブル

では、今回の配線です。

iRobot DINピン ピン用途 接続先 捕捉
1 VOUT Arduino Vinピン ダイオード(1N4001)を2つ挟む
2 VOUT - 今回は使用しない
3 RXD Arduino ソフトウェアシリアルTX(デジタル11ピン) iRobotとの通信用
4 TXD トランジスタ(2N4403) iRobotとの通信用
5 ON/OFF Arduino デジタル2ピン iRobotの電源操作用
6 GND Arduino GNDピン -
7 GND トランジスタ(2N4403) -

配線にあたって注意すべき点は、

  • iRobotからのVOUTを、うっかりArduino Vin以外(3.3Vピンや5Vピン)に挿さない。電圧高くてArduinoが壊れます。
  • ダイオード(1N4001)には向き(カソード、アノード)があるので、向きに気をつける。iRobotから電源供給をするため、iRobot DINピン側にアノードが向く。

1N4001

といったところだと思います。

作成するプログラムの流れ

今回作成するスケッチでは、

1. ArduinoからiRobotを電源ON(オペレーションコード:128)
2. iRobotをセーフモードに設定(オペレーションコード:131)
3. iRobotのディスプレイに「4009」の数字を表示(オペレーションコード:164)
4. PWM制御でiRobotを動かす(オペレーションコード:146)
5. 一定ステップこなしたら、iRobotの電源を切る(オペレーションコード:133)

というシンプルなものにしました。

スケッチ

それでは、Arduinoのスケッチです。

#include <SoftwareSerial.h>
 
//指定されているオペレーションコードを設定
#define OP_START     128
#define OP_SAFE_MODE 131
#define OP_POWER     133
#define OP_DRIVE_PWM 146
#define OP_DIGIT_LED 164

//Arduinoへの接続ピン
#define rxPin 10
#define txPin 11
#define ddPin 2
 
int cnt = 0; //ステップカウント用
 
SoftwareSerial iRobot(rxPin, txPin);
 
/*--------------------------------------------------------------------------*/
void setup() {
 
  //通信レートは初期値115200に設定
  iRobot.begin(115200);
  Serial.begin(115200);
    
  pinMode(ddPin, OUTPUT);
 
  //iRobot側の準備が出来るまでのWait設定
  delay(3000);
 
  Serial.println("iRobot Start");
  
  wakeUp();    //iRobot電源ON
  startSafe(); //セーフモードで起動
 
  Serial.println("Setup Completed");
  
  //「4009」を7セグディスプレイに表示
  opDigitLEDsASCII(52, 48, 48, 57);
  delay(1000);

}
 
/*--------------------------------------------------------------------------*/
void loop() { 
  
  Serial.print("cnt -> ");
  Serial.println(cnt);

  //6回処理したら電源OFF
  if (cnt >= 6) {
    powerOff();
  } else {
    cnt++;
    opDrivePWM(60,60); //まっすぐ4秒間進む
    delay(4000);
    opDrivePWM(0,70);  //4秒間右側に旋回
    delay(4000);
  }
 
}

/*--------------------------------------------------------------------------*/
void wakeUp () {
  digitalWrite(ddPin, HIGH);
  delay(100);
  digitalWrite(ddPin, LOW);
  delay(500);
  digitalWrite(ddPin, HIGH);
  delay(2000);
}

/*--------------------------------------------------------------------------*/
void startSafe() {  
  iRobot.write(OP_START);     //Start
  iRobot.write(OP_SAFE_MODE); //Safe mode
  delay(1000);
}

/*--------------------------------------------------------------------------*/
void powerOff() {
  iRobot.write(OP_POWER);
}

/*--------------------------------------------------------------------------*/
void opDrivePWM(signed short rightPWM, signed short leftPWM) {
 
  iRobot.write(OP_DRIVE_PWM);
  iRobot.write(rightPWM >> 8);
  iRobot.write(rightPWM);
  iRobot.write(leftPWM >> 8);
  iRobot.write(leftPWM);
 
}
 
/*--------------------------------------------------------------------------*/
void opDigitLEDsASCII(signed short digit3, signed short digit2, signed short digit1, signed short digit0) {
 
  iRobot.write(OP_DIGIT_LED);
  iRobot.write(digit3);
  iRobot.write(digit2);
  iRobot.write(digit1);
  iRobot.write(digit0);
 
}

実際にArduinoで動かしてみました

Arduinoから電源ON、動作、電源OFFまで行ってみた動画がこちらです。

今回は、Arduinoのスケッチに直接動作を書き込んで進み方を決めて操作したので、もっと自由にルンバを動かせるように、今度はコントローラーを使ってもっと自由に動かしてみたいと思いますが、ちょっと長くなってしまいそうなので、続きはまた次回にしたいと思います。