eefocus_3914144 发表于 2026-3-14 13:33:06

【瑞萨AI挑战赛】部署AI识别

## 传感器

由于没有买到官方示例的传感器,我采用了bmi270来识别传感器数据。

## 示例匹配

```
void hal_entry(void)
{
#if BSP_TZ_SECURE_BUILD
    /* Enter non-secure code */
    R_BSP_NonSecureEnter();
#endif

    int8_t rslt;
    fsp_err_t err = FSP_SUCCESS;
    float acc_x, acc_y, acc_z;
    float gyr_x, gyr_y, gyr_z;

    APP_PRINT("HAL Entry: Starting BMI270 Demo...\r\n");

    /* Enable access to the PFS registers */
    APP_PRINT("HAL Entry: Enable pin access\r\n");
    R_BSP_PinAccessEnable();

    APP_PRINT("HAL Entry: Write LED1 LOW\r\n");
    R_BSP_PinWrite(LED1_GREEN, BSP_IO_LEVEL_LOW);

    /* Init I2C communication */
    APP_PRINT("HAL Entry: Calling init_i2c_comm\r\n");
    init_i2c_comm();

    /* Initialize BMI270 sensor */
    APP_PRINT("HAL Entry: Calling BMI270_init\r\n");
    rslt = BMI270_init();
    if (rslt != 0) {
      APP_PRINT("BMI270 init failed! rslt=%d\r\n", rslt);
      R_BSP_PinWrite(LED2_GREEN, BSP_IO_LEVEL_HIGH);
      __BKPT(0);
    }
    APP_PRINT("BMI270 initialized successfully\r\n");

#if DATA_COLLECTION_EN
    err = RM_RAI_DATA_COLLECTOR_Open(&g_rai_data_collector0_ctrl, &g_rai_data_collector0_cfg);
    err = RM_RAI_DATA_SHIPPER_Open(&g_rai_data_shipper0_ctrl, &g_rai_data_shipper0_cfg);

    RM_RAI_DATA_COLLECTOR_BufferReset(&g_rai_data_collector0_ctrl);

    err = RM_RAI_DATA_COLLECTOR_ChannelBufferGet(&g_rai_data_collector0_ctrl, 0, (void*)data_x);
    err = RM_RAI_DATA_COLLECTOR_ChannelBufferGet(&g_rai_data_collector0_ctrl, 1, (void*)data_y);
    err = RM_RAI_DATA_COLLECTOR_ChannelBufferGet(&g_rai_data_collector0_ctrl, 2, (void*)data_z);
#endif

    APP_PRINT("Starting data collection loop...\r\n");

    while (true)
    {
      /* Read raw sensor data for debug */
      int16_t raw_acc_x, raw_acc_y, raw_acc_z;
      rslt = BMI270_get_raw_accel(&raw_acc_x, &raw_acc_y, &raw_acc_z);
//      if (rslt == 0) {
//            char buf;
//            sprintf(buf, "Acc Raw: X:%6d Y:%6d Z:%6d\r\n", raw_acc_x, raw_acc_y, raw_acc_z);
//            SEGGER_RTT_WriteString(0, buf);
//      }

      /* Read processed sensor data */
      rslt = BMI270_get_accel_gyro(&acc_x, &acc_y, &acc_z, &gyr_x, &gyr_y, &gyr_z);
      if (rslt == 0) {
            /* Continue to accumulate samples */
            if(count < BUFF_LEN){
                data_x = acc_x;
                data_y = acc_y;
                data_z = acc_z;
                #if DATA_COLLECTION_EN==0
                inputData = acc_x;
                inputData = acc_y;
                inputData = acc_z;
                #endif
                count++;
            }
            else{
                #if DATA_COLLECTION_EN
                err = RM_RAI_DATA_COLLECTOR_ChannelWrite(&g_rai_data_collector0_ctrl, 0, data_x, BUFF_LEN);
                err = RM_RAI_DATA_COLLECTOR_ChannelWrite(&g_rai_data_collector0_ctrl, 1, data_y, BUFF_LEN);
                err = RM_RAI_DATA_COLLECTOR_ChannelWrite(&g_rai_data_collector0_ctrl, 2, data_z, BUFF_LEN);

                rai_data_shipper_write_params_t arg;
                arg.diagnostic_data_len = 0;
                arg.events = g_events;
                arg.p_diagnostic_data = NULL;
                arg.p_sensor_data = &g_callback_args;
                g_dc_callback = false;

                err = RM_RAI_DATA_SHIPPER_Write(&g_rai_data_shipper0_ctrl, &arg);
                g_dc_callback = false;
                #else

                AIC = arm_predict(inputData);

                /* Decode classification event using class names */
                switch(AIC){
                case(arm_no_results):
                  break;
                case(arm_drop):
                  SEGGER_RTT_WriteString(0,
                  RTT_CTRL_TEXT_RED "arm_drop.\r\n");
                  R_BSP_PinWrite(LED1_GREEN, BSP_IO_LEVEL_HIGH);
                  break;
                case(arm_normal):
                  SEGGER_RTT_WriteString(0,
                  RTT_CTRL_TEXT_GREEN "arm_normal.\r\n");
                  break;
                case(arm_shake):
                  SEGGER_RTT_WriteString(0,
                  RTT_CTRL_TEXT_YELLOW "arm_shake.\r\n");
                  break;
                };

                #endif
                  count = 0;
            }
      }
    }
}
```

## AI配置

1、打开AI data tool:

!(https://www.eefocus.com/forum/data/attachment/forum/202603/14/132434vrwr2ponumbpzfou.png)

2、连接串口:
!(https://www.eefocus.com/forum/data/attachment/forum/202603/14/132518bpdfdpci9rrcrrid.png)

3、选择数据存放的地方:
!(https://www.eefocus.com/forum/data/attachment/forum/202603/14/132613imhh3udwuu4uabam.png)

4、数据查看:
!(https://www.eefocus.com/forum/data/attachment/forum/202603/14/132702bt02084ki8z8iv9i.png)

5、设置三个状态:
normal、snake、drop
然后选择Start new capture
依次录制三个状态,然后在数据区域看到有三个文件:
!(https://www.eefocus.com/forum/data/attachment/forum/202603/14/132844h1lex7dihzex22ph.png)

最后选上传数据到服务器。
6、数据训练
!(https://www.eefocus.com/forum/data/attachment/forum/202603/14/132928v2smd7mgg9aemhg7.png)

7、数据训练截图:
!(https://www.eefocus.com/forum/data/attachment/forum/202603/14/132952kgncm6amdmmlcllz.png)

8、生成模型:
!(https://www.eefocus.com/forum/data/attachment/forum/202603/14/133011tu2u3i3i0mxiixm0.png)

9、下载到本地后,将模型解压后替换掉src/rai下的文件:
!(https://www.eefocus.com/forum/data/attachment/forum/202603/14/133107qsxvujs9pl9h4v2v.png)

10、修改识别的宏:
#define DATA\_COLLECTION\_EN       (0)
11、进入debug后,在RTTView中就可以看到识别效果了:
!(https://www.eefocus.com/forum/data/attachment/forum/202603/14/133232abuyhgyoif2xr22r.png)

【总结】
RA的AI生态现在非常好了,有好多网友给出了非常详细的教程。




页: [1]
查看完整版本: 【瑞萨AI挑战赛】部署AI识别