步驟1:MPU-6050模塊
MPU-6050模塊具有8個引腳,
INT:中斷數字輸出引腳。
AD0: I2C從地址LSB引腳。這是設備7位從機地址中的第0位。如果連接到VCC,則將其讀為邏輯1,并且從機地址更改。
XCL:輔助串行時鐘引腳。此引腳用于將其他具有I2C接口功能的傳感器SCL引腳連接到MPU-6050。
XDA:輔助串行數據引腳。該引腳用于將其他啟用I2C接口的傳感器SDA引腳連接到MPU-6050。
SCL:串行時鐘引腳。將此引腳連接到微控制器的SCL引腳。 SDA:串行數據引腳。將此引腳連接到微控制器的SDA引腳。
GND:接地引腳。將此引腳接地。
VCC:電源引腳。將此引腳連接到+ 5V DC電源。 MPU-6050模塊的從站地址(當AD0 = 0時,即未連接到Vcc)為
從站寫地址(SLA + W): 0xD0
從站讀取地址(SLA + R): 0xD1
步驟2:計算
MPU6050模塊的陀螺儀和加速度計傳感器數據由2的補碼形式的16位原始數據組成。
MPU6050模塊的溫度傳感器數據由16位數據組成(不是2的補碼形式)。
現在假設我們選擇了
-加速度計滿量程范圍+/- 2g,靈敏度比例因子為16,384 LSB(Count)/g。
-陀螺儀的滿量程范圍為+/- 250°/s,靈敏度比例因子為131 LSB(計數)/°/s。然后,
要獲取傳感器原始數據,我們首先需要對加速度計和陀螺儀的傳感器數據進行2的補碼運算。在獲得傳感器原始數據之后,我們可以通過將傳感器原始數據除以它們的靈敏度比例因子來計算加速度和角速度,方法如下:
以g(g力)計的加速度計值
ul》
沿X軸的加速度=(加速度計X軸原始數據/16384)g。
沿Y軸的加速度=(加速度計Y軸原始數據/16384)g。
沿Z軸的加速度=(加速度計Z軸原始數據/16384)g。
陀螺儀值,以°/s(每秒度)為單位
沿X軸的角速度=(陀螺儀X軸原始數據/131)°/s。
沿Y軸的角速度=(陀螺儀Y軸原始數據/131)°/s。
沿Z軸的角速度=(陀螺儀Z軸原始數據/131)°/s。
以°/c為單位的溫度值(每度攝氏度)
以攝氏度為單位的溫度=((溫度傳感器數據)/340 + 36.53)°/c。
例如
假設在2‘補碼之后得到加速度計X軸原始值= +15454
然后Ax = +15454/16384 = 0.94 g。
更多
所以我們知道我們在+/- 2G和+/- 250deg/s的靈敏度下運行,但是我們的值如何與這些加速度/角度相對應。
這兩者都是直線圖,我們可以從中得出結果,對于1G,我們將讀取16384,對于1deg/sec,我們將讀取131.07(盡管由于二進制,0.07將被忽略),這些值只是通過繪制直線圖得出的在32767時2G在-32768時為-2G,在250/-250時為-2G。
所以現在我們知道了靈敏度值(16384和131.07),我們只需要減去這些值的偏移量即可。然后
這些對于X和Y值都適用,但是由于Z記錄為1G而不是0,因此在除以靈敏度之前,我們需要減去1G(16384)。
步驟3:MPU6050-Atmega328p連接
。..
連接如下:-
MPU6050 《======》 Arduino Nano。
VCC 《====== 》 5v輸出引腳
GND 《======》接地引腳
SDA 《======》 A4引腳//串行數據
SCL 《======》 A5引腳//串行時鐘
俯仰和橫滾計算:
滾動是圍繞旋轉x軸和螺距是沿y軸的旋轉。
結果以弧度為單位。 (乘以180并除以pi即可轉換為度)
步驟4:代碼和說明
#include
const int MPU=0x68; //I2C address of the MPU-6050
int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ; //16-bit integers
int AcXcal,AcYcal,AcZcal,GyXcal,GyYcal,GyZcal,tcal; //calibration variables
double t,tx,tf,pitch,roll;
void setup()
{
Wire.begin(); //initiate wire library and I2C
Wire.beginTransmission(MPU); //begin transmission to I2C slave device
Wire.write(0x6B); // PWR_MGMT_1 register
Wire.write(0); // set to zero (wakes up the MPU-6050)
Wire.endTransmission(true); //ends transmission to I2C slave device
Serial.begin(9600); //serial communication at 9600 bauds
}
void loop()
{
Wire.beginTransmission(MPU); //begin transmission to I2C slave device
Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H)
Wire.endTransmission(false); //restarts transmission to I2C slave device
Wire.requestFrom(MPU,14,true); //request 14 registers in total
//Acceleration data correction
AcXcal = -950;
AcYcal = -300;
AcZcal = 0;
//Temperature correction
tcal = -1600;
//Gyro correction
GyXcal = 480;
GyYcal = 170;
GyZcal = 210;
//read accelerometer data
AcX=Wire.read()《《8|Wire.read(); // 0x3B (ACCEL_XOUT_H) 0x3C (ACCEL_XOUT_L)
AcY=Wire.read()《《8|Wire.read(); // 0x3D (ACCEL_YOUT_H) 0x3E (ACCEL_YOUT_L)
AcZ=Wire.read()《《8|Wire.read(); // 0x3F (ACCEL_ZOUT_H) 0x40 (ACCEL_ZOUT_L)
//read temperature data
Tmp=Wire.read()《《8|Wire.read(); // 0x41 (TEMP_OUT_H) 0x42 (TEMP_OUT_L)
//read gyroscope data
GyX=Wire.read()《《8|Wire.read(); // 0x43 (GYRO_XOUT_H) 0x44 (GYRO_XOUT_L)
GyY=Wire.read()《《8|Wire.read(); // 0x45 (GYRO_YOUT_H) 0x46 (GYRO_YOUT_L)
GyZ=Wire.read()《《8|Wire.read(); // 0x47 (GYRO_ZOUT_H) 0x48 (GYRO_ZOUT_L)
//temperature calculation
tx = Tmp + tcal;
t = tx/340 + 36.53; //equation for temperature in degrees C from datasheet
tf = (t * 9/5) + 32; //fahrenheit
//get pitch/roll
getAngle(AcX,AcY,AcZ);
//printing values to serial port
Serial.print(“Angle: ”);
Serial.print(“Pitch = ”); Serial.print(pitch);
Serial.print(“ Roll = ”); Serial.println(roll);
Serial.print(“Accelerometer: ”);
Serial.print(“X = ”); Serial.print(AcX + AcXcal);
Serial.print(“ Y = ”); Serial.print(AcY + AcYcal);
Serial.print(“ Z = ”); Serial.println(AcZ + AcZcal);
Serial.print(“Temperature in celsius = ”); Serial.print(t);
Serial.print(“ fahrenheit = ”); Serial.println(tf);
Serial.print(“Gyroscope: ”);
Serial.print(“X = ”); Serial.print(GyX + GyXcal);
Serial.print(“ Y = ”); Serial.print(GyY + GyYcal);
Serial.print(“ Z = ”); Serial.println(GyZ + GyZcal);
delay(1000);
}
//function to convert accelerometer values into pitch and roll
void getAngle(int Ax,int Ay,int Az)
{
double x = Ax;
double y = Ay;
double z = Az; pitch = atan(x/sqrt((y*y) + (z*z))); //pitch calculation
roll = atan(y/sqrt((x*x) + (z*z))); //roll calculation
//converting radians into degrees
pitch = pitch * (180.0/3.14);
roll = roll * (180.0/3.14) ;
}
-----------------------------------------------------------------------------------------------
Results:-
--------------------------------------------------------------------------------------
Angle: Pitch = 88.89 Roll = -0.47
Accelerometer: X = 15974 Y = -440 Z = 312
Temperature in celsius = 29.38 fahrenheit = 84.88
Gyroscope: X = -111 Y = 341 Z = 211
Angle: Pitch = 89.41 Roll = -0.27
Accelerometer: X = 16102 Y = -380 Z = 172
Temperature in celsius = 29.42 fahrenheit = 84.96
Gyroscope: X = -115 Y = 373 Z = 228
Angle: Pitch = 89.28 Roll = -0.34
Accelerometer: X = 16058 Y = -400 Z = 204
Temperature in celsius = 29.42 fahrenheit = 84.96
Gyroscope: X = -98 Y = 354 Z = 224
Angle: Pitch = 88.83 Roll = -0.54
Accelerometer: X = 15978 Y = -460 Z = 320
Temperature in celsius = 29.33 fahrenheit = 84.79
Gyroscope: X = -124 Y = 376 Z = 207
Angle: Pitch = 89.21 Roll = -0.31
Accelerometer: X = 15978 Y = -392 Z = 228
Temperature in celsius = 29.42 fahrenheit = 84.96
Gyroscope: X = -121 Y = 364 Z = 189
Angle: Pitch = 89.00 Roll = -0.56
Accelerometer: X = 15890 Y = -464 Z = 260
Temperature in celsius = 29.38 fahrenheit = 84.88
Gyroscope: X = -111 Y = 361 Z = 221
Angle: Pitch = 88.67 Roll = -0.65
Accelerometer: X = 16018 Y = -492 Z = 360
Temperature in celsius = 29.38 fahrenheit = 84.88
Gyroscope: X = -130 Y = 340 Z = 216
Angle: Pitch = 88.53 Roll = -0.43
Accelerometer: X = 16110 Y = -428 Z = 432
Temperature in celsius = 29.42 fahrenheit = 84.96
Gyroscope: X = -92 Y = 380 Z = 217
Angle: Pitch = 88.85 Roll = -0.60
Accelerometer: X = 15930 Y = -476 Z = 304
Temperature in celsius = 29.47 fahrenheit = 85.05
Gyroscope: X = -102 Y = 374 Z = 219
Angle: Pitch = 88.87 Roll = -0.24
Accelerometer: X = 16222 Y = -372 Z = 344
Temperature in celsius = 29.52 fahrenheit = 85.13
Gyroscope: X = -96 Y = 351 Z = 226
Angle: Pitch = 89.05 Roll = -0.26
Accelerometer: X = 15970 Y = -376 Z = 284
Temperature in celsius = 29.38 fahrenheit = 84.88
Gyroscope: X = -105 Y = 367 Z = 201
Angle: Pitch = 89.13 Roll = -0.62
Accelerometer: X = 16034 Y = -484 Z = 200
Temperature in celsius = 29.52 fahrenheit = 85.13
Gyroscope: X = -110 Y = 391 Z = 207
Angle: Pitch = 88.98 Roll = -0.51
Accelerometer: X = 16178 Y = -452 Z = 280
Temperature in celsius = 29.47 fahrenheit = 85.05
Gyroscope: X = -117 Y = 379 Z = 221
Angle: Pitch = 89.27 Roll = -0.43
Accelerometer: X = 16066 Y = -428 Z = 192
Temperature in celsius = 29.42 fahrenheit = 84.96
Gyroscope: X = -101 Y = 359 Z = 208
Angle: Pitch = 89.31 Roll = -0.19
Accelerometer: X = 16150 Y = -356 Z = 212
Temperature in celsius = 29.52 fahrenheit = 85.13
Gyroscope: X = -115 Y = 361 Z = 189
Angle: Pitch = 88.76 Roll = -0.51
Accelerometer: X = 16026 Y = -452 Z = 348
Temperature in celsius = 29.42 fahrenheit = 84.96
Gyroscope: X = -139 Y = 368 Z = 192
Angle: Pitch = 88.57 Roll = -0.69
Accelerometer: X = 16086 Y = -504 Z = 388
Temperature in celsius = 29.33 fahrenheit = 84.79
Gyroscope: X = -118 Y = 352 Z = 214
步驟5:了解傾斜角
加速度計
地球的重力是恒定的加速度,力始終指向降到地球中心。
當加速度計與重力平行時,測得的加速度將為1G,當加速度計與重力垂直時,加速度將為0G。
傾斜角可以使用以下公式從測量的加速度中計算出:
θ= sin-1(測量的加速度/重力加速度)
陀螺儀
陀螺儀(又稱速率傳感器)用于測量角速度(ω)。
為了獲得機器人的傾斜角,我們需要將陀螺儀的數據如下式所示:
ω=dθ/dt,
θ=∫ωdt
Gyro和加速度傳感器Fusio n
在研究了陀螺儀和加速度計的特性之后,我們知道它們各有優缺點。根據加速度計數據計算出的傾斜角具有較慢的響應時間,而根據陀螺儀數據計算出的積分傾斜角會在一段時間內發生漂移。換句話說,可以說加速度計數據對長期有用,而陀螺儀數據對短期有用。
責任編輯:wv
-
陀螺儀
+關注
關注
44文章
769瀏覽量
98193 -
加速度計
+關注
關注
6文章
693瀏覽量
45735
發布評論請先 登錄
相關推薦
評論