###### tags: `つくばロボットコンテスト2021` `Tsukuba Univ`
# Raspberry PiとArduino UNOの通信プロトコル
## Raspberry Pi to Arduino UNO
**計24byteの固定長データ**
- 2byte: 信号種類
- 10: ステッピングモータ(右)
- 20: ステッピングモータ(左)
- ステッピングモータの左右は機体後方から見たときのもの
- 30: ステッピングモータ(左右)
- 40: ボール認識用測距センサ測定指示
- 50: ライントレーサ測定指示
- 51: ライントレーサ初期設定
- 60: カメラ用サーボモータ(上)
- 70: カメラ用サーボモータ(下)
- 80: 9軸測定指示
- 4byte: ランダムなID
- 1byte: 回転方向
- 0: 右回転
- 1: 左回転
- 2: ロック
- 3: 前進(左右)
- 4: 後進(左右)
- 5: 右旋回
- 6: 左旋回
- 軸を正面に見たときの方向
- 1byte: 信号種類
- 0: (1)角速度```deg/ms```と(2)総角度```deg```
- 1: (1)角速度```deg/ms```と(2)時間```ms```
- 2: 回転開始
- 3: 回転停止
- 4byte: データ(1)(右)
- 4byte: データ(2)
- 4byte: データ(3)(左)
- 4byte: データ(4)
## Arduino UNO to Raspberry Pi
**計42byteの固定長データ**
- 2byte: センサ種類
- 10: ステッピングモータ(右)動作完了
- 20: ステッピングモータ(左)動作完了
- 30: ステッピングモータ(左右)動作完了
- 40: ボール認識用測距センサ測定結果
- 50: ライントレーサ測定結果
- 60: サーボモータ(上)動作完了
- 70: サーボモータ(下)動作完了
- 80: 9軸センサ測定結果
- 4byte: ランダムなID
- 4byte * 3軸 * 3種類: データ(単精度浮動小数点数)
- 10: ステッピングモータ(右)動作完了
- データ1:角速度
- データ2:総角度or時間(ms)
- 20: ステッピングモータ(左)動作完了
- データ1:角速度
- データ2:総角度or時間(ms)
- 20: ステッピングモータ(左)動作完了
- データ1:角速度
- データ2:総角度or時間(ms)
- データ3:角速度
- データ4:総角度or時間(ms)
- 40: ボール認識用測距センサ測定結果
- データ1:距離(mm)
- 50: ライントレーサ測定結果
- データ1:ライン上にある時:1 ない時:0
- 60: サーボモータ(上)動作完了
- データ1:角速度
- データ2:総角度or時間(ms)
- 70: サーボモータ(下)動作完了
- データ1:角速度
- データ2:総角度or時間(ms)
- 80: 9軸センサ測定結果
- データ1:X加速度
- データ2:Y加速度
- データ3:Z加速度
- データ4:X角速度
- データ5:Y角速度
- データ6:Z角速度
- データ7:X地磁気
- データ8:Y地磁気
- データ9:Z地磁気
#### JSONで送信
\>#{"SignalType" : 00, "UniqueID" : 00, "AccelX" : 00, "AccelY" : 00, "AccelZ" : 00, "GyroX" : 00, "GyroY" : 00", GyroZ" : 00, "Direction" : 00, "Temperature" : 00, "LineTracer" : 0or1}
値はすべて小数点以下2桁のfloat, LineTracerのみint
## RaspberryPiの通信仕様
### 送信
- Arduino側からStop信号が来ない限り10msごとにキューにたまったパケットを送信
- Arduino側からStop信号が来た場合、RaspberryPiは一旦送信を停止
- 受信信号としてArduino側から送信済みパケットのrand_idが返ってきた場合に送信を再開
### 受信
- Arduino側から来るパケットを常にリッスンしており、受信するたびにイベントを発火する
## Arduinoの通信仕様
### 送信
- RaspberryPi側からパケットを受け取る前にStop信号を送信し、受け取り終わるとパケットのrand_idを送信
- 測定または動作が終わったときにパケットを送信
### 受信
- RaspberryPi側から来るパケットを常にリッスンしており、受信するたびに動作を開始する