|
平台: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
|