搜索
bottom↓
回复: 2

Arduino读取MPU6050数据

[复制链接]

出0入0汤圆

发表于 2015-10-1 14:10:43 | 显示全部楼层 |阅读模式
平台:Arduino DUE
环境:Arduino IDE 1.6.5
Sensor:MPU6050模块
参考:http://www.amobbs.com/forum.php? ... 4011&highlight=源码%2BMPU6050

/***********************************
* MPU6050 6-axis sensor lib
**********************************/

#include <Wire.h>

//#define Serial        Serial                        //Specify the serial port you used

#define MPU6050_ADDRESS 0x68        //Device slave address
/*********************************
  * MPU6050 Registers
  */
enum {
    MPU6050_WHO_AM_I = 0x75,
    MPU6050_GYRO_OUT = 0x43,  //Gyroscope data register(6 bytes)
    MPU6050_ACC_OUT  = 0x3B,  //Accelerater data register(6 bytes)
    MPU6050_TEMP_OUT = 0x41,  //Temperature data register(2 bytes)
   
    MPU6050_RA_ACCEL_XOUT_H = 0x3B,
    MPU6050_RA_ACCEL_XOUT_L = 0x3C,
    MPU6050_RA_ACCEL_YOUT_H = 0x3D,
    MPU6050_RA_ACCEL_YOUT_L = 0x3E,
    MPU6050_RA_ACCEL_ZOUT_H = 0x3F,
    MPU6050_RA_ACCEL_ZOUT_L = 0x40,
    MPU6050_RA_TEMP_OUT_H = 0x41,
    MPU6050_RA_TEMP_OUT_L = 0x42,
    MPU6050_RA_GYRO_XOUT_H = 0x43,
    MPU6050_RA_GYRO_XOUT_L = 0x44,
    MPU6050_RA_GYRO_YOUT_H = 0x45,
    MPU6050_RA_GYRO_YOUT_L = 0x46,
    MPU6050_RA_GYRO_ZOUT_H = 0x47,
    MPU6050_RA_GYRO_ZOUT_L = 0x48,
       
          MPU6050_RA_PWR_MGMT_1 = 0x6B,        //Wakeup sensor
          MPU6050_RA_SMPLRT_DIV = 0x19,        //Gyroscope reslution set reg
          MPU6050_RA_CONFIG          = 0x1A,        //Chip config
          MPU6050_RA_ACCEL_CONFIG = 0x1C,        //Accel config
          MPU6050_RA_GYRO_CONFIG = 0x1B        //Gyro config
       
  };

enum {
    BIT_0 = 0,
    BIT_1,
    BIT_2,
    BIT_3,
    BIT_4,
    BIT_5,
    BIT_6,
    BIT_7
  };

void MPU6050_Init(void);
int MPU6050ReadID(void);
int MPU6050ReadTemp(short *tempData);
int MPU6050ReadGyro(short *gyroData);
int MPU6050ReadAcc(short *accData);
void MPU6050Reset(void);
void writeByte(unsigned char reg, unsigned char data);

/********************************
* Wirte data to a register
*/
void writeByte(unsigned char reg, unsigned char data)
{
        Wire.beginTransmission(MPU6050_ADDRESS);
    Wire.write(reg);
    Wire.write(data);
        Wire.endTransmission();
}

/********************************
* Read data from chip
*/
int readData(unsigned char reg, unsigned char len, unsigned char *buff)
{
        unsigned char i = 0;
       
        if(!len)
                return -1;
       
        Wire.beginTransmission(MPU6050_ADDRESS);
        Wire.write(reg);
        Wire.endTransmission();
       
        Wire.requestFrom(MPU6050_ADDRESS, len);
        delay(1);
        if(len == Wire.available()) {
                for(i = 0; i < len; i++) {
                        *(buff + i) = Wire.read();
                }
               
                return len;
        }
       
        return -1;
}

/********************************
* Reset chip
*/
void MPU6050Reset(void)
{
       
}

