基于STM32的无线飞鼠(二)
基于STM32的无线飞鼠(二)
在前一篇博客中讲了下一些题外话,从本篇开始讲讲重点的知识,说说无线飞鼠过程用到的模块
细说MPU6050
- 一、 MPU6050简介
- 二、 细节问题
- 三、 相关技术
- 四、 操作步骤
- 五、 实现代码
一、 MPU6050简介
MPU6050集成了3轴加速度和3轴陀螺仪,是一款不错的传感器模块,可以用在很多方面,比如:四轴飞控、空中鼠标、两轮平衡车、GPS定位方面、游戏机、3D遥控器、平板设备等等,此模块给我们提供了强大的数据供应,由于将加速度和陀螺仪集成到了一起,免去了组合这两个模块时之间的轴差问题,减少了包装问题,这两年很火,成了DIY制作者的最爱。
二、 细节问题
在淘宝上买MPU6050时,要注意一下几点:
- 查看卖家给出的介绍信息,是否刻意夸大,结合自己所学的知识进行判断。比如:当时在某个论坛上看到某位大神将的,tb上说他们的模块采用高性能的微处理器和先进的动力学解算与卡尔曼动态滤波算法,能够快速求解出模块当前的实时运动姿态。细心的你就会发现它的这种处理器根本就不能提供这种需求,也就是会所计算不出来。(STM8是8位的单片机,能做姿态解算和滤波吗?)呵呵……想了下都有点搞笑.这个论坛上有详细的解说:http://www.geek-workshop.com/thread-5820-1-1.html
- 不要让模块受到碰撞,否则会影响他的性能。
三、相关技术
MPU6050数据是用IIC进行读取的,So必须学会IIC。类似于USB协议,不过和USB比起来可以说是小巫见大巫。
- IIC技术概述
IIC 即Inter-Integrated Circuit(集成电路总线),这种总线类型是 由飞利浦半导体公司在八十年代初设计出来的两线式串行总线
特点:接口线少、器件封装形式小、通信速率较高
IIC总线只有两根双向信号线,如下图所示:
- IIC数据传输
数据有效位的定义:
IIC总线在进行数据传输时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线的高电平或低电平状态才允许变化
起始和停止条件:
当SCL线是高电平时,SDA线从高电平向低电平切换,这个情况视为起始条件。
当SCL线是高电平时,SDA线有低电平向高电平切换,表示停止条件
数据传输格式:
IIC总线寻址
IIC总线规定:从机地址有第一个字节的7位组成
(想要插入表格,可是在这里不会用了,直接从world中截张图算了)
IIC总线编号
从机的地址有固定部分和可编程部分组成。在一个系统中可能希望接入多个相同的从机,从机地址中科编程部分决定了可接入总线该类期间的最大数目例如:一个从机的7位寻址中有4为是固定的,3位是可编程的,那个这时仅能寻址8个同类期间。
STM32F103中的IIC
这里主要看下载STM32中,IIC是怎么个分布:
四、操作步骤
- 熟悉MPU6050管脚
上图是我自己的模块,由于连上了线,管脚不是很清楚,可以看着一张,管脚和清楚的。
- 管脚功能介绍
这里已经很详细的介绍了各个管脚的功能,在心里就有个大概了解,在后面编写代码中就会明白好多,更多细节可以查看手册的!
五、实现代码
当时开始做这个东西的时候参考了原子、野火的各个例子,再次感谢你们。
代码块
MPU初始化:
void MPU_Init()
{ANBT_I2C_Configuration(); //IIC初始化delay_ms(30);AnBT_DMP_MPU6050_Init(); //MPU6050 的DMP初始化
}
下边是读取陀螺仪的数据函数:
void Read_Gyro_data(short *rxbuf)
{unsigned long sensor_timestamp;unsigned char i = 0;short gyro[3], accel[3], sensors;//陀螺仪存放数组,加速度存放数组,返回状态量unsigned char more;long quat[4]; //四元数存放数组dmp_read_fifo(gyro, accel, quat, &sensor_timestamp, &sensors,&more);if(sensors & INV_WXYZ_QUAT){rxbuf[0] = gyro[0];rxbuf[1] = gyro[1];rxbuf[2] = gyro[2];printf("\r\nRead_Gyro_data gyro:\r\n");for (i = 0; i < 3; i++){printf(" %d ",gyro[i]);}printf("\r\n");}
}
其实参考了圆点博士的开源代码的,看了下匿名四轴下位机协议,当初试了下自己获取的数据是否正确,很不错的,下面是匿名的协议:
/** 函数名:Data_Send_Status* 描述 :数据发送 传感器 的状态根据匿名四轴最新上位机编写的显示姿态的程序* 输入 :Pitch:俯仰角Roll :横滚角Yaw :航向角gyro :陀螺仪accel:加速度* 输出 :* 调用 :*/
void Data_Send_Status(float Pitch,float Roll,float Yaw,int16_t *gyro,int16_t *accel)
{unsigned char i = 0;unsigned char j = 0;unsigned char _cnt = 0,sum = 0;unsigned int _temp;u8 data_to_send[12] = {0}; //发送数组,初始化为0data_to_send[_cnt++] = 0xAA; // 帧头 170data_to_send[_cnt++] = 0xAA; // 170data_to_send[_cnt++] = 0x01; // 功能字 1data_to_send[_cnt++] = 0; // 长度 0//横滚角_temp = (int)(Roll * 100); data_to_send[_cnt++] = BYTE1(_temp); // 高 8 位data_to_send[_cnt++] = BYTE0(_temp); // 低8位//俯仰角_temp = 0 - (int)(Pitch * 100);data_to_send[_cnt++] = BYTE1(_temp);data_to_send[_cnt++] = BYTE0(_temp);//航向角_temp = (int)(Yaw * 100);data_to_send[_cnt++] = BYTE1(_temp);data_to_send[_cnt++] = BYTE0(_temp);data_to_send[3] = _cnt - 4; //数据长度//和校验for(i = 0;i < _cnt;i++)sum += data_to_send[i];data_to_send[_cnt++] = sum;data_to_send[_cnt++] = '\0';//NRF_Tx_Dat(data_to_send); //发送到NRF缓冲区//printf("\r\nData_Send_Status:\r\n");
// for (j = 0; j < 12;j++)
// {// printf(" %d ",data_to_send[j]);
// }// printf("\r\n");
// //串口发送数据for(i=0;i<_cnt;i++)AnBT_Uart1_Send_Char(data_to_send[i]);}/** 函数名:Send_Data* 描述 :用于发送传感器的数据* 输入 :Gyro:陀螺仪存放字符指针Accel:加速度存放指针* 输出 :* 调用 :*/
void Send_Data(int16_t *Gyro,int16_t *Accel)
{unsigned char j = 0;unsigned char i = 0;unsigned char _cnt = 0;unsigned char sum = 0;u8 status;
// unsigned int _temp;/*匿名数据协议:帧头、功能字、长度(len)、数据、校验和(Sum) 共32字节接收端在接收到数据的时候进行对应的解析即可*/u8 data_to_send[12];data_to_send[_cnt++] = 0xAA; //帧头 AAAAdata_to_send[_cnt++] = 0xAA; data_to_send[_cnt++] = 0x02; //功能字data_to_send[_cnt++] = 0; //长度data_to_send[_cnt++] = BYTE1(Accel[0]);data_to_send[_cnt++] = BYTE0(Accel[0]);data_to_send[_cnt++] = BYTE1(Accel[1]);data_to_send[_cnt++] = BYTE0(Accel[1]);data_to_send[_cnt++] = BYTE1(Accel[2]);data_to_send[_cnt++] = BYTE0(Accel[2]);data_to_send[_cnt++] = BYTE1(Gyro[0]);data_to_send[_cnt++] = BYTE0(Gyro[0]);data_to_send[_cnt++] = BYTE1(Gyro[1]);data_to_send[_cnt++] = BYTE0(Gyro[1]);data_to_send[_cnt++] = BYTE1(Gyro[2]);data_to_send[_cnt++] = BYTE0(Gyro[2]);data_to_send[_cnt++] = 0;data_to_send[_cnt++] = 0;data_to_send[_cnt++] = 0;data_to_send[3] = _cnt - 4;for(i = 0;i < _cnt;i++)sum += data_to_send[i];data_to_send[_cnt++] = sum;data_to_send[_cnt++] = '\0';// printf("\r\nSend_Data:\r\n");
// for (j = 0; j < 12;j++)
// {// printf(" %d ",data_to_send[j]);
// }
// printf("\r\n");
// delay_ms(1000);
// status = NRF_Tx_Dat(data_to_send);
//
// /*判断发送状态*/
// switch(status)
// {// case MAX_RT:
// printf("\r\n 主机端 没接收到应答信号,发送次数超过限定值,发送失败。 \r\n");
// break;// case ERROR:
// printf("\r\n 未知原因导致发送失败。 \r\n");
// break;// case TX_DS:
// printf("\r\n 主机端 接收到 从机端 的应答信号,发送成功! \r\n");
// break;
// }
//
// delay_ms(1000);// //串口发送数据for(i = 0;i <_cnt;i++)AnBT_Uart1_Send_Char(data_to_send[i]);
}
在主函数中调用相应的函数即可获取相关数据,做一个简单的测试。
一下是我从串口中获取的数据:
以及其他数据:
因为代码中使用了圆点博士的开源代码,而且都是现成的,就不往出贴了……
以上只是做了个简单介绍,以及获取到了数据,但是并没有说明怎样处理数据,这是很关键的也是最重要的,本次无线飞鼠的数据不好处理,我做到现在数据也不是很稳定,任然有一定幅度的变化。
欢迎转载、分享,请注明出处,技术在于交流、分享……
博客地址:http://blog.csdn.net/u013704336\
Email:creazylq@163.com
QQ:936563422
目录
- 基于STM32的无线飞鼠二
- 细说MPU6050
- 一 MPU6050简介
- 二 细节问题
- 三相关技术
- 四操作步骤
- 五实现代码
- 代码块
- 目录
基于STM32的无线飞鼠(二)相关推荐
- 基于STM32的无线飞鼠(一)
无线飞鼠(一) 时间过得好快,大三已经过了一半了,这段时间忙的没有更新过博客,回顾下自己这段时间中的收获,感觉蛮多的.下边就一一分享下. 一个月前,接到一个朋友的求助,帮忙做一份毕设,其实本来自己也没 ...
- 基于STM32的无线通信模块使用——A7130
基于STM32的无线通信模块使用-A7130 2.4G Hz的无线通信芯片A7130.本文简单介绍A7130的使用. 注:相关资源在这里 A7130简介 A7130 SPI接口 A7130寄存器配置及 ...
- 基于数字电路交通灯信号灯控制系统设计-基于单片机病房温度监测与呼叫系统设计-基于STM32的无线蓝牙心电监护仪系统设计-基于STM32的智能蓝牙温控风扇控制设计-基于STM32的智能温室控制系统设计
1617基于数字电路交通灯信号灯控制系统设计(仿真电路,论文报告) 摘 要:交通灯控制系统在城市交通控制中发挥着重要的作用,本次课程设计就是以城市交通灯控制系统为背景的,主要通过运用学过的数字电路 ...
- 基于STM32的智能温室控制系统仿真电路设计(温控补光)-基于STM32的智能蓝牙温控风扇控制系统设计-基于STM32的无线蓝牙心电监护仪系统设计【毕设课设分享】
1609 基于STM32的智能蓝牙温控风扇控制系统设计-毕设课设 1.LCD1602液晶显示当前温度,温度上下限值,风扇等级,自动手动模式: 2.设置有4个按键,按键1可以设置自动和手动2种模式切换: ...
- 基于STM32的无线体感仿生机械手的设计与实现
研究目标 设计一款基于STM32的仿生机械手: (1)基于STM32的仿生机械手实现无线控制和有线控制. (2)实现串口指令控制仿生机械手动作. (3)实现仿生机械手具有多种工作模式. (4)实现数据 ...
- 基于STM32的无线抄表系统
目录 一.项目描述 二.原理图 三.实物 四.代码 六.论文 七.资料清单 资料下载地址:基于STM32无线抄表系统 一.项目描述 1.通过串口获取电表数据,并在OLED液晶上显示: 2. 通过ESP ...
- 基于STM32的无线模拟病房呼叫系统
一. 系统设计和框图 本系统主要功能为模拟病房的无线呼叫系统,呼叫端(病床)为从机,被呼叫端(护士站)为主机,系统采用一主多从的通信方式,主机和从机之间采用无线通信方式. 主机端包含OLED显示模块( ...
- 基于STM32的无线通信模块使用——HC_05蓝牙串口
注:以下某些资料来自于该模块淘宝店里有介绍,规格书没找到啊. 模块介绍 PC端配置模块,手机端连接模块 STM32串口配置模块 串口通信 小结 一.模块介绍 1.供电电压3.3V~3.6V: 2.支持 ...
- 【毕业设计】基于STM32的无线WIFI投影设计(解析BMP、TCP通讯)
目录 0 引言 1 硬件设计 框图: 2 软件设计 main.c bitmap.c 3 重点难点(BMP文件格式解析.内存与屏幕显示的对应) 4 写在最后 0 引言 有幸做过一个无线传输的设计,有关B ...
最新文章
- 干货整理!深度学习相关的面试考点
- 计算未来轻沙龙 | AI=知识+推理,知识工程与数据管理专场来了!
- 前端学习(3350):数组方法的运用和数值join
- python md5解密_python写一个md5解密器示例
- 2022年保险行业展望
- 连接查询 左连接 右连接 内连接 1112 sqlserver
- 线性代数的本质-B站视频
- Java 设计模式 之 工厂方法模式、抽象工厂模式
- canvas特效收集
- 2017Final 圆周率山
- mac笔记本怎么外接显示屏_Mac电脑外接显示器全攻略
- java 工作业绩_个人年度工作总结报告java
- 对称NAT穿透的一种新方法
- 华为OD机试(含B卷)真题2023 精简版,50道100分题目。如果距离机考时间不多了,就看这个吧
- 有关在html中修改select标签的option selected默认选中属性实现
- 如何管理比自己强的下属?
- 百度 2021 Lic 机器阅读理解比赛有感
- AT32 MCU Audio 24bit例程
- “澳本聪”是怎么从网红一步步变成“众矢之的”?
- 俄罗斯方块、坦克大决战、雷电、魔法门、冒险岛——别告诉我你懂数组(0)...
热门文章
- Evernote宣布关闭电商平台,重心回迁软件开发
- java 苹果内支付_一款集成支付宝、微信支付的Java源码,支持安卓、苹果,maven项目可以看看。申精...
- JS笔记--day22. 01.jq取消绑定事件
- Linux 测试TCP/UDP端口
- python 函数参数列表_Python 函数可变参数列表*args和**kwargs
- 同一页面多个form提交
- 虚拟现实-VR-UE4-构建光照显示光照构建失败,Swarm启动失败
- CAD for Mac安装教程
- oracle 数据类型的变更无效 clob,ORA-22858数据类型的变更无效 varchar2类型转换为clob类型...
- 台式电脑怎么录屏?分享3个实用方法,简单又好用