IMU ストアは,周期的に,IMU センサの出力をバッファメモリに書き込む。
移動覚NNストアは,このバッファメモリの内容を,周期的に UART で受信する。
移動覚NNストアのこのアクセスは,IMU ストアのプロセスの割り込みにはならない。
ここが要点である。
この条件を満たす UART 通信は,つぎのようにして実現される:
- MCU の設定
MCU に対し,回路 UART1 の使用を設定する
→ ハンドル huart1 が生成される
- IMUストア側の設定・処理
( IMUストア/ストアコンプレクス)
(1) 送信バッファ
バッファの名前を "imu_out" とすると,
typedef struct
{
float ax;
float ay;
float wx;
float wy;
} IMUBuffer;
volatile IMUBuffer imu_out;
// imu_out を送信バッファにする設定
HAL_UART_IMU_OUT(
&huart1,
imu_out,
sizeof(imu_out)
);
(2) バッファへの書き込み
IMU (MPU6050) を読む:
// MCU と IMU は I2C で通信
MPU6050_Read_All(
&hi2c1,
&imu
);
データのうち,つぎを使う:
imu.Ax;
imu.Ay;
imu.Gx;
imu.Gy;
UART は byte しか送れないので,bytes に変換して,imu_out に書く。
- 歩行脳NNストア側の設定・処理
( 移動覚NNストア)
(1) UART の Python ライブラリ
import serial
(2) UART受信バッファを作成:
char imu_receive[64];
// imu_receive を受信バッファにする設定
HAL_UART_IMU_RECEIVE(
&huart1,
(uint8_t*)imu_receive,
sizeof(imu_receive)
);
これを Python で書くとどうなる?
(3) IMUストアのバッファの内容を, UART 受信
line = self.uart.readline()
??????
(4) 受信データの変換
imu_data = json.loads(
line.decode()
)
接地センサストアと接地覚NNストアの UART 通信は,回路 UART2 を使う。
ハンドルは huart2 になる。
通信の設定・処理は,IMUストアと移動覚NNストアの場合と同様。
|