#include<Wire.h>
void init_MPU6050();
float* Calib();
float* Offset;
///float offs[6];
long sampling_timer;
const int MPU_addr=0x68; // I2C address of the MPU-6050
int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ; // Raw data of MPU6050
float GAcX, GAcY, GAcZ; // Convert accelerometer to gravity value
float Cal_GyX,Cal_GyY,Cal_GyZ; // Pitch, Roll & Yaw of Gyroscope applied time factor
float acc_pitch, acc_roll, acc_yaw; // Pitch, Roll & Yaw from Accelerometer
float angle_pitch, angle_roll, angle_yaw; // Angle of Pitch, Roll, & Yaw
float alpha = 0.9; // Complementary constant
void setup(){
Serial.begin(115200);
Wire.begin();
init_MPU6050();
Offset = Calib();
Serial.println("W're here ");
}
void loop(){
// Read raw data of MPU6050
Wire.beginTransmission(MPU_addr);
Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H)
Wire.endTransmission(false);
Wire.requestFrom(MPU_addr,14,true); // request a total of 14 registers
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)
Tmp=Wire.read()<<8|Wire.read(); // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
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)
// Sampling Timer
while(micros() - sampling_timer < 4000); //
sampling_timer = micros(); //Reset the sampling timer
}
void init_MPU6050(){
//MPU6050 Initializing & Reset
Wire.beginTransmission(MPU_addr);
Wire.write(0x6B); // PWR_MGMT_1 register
Wire.write(0); // set to zero (wakes up the MPU-6050)
Wire.endTransmission(true);
//MPU6050 Clock Type
Wire.beginTransmission(MPU_addr);
Wire.write(0x6B); // PWR_MGMT_1 register
Wire.write(0x03); // Selection Clock 'PLL with Z axis gyroscope reference'
Wire.endTransmission(true);
//MPU6050 Gyroscope Configuration Setting
Wire.beginTransmission(MPU_addr);
Wire.write(0x1B); // Gyroscope Configuration register
//Wire.write(0x00); // FS_SEL=0, Full Scale Range = +/- 250 [degree/sec]
//Wire.write(0x08); // FS_SEL=1, Full Scale Range = +/- 500 [degree/sec]
//Wire.write(0x10); // FS_SEL=2, Full Scale Range = +/- 1000 [degree/sec]
Wire.write(0x18); // FS_SEL=3, Full Scale Range = +/- 2000 [degree/sec]
Wire.endTransmission(true);
//MPU6050 Accelerometer Configuration Setting
Wire.beginTransmission(MPU_addr);
Wire.write(0x1C); // Accelerometer Configuration register
//Wire.write(0x00); // AFS_SEL=0, Full Scale Range = +/- 2 [g]
//Wire.write(0x08); // AFS_SEL=1, Full Scale Range = +/- 4 [g]
Wire.write(0x10); // AFS_SEL=2, Full Scale Range = +/- 8 [g]
//Wire.write(0x18); // AFS_SEL=3, Full Scale Range = +/- 10 [g]
Wire.endTransmission(true);
//MPU6050 DLPF(Digital Low Pass Filter)
Wire.beginTransmission(MPU_addr);
Wire.write(0x1A); // DLPF_CFG register
Wire.write(0x00); // Accel BW 260Hz, Delay 0ms / Gyro BW 256Hz, Delay 0.98ms, Fs 8KHz
//Wire.write(0x01); // Accel BW 184Hz, Delay 2ms / Gyro BW 188Hz, Delay 1.9ms, Fs 1KHz
//Wire.write(0x02); // Accel BW 94Hz, Delay 3ms / Gyro BW 98Hz, Delay 2.8ms, Fs 1KHz
//Wire.write(0x03); // Accel BW 44Hz, Delay 4.9ms / Gyro BW 42Hz, Delay 4.8ms, Fs 1KHz
//Wire.write(0x04); // Accel BW 21Hz, Delay 8.5ms / Gyro BW 20Hz, Delay 8.3ms, Fs 1KHz
//Wire.write(0x05); // Accel BW 10Hz, Delay 13.8ms / Gyro BW 10Hz, Delay 13.4ms, Fs 1KHz
//Wire.write(0x06); // Accel BW 5Hz, Delay 19ms / Gyro BW 5Hz, Delay 18.6ms, Fs 1KHz
Wire.endTransmission(true);
}
float* Calib()
{
float meanAcx,meanAcy,meanAcz,meanGyX,meanGyY,meanGyZ,meanTmp=0.0;
Serial.println("Whoever u are Plz keep ur Fucking Hand Fixed For 3s to get Initial Positin sends Regards <3");
// Read raw data of MPU6050
Wire.beginTransmission(MPU_addr);
Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H)
Wire.endTransmission(false);
Wire.requestFrom(MPU_addr,14,true); // request a total of 14 registers
for (int i =0 ; i <300; i++)
{
meanAcx+=Wire.read()<<8|Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
meanAcy+=Wire.read()<<8|Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
meanAcz+=Wire.read()<<8|Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
meanTmp+=Wire.read()<<8|Wire.read(); // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
meanGyX+=Wire.read()<<8|Wire.read(); // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
meanGyY+=Wire.read()<<8|Wire.read(); // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
meanGyZ+=Wire.read()<<8|Wire.read(); // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
delay(50);
}
float CalibArr[6] = {(float)meanAcx,(float)meanAcy,(float)meanAcz,(float)meanGyX,(float)meanGyY,(float)meanGyZ};
for (int i=0 ; i <6; i++)
{
CalibArr[i] = CalibArr[i] /300;
}
Serial.println("This Fuction call Calib Done Successfully ");
return CalibArr;
}