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