【英飞凌 CY8CKIT-062S2-AI评测】IMU 动作识别
本文介绍了英飞凌 CY8CKIT-062S-AI 开发板结合板载 IMU 传感器收集加速度计数据,并通过机器学习模型预测和推理特定运动,实现动作识别的项目设计。
项目介绍
该项目使用板载 IMU 传感器收集加速度计数据,发送至 ML 模型以检测特定运动,如振动或圆圈等行为;
- 环境搭建:安装相关软件和机器学习工具,用以生成对应的模型代码;
- 工程创建:使用 ModusToolbox 软件快速加载和编译固件及调试;
- 工程代码:给出项目方案落地实现的关键代码,包括流程图等;
- 效果演示:通过串口显示动作行为的概率,推理并给出预测结果。
环境搭建
-
在 CY8CKIT-062S2-AI 设备 官方网站 下载对应的开发工具和 IDE 软件,包括
- ModusToolbox ;
- DEEPCRAFT™ Studio 或 Imagimob ;
-
可通过 ModusToolbox Setup 软件安装相关软件和工具链;
-
使用 ModusToolbox Programmer 软件烧录固件。
工程测试
加载 CY8CKIT-062S-AI 开发板 Demo 工程,演示了部署由 DEEPCRAFT™ Studio 生成的机器学习(ML)模型。

- 代码示例从惯性测量单元(IMU)收集加速度计数据,然后发送给ML模型以检测特定运动,如震动或圆圈。
- 直接使用了 DEEPCRAFT™ Studio 内部生成的 model.c/h 文件。
- 基于运动检测项目的新模型可以直接加入项目。
工程创建
- 进入 Eclipse for ModusToolbox 软件;
- 在 Quick Package 标签界面下选择 Start - New Application;
- 待加载出设备目录后(需要科学上网),在检索框中输入
CY8CKIT-062S2-AI 获取对应设备;
- 勾选 Machine Learning 目录下的
DEEPCRAFT Deploy Model Motion 工程,点击 Create 按钮;

- 待完成 Demo 创建,右键项目,构建工程,确认无报错;
详见:Infineon/mtb-example-ml-deepcraft-deploy-motion .
流程图

工程代码
打开工程目录中的 main.c 文件,代码如下
#include <float.h>
#include <stdbool.h>
#include "cyhal.h"
#include "cybsp.h"
#include "bmi270.h"
#include "cy_retarget_io.h"
/* Model to use */
#include <models/model.h>
/*******************************************************************************
* Macros
*******************************************************************************/
#define BMI270_ADDRESS (BMI2_I2C_PRIM_ADDR)
/* X, Y and Z axes */
#define AXIS_COUNT (3)
/* Total number of sensors - Accelerometer & Gyroscope */
#define SENSOR_COUNT (2)
/* Earth's gravity in m/s^2 */
#define GRAVITY_EARTH (9.80665f)
/* Accelerometer range in G. Must be one of 2, 4, 8, 16 */
#define IMU_ACCEL_RANGE_G (8)
/* Gyro range in degrees per second. Must be one of 125, 250, 500, 1000, 2000 */
#define IMU_GYRO_RANGE_DPS (500)
/* IMU Sample frequency (Hz), must be one of 25, 50, 100, 200, 400 */
#define IMU_FREQ (50)
/* I2C Config */
#define _I2C_TIMEOUT_MS (10U)
#define _READ_WRITE_LEN (46U)
#define _SOFT_RESET_DELAY_US (300)
/*******************************************************************************
* Function Prototypes
*******************************************************************************/
static void init_board(void);
static void halt_error(int code);
static void imu_init(struct bmi2_dev* imu);
static float imu_lsb_to_mps2(int16_t val, float g_range, uint8_t bit_width);
static float imu_lsb_to_dps(int16_t val, float dps, uint8_t bit_width);
static bool imu_read(struct bmi2_dev* imu, float* dest);
static BMI2_INTF_RETURN_TYPE _bmi2_i2c_read(
uint8_t reg_addr,
uint8_t* reg_data,
uint32_t len,
void* intf_ptr);
static BMI2_INTF_RETURN_TYPE _bmi2_i2c_write(
uint8_t reg_addr,
const uint8_t* reg_data,
uint32_t len,
void* intf_ptr);
static void _bmi2_delay_us(uint32_t us, void* intf_ptr);
/*************************************************
* Function Name: main
*************************************************/
int main(void)
{
float data_buffer[SENSOR_COUNT * AXIS_COUNT];
float label_scores[IMAI_DATA_OUT_COUNT];
char *label_text[] = IMAI_DATA_OUT_SYMBOLS;
struct bmi2_dev imu = {0};
cy_rslt_t result;
int16_t best_label;
float max_score;
/* Basic board setup */
init_board();
/* ANSI ESC sequence for clear screen */
printf("\x1b[2J\x1b[;H\x1b[?25l");
/* Initialize model */
result = IMAI_init();
halt_error(result);
/* Initialize IMU sampling */
imu_init(&imu);
for (;;)
{
/* Move cursor home */
printf("\033[H");
printf("DEEPCRAFT IMU Model Example\r\n\n");
/* Read sensor data */
memset(data_buffer, 0, sizeof(data_buffer));
if(!imu_read(&imu, data_buffer))
{
continue;
}
/* Give sensor data to model */
result = IMAI_enqueue(data_buffer);
halt_error(result);
/* Check if there is any model output */
best_label = 0;
max_score = -1000.0f;
switch(IMAI_dequeue(label_scores))
{
case IMAI_RET_SUCCESS: /* We have data, display it */
for(int i = 0; i < IMAI_DATA_OUT_COUNT; i++)
{
printf("label: %-10s: score: %f\r\n", label_text[i], label_scores[i]);
if (label_scores[i] > max_score)
{
max_score = label_scores[i];
best_label = i;
}
}
printf("\r\n");
printf("Output: %-30s\r\n", label_text[best_label]);
break;
case IMAI_RET_NODATA: /* No new output, continue with sampling */
break;
case IMAI_RET_ERROR: /* Abort on error */
halt_error(IMAI_RET_ERROR);
break;
}
}
}
保存代码。
固件上传
- 连接开发板和电脑,点击菜单栏的运行按钮,完成固件上传;
- 或使用
ModusToolbox Programmer 工具烧录固件

- 加载固件,配置烧录器、开发板型号;
- 点击 Program 即可。
效果
- 运行
Tera Term 软件,连接设备串口,配置波特率为 115200;
- 短按板载 RESET 键,终端显示 IMU 例程,并进行动作推理;

- 使开发板做摆动、绕圈等运动,开发板可根据 IMU 数据识别出相应的行为动作;

总结
本文介绍了英飞凌 CY8CKIT-062S-AI 开发板结合板载 IMU 传感器收集加速度计数据,并通过机器学习模型预测和推理特定运动,实现动作识别的项目设计,为相关产品在边缘 AI 领域的快速开发和设计应用提供了参考。