基本

KeiganMotor は、1バイトずつデータを送信することにより、制御することができます。
1まとまりの制御データ(命令)を送り込むことにより、KeiganMotorにさせる1つの仕事を「タスク」と呼びます。

コマンドのデータ構造は次の形式を取ります。

 

byte [0] [1][2] [3]...[n-3] [n-2] [n-1]
0x00-0xFF uint16_t identifier values uint16_t crc16
説明 コマンド タスク管理用ID 引数
(各コマンドによって長さが異なる)
巡回冗長検査
(データ誤り検出用)

ポイント

  • データの0バイト目には必ず、コマンドごとの固有値が入ります。該当しないコマンドは無視されます。
  • データの1バイト目〜2バイト目は、タスク管理用のIDです。タスク管理は将来的に実装予定ですが、動作だけであれば、{0, 0} 等の、任意の値で構いません。
  • データの3バイト目以降は、コマンドによって異なる値、引数が入ります。引数がないコマンドも存在します。
  • データの末尾には、2バイトのデータ誤り検出用データが入ります。データ誤り検出は将来的に実装されます。動作だけであれば、{0, 0} 等の、任意の値で構いません。
  • バイトオーダーはビッグエンディアンとなります。

 

単位系

KeiganMotor では、以下の単位系を採用しています。

単位  
位置 radian ラジアン
速さ・速度 radian / second ラジアン / 秒
トルク N * m ニュートン・メートル

KeiganMotor の内部では、上記のような物理的な値を 32ビットの単精度 float 型 で取り扱います。

コマンドの引数に float型の値を入れる場合、4バイトの uint8_t 型に変換したものを入れて下さい。
変換の方法は、多くのプログラミング言語の標準である、IEEE754に準拠します。

すなわち、float 型を16進数として変換し、バイト列に分割します。
参考リンク:IEEE 754 浮動小数点数 コンバーター
http://logroid.blogspot.jp/2014/02/ieee754-single-converter.html

 

制御コマンドの例

KM-1 では、無線(Bluetooth Low Energy)の他、有線(I2C, USB)を使って制御することができます。
例えば、KeiganMotorに単純な回転動作させる場合は、以下の順序で制御コマンドを送ります。

(タスク1)モーターの動作を許可(enable コマンド:0x51)

(タスク2)モーターの速さを設定(speed コマンド:0x58)

(タスク3)モーターを正回転(runForward コマンド:0x60)

次のバイト列を送信すると、モーターは正回転します。
id と crc16 は任意の値で構いません。

(タスク1)

モーターの動作を許可(motorEnable コマンド:0x51)

byte[0] byte[1] byte[2] byte[3] byte[4]
0x51 0 0 0 0

(タスク2)

モーターの速さを設定(speed コマンド:0x58)

byte[0] byte[1] byte[2] byte[3] byte[4] byte[5] byte[6] byte[7] byte[8]
0x58 0x00 0x01 0x3F 0x80 0x00 0x00 0x00 0x00

この例では、byte[3]~[6]に、 (float)1.0 = 0x3F800000 をバイト列に変換したものを入れています。
すなわち、1.0 radian/second の速さをモーターに与えたことになります。
(1 radian / second ≒ 9.55 rpm:1分間の回転数 となります)

(タスク3)

モーターを正回転(runForward コマンド:0x60)

byte[0] byte[1] byte[2] byte[3] byte[4]
0x60 0x00 0x02 0x00 0x00

(タスク4)

モーターの動作を不許可とする(disable コマンド:0x50)

byte[0] byte[1] byte[2] byte[3] byte[4]
0x50 0x00 0x03 0x00 0x00