嵌入式AI STM32部署卷积神经网络的魔法棒
基于STM32部署卷积神经网络控制设备方案-AI项目-STM32部署卷积神经网络方案-红外信号复制方案-轨迹识别
项目包含下述内容
- 硬件部分、PCB制板、BOM表文件等等 (Hardware)
- 外壳、3D打印文件 (3D_print)
- 软件程序、用于电子法棒的软件程序 AI + Keil等等(Software)
- QT上位机动作识别模型训练脚本 (用于训练模型等功能)(Upper_computer)
- 图示、Demo中的13个动作轨迹图例(Model_trajectories)
- 环境安装包、工具包(Install_package) + 嵌入式神经网络部署源码(NNOM_Demo)
- 二次开发方案
1.项目简介
功能:(通俗易懂)
设备会根据你的手势轨迹动作,去发出指令,控制设备。你可以理解是一个哈利波特魔法棒。
1.设备的手势可以自行添加,目前13个手势,你可以任意添加你想要的手势轨迹,配备QT上位机给你添加(还可以学到QT)
2.设备会根据你做的动作判断是否正确,是否是动作集里面的动作,去发出控制设备的信号,比如空调的开关,温度的升降,任何牌子的都可以(格力美的等等都可以 本质是复制红外信号)
2.系统架构
硬件架构:STM32F103、MPU6050、红外传感器、电池降压电路、电源管理IC、电源选择电路、充电管理电路、充电管理IC等等
软件架构:QT、ARM、Tensorflow、Keras、实战算法、nnom(嵌入式AI推理库)等等
3.开发环境配置说明
Keil环境配置:
-
Keil 版本:请使用 Keil 5,建议从 Keil 官网下载最新版,避免遇到兼容性问题。
-
编译器版本:请选择 Arm Compiler 6.22 作为编译器,确保项目能够顺利编译。
-
调试器设置:根据您的设备选择合适的调试器,例如 ST-Link 或其他兼容设备,以进行程序调试。
-
库文件安装:首次打开项目时,Keil 可能提示需要安装缺失的库,请根据提示进行安装,以确保项目能够正常运行。
代码如下所示:
#include "CyberryPotter.h"
#include "weights.h"
#include "nnom.h"
#define QUANTIFICATION_SCALE (pow(2, INPUT_1_OUTPUT_DEC))
#define OUTPUT_THRESHOLD 63
void model_feed_data(void);
Model_Output_t model_get_output(void);
#ifdef NNOM_USING_STATIC_MEMORY
uint8_t static_buf[1024 * 10];
#endif
nnom_model_t* model;
volatile Model_Output_t model_output = -1;
int main(void) {
System_Init();
LED.Operate(BLINK_10HZ);
#ifdef NNOM_USING_STATIC_MEMORY
nnom_set_static_buf(static_buf, sizeof(static_buf));
#endif
model = nnom_model_create();
while (1) {
if (Button.status == BUTTON_HOLD && IMU.status == IMU_Idle) {
IMU.Sample_Start();
EXTI_Stop();
LED.Operate(OFF);
while (IMU.status != IMU_Sampled);
LED.Operate(ON);
#ifndef SYSTEM_MODE_DATA_COLLECT
model_output = model_get_output();
if (model_output != Unrecognized) {
switch (Cyberry_Potter.System_Mode) {
case SYSTEM_MODE_0:
Module.Mode0_Handler();
break;
case SYSTEM_MODE_1:
Module.Mode1_Handler();
break;
default:
break;
}
}
#endif
IMU.status = IMU_Idle;
Button.status_clear();
EXTI_Restore();
} else if (Button.status == BUTTON_HOLD_LONG) {
printf("BUTTON_HOLD_LONG\n");
LED.Operate(BLINK_5HZ);
Cyberry_Potter_System_Status_Update();
Button.status_clear();
}
}
}
void model_feed_data(void) {
const double scale = QUANTIFICATION_SCALE;
for (uint16_t i = 0; i < IMU_SEQUENCE_LENGTH_MAX; i++) {
nnom_input_data[i * 3] = (int8_t)round(IMU.gyro[i][Roll] * scale);
nnom_input_data[i * 3 + 1] = (int8_t)round(IMU.gyro[i][Pitch] * scale);
nnom_input_data[i * 3 + 2] = (int8_t)round(IMU.gyro[i][Yaw] * scale);
}
}
Model_Output_t model_get_output(void) {
model_feed_data();
model_run(model);
int8_t max_output = -128;
Model_Output_t ret = Unrecognized;
for (uint8_t i = 0; i < 13; i++) {
#ifdef SERIAL_DEBUG
printf("Output[%d] = %.2f %%\n", i, (nnom_output_data[i] / 127.0) * 100);
#endif
if (nnom_output_data[i] > max_output) {
max_output = nnom_output_data[i];
ret = i;
}
}
if (max_output < OUTPUT_THRESHOLD) {
ret = Unrecognized;
}
#ifdef SERIAL_DEBUG
const char* gesture_names[] = {
"Unrecognized", "RightAngle", "SharpAngle", "Lightning", "Triangle",
"Letter_h", "Letter_R", "Letter_W", "Letter_phi", "Circle",
"UpAndDown", "Horn", "Wave", "NoMotion"
};
printf("%s\n", gesture_names[ret]);
#endif
return ret;
}
原文地址:https://blog.csdn.net/weixin_64593595/article/details/144729568
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!