MPU6050原始資料的獲取
阿新 • • 發佈:2019-01-02
MPU6050採用IIC通訊,IIC通訊的結構如下圖
IIC 即Inter-Integrated Circuit(積體電路匯流排),這種匯流排型別是由飛利浦半導體公司在八十年代初設計出來的一種簡單、雙向、二線制、同步序列匯流排,主要是用來連線整體電路(ICS) ,IIC是一種多向控制匯流排,也就是說多個晶片可以連線到同一匯流排結構下,同時每個晶片都可以作為實時資料傳輸的控制源。這種方式簡化了訊號傳輸匯流排介面。
IIC匯流排一共有四根線,分別是VCC,GND,SCL,SDA。SCL的為時鐘線,SDA為資料線。I2C總線上的主裝置與從裝置之間以位元組(8位)為單位進行雙向的資料傳輸。
IICMPU6050資料在暫存器中的地址:
0x3B,加速度計的X軸分量高八位0x3C,加速度計的X軸分量低八位
0x3D,加速度計的Y軸分量高八位
0x3E,加速度計的Y軸分量低八位
0x3F,加速度計的Z軸分量高八位
0x40,加速度計的Z軸分量高八位
0x41,當前溫度TEMP高八位
0x42,當前溫度TEMP低八位
0x43,繞X軸旋轉的角速度高八位
0x44,繞X軸旋轉的角速度低八位
0x45,繞Y軸旋轉的角速度高八位
0x46,繞Y軸旋轉的角速度低八位
0x47,繞Z軸旋轉的角速度高八位
0x48,繞Z軸旋轉的角速度低八位
接下來就是讀出這些資料
接線方式MPU6050 Arduino uno
VCC —— 3.3V/5V
GND —— GND
SCL —— SCL
SDA —— SDA
以下是在ARDUINO上面具體實現程式碼 在Arduino ide 1.81版本編譯通過
#include <Wire.h>
#define ACCEL_XOUT_H 0x3B
#define ACCEL_XOUT_L 0x3C
#define ACCEL_YOUT_H 0x3D
#define ACCEL_YOUT_L 0x3E
#define ACCEL_ZOUT_H 0x3F
#define ACCEL_ZOUT_L 0x40
#define TEMP_OUT_H 0x41
#define TEMP_OUT_L 0x42
#define GYRO_XOUT_H 0x43
#define GYRO_XOUT_L 0x44
#define GYRO_YOUT_H 0x45
#define GYRO_YOUT_L 0x46
#define GYRO_ZOUT_H 0x47
#define GYRO_ZOUT_L 0x48
unsigned char DATA_H, DATA_L;
//float ax,ay,az,gx,gy,gz,temp;
void setup() {
Wire.begin();
Serial.begin(9600);
delay(10);
MPU6050Reset();
}
void loop() {
mpu6050_TEMP_OUT_data();
mpu6050_ACCEL_X_data();
mpu6050_ACCEL_Y_data();
mpu6050_ACCEL_Z_data();
mpu6050_GYRO_X_data();
mpu6050_GYRO_Y_data();
mpu6050_GYRO_Z_data() ;
Serial.print(" ACCEL_X "); Serial.print(mpu6050_ACCEL_X_data()); Serial.print(",");
Serial.print(" ACCEL_Y "); Serial.print(mpu6050_ACCEL_Y_data()); Serial.print(",");
Serial.print(" ACCEL_Z "); Serial.print(mpu6050_ACCEL_Z_data()); Serial.print(",");
Serial.print(" GYRO_X "); Serial.print(mpu6050_GYRO_X_data()); Serial.print(",");
Serial.print(" GYRO_Y "); Serial.print(mpu6050_GYRO_Y_data()); Serial.print(",");
Serial.print(" GYRO_Z "); Serial.print(mpu6050_GYRO_Z_data()); Serial.print(",");
Serial.print(" TEMP_OUT ");Serial.print(mpu6050_TEMP_OUT_data());
Serial.println();
}
void MPU6050Write(unsigned char adr, unsigned char dat)
{
Wire.beginTransmission(0x68); //開啟MPU6050的傳輸
Wire.write(adr); //指定暫存器地址
Wire.write(dat); //寫入一個位元組的資料
Wire.endTransmission(true); //結束傳輸,true表示釋放匯流排
}
void MPU6050Reset()
{
MPU6050Write(0x6B, 0x00);
MPU6050Write(0x19, 0x07);
MPU6050Write(0x1A, 0x06);
MPU6050Write(0x1B, 0x18); //2000
MPU6050Write(0x1C, 0x10); //4g
/*暫存器的設定參考此文章http://blog.sina.com.cn/s/blog_8240cbef01018i10.html */
}
unsigned char ReadMPUReg(int nReg) {
Wire.beginTransmission(0x68);
Wire.write(nReg);
Wire.requestFrom(0x68, 1, true);
Wire.endTransmission(true);
return Wire.read();
}
//讀 加速度計X軸 資料
int mpu6050_ACCEL_X_data()
{
DATA_H = ReadMPUReg(ACCEL_XOUT_H);
DATA_L = ReadMPUReg(ACCEL_XOUT_L);
return (DATA_H << 8) + DATA_L;
}
//讀 加速度計Y軸 資料
int mpu6050_ACCEL_Y_data()
{
DATA_H = ReadMPUReg(ACCEL_YOUT_H);
DATA_L = ReadMPUReg(ACCEL_YOUT_L);
return (DATA_H << 8) + DATA_L;
}
//讀 加速度計Z軸 資料
int mpu6050_ACCEL_Z_data()
{
DATA_H = ReadMPUReg(ACCEL_ZOUT_H);
DATA_L = ReadMPUReg(ACCEL_ZOUT_L);
return (DATA_H << 8) + DATA_L;
}
//讀 陀螺儀計X軸 資料
int mpu6050_GYRO_X_data()
{
DATA_H = ReadMPUReg(GYRO_XOUT_H);
DATA_L = ReadMPUReg(GYRO_XOUT_L);
return (DATA_H << 8) + DATA_L;
}
//讀 陀螺儀計Y軸 資料
int mpu6050_GYRO_Y_data()
{
DATA_H = ReadMPUReg(GYRO_YOUT_H);
DATA_L = ReadMPUReg(GYRO_YOUT_L);
return (DATA_H << 8) + DATA_L;
}
//讀 陀螺儀計Z軸 資料
int mpu6050_GYRO_Z_data()
{
DATA_H = ReadMPUReg(GYRO_ZOUT_H);
DATA_L = ReadMPUReg(GYRO_ZOUT_L);
return (DATA_H << 8) + DATA_L;
}
//讀 溫度 資料
int mpu6050_TEMP_OUT_data()
{
DATA_H = ReadMPUReg(TEMP_OUT_H);
DATA_L = ReadMPUReg(TEMP_OUT_L);
return (DATA_H << 8) + DATA_L;
}
//by Sunlife
在ide裡面選擇串列埠監視器可以看見資料
波特率設為9600