/********************************
* Chip init
*/
void MPU6050_Init(void)
{
        Wire.begin();
        delay(10);
        writeByte(MPU6050_RA_PWR_MGMT_1, 0x00);                //Wakeup chip
        writeByte(MPU6050_RA_SMPLRT_DIV, 0x07);                //Gyroscope reslution
        writeByte(MPU6050_RA_CONFIG, 0x06);
        writeByte(MPU6050_RA_ACCEL_CONFIG, 0x01);        //Accelerater work at 16G mode
        writeByte(MPU6050_RA_GYRO_CONFIG, 0x18);        //Gyroscope self test off & set range to 2000deg/s
}

/********************************
* Read chip id
*/
int MPU6050ReadID(unsigned char *id)
{
        if (1 == readData(MPU6050_WHO_AM_I, 1, id)) { //Read the chip ID
                return 0;
        }
       
        return -1;
}

/********************************
* Read temperature
*/
int MPU6050ReadTemp(short *tempData)
{
        unsigned char buff[2] = {0};
        if (2 == readData(MPU6050_TEMP_OUT, 2, buff)) {
                *tempData = (buff[0] << 8) | buff[1];
                *tempData = (((double) (*tempData + 13200)) / 280.0) - 13;
               
                return 0;
        }
       
        return -1;
}

/********************************
* Read gyroscope data
*/
int MPU6050ReadGyro(short *gyroData)
{
        unsigned char buff[6] = {0};
        if (6 == readData(MPU6050_GYRO_OUT, 6, buff)) {
                *(gyroData) = (buff[0] << 8) | buff[1];
                *(gyroData + 1) = (buff[2] << 8) | buff[3];
                *(gyroData + 2) = (buff[4] << 8) | buff[5];
               
                return 0;
        }
       
        return -1;
}

/********************************
* Read accelerater data
*/
int MPU6050ReadAcc(short *accData)
{
                unsigned char buff[6] = {0};
        if (6 == readData(MPU6050_ACC_OUT, 6, buff)) {
                *(accData) = (buff[0] << 8) | buff[1];
                *(accData + 1) = (buff[2] << 8) | buff[3];
                *(accData + 2) = (buff[4] << 8) | buff[5];
               
                return 0;
        }
       
        return -1;
}


以下为主程序:
/***********************************
* Test MPU6050 6-axis sensor
**********************************/
extern void MPU6050_Init(void);
extern int MPU6050ReadID(void);
extern int MPU6050ReadTemp(short *tempData);
extern int MPU6050ReadGyro(short *gyroData);
extern int MPU6050ReadAcc(short *accData);
extern void MPU6050Reset(void);

short accelData[3] = {0};
short gyroData[3] = {0};
short temp = 0;
unsigned char id = 0;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  MPU6050_Init();
  delay(10);
  if (!MPU6050ReadID(&id)) {
    Serial.print("Chip ID: ");
    Serial.println(id, DEC);  
  } else {
    Serial.println("Can not read chip id!");
    for(;;);
  }
  delay(100);
}

void loop() {
  // put your main code here, to run repeatedly:
  if(!MPU6050ReadTemp(&temp) &&
     !MPU6050ReadGyro(gyroData) &&
     !MPU6050ReadAcc(accelData)) {
         Serial.print("Accel data x: ");
         Serial.print(accelData[0], DEC);
         Serial.print(" y: ");
         Serial.print(accelData[1], DEC);
         Serial.print(" z: ");
         Serial.println(accelData[2], DEC);

         Serial.print("Gyro data x: ");
         Serial.print(gyroData[0], DEC);
         Serial.print(" y: ");
         Serial.print(gyroData[1], DEC);
         Serial.print(" z: ");
         Serial.println(gyroData[2], DEC);

         Serial.print("Temp data: ");
         Serial.print(temp, DEC);
         Serial.println(" 'C");
  }

  delay(50);
}


读出的数据还需要转换,

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-10-1 19:08:32 | 显示全部楼层
不错,可以参考

出0入0汤圆

发表于 2015-11-19 09:45:49 | 显示全部楼层
谢谢分享
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 10:09

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表