nRF52832-Bluefruit52学习之外设开发(1)-- MPU6050六轴模块

2024-01-19 06:08

本文主要是介绍nRF52832-Bluefruit52学习之外设开发(1)-- MPU6050六轴模块,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       nRF52832技术交流群:680723714

       nRF52832-Bluefruit52核心板详细介绍:

https://blog.csdn.net/solar_Lan/article/details/88688451

                                                 nRF52832驱动MPU6050

       nRF52832-Bluefruit52蓝牙核心板板载MPU6050芯片,连接I2C总线上,SCL---P0.26,SDA---P0.25。

       MPU-6050的角速度全格感测范围为±250、±500、±1000与±2000°/sec (dps),可准确追踪快速与慢速动作,并且,用户可程式控制的加速器全格感测范围为±2g、±4g±8g与±16g。产品传输可透过最高至400kHz的I2C。MPU-6050可在不同电压下工作,VDD供电电压介为2.5V±5%、3.0V±5%或3.3V±5%,逻辑接口VDDIO供电为1.8V± 5%(MPU6000仅用VDD)。MPU-6050的包装尺寸4x4x0.9mm(QFN),在业界是革命性的尺寸。其他的特征包含内建的温度感测器、包含在运作环境中仅有±1%变动的振荡器。

        在很多领域均有应用,比如智能手机,平板设备,手持型游戏产品,游戏机,3D体感遥控器,可携式导航设备等等。配合蓝牙的使用场景更加广泛,比如无线鼠标,无线游戏手柄,无线3D遥控器,计步器,可穿戴设备等等。

       在芯片的I2C驱动上,简单地说,MPU6050就是一个i2c从器件,就像一个微控制器,要使用它,你得了解寄存器,初始化,读取,写入等等。本次使用nRF52832作为主控芯片,使用硬件I2C驱动MPU6050,并且结合匿名四轴上位机,通过串口协议可以实时监测姿态解析的的数据,对后续在产品上的开发有很大参考意义。

       MPU6050的驱动文件主要有3个,结合nRF52832芯片的串口例程,我们做了移植。

       main主函数源码:

/*** @brief Function for main application entry.*/
int main(void)
{int16_t AccValue[3],GyroValue[3];uint8_t id;float pitch,roll,yaw; 			//欧拉角short aacx,aacy,aacz;		  	//加速度传感器原始数据short gyrox,gyroy,gyroz;		//陀螺仪原始数据nrf_gpio_cfg_output(LED_1);		//配置管脚P0.17为输出,驱动指示灯D1nrf_gpio_pin_set(LED_1);   		//设置指示灯D1初始状态为熄灭uart_init();  //配置串口,禁止流控,波特率:115200	twi_master_init();nrf_delay_ms(2000);if(mpu6050_init(0x68) == false){while (true){printf("mpu6050 init fail\r\n");nrf_delay_ms(500);}	}else{	nrf_delay_ms(1000);printf("mpu6050 init ok\r\n");}mpu6050_register_read(0x75U, &id, 1);printf("mpu6050 id is %d \r\n",id);while(mpu_dmp_init()){nrf_delay_ms(1000);printf("mpu6050 init Error\r\n");}while (true){if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0){ MPU6050_ReadAcc(&aacx,&aacy,&aacz);	    //读取加速度传感器数据MPU6050_ReadGyro(&gyrox,&gyroy,&gyroz);	//读取陀螺仪数据mpu6050_send_dat(aacx,aacy,aacz,gyrox,gyroy,gyroz);//用自定义帧发送加速度和陀螺仪原始数据Uart_ReportIMU(aacx,aacy,aacz,gyrox,gyroy,gyroz,(int)(roll*100),(int)(pitch*100),(int)(yaw*10));nrf_delay_ms(50);}}
#else// This part of the example is just for testing the loopback .while (true){uart_loopback_test();}
#endif
}

为了支持匿名四轴上位机,我们要对串口数据进行数据协议规范:

