基本
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 |