概述

CyberryPotter ElectromagicWand 是一款基于 STM32F103C8T6 微控制器的嵌入式手势识别系统。它使用MPU6050惯性测量单元 (IMU) 来捕获运动数据,使用嵌入式机器学习库通过卷积神经网络 (CNN) 对其进行处理,并识别 12 种不同的手势模式(称为“咒语”)以触发相应的作,例如控制 LED。nnom

系统架构

CyberryPotter ElectromagicWand 由三个主要组件组成:硬件、固件和 PC 软件工具,它们协同工作以实现手势识别和响应。

硬件组件

硬件平台包括:

  1. STM32F103C8T6 微控制器:运行固件、处理传感器数据和执行 CNN 模型的核心处理器
  2. MPU6050 IMU 传感器:捕获加速度和陀螺仪数据的 6 轴运动跟踪设备
  3. 按钮:用于启动手势录制和系统模式控制的用户输入
  4. LED 指示灯:5 个 LED,根据识别的手势提供视觉反馈
  5. UART/串行接口:与 PC 通信以进行数据收集和调试

固件组件

固件架构分为几个核心模块:

  1. main.c:包含初始化例程和主程序循环的入口点
  2. CyberryPotter.c:实现手势识别逻辑和系统状态管理
  3. IMU.c:处理与 MPU6050 传感器的通信并处理原始运动数据
  4. hardware.c:提供用于控制 LED、按钮和其他外围设备的硬件抽象
  5. CNN 模型:使用 nnom 库实现的手势识别神经网络
  6. config.h:配置设置,包括数据收集和推理之间的系统模式选择

PC 软件工具

该项目包括用于机器学习管道的 Python 工具:

  1. Serial_Read.py:收集并保存从微控制器传输的运动数据
  2. CNNTrainRaw.py:处理收集的数据并训练 CNN 模型
  3. CNNTestSerialRaw.py:使用来自设备的实时数据测试模型性能

数据流

系统的数据流根据作模式(数据收集或推理)而变化,该模式由 config.h 中的标志控制。SYSTEM_MODE_DATA_COLLECT

数据收集模式

当 在 config.h 中定义时:SYSTEM_MODE_DATA_COLLECT

  1. 该按钮触发从 MPU6050 传感器收集数据
  2. 原始传感器数据(100Hz 采样率)通过 UART 传输到连接的 PC
  3. Serial_Read.py 捕获并保存此数据以进行训练
  4. CNNTrainRaw.py 处理收集的样本并训练 CNN 模型
  5. 训练后的模型被转换为 weights.h 以进行嵌入式部署

推理模式

When 未定义:SYSTEM_MODE_DATA_COLLECT

  1. 按下按钮会从MPU6050启动手势捕获
  2. 运动数据经过预处理并馈送到板载 CNN 模型中
  3. 模型执行推理以对手势进行分类
  4. 如果识别置信度超过阈值,则触发相应的作
  5. LED 指示灯根据识别的手势提供视觉反馈

系统作模式

该系统实现了一个状态机来管理不同的作模式和用户交互。

主要状态包括:

  1. SYSTEM_IDLE:等待用户输入的默认状态
  2. SYSTEM_RECORD:按住按钮时激活,捕获运动数据
  3. SYSTEM_TRANSMIT:在数据收集模式下,将记录的数据发送到 PC

按钮按住持续时间确定状态之间的转换,允许用户控制系统作。

CNN 模型架构

手势识别由使用 nnom 库实现的卷积神经网络提供支持,该库针对资源受限的微控制器进行了优化。

CNN 架构包括:

  1. 输入层:150×3 矩阵(150 个 3 轴陀螺仪数据样本,100Hz)
  2. 两个 Conv1D 层:用于使用 ReLU 激活进行特征提取
  3. MaxPooling Layer:用于降维
  4. 展平图层:将特征转换为 1D 矢量
  5. 密集层:13 个输出单元(12 个手势 + 未知)
  6. Dropout:用于正则化
  7. Softmax:输出类概率

该模型在 PC 上使用收集的手势数据进行训练,然后使用 nnom 工具进行量化并转换为 C 代码以进行嵌入式部署。

开发工作流程

该项目实现了从数据收集到模型部署的完整机器学习管道。

此工作流支持迭代改进:

  1. 首先收集不同手势的训练数据
  2. 使用收集的数据训练模型
  3. 将经过训练的模型部署到微控制器
  4. 如果需要,通过收集更多数据进行测试和优化

已识别的手势

该系统可以识别 12 种不同的手势模式(“咒语”)。每个手势都映射到特定的 LED 控制作。存储库包括 CNN/SpellsCard 目录中用于练习这些手势的参考卡。

技术规格

元件 规范
微控制器 STM32F103C8T6 (ARM Cortex-M3, 72MHz)
IMU 传感器 MPU6050(3 轴加速度计和陀螺仪)
ML 框架 NNOM 嵌入式神经网络库
采样率 100 赫兹
手势持续时间 ~1.5 秒(150 个样品)
可识别的手势 12 种不同的模式(“法术”)
开发环境 带有 ARM 编译器 6.22 的 Keil MDK 5

总结

CyberryPotter ElectromagicWand 项目演示了用于手势识别的嵌入式机器学习的实际实现。其模块化架构、完整的 ML 管道和双模式作为开发手势控制系统提供了基础。该项目说明了资源受限的微控制器如何为实时交互应用高效运行神经网络推理。

系统架构

本文档详细概述了 CyberryPotter ElectromagicWand 系统架构,解释了核心组件及其交互。该架构旨在使用 MPU6050 IMU 传感器和通过 nnom 库实现的 CNN 模型在 STM32F103C8T6 微控制器上实现手势识别。

1. 系统概述

CyberryPotter ElectromagicWand 是一种手势识别系统,可以检测 12 种不同的手势(“咒语”)并触发相应的动作,例如控制 LED。该系统以两种主要模式运行:

  1. 数据收集模式:从 IMU 捕获运动数据以训练 CNN 模型
  2. 推理模式:实时处理运动数据以识别手势并触发动作

系统组件摘要:

元件 目的 实现
STM32F103C8T6 主微控制器 硬件
MPU6050 惯性测量单元 硬件
按钮 用户输入 硬件
发光二极管 输出指示器 硬件
UART 接口 与 PC 通信 硬件/固件
CNN 模型 手势识别 nnom 库

. 硬件架构

硬件架构由以下组件组成:

  1. STM32F103C8T6:处理数据并运行 CNN 模型的主微控制器
  2. MPU6050:捕获运动数据的 6 轴 IMU(加速度计和陀螺仪)
  3. 按钮:用于控制系统状态和启动手势录制
  4. LED:系统状态和手势识别结果的视觉指示器
  5. UART/串行接口:支持与 PC 通信以进行数据收集和模型训练

2.1 硬件连接图


3. 软件架构

软件架构由几个集成模块组成,这些模块处理系统功能的不同方面:

3.1 核心模块

模块 文件 目的
主要应用 main.c 系统初始化、主循环、CNN 模型交互
CyberryPotter 用户/CyberryPotter.c 系统状态管理、按钮控制、LED 反馈
硬件接口 STM32_Hardware/hardware.c 硬件初始化和低级控制
IMU 数据采集 用户/IMU.c 捕获和处理来自 MPU6050 的运动数据
CNN 模型 nnom 库 使用卷积神经网络进行手势识别

3.3 数据采集模式架构

在数据收集模式下,系统从 MPU6050 IMU 捕获运动数据,并通过 UART 将其传输到 PC 以训练 CNN 模型。

3.4 推理模式架构

在推理模式下,系统捕获运动数据,通过 CNN 模型进行处理,并根据识别出的手势触发相应的动作。

4. 数据流架构

系统通过从采集到作执行的几个阶段处理数据:

4.1 数据采集和处理流程


4.2 按钮处理流程

5. CNN 模型架构

CNN 模型是使用 nnom 库实现的,该库支持在资源受限的微控制器上高效执行神经网络。

5.1 模型结构

5.2 输入和输出格式

输入格式:
  • 输入数据由 150 个 3 轴陀螺仪数据样本组成
  • 根据 function 中的公式对数据进行缩放model_feed_data()
  • 输入被量化为 int8_t 格式,以便在微控制器上高效执行