/************************************************************************************ 描  述 : 串口发送数据,数据格式为匿名四轴上位机软件(V2.6版本)数据格式* 入  参 : fun:功能码*        : dat:数据缓存区地址,最多28字节*        : len:数据长度,最大28字节* 返回值 : 无**********************************************************************************/ 
void Uart_SendDat_ToPC(uint8_t fun,uint8_t *dat,uint8_t len)
{uint8_t send_buf[32];uint8_t i;if(len>28)return;	  //最多28字节数据 send_buf[len+3]=0;	//校验数置零send_buf[0]=0x88;	  //帧头send_buf[1]=fun;	  //功能码send_buf[2]=len;	  //数据长度for(i=0;i<len;i++)send_buf[3+i]=dat[i];			      //复制数据for(i=0;i<len+3;i++)send_buf[len+3]+=send_buf[i];	//计算校验和	for(i=0;i<len+4;i++)app_uart_put(send_buf[i]);	  //串口输出数据
}
/************************************************************************************ 描  述 : 发送加速度传感器数据和陀螺仪数据* 入  参 : aacx,aacy,aacz:x,y,z三个方向上面的加速度值*          gyrox,gyroy,gyroz:x,y,z三个方向上面的陀螺仪值* 返回值 : 无**********************************************************************************/
void mpu6050_send_dat(short aacx,short aacy,short aacz,short gyrox,short gyroy,short gyroz)
{uint8_t tx_buf[12]; tx_buf[0]=(aacx>>8)&0xFF;tx_buf[1]=aacx&0xFF;tx_buf[2]=(aacy>>8)&0xFF;tx_buf[3]=aacy&0xFF;tx_buf[4]=(aacz>>8)&0xFF;tx_buf[5]=aacz&0xFF; tx_buf[6]=(gyrox>>8)&0xFF;tx_buf[7]=gyrox&0xFF;tx_buf[8]=(gyroy>>8)&0xFF;tx_buf[9]=gyroy&0xFF;tx_buf[10]=(gyroz>>8)&0xFF;tx_buf[11]=gyroz&0xFF;Uart_SendDat_ToPC(0xA1,tx_buf,12);//自定义帧,0XA1
}	
/************************************************************************************ 描  述 : 串口上传MPU6050姿态数据* 入  参 : aacx,aacy,aacz:x,y,z三个方向上面的加速度值*        : gyrox,gyroy,gyroz:x,y,z三个方向上面的陀螺仪值*        : roll:横滚角.单位0.01度。 -18000 -> 18000 对应 -180.00  ->  180.00度*        : pitch:俯仰角.单位 0.01度。-9000 - 9000 对应 -90.00 -> 90.00 度*        : yaw:航向角.单位为0.1度 0 -> 3600  对应 0 -> 360.0度* 返回值 : 无**********************************************************************************/ 
void Uart_ReportIMU(short aacx,short aacy,short aacz,short gyrox,short gyroy,short gyroz,short roll,short pitch,short yaw)
{uint8_t i,tx_buf[28]; for(i=0;i<28;i++)tx_buf[i]=0;//清0tx_buf[0]=(aacx>>8)&0xFF;tx_buf[1]=aacx&0xFF;tx_buf[2]=(aacy>>8)&0xFF;tx_buf[3]=aacy&0xFF;tx_buf[4]=(aacz>>8)&0xFF;tx_buf[5]=aacz&0xFF; tx_buf[6]=(gyrox>>8)&0xFF;tx_buf[7]=gyrox&0xFF;tx_buf[8]=(gyroy>>8)&0xFF;tx_buf[9]=gyroy&0xFF;tx_buf[10]=(gyroz>>8)&0xFF;tx_buf[11]=gyroz&0xFF;	tx_buf[18]=(roll>>8)&0xFF;tx_buf[19]=roll&0xFF;tx_buf[20]=(pitch>>8)&0xFF;tx_buf[21]=pitch&0xFF;tx_buf[22]=(yaw>>8)&0xFF;tx_buf[23]=yaw&0xFF;Uart_SendDat_ToPC(0xAF,tx_buf,28);//匿名四轴飞控显示帧,0xAF
} 

完成MPU6050的移植和串口协议的编写后,我们即可使用keil进行编译下载。打开匿名四轴上位机V2.6版本,打开串口即可看到交互界面:

可以看到在我们移植文件中已经移植了MPU6050的DMP功能,可以直接解算出pitch,roll,yaw的欧拉角,是非常方便的。

 

后续结合蓝牙的功能可以实现很多好玩的案例:计步器,空中鼠标,3D游戏手柄,3D遥控器,手势遥控器 等等。

这篇关于nRF52832-Bluefruit52学习之外设开发(1)-- MPU6050六轴模块的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/621465

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof