MZ Platformとフィジカルコンピューティング

MZ Platformとルンバの接続

ここでは、MZ Platformとルンバを接続する方法と、その利用例について説明します。

ルンバとは市販されているロボット掃除機で、 その中の500シリーズという製品はシリアル通信インタフェースが公開され、 モータの制御やセンサデータの取得ができるようになっています。 その文書は、「roomba 500 open interface specification」などのキーワードで検索すると見つかるはずです。 これを利用するための方法や利用例は書籍や雑誌記事で紹介されていて、日本語でも多くの情報が存在します。

つまり、ここではMZ Platformでシリアル通信を介して、 ルンバのモータ制御やセンサデータの取得を行う方法を紹介します。

準備するもの

まずは500シリーズのルンバ本体が必要です。下図左は購入した537Jで、ここではこれを用います。 また、PCからシリアル通信をするためのUSBケーブルおよびUSBシリアル変換モジュール(5V)が必要です。 下図右は購入したサンハヤトMM-FT232です。 それをルンバのシリアル通信ポートと接続するためのジャンプワイヤ3本も必要です。 USBシリアル変換モジュールはPCと初めて接続する際にドライバのインストールが必要になります。

上記だけで接続できますが、ルンバを自由に操作するためには有線より無線の方が良く、 XBeeなどでシリアル通信の無線化をすることもできます。 XBeeの利用でその方法も紹介します。

ルンバの設定

まずルンバの上面カバーをはずして、シリアル通信ポートを使える状態にします。 カバーは4箇所のツメで留められているだけなので、はずすのは難しくありません。 とはいえ、固くてはずしにくいこともありますので、壊さないようにお気をつけください。 はずすと掃除ボタンの右側にMini-DIN7ピンのポートが現れます。 ルンバ側のRXD・TXD・GNDと、シリアル変換モジュール側のTXD・RXD・GNDをそれぞれ接続すれば準備完了です。 有線の場合、ルンバ側のV+は使用しません。

あとルンバの設定としては、シリアル通信のボーレートを指定するだけです。 デフォルトは115200となっていて、このまま使用する場合は特に必要ありません。 有線ではこのまま使用できますが、XBeeを利用するときに変更する必要があるので、 そちらで変更方法を説明します。

ルンバの操作モード

ルンバにはシリアル通信による操作モードが4つあるそうです。 下図にその関係を示します。

最初はOffで、シリアル通信を開始するとPassiveモードになります。 この状態では、センサデータを取得することができますが、モータを制御することはできません。 特定のコマンドを送るとSafeモードになり、センサデータの取得に加えてモータ制御ができるようになります。 Safeモードでは、動作中に脱輪を検知したときなどにモータが自動停止してPassiveモードに移行します。 さらに、そのような自動停止が生じないFullモードもありますが、ここでは扱いません。

ここでは、基本的にSafeモードの状態で操作します。 ルンバの電源がオンの状態では、通常中央のボタンのLEDが黄色く光っていますが、 Safeモードに移行するとこのLEDが消灯します。Safeモードでは本体のボタンを押しても反応しません。 Safeモードで動作していても、持ち上げた場合などにPassiveモードに移行して、 そのときLEDが点灯するので、外観から操作モードをある程度把握することができます。

Safeモードで長時間操作しなくてもモードは持続しますが、 Passiveモードで長時間操作しないと電源が切れてLEDが消灯します。 そうなるとシリアル通信コマンドに反応しなくなるので、本体の電源ボタンを押してオンにしてください。 オンの直後はLEDが点灯してPassiveモードになっているので、Safeモードにしてから操作を行います。

MZアプリ

MZ Platformアプリケーションの作成では、シリアル通信コンポーネントを用います。 ルンバのシリアル通信インタフェースで定義されているコマンドや書式を、MZ側で送受信する処理を作成します。

下図が作成したMZアプリの実行画面です。

最初にシリアル通信の接続処理を説明します。 これはArduinoとの接続と同様に、 ポート名を指定して接続します。 ここでは通信速度(ボーレート)をシリアル通信コンポーネントの属性値として設定していて、 最初は前述のデフォルトの通信速度115200を指定します。その他の属性値は変更する必要がありません。

接続が開始されたら、シリアル通信コンポーネントを介してコマンドを送信することで、ルンバを操作することができます。 各種のコマンドを受け付ける状態にするために、 接続に成功した場合(処理完了イベント発生:番号1)に「操作開始」処理を呼び出しています。

「操作開始」処理では、下図に示すように、 シリアル通信コンポーネントのメソッド「ポートにバイトデータを出力する」を2回起動しています。

それぞれがルンバのシリアル通信インタフェースのコマンド送信に該当します。 1行目は「128」という値を1バイトのコマンドとして送信していて、Passiveモードへの移行を指示します。 2行目は「131」という値を1バイトのコマンドとして送信していて、Safeモードへの移行を指示します。 このように、1から数バイトの値の送信がルンバに対するコマンド送信になります。 下図では他の1バイトコマンドの処理を示しています。

「スポット掃除」と「ドック探索」は、ルンバの中心にある「SPOT」「DOCK」ボタンに対応する動作になります。 これらは1バイトコマンドとして「134」と「143」を送信すれば実行されます。 これらのコマンド送信によってPassiveモードに移行するので、 これらの動作を取り消して待機状態にする場合は「131」を送信します。

コマンドは複数バイトの値で表現されることもあります。 下図は、ルンバの移動用モータを制御して前進を指示する処理を示しています。 ルンバには移動用のモータが左右に2つ付いていて、それぞれ2バイトの値で回転数(方向込み)を指定します。 つまり、移動の指示は最初に「146」で移動を示して、続く4バイトで左右の回転数を示すため、全部で5バイトのコマンドとなります。

前進はHIGH側を「0」、LOW側を「0〜255」で直観的に回転数の大きさを指示します。 一方、後退はHIGH側を「255」、LOW側を「255〜0」で回転数の大きさを指示します。 例えば、ここで示した「前進」ボタンの場合は、「0」「95」「0」「95」を送信しています。 同様の速度の「後退」ボタンでは、「255」「160」「255」「160」を送信します。

同様に、下図はルンバの掃除用モータを制御する処理を示しています。 ルンバには掃除用にモータが3つ付いていて、メインブラシとサイドブラシおよび吸い込みに使われています。 コマンドは最初に「144」で掃除用モータを示し、各1バイトずつの3バイトで3つのモータの回転を指定します。

メインブラシとサイドブラシは正回転と逆回転があるので、それぞれ「-127〜127」で回転数を指示し、 吸い込みは正回転のみなので、「0〜127」で回転数を指定します。

さらに、ルンバ側のセンサの情報を取得することも可能です。 下図はバッテリー電圧の状態を取得する処理を示しています。 センサの情報を取得するためのコマンドは2バイトで、 下図ではセンサデータ受信を示す「142」とデータ種類として電圧を示す「22」を送信しています。 このコマンド送信後にシリアル通信コンポーネントからデータ生成イベントが発生するので、 そのときにデータを読み込むモードを事前に設定しています。 ここでは、電圧のデータが符号なしの2バイト値で送られてくるので、そのモードを指定しています。 それぞれのセンサ情報によって送られてくるデータの構成が変わるので、データごとにモードを変更する必要があります。

下図はシリアル通信コンポーネントのデータ生成イベントの処理を示しています。 コマンド送信前に指定したモードでデータが解釈され、適切な文字列に変換されてイベント内包データとして取得できます。 ここでは、受信したデータをテキストエリアに文字列として表示するだけなので、共通の処理として定義しています。

このように、センサデータを1つ取得する場合は、シリアル通信コンポーネントで受信モードを指定した後、 同様のコマンド送信を行うことで、各種のデータを受信できます。 取得できるデータとして、他に「動作モード(35:符号なし1バイト)」、 「バッテリー温度(24:符号あり1バイト)」、「充電量(25:符号なし2バイト)」、 「消費電流(23:符号あり2バイト)」、 「累積移動量(19:符号あり2バイト)」、「累積角度変化量(20:符号あり2バイト)」などがあります。

XBeeの利用

ルンバとの接続を無線化するために、XBeeを用いる方法を紹介します。 XBeeでシリアル通信を無線化する方法については、 こちらをご覧ください。 XBeeモジュール2つとXBeeエクスプローラUSBが必要なのは同じで、 ルンバと接続するために下図のような部品が追加で必要となります。

ここではスイッチサイエンスのXBee 5Vアダプタと、Mini-DIN7ピンのプラグ、 ルンバのバッテリ電源から5Vを取り出すためのレギュレータ等を、 市販のケースを加工して収めています。下図が回路の構成です。 電子回路は他のサイトや部品のデータシートから情報を集めて作成しました。 動作しているので良しとしますが、どの程度妥当なのか自分では判断できません。

組み立てて装着すると下図のようになります。 PC側にUSBのXBeeエクスプローラを接続すれば、有線と同様にシリアル通信が可能になります。

XBeeを介して接続する場合、シリアル通信コンポーネントの通信速度とXBeeの通信速度を揃える必要がありますが、 ルンバのデフォルトの通信速度だと、XBeeが対応していない/設定しても正常に動作しないようなので、 通信速度の設定を57600に変更する必要があります。

まずは有線で正常に接続した状態で、下図のような処理を呼び出してルンバの通信速度を変更し、 シリアル通信コンポーネントの通信速度を変更します。 ルンバの通信速度変更は2バイトのコマンド送信で、「129」と「10」という値を連続して送ることで、 通信速度を57600に指定したことになります。 そのあとでシリアル通信コンポーネントの通信速度を57600に変更しており、 いずれも問題がなければ新しい通信速度で通信をすることになります。 有線で問題がなければ、XBeeの通信速度を57600に設定して接続し、通信できることを確認します。

もしも何らかの問題によって通信ができなくなった場合は、有線で動作を確認するようにしましょう。 ルンバのバッテリ切れで状態が初期化された場合には、指定した通信速度も初期状態になるので、 この設定をやり直す必要があります。

もし有線でも接続できなくなってしまった場合、何らかの事情で通信速度が変わってしまっていることがあります。 総当たりで通信速度を試してもわからない場合は、強制的に通信速度を変更する方法があり、 電源ボタンを10秒以上押すことで、メロディが鳴って通信速度が19200に設定されます。

動画

XBeeを利用した通信で、作成したMZアプリからルンバを動かしている様子を動画でお見せします。

作成日 2013-08-28

最終更新日 2013-08-30