输出格式:
  • 输出是一个 13 元素数组,表示不同手势的概率
  • 这 13 个类包括 12 个已识别的手势和 1 个“NoMotion”类
  • 输出被量化,需要除以 127.0 才能得到百分比值
  • 如果手势的概率超过 OUPUT_THRESHOLD 值,则识别手势
识别的手势:
指数 手势名称 行动
0 RightAngle (右角) 打开 PA6 上的 LED
1 锐角 关闭 PA6 上的 LED
2 闪电 打开 PA5 上的 LED
3 三角形 关闭 PA5 上的 LED
4 Letter_h 打开 PA4 上的 LED 指示灯
5 letter_R 关闭 PA4 上的 LED
6 letter_W 打开 PA3 上的 LED
7 letter_phi 关闭 PA3 上的 LED
8 无特定作
9 UpAndDown 无特定作
10 无特定作
11 无特定作
12 无运动 被视为未识别
-1 未知 无作(未达到阈值)

6. 系统模式和状态管理

该系统使用状态机方法来管理不同的作模式和状态:

6.1 系统模式


6.2 按钮状态

7. 开发和培训工作流程

该系统支持从数据收集到模型部署的完整开发工作流程:

这种全面的架构使 CyberryPotter ElectromagicWand 能够在资源受限的微控制器上有效地实时识别手势,通过基于用户魔杖运动的 LED 反馈为用户提供交互式体验。

项目结构

本页记录了 CyberryPotter ElectromagicWand 代码库的组织和结构。它解释了目录布局、关键文件以及项目中不同组件的组织方式。

目录结构

CyberryPotter ElectromagicWand 项目被组织成一个模块化结构,将系统的不同功能方面分开。这种组织方式有助于维护,并将硬件接口、核心应用程序逻辑和机器学习组件之间的关注点分开。

目录说明:

目录 目的
用户/ 包含核心应用程序代码,包括主要的 CyberryPotter 实现和 IMU 数据处理
STM32_Hardware/ 包含用于与物理组件接口的硬件抽象层代码
STM32_Hardware/eMPL/ 包含适用于 MPU6050 接口的 InvenSense 运动处理库
CNN / 包含用于训练和测试的神经网络模型文件和 Python 工具
CNN/nnom_lib/ NNoM (Neural Network on Microcontroller) 库实现
RTE/ STM32 微控制器的运行时环境文件

关键文件概述

该项目由多个文件组成,这些文件按功能组织。下图显示了主要文件及其关系:

核心应用程序文件

核心应用程序逻辑驻留在目录中,由以下密钥文件组成:User/

文件 描述
main.c 初始化组件并包含主应用程序循环的应用程序入口点
config.h 配置标志,包括用于在数据收集和推理模式之间切换的标志SYSTEM_MODE_DATA_COLLECT
CyberryPotter.c/.h 核心手势识别实现和系统状态管理
CyberryPotter_status.h 系统状态和状态代码的定义
IMU.c/.h 处理神经网络的 IMU 数据采集、预处理和格式化
Delay .c/.h Time delay 实用函数

这种模块化方法将核心应用程序逻辑与特定于硬件的代码分开,从而实现更好的可维护性和对其他平台的潜在可移植性。

硬件接口文件

硬件抽象层包含在目录中,为物理组件提供接口:STM32_Hardware/

