您的位置 首页 电子

根据STM32的无线飞鼠(二)

在前一篇博客中讲了下一些题外话,从本篇开始讲讲重点的知识,说说无线飞鼠过程用到的模块细说MPU6050一、MPU6050简介二、细节问题三、…

在前一篇博客中讲了下一些题外话,从本篇开端讲讲要点的常识,说说无线飞鼠进程用到的模块

细说MPU6050

  • 一、 MPU6050简介
  • 二、 细节问题
  • 三、 相关技能
  • 四、 操作过程
  • 五、 完成代码

一、 MPU6050简介

MPU6050集成了3轴加速度和3轴陀螺仪,是一款不错的传感器模块,能够用在许多方面,比方:四轴飞控、空中鼠标、两轮平衡车、GPS定位方面、游戏机、3D遥控器、平板设备等等,此模块给咱们供给了强壮的数据供给,我们将加速度和陀螺仪集成到了一同,免去了组合这两个模块时之间的轴差问题,减少了包装问题,这两年很火,成了DIY制作者的邻居。


二、 细节问题

在淘宝上买MPU6050时,要注意一下几点:

  1. 检查卖家给出的介绍信息,是否故意夸张,结合自己所学的常识进行判别。比方:其时在某个论坛上看到某位大神将的,tb上说他们的模块选用高功用的微处理器和先进的动力学解算与卡尔曼动态滤波算法,能够快速求解出模块其时的实时运动姿势。仔细的你就会发现它的这种处理器底子就不能供给这种需求,也便是会所核算不出来。(STM8是8位的单片机,能做姿势解算和滤波吗?)……想了下都有点搞笑.这个论坛上有具体的阐明:http://www.geek-workshop.com/thread-5820-1-1.html
  2. 不要让模块遭到磕碰,否则会影响他的功用。

三、相关技能

MPU6050数据是用IIC进行读取的,So有必要学会IIC。类似于USB协议,不过和USB比起来能够说是小巫见大巫。

  1. IIC技能概述
    IIC 即Inter-Integrated Circuit(集成电路总线),这种总线类型是 由飞利浦半导体公司在八十年代初规划出来的两线式串行总线
    特色:接口线少、器材封装方式小、通讯速率较高
    IIC总线只要两根双向信号线,如下图所示:
  2. IIC数据传输
    数据有用位的界说:
     IIC总线在进行数据传输时,时钟信号为高电平期间,数据线上的数据有必要保持安稳,只要在时钟线上的信号为低电平期间,数据线的高电平或低电平状况才答应改变
    开端和中止条件:
     当SCL线是高电平时,SDA线从高电平向低电平切换,这个状况视为开端条件。
     当SCL线是高电平时,SDA线有低电平向高电平切换,一共中止条件
    数据传输格局:
  3. IIC总线寻址
    IIC总线规则:从机地址有第一个字节的7位组成
    (想要刺进表格,可是在这儿不会用了,直接从world中截张图算了)

  4. IIC总线编号
    从机的地址有固定部分和可编程部分组成。在一个体系中或许期望接入多个相同的从机,从机地址中科编程部分决议了可接入总线该类期间的最大数目

    例如:一个从机的7位寻址中有4为是固定的,3位是可编程的,那个这时仅能寻址8个同类期间。

  5. STM32F103中的IIC
    这儿首要看下载STM32中,I%&&&&&%是怎样个散布:


四、操作过程

  1. 了解MPU6050管脚

    上图是我自己的模块,我们连上了线,管脚不是很清楚,能够看着一张,管脚和清楚的。

  2. 管脚功用介绍

    这儿现已很具体的介绍了各个管脚的功用,在心里就有个大约了解,在后面编写代码中就会理解很多,更多细节能够检查手册的!


五、完成代码

其时开端做这个东西的时分参阅了原子、野火的各个比如,再次感谢你们。

代码块

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]);}

在主函数中调用相应的函数即可获取相关数据,做一个简略的测验。
一下是我从串口中获取的数据:

以及其他数据:

由于代码中使用了圆点博士的开源代码,并且都是现成的,就不往出贴了……
以上仅仅做了个简略介绍,以及获取到了数据,可是并没有阐明怎样处理数据,这是很要害的也是最重要的,本次无线飞鼠的数据欠好处理,我做到现在数据也不是很安稳,任然有必定承认的改变。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/dianzi/265760.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部