Up UART 通信 作成: 2026-09-29
更新: 2026-10-09

4足歩行ロボット > 自律型> コンピュータ > プログラミング > MCU > UART

    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ストアの場合と同様。