The finished code for JY61---MPU6050

Dependencies:   mbed

gyro.cpp

Committer:
Charlie_He
Date:
2018-06-02
Revision:
0:68d5307f4eba

File content as of revision 0:68d5307f4eba:

#include "gyro.h"

#define IMU_TX_PINMAP p28
#define IMU_RX_PINMAP p27
Serial device(IMU_TX_PINMAP, IMU_RX_PINMAP);  // tx, rx
Serial pc(USBTX,USBRX);
unsigned char Re_buf[11],counter=0;
unsigned char sign=0;
float a[3],w[3],angle[3],T;
float yaw = 0;
void output();
void deviceEvent() {
    Re_buf[counter]=(unsigned char)device.getc();
    if(counter==0&&Re_buf[0]!=0x55) return;      //第0号数据不是帧头              
    counter++;       
    if(counter==11)             //接收到11个数据
    {    
       counter=0;               //重新赋值,准备下一帧数据的接收 
       sign=1;
    }
    output();
}

void output()
{
    if(sign)
  {  
     sign=0;
     if(Re_buf[0]==0x55)      //检查帧头
    {  
    for (int i=0;i<10;i++)
    /*
    {pc.printf("%d",Re_buf[i]);}
    pc.printf("\n"}*/
  switch(Re_buf [1])
    {
    static float lastYaw = 0;
    static float turnNum = 0;
    case 0x51:
        a[0] = (short(Re_buf [3]<<8| Re_buf [2]))/32768.0*16;
        a[1] = (short(Re_buf [5]<<8| Re_buf [4]))/32768.0*16;
        a[2] = (short(Re_buf [7]<<8| Re_buf [6]))/32768.0*16;
        T = (short(Re_buf [9]<<8| Re_buf [8]))/340.0+36.25;
        break;
    case 0x52:
        w[0] = (short(Re_buf [3]<<8| Re_buf [2]))/32768.0*2000;
        w[1] = (short(Re_buf [5]<<8| Re_buf [4]))/32768.0*2000;
        w[2] = (short(Re_buf [7]<<8| Re_buf [6]))/32768.0*2000;
        T = (short(Re_buf [9]<<8| Re_buf [8]))/340.0+36.25;
        break;
    case 0x53:
        double yaw_;
        yaw_ = Re_buf[7] << 8 | Re_buf[6];
        yaw_ = yaw_ / 32768.0 * 180;
        if(lastYaw < 90 && yaw_ > 270){turnNum -= 1;}
        else if(lastYaw > 270 && yaw_ < 90){turnNum += 1;}
        lastYaw = yaw_;
        yaw = yaw_ + 360*turnNum;
        pc.printf("      %8.2f\n", yaw_+360*turnNum);
        angle[0] = (short(Re_buf [3]<<8| Re_buf [2]))/32768.0*180;
        angle[1] = (short(Re_buf [5]<<8| Re_buf [4]))/32768.0*180;
        angle[2] = (short(Re_buf [7]<<8| Re_buf [6]))/32768.0*180;
        T = (short(Re_buf [9]<<8| Re_buf [8]))/340.0+36.25;
               /* pc.printf("a:");
                pc.printf("%d",a[0]);pc.printf(" ");
                pc.printf("%d",a[1]);pc.printf(" ");
                pc.printf("%d\n",a[2]);pc.printf(" ");
                pc.printf("w:");
                pc.printf("%d",w[0]);pc.printf(" ");
                pc.printf("%d",w[1]);pc.printf(" ");
                pc.printf("%d\n",w[2]);pc.printf(" ");
                pc.printf("angle:");
                pc.printf("%d",angle[0]);pc.printf(" ");
                pc.printf("%d",angle[1]);pc.printf(" ");
                pc.printf("%d\n",angle[2]);pc.printf(" ");
                pc.printf("T:");*/
                break;
    } 
    }
  } 
}

void init_gyro(){
   device.baud(115200);
   device.attach(&deviceEvent, device.RxIrq);
}