1170390 发表于 2015-10-1 14:10:43

Arduino读取MPU6050数据

平台:Arduino DUE
环境:Arduino IDE 1.6.5
Sensor:MPU6050模块
参考:http://www.amobbs.com/forum.php?mod=viewthread&tid=5574011&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 = {0};
        if (2 == readData(MPU6050_TEMP_OUT, 2, buff)) {
                *tempData = (buff << 8) | buff;
                *tempData = (((double) (*tempData + 13200)) / 280.0) - 13;
               
                return 0;
        }
       
        return -1;
}

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

/********************************
* Read accelerater data
*/
int MPU6050ReadAcc(short *accData)
{
                unsigned char buff = {0};
        if (6 == readData(MPU6050_ACC_OUT, 6, buff)) {
                *(accData) = (buff << 8) | buff;
                *(accData + 1) = (buff << 8) | buff;
                *(accData + 2) = (buff << 8) | buff;
               
                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 = {0};
short gyroData = {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, DEC);
         Serial.print(" y: ");
         Serial.print(accelData, DEC);
         Serial.print(" z: ");
         Serial.println(accelData, DEC);

         Serial.print("Gyro data x: ");
         Serial.print(gyroData, DEC);
         Serial.print(" y: ");
         Serial.print(gyroData, DEC);
         Serial.print(" z: ");
         Serial.println(gyroData, DEC);

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

delay(50);
}


读出的数据还需要转换,

AllEle 发表于 2015-10-1 19:08:32

不错,可以参考

kxm2008 发表于 2015-11-19 09:45:49

谢谢分享
页: [1]
查看完整版本: Arduino读取MPU6050数据