Aster Protocol¶
ALEO、AC間通信を確立するための独自プロトコルです。
UART8N1通信を利用し以下の内容で動作します。
UART通信仕様
-
Baudrate : 115200
-
Data : 8bit
-
Parity : None
-
Stop : 1bit
プロトコル構成
| START | CMD | LEN | DATA | CRC8/ATM |
|---|---|---|---|---|
| 0xAA | 1byte | 1byte | Nbyte | 1byte |
START¶
プロトコルの開始は必ず0xAAとする。
CMD¶
命令コマンド。各値の割当ては以下である。
| 領域 | 機能 |
|---|---|
| 0x0x | 単一モータ |
| 0x1x | 全統モータ |
| 0x2x | PID処理 |
| 0x3x | STATUS |
| 0x4x | SYSTEM |
| 0x8x | ACK,NACK |
| CMD | 機能 | LEN | 型 | DATA |
|---|---|---|---|---|
| 0x01 | SET_WHEEL_DIR | 3 | uint8_t,uint16_t | No,DIR(deg) |
| 0x02 | SET_WHEEL_SPEED | 3 | uint8_t,uint8_t | No,SPEED(%) |
| 0x10 | STOP_ALL_MOTOR | 0 | - | - |
| 0x11 | SET_ALL_DIR | 2 | uint16_t | DIR(deg) |
| 0x12 | SET_ALL_SPEED | 1 | uint8_t | SPEED(%) |
| 0x20 | SET_PID | 3 | uint8_t,uint16_t | PID,val |
| 0x21 | GET_PID | 0 | - | - |
| 0x22 | RESET_PID | 0 | - | - |
| 0x30 | GET_STATUS | 0 | - | - |
| 0x31 | GET_MOTOR_STATUS | 0 | - | - |
| 0x32 | GET_SENSOR_STATUS | 0 | - | - |
| 0x40 | PING | 0 | - | - |
| 0x41 | GET_VERSION | 0 | - | - |
| 0x42 | RESET | 0 | - | - |
| 0x80 | ACK | 0 | - | - |
| 0x81 | NACK | 1 | uint8_t | ERROR_CODE |
ERROR_CODE¶
| CODE | 意味 |
|---|---|
| 0x01 | CRC_ERROR |
| 0x02 | UNKNOWN_CMD |
| 0x03 | INVALID_LENGTH |
| 0x04 | INVALID_DATA |
| 0x05 | BUSY |
| 0x06 | NOT_READY |
| 0x07 | INTERNAL_ERROR |
| 0x08 | TIMEOUT |
CRC8/ATM¶
巡回冗長検査(CRC)でATM方式を利用する。多項式は以下となり、標準は0x07となる。
\[ x8 + x2 + x + 1 \]
CRCのチェックは以下の関数で行い言語は違えどNode.jsでも同様である。
uint8_t Protocol_CalculateCRC8(const uint8_t *data, uint8_t length)
{
uint8_t crc = 0x00;
for (uint8_t i = 0; i < length; i++)
{
crc ^= data[i];
for (uint8_t bit = 0; bit < 8; bit++)
{
if (crc & 0x80)
{
crc = (crc << 1) ^ 0x07;
}
else
{
crc <<= 1;
}
}
}
return crc;
}