/* * Author : kunchala Anil * Email : anilkunchalaece@gmail.com * Date : 21 May 2018 * * This sketch is used to calculate angle from MPU6050 GyroScope Angular Rate * Ingridient of sketch is * Angle = prevAngle + presentAngularRate * dt * prevAngle = Angle * * dt -> time elapsed from the last angular rate reading * * Offset Value is used to slow the Gyro Drift * * For discussion on the code ref : http://forum.arduino.cc/index.php?topic=548675 */ #include <Wire.h> const float GYRO_SENSITIVITY_SCALE_FACTOR = 131.0; //for 200 degrees / sec const int MPU6050_ADDR = 0b1101000; const byte PWR_REG_ADDR = 0x6B; const byte GYRO_CONFIG_REG_ADDR = 0x1B; const byte GYRO_READ_START_ADDR = 0x43; int16_t gyroX; float rotX; // It is Angular Rate float prevRotX=0; unsigned long prevTime=0,currentTime; float offsetVal; const int noOfSamplesForOffset = 1000; void setup() { Wire.begin(); Serial.begin(115200); configureMPU(); float totalVal = 0; for (int i=0; i< noOfSamplesForOffset; i++){ readGyroX(); Serial.println(rotX); totalVal = totalVal + (rotX); }//end of for Serial.println(totalVal); offsetVal = totalVal / (noOfSamplesForOffset); Serial.print("offset Val"); Serial.println(offsetVal); //while(1); }//end of setup void loop() { if(prevTime == 0){ readGyroX(); prevTime = millis(); }else{ readGyroX(); currentTime = millis(); double dt = (currentTime - prevTime)/1000.0; prevTime = currentTime; rotX = prevRotX + (rotX-offsetVal)* dt; prevRotX = rotX; Serial.println(rotX); }//end of ifElse delay(100); }//end of loop void readGyroX(){ Wire.beginTransmission(MPU6050_ADDR); Wire.write(GYRO_READ_START_ADDR); // starting with register 0x3B (ACCEL_XOUT_H) Wire.endTransmission(false); Wire.requestFrom(MPU6050_ADDR,2,true); gyroX=Wire.read()<<8|Wire.read(); // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L) rotX = gyroX / GYRO_SENSITIVITY_SCALE_FACTOR; }//end of readGyroX Fcn void configureMPU(){ //Power Register Wire.beginTransmission(MPU6050_ADDR); Wire.write(PWR_REG_ADDR);//Access the power register Wire.write(0b00000000); Wire.endTransmission(); //Gyro Config Wire.beginTransmission(MPU6050_ADDR); Wire.write(GYRO_CONFIG_REG_ADDR); Wire.write(0b00000000); Wire.endTransmission(); }//end of setUpMPU Fcn
Monday, 21 May 2018
MPU6050 - Calculating the Angle from Gyroscope Angular Rate
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment