[ English version is here ]
iRobot Create Open Interface (OI) は多くの機能をもっています。例えば LED の制御、サウンド演奏およびセンサー(壁検出)制御などです。しかし、iRobot Create + Sun SPOT demo のためには以下のコマンドだけを理解すれば十分です。
- Start コマンド
- Mode コマンド
- Drive コマンド
"Start" コマンドは OI を開始するためのトリガーです。iRobot Create はその制御レベル(ユーザーがどの程度 iRobot Create を制御できるか)に応じて4つのオペレーティングモード(Off, Passive, Safe, Full)をもっています。iRobot Create + Sun SPOT demo では常に iRobot Create を完全に制御できる "Full" モードを利用しますが、今回は "Safe" モードを使用します。Safe モードは Full モードとほぼ同じですが、安全のためにがけ・脱輪センサーなどが働き、危険時には動作がストップする点が異なります(詳細については iRobot Create 仕様 を参照ください)。
"Drive" コマンドは iRobot Create の車輪を駆動させるためのコマンドで、iRobot Create + Sun SPOT demo のメインのコマンドです。前回使用したシリアル接続 + Realterm を使用してこのコマンドを試してみましょう。
Drive コマンドの syntax (シリアルシーケンス)は
[137] [Velocity high byte] [Velocity low byte] [Radius high byte] [Radius low byte]
です。直進速度の範囲は -500 から 500 mm/s、回転速度の範囲は -2000 から 2000 mm です。"radius value" に関しては以下のような3つの特別なケースがあります。
- 0x8000 or 0x7FFF: 直進(+ Velocity 前進、- Velocity 後進)
- 0xFFFF: 回転(時計回り)
- 0x0001: 回転(反時計回り)
つまり、iRobot Create をここのビデオのように動かしたい場合は以下のようなコマンドを送ればよいわけです。
- 128 131 (Start OI and puts the OI into Safe mode)
- 137 0 100 128 0 (move forward at 100 mm/s)
- 156 1 44 (until traveling 300 mm (3 s))
- 137 0 0 128 0 (stop)
- 155 20 (wait for 20 * 1/10 = 2 s)
- 137 255 156 128 0 (move backward at -100 mm/s)
- 156 254 212 (until traveling -300 mm (3 s))
- 137 0 0 128 0 (stop)
- 155 20 (wait for 20 * 1/10 = 2 s)
- 137 0 100 0 1 (move counter-clockwise at 100 mm/s)
- 157 1 105 (until rotating 360 degrees)
- 137 0 0 128 0 (stop)
- 155 20 (wait for 20 * 1/10 = 2 s)
- 137 0 100 255 255 (move clockwise at 100 mm/s)
- 157 254 152 (until rotating -360 degrees)
- 137 0 0 128 0 (stop)
上記の "Wait" コマンドについてはまだ説明していませんでしたのでここで説明します。iRobot Create OI はいくつかの「待機」コマンドをもっており、文字通りなんらかのイベントが起きるまで次のコマンドの実行を「待機」するコマンドです。"Wait Distance (Opcode: 156)" は iRobot Create がある距離(mm)進むまで待機するコマンドです。ですから上の "156 1 44" は 100 mm/s で進んでいる場合には (256 + 44) / 100 = 3 秒待つという意味になります。また、"Wait Angle (Opcode: 157)" はある角度(度)動くまで待機するコマンド、"Wait Time (Opcode 155)" はある一定時間待機するコマンドです。
話はそれますが、OI を使用するためには(上記のフォーマットでの)10 進→ 16 進変換をよく行いますのでそのためのツールを準備しておくと便利かもしれません。Ruby を使用した場合は↓のようなスクリプトで上記で使用した -100, -300, -360 を変換することができます。
$ cat conv.rb
#!/usr/bin/env ruby
ARGV.each {|n|
s = sprintf("%.4x", n)
puts "#{n} => #{s} (#{s[0,2].hex} #{s[2,4].hex})"
}
$ ./conv.rb -100 -300 -360
-100 => ff9c (255 156)
-300 => fed4 (254 212)
-360 => fe98 (254 152)
上記コマンドを Realterm 上で実行するには iRobot Create の電源を入れた後、"128 131" を最初に送信した後、残りのコマンドを一度に送信することができます:
137 0 100 128 0 156 1 44 137 0 0 128 0 155 20 137 255 156 128 0 156 254 212 137 0 0 128 0 155 20 137 0 100 0 1 157 1 105 137 0 0 128 0 155 20 137 0 100 255 255 157 254 152 137 0 0 128 0
今までシリアル通信と Realterm を用いて iRobot Create の動作をテスト・理解してきましたが、iRobot Create をプログラムから制御できればもっと楽しくないでしょうか?次回からはその方法についてみていきましょう。