-
Notifications
You must be signed in to change notification settings - Fork 0
/
MPU6050.ino
71 lines (61 loc) · 2.48 KB
/
MPU6050.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include "Wire.h"
#include "Kalman.h"
Kalman kalmanX;
Kalman kalmanY;
const uint8_t IMUAddress = 0x68;
const uint8_t targetAngle = 160;
// калибровочные значения гироскопа
const int STARTXANGLE = 180;
const int STARTYANGLE = -180;
int16_t accX, accY, accZ;
int16_t gyroX, gyroY, gyroZ;
// углы, которые будут вычисляться через акселерометр и гироскоп соответственно
float accXangle, accYangle;
float gyroXangle, gyroYangle;
float compAngleX = 0;
float compAngleY = 0;
float angleX, angleY;
uint32_t timer;
// функция будет формировать углы отклонения
void getAngles() {
Wire.beginTransmission(IMUAddress);
Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H)
Wire.endTransmission(false);
Wire.requestFrom(IMUAddress, 14, true);
accX = Wire.read() << 8 | Wire.read();
accY = Wire.read() << 8 | Wire.read();
accZ = Wire.read() << 8 | Wire.read();
float tempRaw = Wire.read() << 8 | Wire.read();
gyroX = Wire.read() << 8 | Wire.read();
gyroY = Wire.read() << 8 | Wire.read();
gyroZ = Wire.read() << 8 | Wire.read();
}
// функция вычисляет конечный угол по данным от акселерометра и гироскопа.
// Данные при этом проходят через фильтр и мы получаем итоговые показатели
void calculateAngles() {
accYangle = (atan2(accX, accZ) + PI) * RAD_TO_DEG;
accXangle = (atan2(accY, accZ) + PI) * RAD_TO_DEG;
float gyroXrate = (float)gyroX / 131.0;
float gyroYrate = -((float)gyroY / 131.0);
gyroXangle += gyroXrate * ((float)(micros() - timer) / 1000000);
gyroYangle += gyroYrate * ((float)(micros() - timer) / 1000000);
angleX = kalmanX.getAngle(accXangle, gyroXrate, (float)(micros() - timer) / 1000000);
angleY = kalmanY.getAngle(accYangle, gyroYrate, (float)(micros() - timer) / 1000000);
timer = micros();
}
void setup(){
// соединение битов данных со сдвиговым регистром гироскопа
Wire.begin();
Wire.beginTransmission(IMUAddress);
Wire.write(0x6B);
Wire.write(0);
Wire.endTransmission(true);
// задать начало отсчета для фильтра
kalmanX.setAngle(STARTXANGLE);
kalmanY.setAngle(STARTYANGLE);
timer = micros();
}
void loop(){
getAngles();
calculateAngles();
}