笔者前段时间想做一个运动手环,发现mpu6050还是稍微缺了点精度用起来虽然蛮多开源但是数据有点慢。想了想去淘宝找了一圈国产的mpu就看到了维特的jy系列。
一、设计灵感
之前看很多运动手环都有类似的功能,但是针对个别运动好像还是缺了点,个人认为针对某些运动其实可以做一个专门的纠正手环,笔者这里想到了篮球(姬霓太美)于是就开始动手去找资料了。发现国内基本没有这种东西。
不过我们首先还是先看看维他他家的官网的产品概述
产品概述
- 该产品是基于MEMS技术的高性能三维运动姿态测量系统。它包含三轴陀螺仪、三轴加速度计。通过集成各种高性能传感器和运用自主研发的姿态动力学核心算法引擎,结合高动态卡尔曼滤波融合算法,为客户提供高精度、高动态、实时补偿的三轴姿态角度,通过对各类数据的灵活选择配置,满足不同的应用场景。
- 领先的基于 Kalman 滤波原理并具有自主知识产权的传感器融合算法,可以实时提供高达 200Hz 更新率的数据,从而满足各种高精度的应用需求,实现准确的动作捕捉和姿态估计。
- 拥有国内领先的高精度转台设备仪器,产品内部集成自主研发的高精度校准和标定算法,提高产品的测量精度。
- 同时提供用户所需要的各种上位机、使用说明、开发手册、开发代码,使得针对各类需求的研发产品特点时间降至最低。
- 产品特点
- 模块集成高精度的陀螺仪、加速度计,采用高性能的微处理器和先进的动力学解算与卡尔曼动态滤波算法,能够快速求解出模块当前的实时运动姿态。
- 采用先进的数字滤波技术,能有效降低测量噪声,提高测量精度。
- 模块内部集成了姿态解算器,配合动态卡尔曼滤波算法,能够在动态环境下准确输出模块的当前姿态, 姿态测量精度 0.2度 ,稳定性极高,性能甚至优于某些专业的倾角仪。
- 模块内部自带电压稳定电路,工作电压3.3~5V,引脚电平兼容3.3V/5V的嵌入式系统,连接方便。
- 支持串口和IIC两种数字接口。方便用户选择最佳的连接方式。串口速率4800bps~230400bps可调,IIC接口支持全速400K速率。
- 最高200Hz数据输出速率。输出内容可以任意选择,输出速率0.2~200Hz可调节。
- 保留4路扩展端口,可以分别配置为模拟输入,数字输入,数字输出等功能。
- 具备GPS连接能力。可接受符合NMEA-0183标准的串口GPS数据,形成GPS-IMU组合导航单元。
- 采用邮票孔镀金工艺,可嵌入用户的PCB板中。
- 4层PCB板工艺,更薄、更小、更可靠。
可以发现功能还是满齐全的也挺高端(看起来)
使用方法还是一般的串口使用方法,不过笔者这里之前移植了iic的索性就用iic的接口去跑数据了。
二、设计步骤
1.模块的调试
代码如下(主任务):
int main(void)
{
int i;
angle = fangle[0];
angle_2 = fangle[1];
angle_3 = fangle[2];
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(RCC_PLL_MUL9); //设置时钟,72M
delay_init(72); //初始化延时函数
LED_Init(); //初始化LED
IIC_Init(); //初始化IIC
KEY_Init(); //初始化按键
LCD_Init(); //初始化lcd显示屏
uart_init(115200); //串口初始化为115200(串口数据调试)
uart3_init(115200); //串口3初始化为115200
ESP8266_Init(); //初始化esp8266
open_UI(); //开机界面
WitInit(WIT_PROTOCOL_I2C, 0x50);
WitI2cFuncRegister(IICwriteBytes, IICreadBytes);
WitRegisterCallBack(CopeSensorData);
WitDelayMsRegister(Delayms);
AutoScanSensor();
/* 无限循环 */
while(1)
{
WitReadReg(AX, 12);
delay_ms(20);
CmdProcess();
if(s_cDataUpdate)
{
for(i = 0; i < 3; i++)
{
fangle[i] = sReg[Roll+i] / 32768.0f * 180.0f; //角度
}
if(s_cDataUpdate & ANGLE_UPDATE)
{
s_cDataUpdate &= ~ANGLE_UPDATE;
LCD_ShowNum(24,16,fangle[0],3,16);
LCD_ShowFloatNum1(56,16,fangle[0],2,0xffff,0x0000,16);
LCD_ShowNum(24,34,fangle[1],3,16);
LCD_ShowFloatNum1(56,34,fangle[1],2,0xffff,0x0000,16);
LCD_ShowNum(24,54,fangle[2],3,16);
LCD_ShowFloatNum1(56,54,fangle[2],2,0xffff,0x0000,16);
delay_ms(10);
}
ESP8266_SendData(angle,angle_2,angle_3);//发送数据
delay_ms(10);
}
}
}
预计的pcb大小,和这个屏幕应该差不多。
2.数据校准
代码如下(示例):
fangle[i] = sReg[Roll+i] / 32768.0f * 180.0f; //角度
用的串口输出来看了一下数据的准确性,还是比较满意的
总结
这么个小东西前前后后调试了两周,也做了点功能的拓展,传输数据到云端服务器去分析啊什么的,感觉还是挺有意思的,ui也自己设计了一个挺好玩的,接口我也有保留后续可能会开发更多功能吧,看起来优化的地方还有很多缩小体积啊减少电池的体积啊屏幕的排线集成啊什么的。
后续有机会会把这个东西开源出来让大家伙拓展功能,至于什么时候就要看我有没有时间了(笑哭)
感兴趣关注我一手吧,需要源代码的话留个邮箱,笔者看到的话会发的(关注关注关注),主要是度盘容易炸。