文件 描述
硬件.c/.h 硬件初始化、LED 控制、按钮处理和 UART 通信
IIC.c/.h 用于传感器接口的 I2C 通信协议实现
MPU6050.c/.h MPU6050 IMU 传感器的驱动程序
MPU6050_Reg.h 注册 MPU6050 的定义
eMPL/* 文件 用于增强 MPU6050 功能的 InvenSense 运动处理库
硬件层将物理组件从应用程序逻辑中抽象出来,为与 LED、按钮和传感器交互提供干净的接口。

神经网络实现

神经网络实现组织在目录中:CNN/

神经网络实现的关键组件:

元件 描述
weights.h 包含 Python 训练脚本生成的训练模型权重
nnom_lib/包括/ 定义用于神经网络作的 NNoM API 的头文件
nnom_lib/src/core/ 核心神经网络功能(模型创建、执行等)
nnom_lib/src/layers/ 各种神经网络层(Conv1D、Density 等)的实现
nnom_lib/src/backends/ 用于神经网络作的后端计算函数

神经网络是使用 NNoM 库实现的,该库提供了一种在资源受限的微控制器上运行机器学习模型的有效方法。

Python 工具

该项目包括多个用于数据收集、模型训练和测试的 Python 工具:

工具 描述
Serial_Read.py 在数据收集模式下从设备收集原始 IMU 数据
CNNTrainRaw.py 使用收集的数据训练 CNN 模型并生成 weights.h 文件
CNNTestSerialRaw.py 使用与设备的串行端口连接测试模型

这些工具实现了从数据收集到模型部署的开发工作流程:

  1. 通过在 config.h 中启用来配置设备以进行数据收集SYSTEM_MODE_DATA_COLLECT
  2. 使用 Serial_Read.py 收集手势数据
  3. 使用 CNNTrainRaw.py 训练模型
  4. 将生成的 weights.h 文件部署到设备
  5. 使用 CNNTestSerialRaw.py 测试模型

构建系统

该项目使用 Keil MDK(微控制器开发套件)作为开发环境。构建配置在文件中定义,该文件指定:CyberryPotter.uvprojx

  • 目标设备 (STM32F103C8)
  • 编译器设置
  • 包含路径
  • 源文件
  • 依赖

该项目需要以下外部包:

版本 目的
CMSIS 6.0.0 内核 ARM Cortex-M 支持
CMSIS 编译器 2.1.0 编译器支持
STM32F1xx_DFP 2.4.1 STM32F1 系列的设备支持

文件依赖关系图

下图说明了项目中的关键文件依赖项,显示了不同组件的交互方式:

模式配置

项目可以在两种主要模式下运行,由 config.h 中的标志控制:SYSTEM_MODE_DATA_COLLECT

模式 描述
数据收集模式 定义后,设备会捕获并传输原始 IMU 数据以进行模型训练SYSTEM_MODE_DATA_COLLECT
推理模式 当注释掉时,设备使用经过训练的模型来识别手势SYSTEM_MODE_DATA_COLLECT
这种双模式设计允许使用相同的硬件来收集训练数据和用于现实世界的手势识别应用。

构建和开发工作流程

该项目的典型开发工作流程包括:

  1. 设置开发环境(Keil MDK 和 Python 环境)
  2. 在数据收集模式下构建和刷写固件
  3. 使用 Serial_Read.py 收集手势数据
  4. 使用 CNNTrainRaw.py 训练 CNN 模型
  5. 将生成的 weights.h 文件集成到项目中
  6. 在推理模式下构建和刷写固件
  7. 测试手势识别功能

此迭代过程允许通过收集更多数据并重新训练模型来提高手势识别准确性。

硬件设置

目的和范围

本文档概述了 CyberryPotter ElectromagicWand 项目所需的硬件组件,并提供了有关如何正确连接它们的说明。它涵盖了在进行固件安装之前构建手势识别棒所需的所有物理组件。

组件列表

CyberryPotter ElectromagicWand 需要以下硬件组件:

元件 规范 目的
STM32F103C8T6 最小系统板 主微控制器
MPU6050 3 轴陀螺仪 + 3 轴加速度计 运动感应
按钮 标准瞬时开关 系统控制
发光二极管 5 个 LED,带 1K-10K 欧姆电阻 视觉反馈
串行转换器 CH340 或类似的 USB 转 TTL 模块 编程和数据收集
注意:建议使用 LED 的限流电阻器 (1K-10K ohm) 以保护您的眼睛免受过亮的影响。

硬件架构

下图显示了 ElectromagicWand 系统的整体硬件架构:


接线图

下图显示了基于参考原理图的所有元件之间的连接:


带 MPU6050 的 I2C 接口

MPU6050惯性测量单元是 ElectromagicWand 的主传感器。它使用 I2C 协议与 STM32 微控制器通信。


MPU6050 提供 6 轴运动传感,带有 3 轴加速度计和 3 轴陀螺仪数据。这些原始运动数据由固件通过 I2C 接口读取,并在模块中进行处理,然后馈送到神经网络进行手势识别。 IMU.c

按钮和 LED 连接

按钮和 LED 连接到 STM32 上的 GPIO 引脚:

该按钮在系统中具有多种功能:

  • 短按:开始/停止捕获运动数据
  • 长按:在不同系统模式之间切换

这 5 个 LED 指示灯为以下各项提供视觉反馈:

  • 系统状态(电源、就绪、录制)
  • 识别的手势(拼写)
  • 当前运行模式

电源要求

STM32F103C8T6最小系统主板可以通过以下方式供电:

  1. 通过串行模块进行 USB 连接 (5V)
  2. 外部电源 (3.3V 至 5V)

该系统功耗极低,在开发 (数据收集) 和正常作 (手势识别) 期间都可以通过 USB 端口进行作。

系统作中的硬件

硬件组件的使用方式因系统的运行模式而异:

数据收集模式

在此模式下(通过在 config.h 中设置启用):SYSTEM_MODE_DATA_COLLECT

  1. 按住按钮时,MPU6050 会捕获运动数据
  2. STM32 通过串行接口将原始传感器数据传输到计算机
  3. LED 指示录制状态
  4. 收集的数据用于在计算机上训练 CNN 模型

推理模式

在正常作 (默认模式) 中:

  1. 按住按钮时,MPU6050 会捕获运动数据
  2. STM32 通过嵌入式 CNN 模型处理数据
  3. 识别到手势时,将激活相应的 LED 模式
  4. 除调试外,不需要串行通信

硬件和手势识别管道

下图说明了硬件组件如何与手势识别管道集成:


此管道显示物理MPU6050传感器数据如何流经固件模块,以最终根据识别的手势控制 LED 输出。

结论

CyberryPotter ElectromagicWand 的硬件设置由现成的组件组成,这些组件可以轻松连接到 STM32F103C8T6 微控制器。按照本文档中的连接图,您可以组装魔杖所需的硬件。

组件列表

目的和范围

本文档提供了构建 CyberryPotter ElectromagicWand 项目所需的所有硬件组件的全面清单。它包括详细的规格、推荐的型号以及系统内每个组件的用途。

所需硬件组件

CyberryPotter ElectromagicWand 项目需要以下核心硬件组件:

元件 数量 描述 系统中的用途
STM32F103C8T6开发板 1 ARM Cortex-M3 MCU,最大频率为 72MHz,64KB 闪存,20KB SRAM 运行手势识别算法的主处理单元
MPU6050模块 1 6 轴运动跟踪装置(3 轴陀螺仪 + 3 轴加速度计) 捕获运动数据以进行手势识别
按钮 1 瞬时轻触开关 用于控制系统模式的用户输入
发光二极管 5 标准 LED(任何颜色) 系统状态和已识别手势的视觉反馈
限流电阻器 5 1K-10K 欧姆电阻器 保护 LED 并限制亮度
USB 转 TTL 串行转换器 1 CH340 或类似产品 MCU 和 PC 之间的数据传输(用于训练数据收集)
连接电线 各种 跳线 将组件连接在一起
电源 1 5V 电源(USB 或电池) 为系统供电

组件规格和要求

STM32F103C8T6 微控制器

STM32F103C8T6 是运行手势识别算法并控制所有系统功能的中央处理单元。

规格:

  • ARM 32 位 Cortex-M3 CPU
  • 最大频率 72 MHz
  • 64 KB 闪存
  • 20 KB SRAM
  • 工作电压:2.0V 至 3.6V
  • I2C 接口(用于 MPU6050 通信)
  • GPIO 端口(用于 LED 和按钮)
  • UART 接口(用于 PC 通信)

建议的外形尺寸:“Blue Pill” 最小系统开发板

MPU6050惯性测量单元

MPU6050 是一种 6 轴运动跟踪设备,可捕获手势识别所需的运动数据。

规格:

  • 3 轴陀螺仪
  • 3 轴加速度计
  • 数字运动处理器 (DMP)
  • 用于通信的 I2C 接口
  • 工作电压:3.3V
  • 每个通道 16 位模数转换
  • 可编程数字滤波器
  • 陀螺仪范围:±250、±500、±1000 和 ±2000°/秒
  • 加速度计范围:±2g、±4g、±8g 和 ±16g

模块连接:

  • VCC:3.3V 电源
  • GND:接地
  • SCL:I2C 时钟线(连接到 STM32 I2C1_SCL)
  • SDA:I2C 数据线(连接到 STM32 I2C1_SDA)
  • INT:中断引脚(可选)

按钮

用户输入使用简单的瞬时触摸开关来控制系统的运行模式。

规格:

  • 标准触摸按钮开关
  • 2 或 4 个引脚(如果 4 个引脚,则连接了相反的对)
  • 常开 (NO) 型
  • 工作电压:兼容 3.3V 逻辑

功能性:

  • 短按:触发手势识别
  • 长按:更改系统模式(例如,在数据收集和推理之间)

LED 和限流电阻器

5 个 LED 用于提供有关系统状态和已识别手势的视觉反馈。

规格:

  • 标准 3mm 或 5mm LED(任何颜色)
  • 正向电压:通常为 1.8V-3.3V(取决于颜色)
  • 正向电流:最大 20mA
  • 限流电阻:1K-10K 欧姆(推荐用于眼睛安全)

LED 功能:

  • 电源/状态指示灯
  • 模式指示器 (数据收集/推理)
  • 手势识别指示器

电阻计算:电阻值 = (电源电压 - LED 正向电压) / 所需电流

对于 3.3V 电源、2V 正向电压和 5mA 电流: 电阻值 = (3.3V - 2V) / 0.005A = 260 欧姆(使用 270 或 330 欧姆标准值)

USB 转 TTL 串行转换器

在训练数据收集和模型部署期间,微控制器和 PC 之间的数据传输需要此模块。

规格:

  • CH340、CP2102、FTDI 或类似芯片
  • 用于 PC 连接的 USB 接口
  • 用于微控制器连接的 TTL 串行接口 (TX/RX)
  • 3.3V/5V 逻辑电平兼容性
  • 波特率支持高达 115200 bps

连接:

  • VCC:通常不连接(STM32 单独供电)
  • GND:连接到 STM32 GND
  • TX:连接到 STM32 RX 引脚
  • RX:连接到 STM32 TX 引脚

硬件-软件接口映射

下图说明了硬件组件如何映射到固件中的相应软件模块:

引脚分配和硬件要求

下表详细介绍了将外设连接到 STM32F103C8T6 微控制器的特定引脚分配:

外设 STM32 引脚 功能 笔记
MPU6050 - SCL PB6 I2C1_SCL I2C 时钟线
MPU6050 - SDA PB7 I2C1_SDA I2C 数据线
按钮 PB5 系列 GPIO 输入 带上拉电阻
搭载了 1 个 PB12 GPIO 输出 状态指示灯
搭载 LED 2 PB13 GPIO 输出 手势指示器
搭载 LED 3 PB14 GPIO 输出 手势指示器
搭载了 4 个 PB15 GPIO 输出 手势指示器
搭载 LED 5 PA8 系列 GPIO 输出 手势指示器
UART 发送器 PA9 系列 USART1_TX 至 USB-TTL RX
UART 接收机 PA10 系列 USART1_RX 至 USB-TTL TX

注意: pin 分配可能因特定的 implementation preferences 而异。上表显示了与工程原理图参考一致的典型配置。

电源注意事项

整个系统可以通过多种方法供电:

  1. USB 电源:通过 STM32 的 USB 端口或 USB-TTL 转换器
  2. 外部电源:STM32 VIN 引脚的 5V DC 输入
  3. 电池电源:用于便携式作(建议使用带稳压器的 3.7V LiPo)

功耗约为:

  • 正常运行时为 50-100mA
  • 在与 PC 主动通信期间高达 150mA

建议对 LED 使用限流电阻器 (1K-10K ohm),以降低功耗并保护 LED 免受损坏。

组件系统集成

下图说明了组件如何集成到整个系统体系结构中:

组件选择建议

在为此项目选择组件时,请考虑以下建议:

  1. STM32F103C8T6:“Blue Pill”开发板是最具成本效益的选择,具有足够的处理能力和内存,可用于此应用。

  2. MPU6050模块:标准 GY-521 分线板随时可用且运行良好。确保它包括用于 I2C 线路的上拉电阻器。

  3. 按钮:任何瞬时触觉开关都可以工作。如果按钮将是经常使用的设备,请考虑按钮质量以获得更好的用户体验。

  4. LED:为了获得更好的能见度,请考虑使用漫射 LED。可以使用不同的颜色来表示不同的手势或状态。

  5. USB-TTL 转换器: 基于 CH340 的转换器价格低廉且运行良好。基于 FTDI 的转换器更可靠,但成本更高。

  6. 电阻器:标准 1/4W 电阻器就足够了。建议将 1K 至 10K 欧姆值用于 LED 电流限制。

  7. 可选组件

    • 最终设备的外壳或外壳
    • 用于便携式作的电池和充电电路
    • 接头或连接器,便于组装/拆卸

结论

此组件列表提供了构建功能性 CyberryPotter ElectromagicWand 所需的所有硬件。该系统旨在使用常用且价格合理的组件构建,使其可用于教育目的和进一步开发。

接线图

本页提供了连接 CyberryPotter ElectromagicWand 项目所需的硬件组件的详细说明。它包括引脚映射、连接图和确保系统正常运行的重要注意事项。

概述

CyberryPotter ElectromagicWand 硬件设置包括:

  • STM32F103C8T6 微控制器(Blue Pill 板)
  • MPU6050 IMU 传感器
  • 用于输入控制的按钮
  • 5 个 LED 指示灯,提供视觉反馈
  • 用于数据收集和编程的 UART/串行连接

引脚映射表

下表提供了所有组件的全面引脚映射:

STM32 引脚 元件 零部件引脚 功能
PA0 系列 按钮 信号 用户输入
PA3 搭载 LED1 阳极 指示灯
聚四氟乙烯 LED2 阳极 指示灯
PA5 系列 LED3 阳极 指示灯
PA6 LED4 指示灯 阳极 指示灯
PA7 系列 LED5 指示灯 阳极 指示灯
PA9 系列 USB-TTL 端口 接收 UART 发送器
PA10 系列 USB-TTL 端口 TX 系列 UART 接收机
PB6 MPU6050 标准及校正实验所 I2C 时钟
PB7 MPU6050 SDA I2C 数据
PB5 系列 MPU6050 INT 系列 中断
3.3V MPU6050 VCC 权力
接地 MPU6050 接地
接地 发光二极管 阴极 接地(通过电阻器)
接地 按钮 接地
5V/3.3V 按钮 VCC 上拉电源

主要连接图

MPU6050 连接详细信息

MPU6050通过 I2C 接口连接到 STM32,并带有一个用于数据采集定时的附加中断引脚。

MPU6050 中断配置

MPU6050配置为在 GPIOB 引脚 5 上生成中断,从而触发数据采集。中断在硬件初始化中配置为下降沿触发器。

EXTI_InitStruct.EXTI_Line = EXTI_Line5;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_Init(&EXTI_InitStruct);

按钮连接详细信息

该按钮连接到 GPIOA 引脚 0 并配置了一个内部上拉电阻器,这意味着当按钮未按下时,引脚读数为 HIGH,按下时引脚读数为 LOW。

按钮配置

该按钮配置了以下特征:

  • 连接到 GPIOA 引脚 0
  • 配置内部上拉电阻器 (GPIO_Mode_IPU)
  • EXTI 中断配置为上升沿和下降沿
  • 用于系统模式控制和手势录制

LED 连接详细信息

5 个 LED 连接到 GPIOA 引脚 3-7,每个引脚都有一个推荐的限流电阻器 (1K-10K Ohm)。

UART 连接详细信息

UART 连接用于编程、调试和数据收集。它连接到 USB-TTL 转换器(如 CH340)。

UART 配置

UART 配置了以下参数:

  • 引脚 PA9 (TX) 和 PA10 (RX) 上的 USART1
  • 配置文件中定义的波特率(默认值通常为 115200)
  • 8 个数据位,无奇偶校验,1 个停止位
  • 无硬件流控制

系统连接图

下图显示了完整的系统连接,包括数据流和外围设备交互:

实施说明

  1. LED 限流:始终对 LED 使用限流电阻器 (1K-10K Ohm) 来保护 LED 和微控制器引脚。

  2. 电源:系统可通过以下方式供电:

    • 通过 USB-TTL 转换器的 USB
    • STM32F103C8T6板上的 5V 引脚
    • 3.3V 引脚可降低功耗
  3. MPU6050地址:MPU6050的 I2C 地址默认为 0x68。如果 AD0 引脚连接到 VCC,则地址变为 0x69。在这个项目中,AD0 连接到 GND 以使用默认地址。

  4. 按钮去抖动:按钮去抖动由软件中的按钮状态处理程序处理用户/CyberryPotter.c77-128

  5. 中断优先级:系统对不同的组件使用不同的中断优先级:

    • 按钮 (EXTI0):优先级 3,子优先级 3
    • MPU6050 (EXTI5):优先级 6,子优先级 6
    • UART (USART1):优先级 1,子优先级 1
    • 定时器 (TIM4):优先级 4,子优先级 4

固件

概述

CyberryPotter ElectromagicWand 项目的固件组件负责控制硬件、处理传感器数据、运行神经网络以进行手势识别以及管理系统的运行状态。该固件在 STM32F103C8T6 微控制器上运行,并与 MPU6050 IMU 传感器连接以捕获运动数据,然后对其进行处理以识别特定的手势模式。

固件架构

固件分为几个关键模块,每个模块负责系统内的特定功能。

核心组件

固件由几个相互作用的组件组成,每个组件都有特定的职责:

元件 文件 主要职责
主要应用 main.c 程序入口点、主循环、模型推理、LED 输出
系统控制 CyberryPotter.c 按钮处理、系统状态管理、LED 控制
IMU 接口 IMU.c 传感器数据采集、处理和格式化
硬件接口 硬件.c 外设初始化,低级硬件控制
配置 config.h 系统范围的设置和常量
神经网络 weights.h (生成) CNN 模型定义和权重

作模式

固件以两种主要模式运行,由 config.h 中的配置标志控制: SYSTEM_MODE_DATA_COLLECT

数据收集模式

在此模式下,按住按钮时,系统会从 IMU 捕获运动数据,并通过串行将原始数据发送到连接的计算机进行模型训练。

  • 通过在 config.h 中定义来启用SYSTEM_MODE_DATA_COLLECT
  • 数据收集在 and 数组中IMU_Data_mGyroIMU_Data_mAcc
  • 采样完成后,数据通过 UART 传输,使用IMU_Data_Print()

推理模式

在该模式下,系统捕获运动数据,通过 CNN 模型进行处理,并根据识别的手势触发相应的 LED 输出。

  • 未定义时激活SYSTEM_MODE_DATA_COLLECT
  • 捕获的数据使用model_feed_data()
  • 模型推理是通过model_run()
  • 处理输出并在model_get_output()
  • 相应的 LED 模式由Model_LED()

IMU 数据采集

IMU 数据采集过程负责从 MPU6050 传感器收集运动数据。它是通过基于计时器和中断的采样的组合来实现的。

取样过程


关键数据结构

IMU 数据存储在两个主要数组中:

  • IMU_Data_mGyro[IMU_SEQUENCE_LENGTH_MAX][3]:存储陀螺仪数据(角速度)
  • IMU_Data_mAcc[IMU_SEQUENCE_LENGTH_MAX][3]:存储加速度计数据

这些数组的常量在 config.h 中定义:

  • IMU_SEQUENCE_LENGTH_MAX:150 个样本
  • IMU_SAMPLING_TIME_MS: 1500 毫秒
  • IMU_SAMPLING_DELAY_MS:计算方式IMU_SAMPLING_TIME_MS/IMU_SEQUENCE_LENGTH_MAX

神经网络集成

该固件集成了 nnom 库,以运行卷积神经网络模型进行手势识别。

CNN 模型初始化

模型在 main 函数中初始化:


推理管道

捕获手势时,将执行以下推理管道:

手势映射

系统可识别 12 种不同的手势以及“无法识别”的状态。每个识别的手势都可以触发特定的 LED 输出。

模型输出 手势名称 LED 动作
-1 未知 无作
0 RightAngle (右角) 设置 GPIO_Pin_6
1 锐角 重置GPIO_Pin_6
2 闪电 设置 GPIO_Pin_5
3 三角形 重置 GPIO_Pin_5
4 Letter_h 设置 GPIO_Pin_4
5 letter_R 重置GPIO_Pin_4
6 letter_W 设置 GPIO_Pin_3
7 letter_phi 重置GPIO_Pin_3
8 无特定的 LED 动作
9 UpAndDown 无特定的 LED 动作
10 无特定的 LED 动作
11 无特定的 LED 动作
12 无运动 被视为未识别

系统控制

系统控制逻辑通过按钮、系统状态和 LED 反馈管理用户输入。

按钮处理


系统状态机

系统保持不同的运行状态,这些状态可以通过长按按钮来循环:

LED 反馈

该系统通过 LED 模式提供视觉反馈:

  • LED_ALWAYS_ON:连续 LED 照明
  • LED_5HZ:5Hz 闪烁(100ms 开,100ms 关)
  • LED_10HZ:10Hz 闪烁(50ms 开,50ms 关)
  • LED_IDLE:自定义模式(200ms 开,500ms 关,300ms 开)

配置设置

固件行为通过以下中的配置设置进行控制:config.h

系统模式

  • CYBERRY_POTTER_MODE_NORMAL:正常运行模式
  • CYBERRY_POTTER_MODE_DATA_COLLECTOR:数据收集模式
  • SYSTEM_MODE_DATA_COLLECT:定义后,启用通过串行收集数据

IMU 设置

  • IMU_SEQUENCE_LENGTH_MAX:每个手势 150 个样本
  • IMU_SAMPLING_TIME_MS:1500 毫秒用于完整手势捕获
  • IMU_ACC_TRANS_CONSTANT: 8192.0 (加速度计数据的比例因子)
  • IMU_GYRO_TRANS_RADIAN_CONSTANT: 8192.0 (陀螺仪数据的比例因子)

神经网络设置

  • OUPUT_THRESHOLD: 103 (手势识别的最低置信度阈值)

构建和部署注意事项

构建固件时,请考虑以下事项:

  1. 模式选择 () 确定系统是捕获数据进行训练还是执行手势识别。SYSTEM_MODE_DATA_COLLECT

  2. 如果在推理模式下使用系统,请确保文件(从训练过程生成)包含在项目中。weights.h

  3. 定义时,将使用静态内存分配来优化系统的内存使用情况。NNOM_USING_STATIC_MEMORY

  4. 串口通讯波特率默认设置为 921600,需要兼容的串口终端。

主要应用

本页介绍了 CyberryPotter ElectromagicWand 项目的主要应用程序流程、系统初始化和手势识别管道。它介绍了如何在固件中实现核心功能,重点介绍初始化硬件组件、处理 IMU 传感器数据以及使用 CNN 模型执行手势识别的程序结构。

系统概述

主应用程序用作 ElectromagicWand 系统的中央控制点,协调硬件组件、处理用户输入、收集运动数据和识别手势。


系统初始化

系统初始化过程会准备所有硬件组件并设置系统的初始状态。

系统初始化按以下顺序进行:

  1. System_Init()main()
  2. Hardware_Init()调用 from 配置外围组件:System_Init()
    • 支持中断的按钮输入
    • 按钮去抖动计时器
    • UART 通信
    • LED 输出
    • 支持中断的 IMU (MPU6050)
  3. 初始系统状态已配置:
    • 按钮状态设置为BUTTON_IDLE
    • Serial status (串行状态) 设置为Serial_Idle
    • IMU 状态设置为IMU_Idle
    • LED 状态设置为LED_ALWAYS_ON
    • 系统模式设置为SYSTEM_TRANSMIT

主程序流程

主程序流在函数中实现为无限循环,该函数持续检查系统状态并触发适当的作。main()

主循环执行以下作:

  1. 检查按钮状态:

    • 如果按住 按钮且 IMU 处于空闲状态,则开始对 IMU 数据进行采样
    • 如果需要,重置按钮状态
  2. 检查 IMU 状态:

    • 如果 IMU 已完成采样 ():IMU_Sampled
      • 打开 LED 指示活动
      • 在数据采集模式下:打印 IMU 数据以进行外部采集
      • 推理模式:通过神经网络处理数据
    • 重置 IMU 状态并恢复中断

手势识别管道

手势识别管道将 IMU 捕获的运动数据处理为已识别的手势。

该流程包括以下关键阶段:

  1. 数据采集:原始陀螺仪数据通过 IMU 中断处理程序收集到数组中IMU_Data_mGyro[150][3]

  2. 数据预处理

    • model_feed_data()为神经网络准备原始数据
    • 根据定义的比例因子缩放值SCALE
    • 将浮点陀螺仪数据转换为模型所需的定点格式
  3. 模型推理

    • model_run()执行神经网络模型
    • 通过 CNN 层处理输入数据
  4. 结果处理

    • model_get_output()分析模型输出
    • 查找概率得分最高的手势
    • 输出有关置信度的调试信息
    • 如果置信度低于阈值,则返回无法识别的手势
  5. 输出控制

    • Model_LED()根据识别的手势控制 LED 输出

识别输出映射

系统可识别 12 个不同的手势(加上“无法识别”),每个手势对应于一个枚举值:

手势 ID 手势名称 LED 控制效果
-1 未知 无效果
0 RightAngle (右角) 设置 GPIOA 引脚 6
1 锐角 重置 GPIOA 引脚 6
2 闪电 设置 GPIOA 引脚 5
3 三角形 重置 GPIOA 引脚 5
4 Letter_h 设置 GPIOA 引脚 4
5 letter_R 重置 GPIOA 引脚 4
6 letter_W 设置 GPIOA 引脚 3
7 letter_phi 重置 GPIOA 引脚 3
8 无效果
9 UpAndDown 无效果
10 无效果
11 无效果
12 无运动 被视为未识别

系统作模式

系统可以在由 compilation 标志控制的两种主要模式下运行:SYSTEM_MODE_DATA_COLLECT

系统模式在编译时确定:

  1. 数据收集模式 ( defined):SYSTEM_MODE_DATA_COLLECT

    • 对 IMU 数据进行采样时,通过 UART 传输以进行外部采集
    • 用于收集神经网络的训练数据
    • 不在此设备上执行推理
  2. 推理模式(未定义):SYSTEM_MODE_DATA_COLLECT

    • 对 IMU 数据进行采样时,将通过神经网络进行处理
    • 该模型对手势进行分类并触发相应的 LED 输出
    • 完整的设备端手势识别

在这些模式下,系统也可以处于由单独的状态机管理的不同状态:

  • SYSTEM_TRANSMIT:转换到此状态时 LED 以 10Hz 闪烁
  • SYSTEM_RECORD:转换到此状态时 LED 以 5Hz 闪烁
  • SYSTEM_IDLE:转换到此状态时 LED 熄灭

神经网络实现

用于手势识别的神经网络是使用 NNoM (Neural Network on Microcontroller) 库实现的,该库为在资源受限的设备上运行神经网络提供了一个高效的框架。


神经网络实现的关键方面:

  1. 内存管理

    • 如果定义了 ,则分配静态内存缓冲区NNOM_USING_STATIC_MEMORY
    • 为神经网络作预留了 8KB 内存
  2. 模型初始化

    • nnom_model_create()构建神经网络结构
    • 文件中包含模型权重,其中包含量化参数weights.h
  3. 模型执行

    • 在推理之前对输入数据进行缩放和量化
    • 处理模型输出以识别最可能的手势
    • 置信度阈值 () 用于筛选不可靠的预测OUPUT_THRESHOLD

按钮和 IMU 交互

该系统的作主要由按钮界面控制,按住时会触发 IMU 数据收集。

按钮和 IMU 交互遵循以下顺序:

  1. 按钮按下检测

    • 当按钮状态发生变化时触发 EXTI0 中断
    • TIM4 计时器用于去抖动和确定印刷持续时间
    • 根据按住持续时间报告不同的按钮状态
  2. IMU 采样启动

    • 当按住按钮且 IMU 处于空闲状态时,开始采样
    • IMU_Sample_Start()被调用以开始采样过程
  3. IMU 数据收集

    • MPU6050 以固定速率生成中断
    • 每个中断都会触发 EXTI9_5 处理程序
    • Handler 收集单个数据点并将其存储在 IMU_Data 数组中
    • 收集到所需数量的样本后,状态将设置为IMU_Sampled
  4. 数据处理

    • 主循环检测状态并处理收集的数据IMU_Sampled
    • 处理取决于当前的系统模式(数据收集或推理)

总结

ElectromagicWand 项目的主要应用通过以下方式实现一个完整的手势识别系统:

  1. 初始化硬件和系统状态
  2. 管理用户输入的按钮交互
  3. 从 MPU6050 IMU 收集运动数据
  4. 通过 CNN 模型处理数据(在推理模式下)
  5. 根据识别的手势通过 LED 产生视觉反馈
  6. 支持用于收集训练数据的数据收集模式

该 App 演示了在资源受限的硬件上高效实现嵌入式机器学习,从而直接在微控制器上实现手势识别。

IMU 数据采集

本页记录了 CyberryPotter ElectromagicWand 项目的惯性测量单元 (IMU) 数据采集子系统。它解释了如何从 MPU6050 传感器捕获运动数据、处理和准备数据收集或手势识别。

1. IMU 子系统概述

CyberryPotter 项目使用 MPU6050 传感器在用户使用魔杖执行手势动作时捕获运动数据。然后,此数据为:

  • 传输到 PC 进行模型训练(在数据收集模式下)
  • 馈送到板载神经网络以进行实时手势识别(在推理模式下)

2. IMU 配置

MPU6050 配置了以下参数:

参数 价值 描述
采样频率 100 赫兹 默认采样率
采样持续时间 1500 毫秒 收集手势序列的总时间
序列长度 150 个样品 每个手势收集的样本数
加速度计范围 ±4 克 最大加速度测量
陀螺仪范围 ±500°/秒 最大角速度测量
采样间隔 10 毫秒 连续样本之间的时间

3. 数据结构

该系统使用两种主要数据结构来存储 IMU 测量值:

4. 数据采集过程

IMU 数据采集过程遵循以下步骤:

5. 原始数据处理

5.1 数据采集和偏差校正

该函数读取原始传感器数据并应用多个处理步骤:IMU_Get_Data()

  1. 通过 I2C 从 MPU6050 传感器读取原始 16 位值
  2. 使用阵列应用偏置校正以补偿传感器漂移IMU_bias
  3. 使用转换常数将原始值转换为物理单位:
    • 加速度计:除以 (8192.0) 转换为 gIMU_ACC_TRANS_CONSTANT
    • 陀螺仪:除以 (8192.0) 以转换为弧度/秒IMU_GYRO_TRANS_RADIAN_CONSTANT

5.2 原始数据处理的代码摘录

原始加速度计数据的读取和处理方式如下:

  1. 从 MPU6050 个寄存器读取 6 字节的加速度计数据
  2. 将高字节和低字节组合成 16 位有符号整数
  3. 减去偏置值以校正传感器漂移
  4. 通过除以转换常数转换为物理单位
  5. 存储在适当的数据数组中

对陀螺仪数据执行类似的处理。

6. 系统模式和 IMU 数据使用

IMU 子系统以两种不同的模式运行:

6.1 数据收集模式


在数据收集模式下,函数:IMU_Data_Print()

  • 输出标头标识符 “IMU\n” 以标记 IMU 数据的开头
  • 通过串行连接传输所有加速度计和陀螺仪数据
  • 将数据格式化为以空格分隔的值,每行一个样本
  • 总共发送 150 行数据(每行 6 个值:3 个加速度计 + 3 个陀螺仪值)

这些数据由 PC 软件收集,用于训练手势识别模型。

6.2 推理模式


在推理模式下,该函数:model_feed_data()

  • 将 IMU 陀螺仪数据转换为神经网络所需的格式
  • 将浮点值缩放为模型的定点表示形式
  • 将转换后的数据存储在模型的 input buffer 中

然后,神经网络对数据进行处理以识别手势。

7. 与主应用程序集成

IMU 数据采集子系统与主要应用流程集成,如下所示:

主循环持续检查按钮是否被按住以及 IMU 是否处于空闲状态。当满足此条件时,它将开始 IMU 采样。采样完成后,它会发送数据进行收集或处理数据以进行手势识别,具体取决于系统模式。

8. 技术考虑

8.1 采样率和序列长度

系统配置为以 100Hz 采样 1.5 秒,每个手势产生 150 个样本。这提供了足够的时间分辨率来捕获棒运动的动态,同时保持 STM32F103 微控制器的内存需求可控。

8.2 偏差校正

该系统应用偏置校正来补偿传感器漂移和MPU6050中的制造变化。该数组存储从原始传感器读数中减去的偏移值。IMU_bias

8.3 单位换算

原始传感器值使用配置文件中定义的常量转换为物理单位:

  • 加速度计:(8192.0) 转换为 g 单位IMU_ACC_TRANS_CONSTANT
  • 陀螺仪:(8192.0) 转换为每秒弧度IMU_GYRO_TRANS_RADIAN_CONSTANT

9. 总结

IMU 数据采集子系统有效地从 MPU6050 传感器捕获运动数据,对其进行处理以消除偏差并转换为物理单元,并使其可用于数据收集或实时手势识别。该系统构成了 CyberryPotter ElectromagicWand 识别用户执行的魔杖手势(法术)的能力的基础。

系统控制

本页记录了 CyberryPotter ElectromagicWand 项目中的系统控制机制,重点介绍状态机实现、按钮控制逻辑和 LED 反馈系统。这些控制机制使用户能够与设备交互,并提供有关系统当前状态的视觉反馈。

系统状态架构

CyberryPotter 项目实现了一个基于状态的控制系统,该系统管理不同的作模式并提供用户反馈。系统控制架构由以下关键组件组成:

  1. 状态管理结构 - 跟踪和管理系统的当前状态
  2. 按钮控制系统 - 检测和解释用户输入
  3. 系统模式状态机 - 管理作模式之间的转换
  4. LED 反馈系统 - 提供有关系统当前状态的视觉反馈

状态管理结构

系统使用该结构维护其状态,该结构跟踪系统的多个方面:Cyberry_Potter_Status_Typedef

Cyberry_Potter_Status_Typedef Cyberry_Potter_Status;

此结构包含以下状态信息:

  • Button_Status- 当前按钮状态(IDLE、HOLD、HOLD_LONG、HOLD_VERY_LONG)
  • Serial_Status- 串行接口的状态
  • IMU_Status- IMU 传感器的状态
  • LED_Status- 电流 LED 反馈模式
  • System_Mode- 当前作模式(IDLE、TRANSMIT、RECORD)
  • Button_Click_Count- 按钮点击计数器

按钮控制系统

按钮控制系统通过硬件中断和基于计时器的持续时间测量的组合来解释用户输入。

按钮按下检测

最初通过 GPIO 中断检测到按钮按下。当检测到按钮状态变化时,将启动计时器来测量按下的持续时间。

按钮状态分类

按钮按下根据其持续时间分为不同的类别:

  1. BUTTON_HOLD - 按钮至少按住BUTTON_IDLE_SHORT_THRESHOLD_MS
  2. BUTTON_HOLD_LONG - 按钮至少按住BUTTON_SHORT_LONG_THRESHOLD_MS
  3. BUTTON_HOLD_VERY_LONG - 按钮至少按住BUTTON_LONG_VERYLONG_THRESHOLD_MS

按钮处理实现

按钮状态在计时器中断处理程序 () 中处理。此功能:TIM4_IRQHandler

  1. 对当前按钮状态进行采样
  2. 将其与上一个状态进行比较
  3. 计算保留和释放的持续时间
  4. 在满足阈值时更新按钮状态

定时器中断每 1 毫秒触发一次,为按钮按下持续时间测量提供精确的计时。

系统模式状态机

该系统以三种主要模式运行,通过长时间按下按钮触发转换:

  1. SYSTEM_IDLE - 活动最少的待机模式
  2. SYSTEM_TRANSMIT - 串行传输数据的模式
  3. SYSTEM_RECORD - 记录手势数据的模式

System Mode 转换

模式转换在 函数中处理,当检测到很长的按钮按下时调用该函数。此功能:Cyberry_Potter_System_Status_Update()

  1. 检查按钮状态是否为BUTTON_HOLD_VERY_LONG
  2. 根据当前系统模式,转换到下一个模式
  3. 更新 LED 状态以提供视觉反馈
  4. 通过串行输出调试消息

LED 反馈系统

LED 反馈系统使用不同的闪烁模式提供有关系统当前状态的视觉提示。

LED 状态类型

使用了四种主要的 LED 模式:

  1. LED_ALWAYS_ON - LED 持续亮起
  2. LED_5HZ - LED 以 5Hz 的频率闪烁(在 RECORD 模式下使用)
  3. LED_10HZ - LED 以 10Hz 的频率闪烁(在 TRANSMIT 模式下使用)
  4. LED_IDLE - IDLE 模式的自定义模式

LED 控制实现

LED 模式在函数中实现,它:LED_Blink()

  1. 接收当前 LED 状态
  2. 使用基于延迟的时序执行适当的闪烁模式
  3. 将 LED 状态重置为完成图案后LED_ALWAYS_ON

系统初始化

系统控制组件在函数中初始化,其中:System_Init()

  1. 用于设置 GPIO、中断和计时器的调用Hardware_Init()
  2. 设置所有状态字段的默认值
  3. 将初始系统模式设置为SYSTEM_TRANSMIT
  4. 打开 LED

与 IMU 数据采集集成

系统控制器通过以下方式与 IMU 数据采集系统交互:

  1. 按下触发数据采样的按钮
  2. 跟踪 IMU 采样完成的状态更新
  3. IMU 数据的中断处理

当 IMU 完成对完整序列的采样时,它会更新并停止进一步采样。Cyberry_Potter_Status.IMU_StatusIMU_Sampled

硬件实现细节

按钮硬件配置

该按钮配置在 GPIO 引脚 A0 上,具有以下特性:

  • 内部上拉电阻器使能 (GPIO_Mode_IPU)
  • 为上升沿和下降沿配置的外部中断 (EXTI0)
  • 中断优先级设置为 3:3

用于按钮去抖动的定时器配置

TIM4 配置为每 1 毫秒生成一个中断,其中:

  • 预分频器:3600 - 1
  • 时段: 20 - 1
  • 时钟除法:TIM_CKD_DIV1
  • 中断优先级:4:4

LED 配置

GPIO 引脚 A3、A4、A5、A6 和 A7 上的 LED 配置为推挽式输出。

时序特性

系统用于按钮识别的计时特征是:

按钮状态 Timing Threshold
BUTTON_HOLD >= BUTTON_IDLE_SHORT_THRESHOLD_MS
BUTTON_HOLD_LONG >= BUTTON_SHORT_LONG_THRESHOLD_MS
BUTTON_HOLD_VERY_LONG >= BUTTON_LONG_VERYLONG_THRESHOLD_MS

CNN 模型

本页记录了 CyberryPotter ElectromagicWand 项目中用于手势识别的卷积神经网络 (CNN) 模型。CNN 负责处理来自 MPU6050 传感器的惯性测量单元 (IMU) 数据,并将其分类为 12 种不同的手势模式(咒语)之一。

模型概述

CNN 模型是 ElectromagicWand 系统的核心智能,使其能够识别三维空间中的运动模式。它是使用嵌入式机器学习库实现的,该库允许在资源受限的 STM32F103C8T6 微控制器上进行高效的神经网络推理。nnom


模型架构

CNN 模型遵循针对时间序列运动数据处理优化的顺序架构。它由用于特征提取的卷积层、用于降维的池化层和用于分类的密集层组成。

架构图


图层详细信息

该模型处理 3 轴陀螺仪数据的 150 个时间步长,并输出 13 个类(12 个已识别的手势加上一个“未识别”的类)的概率。

输出形状 参数 量化 (int-bits, dec-bits)
输入 (150, 3) 0 (4, 0)
卷积 1D (50, 30) 300 (3, 0)
ReLU 系列 (50, 30) 0 (3, 0)
Conv1D_1 (16, 15) 1,365 (2, 0)
ReLU_1 (16, 15) 0 (2, 0)
MaxPooling1D (5, 15) 0 (2, 0)
扁平 化 (75) 0 (2, 0)
(13) 988 (2, 0)
辍学 (13) 0 (2, 0)
Softmax (13) 0 (7, 0)

手势分类流程

输入处理

通过以下步骤,将来自 MPU6050 传感器的原始陀螺仪数据转换为适合 CNN 模型的格式:

  1. IMU 数据被采样并存储在数组中IMU_Data_mGyro
  2. 该函数对这些数据进行缩放和量化,以匹配 CNN 的输入要求model_feed_data()
  3. 缩放后的数据存储在数组中nnom_input_data
void model_feed_data(void)
{
    const double scale = SCALE;
    uint16_t i = 0;
    for(i = 0; i < IMU_SEQUENCE_LENGTH_MAX;i++){
        nnom_input_data[i*3] = (int8_t)round(IMU_Data_mGyro[i][0] * scale);
        nnom_input_data[i*3+1] = (int8_t)round(IMU_Data_mGyro[i][1] * scale);
        nnom_input_data[i*3+2] = (int8_t)round(IMU_Data_mGyro[i][2] * scale);
    }
}

模型推理

模型推理过程包括:

  1. 创建 nnom 模型nnom_model_create()
  2. 运行模型推理model_run(model)
  3. 使用 处理输出model_get_output()

输出分类

该模型输出 13 个手势类中每个类的概率。这些 Cookie 的处理方式如下:

  1. 该函数在所有类别中查找最大概率model_get_output()
  2. 如果此概率超过阈值 (),则会识别相应的手势OUPUT_THRESHOLD
  3. 否则,输出将设置为 “Unrecognized” (-1)
  4. 然后显示识别的手势,并用于通过以下方式控制 LEDModel_LED()
int8_t model_get_output(void)
{
    uint8_t i = 0;
    int8_t max_output = -128;
    int8_t ret = 0;
    for(i = 0; i < 13;i++){
        printf("Output[%d] = %.2f %%\n",i,(nnom_output_data[i] / 127.0)*100);
        if(nnom_output_data[i] >= max_output){
            max_output = nnom_output_data[i];
            ret = i;
        }
    }
    if(max_output >= OUPUT_THRESHOLD){
        ret = ret;
    }
    else{
        ret = -1; // Unrecognized
    }
    
    // Print the recognized gesture name
    switch(ret){
        case RightAngle:
            printf("RightAngle");
            break;
        // ... other cases ...
    }
    printf("\n");
    return ret;
}

已识别的手势

该模型识别 12 种不同的运动模式或“咒语”,在枚举中定义:

枚举值 手势名称 LED 动作
0 RightAngle (右角) GPIOA 引脚 6 套
1 锐角 GPIOA 引脚 6 复位
2 闪电 GPIOA 引脚 5 组
3 三角形 GPIOA 引脚 5 复位
4 Letter_h GPIOA 引脚 4 套
5 letter_R GPIOA 引脚 4 复位
6 letter_W GPIOA 引脚 3 套
7 letter_phi GPIOA 引脚 3 复位
8 无 LED作
9 UpAndDown 无 LED作
10 无 LED作
11 无 LED作
12 无运动 被视为未识别
-1 未知 无 LED作

使用 nnom 进行模型部署

该模型使用 nnom 库部署到 STM32 微控制器上,该库优化了嵌入式系统的神经网络作。

内存管理

nnom 库支持静态内存分配以避免堆碎片化:

#ifdef NNOM_USING_STATIC_MEMORY
    uint8_t static_buf[1024 * 8];
    nnom_set_static_buf(static_buf, sizeof(static_buf)); 
#endif

在 Main Loop 中集成

该模型被集成到主程序循环中,它:

  1. 等待按住按钮且 IMU 状态为空闲
  2. 启动 IMU 采样
  3. IMU 采样完成后,将数据馈送到模型
  4. 运行模型推理
  5. 获取输出并相应地控制 LED

培训过程

虽然模型部署是在固件中处理的,但模型是使用 Python 脚本离线训练的:

  1. Serial_Read.py在数据收集模式下从设备收集 IMU 数据
  2. CNNTrainRaw.py使用收集的数据训练 CNN 模型
  3. 训练后的模型将转换为 C 代码(特别是)以进行部署weights.h

使用指南

本文档提供了有关如何作 CyberryPotter ElectromagicWand 系统的全面说明。它涵盖了数据收集和推理模式、按钮作、LED 指示灯和手势识别。

1. 系统模式概述

CyberryPotter ElectromagicWand 以两种主要模式运行:

  1. 数据收集模式 - 用于捕获手势数据以训练 CNN 模型
  2. 推理模式 - 用于识别手势并触发相应的作

模式由文件中的标志确定。启用此标志后,系统将进入数据收集模式;否则,它将在推理模式下运行。SYSTEM_MODE_DATA_COLLECTconfig.h

2. 按钮作

该系统使用具有不同按下持续时间的单个按钮来控制各种功能:

按 Type 期间 推理模式下的函数 数据收集模式下的功能
20-1999 毫秒 捕获手势数据以进行推理 捕获手势数据以进行收集
长握 2000-4999 毫秒 不适用 不适用
超长保留 ≥5000 毫秒 在系统状态之间切换 (IDLE/TRANSMIT/RECORD) 不适用

按钮状态机会监控按下和释放持续时间,以准确确定按钮按下的类型,如下所示:

3. 系统状态机

在推理模式下,系统可以处于以下三种系统状态之一,由长时间按下按钮来控制:

  1. SYSTEM_IDLE - 待机模式,LED 活动最少
  2. SYSTEM_TRANSMIT - 准备好识别手势并传输结果
  3. SYSTEM_RECORD - 准备录制手势

4. LED 指示灯

LED 提供有关系统状态的视觉反馈:

LED 图案 意义
始终开启 正常作
以 10Hz 的频率闪烁 SYSTEM_TRANSMIT 模式激活
以 5Hz 的频率闪烁 SYSTEM_RECORD 模式激活
自定义模式 SYSTEM_IDLE 模式处于活动状态
特定于模型的模式 识别手势(在推理模式下)

5. 在推理模式下使用 Wand

5.1 执行手势

要执行手势识别:

  1. 确保系统处于推理模式(在SYSTEM_MODE_DATA_COLLECTconfig.h)
  2. 按住按钮
  3. 按住按钮时执行 12 个已识别的手势/法术之一
  4. 松开按钮
  5. 系统将通过 CNN 处理捕获的运动数据
  6. 如果识别出手势,则会显示相应的 LED 指示灯图案

5.2 识别的手势

该系统可以识别 12 种不同的手势/法术。这些手势的视觉表示形式在存储库 中以卡片的形式提供,网址为 。识别时,手势对应于不同的 LED 模式。CNN/SpellsCard/

6. 在数据收集模式下使用 Wand

6.1 配置数据收集模式

要启用数据收集模式:

  1. 取消注释 中的定义SYSTEM_MODE_DATA_COLLECTconfig.h
  2. 重新编译固件并将其闪存到 STM32
  3. 通过串行连接将设备连接到您的 PC

6.2 收集手势数据

数据收集工作流程:

6.3 数据收集协议

对于最佳模型训练:

  1. 为 12 个手势中的每个手势收集多个样本(推荐 20+)
  2. 每次都一致地执行手势
  3. 包括速度和振幅的变化,以实现稳健性
  4. 确保传感器对于相同手势的所有样本处于相同的方向

7. 模型训练和部署

收集数据后,请按照以下步骤训练和部署新模型:

  1. 使用收集的数据来训练 CNN 模型CNNTrainRaw.py
  2. 该脚本生成:
    • 用于在 PC 上测试的模型文件.h5
    • 用于在 STM32 上部署的文件weights.h
  3. 要部署新模型,请执行以下作:
    • 禁用位置SYSTEM_MODE_DATA_COLLECTconfig.h
    • 将生成的weights.h
    • 重新编译并刷新固件

8. 故障排除

问题 可能的原因 溶液
无 LED 响应 未检测到按钮 检查按钮连接和固件
识别准确率差 训练数据不足 收集更多手势示例
系统卡在一种模式 按钮计时问题 重置系统并重试
串行通信问题 UART 配置 验证波特率(默认值:在 hardware.h 中定义)
编译错误 缺少库 按照 README 中的设置说明进行作

9.作环境

系统已经过测试,在以下条件下运行正常:

  • 带有 Arm 编译器 6.22 的 Keil 5 IDE
  • IMU 数据的 100Hz 采样频率
  • 步幅为 3 的 2 层 CNN
  • ST-Link 或等效调试工具

详细的环境设置说明请参考 README 文件。

数据收集模式

概述

CyberryPotter ElectromagicWand 项目中的数据收集模式支持从 MPU6050 IMU 传感器收集运动数据,从而为手势识别神经网络创建训练数据集。此模式对于开发和改进系统识别自定义手势(系统称为“咒语”)的能力至关重要。

启用 Data Collection Mode

要启用 Data Collection Mode,您需要修改固件中的系统配置:

  1. 打开文件config.h
  2. 通过删除行开头的 来取消对定义的注释SYSTEM_MODE_DATA_COLLECT//
// Change this:
//#define SYSTEM_MODE_DATA_COLLECT

// To this:
#define SYSTEM_MODE_DATA_COLLECT
  1. 编译固件并将其闪存到 STM32F103C8T6 微控制器

数据收集工作流程

数据收集过程遵循以下常规工作流程:

数据收集模式下的系统状态

当处于 Data Collection Mode 时,系统使用以下状态机运行:


按钮控制界面

系统使用具有不同保留持续时间的单个按钮来控制数据收集过程:

按钮作 保持期 功能
5-1000 毫秒 开始数据采样
长按 1000-2500 毫秒 未在 Data Collection 模式下使用
保持非常长 >2500 毫秒 在系统状态之间切换

按钮按下持续时间在配置中定义:

#define BUTTON_IDLE_SHORT_THRESHOLD_MS (5)
#define BUTTON_SHORT_LONG_THRESHOLD_MS (1000)
#define BUTTON_LONG_VERYLONG_THRESHOLD_MS (2500)

LED 状态指示灯

系统使用 LED 闪烁模式来指示当前系统状态:

系统状态 LED 图案
SYSTEM_TRANSMIT 10Hz 闪烁(50 毫秒开,50 毫秒关)
SYSTEM_RECORD 5Hz 闪烁(100ms 开,100ms 关)
SYSTEM_IDLE 带周期指示器的 LED 熄灭

数据采样过程

配置示例

数据收集按照以下规格对 IMU 数据进行采样:

  • 采样率:100Hz(定义IMU_DEFAULT_HZ)
  • 采样持续时间:1.5 秒(由IMU_SAMPLING_TIME_MS)
  • 样本序列长度:150 个样本(由IMU_SEQUENCE_LENGTH_MAX)

数据格式

IMU 数据从加速度计和陀螺仪收集,并存储在数组中:

float IMU_Data_mAcc[IMU_SEQUENCE_LENGTH_MAX][3];  // Accelerometer data [x, y, z]
float IMU_Data_mGyro[IMU_SEQUENCE_LENGTH_MAX][3]; // Gyroscope data [roll, pitch, yaw]

使用以下比例因子从原始传感器值转换数据:

#define IMU_ACC_TRANS_CONSTANT (8192.0)  // For ±4g range
#define IMU_GYRO_TRANS_RADIAN_CONSTANT (8192.0)  // For ±500 degrees/sec range

数据收集功能

当按住按钮并且 IMU 开始采样时,通过第 5 行的 EXTI 中断为每个采样点调用该函数:IMU_Get_Data()

数据输出格式

数据以特定格式通过串行传输:

  1. 每个数据收集序列都以标头开头:"IMU\n"
  2. 每个样本的格式如下:<AccX> <AccY> <AccZ> <GyroRoll> <GyroPitch> <GyroYaw>\n
  3. 所有 150 个样本按顺序传输

输出示例(部分):

IMU
0.123 -0.456 9.789 0.001 0.002 -0.003
0.124 -0.452 9.791 0.002 0.001 -0.004
...

PC 端数据收集

使用 Serial_Read.py

存储库包括一个 Python 脚本,该脚本连接到串行端口并从设备捕获数据:Serial_Read.py

  1. 在设备处于 Data Collection Mode 时运行脚本
  2. 按住按钮时执行所需的手势
  3. 该脚本将接收数据并将其保存为 CSV 文件以进行训练

培训过程

为每个手势收集足够的数据样本后:

  1. 运行脚本以使用收集的数据训练 CNN 模型CNNTrainRaw.py

  2. 该脚本生成两个输出文件:

    • model.h5:用于在 PC 上测试的 Keras 模型文件
    • weights.h:包含 STM32 模型权重的 C 头文件
  3. 要在部署之前测试模型,您可以使用 which 在 Data Collection Mode 下连接到设备,但在 PC 上运行推理CNNTestSerialRaw.py

转换为推理模式

训练模型并生成文件后,您需要:weights.h

  1. 将文件复制到您的项目中weights.h
  2. 注释掉 define inSYSTEM_MODE_DATA_COLLECTconfig.h
  3. 重新编译并刷新固件以启用推理模式

系统现在将使用经过训练的模型来识别手势,而不是收集数据。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