2017.02.16

  • 人×技術

ロボット掃除機のルンバを思い通りに動かしてみよう

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

自動で部屋をキレイにしてくれるロボット掃除機としては、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ピンです。

ここにジャンパーピンを挿していっても良いのですが、千石電商さんで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ピン側にアノードが向く。

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

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

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

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

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

スケッチ

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

  
//指定されているオペレーションコードを設定
#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のスケッチに直接動作を書き込んで進み方を決めて操作したので、もっと自由にルンバを動かせるように、今度はコントローラーを使ってもっと自由に動かしてみたいと思いますが、ちょっと長くなってしまいそうなので、続きはまた次回にしたいと思います。

この記事を書いた人 :
イシイ

この記事をシェアする

すべての記事