MPU 6050 (GY 521) + Mega 2560

Hello all,

I am doing a project in which it requires the accelerations of hand. So, I purchased an accelerometer MPU 6050 (GY 521) and Arduino Mega 2560. I did not show the accelerations on my serial screen whenever I move the accelerometer.

Please help me in getting me the connections and code.

My connections - Vcc to 5v ; GND to GND; SCL to SCL 21; SDA to SDA 20

#include <Wire.h>
                                                                         //Declaring some global variables
int gyro_x, gyro_y, gyro_z;

long gyro_x_cal, gyro_y_cal, gyro_z_cal;

boolean set_gyro_angles;

long acc_x, acc_y, acc_z, acc_total_vector;

float angle_roll_acc, angle_pitch_acc;

float angle_pitch, angle_roll;
int angle_pitch_buffer, angle_roll_buffer;
float angle_pitch_output, angle_roll_output;

long loop_timer;
int temp;

void setup() {
  Wire.begin();                                                                    //Start I2C as master
  setup_mpu_6050_registers();                                            //Setup the registers of the MPU-6050 
  
 for (int cal_int = 0; cal_int < 1000 ; cal_int ++){                  //Read the raw acc and gyro data from the 
   
MPU-6050 for 1000 times

    read_mpu_6050_data();                                             
    gyro_x_cal += gyro_x;                                              
    gyro_y_cal += gyro_y;                                              
    gyro_z_cal += gyro_z;                                             
    delay(3);                                                          
  }

  // divide by 1000 to get avarage offset
  gyro_x_cal /= 1000;                                                 
  gyro_y_cal /= 1000;                                                 
  gyro_z_cal /= 1000;                                                 
  Serial.begin(115200);
  loop_timer = micros();                                               //Reset the loop timer
}

void loop(){

  read_mpu_6050_data();         
                                           //Subtract the offset values from the raw gyro values
  gyro_x -= gyro_x_cal;                                                
  gyro_y -= gyro_y_cal;                                                
  gyro_z -= gyro_z_cal;                                                
         
  //Gyro angle calculations . Note 0.0000611 = 1 / (250Hz x 65.5)
 
 angle_pitch += gyro_x * 0.0000611;                                  

 angle_roll += gyro_y * 0.0000611;                   /
 
  angle_pitch += angle_roll * sin(gyro_z * 0.000001066);               //If the IMU has yawed transfer the roll angle to the pitch angel
  angle_roll -= angle_pitch * sin(gyro_z * 0.000001066);               //If the IMU has yawed transfer the pitch angle to the roll angel
  
  //Accelerometer angle calculations
  
acc_total_vector = sqrt((acc_x*acc_x)+(acc_y*acc_y)+(acc_z*acc_z));  
 
  angle_pitch_acc = asin((float)acc_y/acc_total_vector)* 57.296;       //Calculate the pitch angle
 
 angle_roll_acc = asin((float)acc_x/acc_total_vector)* -57.296;       //Calculate the roll angle
  
  angle_pitch_acc -= 0.0;                                              //Accelerometer calibration value for pitch
  angle_roll_acc -= 0.0;                                               //Accelerometer calibration value for roll

  if(set_gyro_angles){                                                 
    angle_pitch = angle_pitch * 0.9996 + angle_pitch_acc * 0.0004;     

    angle_roll = angle_roll * 0.9996 + angle_roll_acc * 0.0004;     
  }
  else{                                                            //At first start
    angle_pitch = angle_pitch_acc;                 //Set the gyro pitch angle equal to the accelerometer pitch angle 
    angle_roll = angle_roll_acc;                     //Set the gyro roll angle equal to the accelerometer roll angle 
    set_gyro_angles = true;                              //Set the IMU started flag
  }
  
  
  angle_pitch_output = angle_pitch_output * 0.9 + angle_pitch * 0.1;   
  angle_roll_output = angle_roll_output * 0.9 + angle_roll * 0.1;      
 
  Serial.print(" | Angle_1  = "); Serial.print(angle_pitch_output); Serial.print("  ----------------  ");
  Serial.print(" | Angle_2  = "); Serial.println(angle_roll_output);

 while(micros() - loop_timer < 4000);                                 
 loop_timer = micros();                                                //Reset the loop timer
  
}




void setup_mpu_6050_registers(){
  //Activate the MPU-6050
  Wire.beginTransmission(0x68);                                        //Start communicating with the MPU-6050
  Wire.write(0x6B);                                                    //Send the requested starting register
  Wire.write(0x00);                                                    //Set the requested starting register
  Wire.endTransmission();                                             
  //Configure the accelerometer (+/-8g)
  Wire.beginTransmission(0x68);                                        //Start communicating with the MPU-6050
  Wire.write(0x1C);                                                    //Send the requested starting register
  Wire.write(0x10);                                                    //Set the requested starting register
  Wire.endTransmission();                                             
  //Configure the gyro (500dps full scale)
  Wire.beginTransmission(0x68);                                        //Start communicating with the MPU-6050
  Wire.write(0x1B);                                                         //Send the requested starting register
  Wire.write(0x08);                                                          //Set the requested starting register
  Wire.endTransmission();                                             
}


void read_mpu_6050_data(){                                             //Subroutine for reading the raw gyro and accelerometer data
  Wire.beginTransmission(0x68);                                        //Start communicating with the MPU-6050
  Wire.write(0x3B);                                                           //Send the requested starting register
  Wire.endTransmission();                                                 //End the transmission
  Wire.requestFrom(0x68,14);                                           //Request 14 bytes from the MPU-6050
  while(Wire.available() < 14);                                          //Wait until all the bytes are received
  acc_x = Wire.read()<<8|Wire.read();                                  
  acc_y = Wire.read()<<8|Wire.read();                                  
  acc_z = Wire.read()<<8|Wire.read();                                  
  temp = Wire.read()<<8|Wire.read();                                   
  gyro_x = Wire.read()<<8|Wire.read();                                 
  gyro_y = Wire.read()<<8|Wire.read();                                 
  gyro_z = Wire.read()<<8|Wire.read();                                 
}

How to solve these things? where this code works on Arduino UNO

Thanks a lot in advance.


W. Hamanah

Moderator edit:
</mark> <mark>[code]</mark> <mark>

</mark> <mark>[/code]</mark> <mark>
tags added.

Please, use code tags for source code. :confused:

I used code and the its library for this link:

Its works with me in UNO but when downloaded code in Mega, it does not show any things on the serial monitor.

I used code and its library for this link:

Its works with me in UNO but when downloaded code in Mega, it does not show any things on the serial monitor.

Is there any adjusting or adding to make it work on arduino Mega 2560?

The I2C pins are not A4 and A5 on a Mega. They are pins 20 (SDA) and 21 (SCL).

Read the "how to use this forum-please read" sticky.

It is better to use pins next to AREF (Arduino R3 version). They are marked SDA, SCL on bottom side of board.

@WaleedMohammed, do not hijack. Thread split.

Mira a ver si te vale este:

Solo he incluido alguna libreria y cambiado Serial.begin(9600);

#include "Wire.h"
#include "MPU6050.h"
#include "I2Cdev.h"
                                                                         //Declaring some global variables
int gyro_x, gyro_y, gyro_z;

long gyro_x_cal, gyro_y_cal, gyro_z_cal;

boolean set_gyro_angles;

long acc_x, acc_y, acc_z, acc_total_vector;

float angle_roll_acc, angle_pitch_acc;

float angle_pitch, angle_roll;
int angle_pitch_buffer, angle_roll_buffer;
float angle_pitch_output, angle_roll_output;

long loop_timer;
int temp;

void setup() {
  Serial.begin(9600);
  Wire.begin();                                                                    //Start I2C as master
  setup_mpu_6050_registers();                                            //Setup the registers of the MPU-6050 
  
 for (int cal_int = 0; cal_int < 1000 ; cal_int ++){                  //Read the raw acc and gyro data from the 
   
MPU6050 sensor(0x68);
    read_mpu_6050_data();                                             
    gyro_x_cal += gyro_x;                                              
    gyro_y_cal += gyro_y;                                              
    gyro_z_cal += gyro_z;                                             
    delay(3);                                                          
  }

  // divide by 1000 to get avarage offset
  gyro_x_cal /= 1000;                                                 
  gyro_y_cal /= 1000;                                                 
  gyro_z_cal /= 1000;                                                 
  Serial.begin(9600);
  loop_timer = micros();                                               //Reset the loop timer
}

void loop(){

  read_mpu_6050_data();         
                                           //Subtract the offset values from the raw gyro values
  gyro_x -= gyro_x_cal;                                                
  gyro_y -= gyro_y_cal;                                                
  gyro_z -= gyro_z_cal;                                                
         
  //Gyro angle calculations . Note 0.0000611 = 1 / (250Hz x 65.5)
 
 angle_pitch += gyro_x * 0.0000611;                                  

 angle_roll += gyro_y * 0.0000611;                   
 
  angle_pitch += angle_roll * sin(gyro_z * 0.000001066);               //If the IMU has yawed transfer the roll angle to the pitch angel
  angle_roll -= angle_pitch * sin(gyro_z * 0.000001066);               //If the IMU has yawed transfer the pitch angle to the roll angel
  
  //Accelerometer angle calculations
  
acc_total_vector = sqrt((acc_x*acc_x)+(acc_y*acc_y)+(acc_z*acc_z));  
 
  angle_pitch_acc = asin((float)acc_y/acc_total_vector)* 57.296;       //Calculate the pitch angle
 
 angle_roll_acc = asin((float)acc_x/acc_total_vector)* -57.296;       //Calculate the roll angle
  
  angle_pitch_acc -= 0.0;                                              //Accelerometer calibration value for pitch
  angle_roll_acc -= 0.0;                                               //Accelerometer calibration value for roll

  if(set_gyro_angles){                                                 
    angle_pitch = angle_pitch * 0.9996 + angle_pitch_acc * 0.0004;     

    angle_roll = angle_roll * 0.9996 + angle_roll_acc * 0.0004;     
  }
  else{                                                            //At first start
    angle_pitch = angle_pitch_acc;                 //Set the gyro pitch angle equal to the accelerometer pitch angle 
    angle_roll = angle_roll_acc;                     //Set the gyro roll angle equal to the accelerometer roll angle 
    set_gyro_angles = true;                              //Set the IMU started flag
  }
  
  
  angle_pitch_output = angle_pitch_output * 0.9 + angle_pitch * 0.1;   
  angle_roll_output = angle_roll_output * 0.9 + angle_roll * 0.1;      
 
  Serial.print(" | Angle_1  = "); Serial.print(angle_pitch_output); Serial.print("  ----------------  ");
  Serial.print(" | Angle_2  = "); Serial.println(angle_roll_output);

 while(micros() - loop_timer < 4000);                                 
 loop_timer = micros();                                                //Reset the loop timer
  
}




void setup_mpu_6050_registers(){
  //Activate the MPU-6050
  Wire.beginTransmission(0x68);                                        //Start communicating with the MPU-6050
  Wire.write(0x6B);                                                    //Send the requested starting register
  Wire.write(0x00);                                                    //Set the requested starting register
  Wire.endTransmission();                                             
  //Configure the accelerometer (+/-8g)
  Wire.beginTransmission(0x68);                                        //Start communicating with the MPU-6050
  Wire.write(0x1C);                                                    //Send the requested starting register
  Wire.write(0x10);                                                    //Set the requested starting register
  Wire.endTransmission();                                             
  //Configure the gyro (500dps full scale)
  Wire.beginTransmission(0x68);                                        //Start communicating with the MPU-6050
  Wire.write(0x1B);                                                         //Send the requested starting register
  Wire.write(0x08);                                                          //Set the requested starting register
  Wire.endTransmission();                                             
}


void read_mpu_6050_data(){                                             //Subroutine for reading the raw gyro and accelerometer data
  Wire.beginTransmission(0x68);                                        //Start communicating with the MPU-6050
  Wire.write(0x3B);                                                           //Send the requested starting register
  Wire.endTransmission();                                                 //End the transmission
  Wire.requestFrom(0x68,14);                                           //Request 14 bytes from the MPU-6050
  while(Wire.available() < 14);                                          //Wait until all the bytes are received
  acc_x = Wire.read()<<8|Wire.read();                                  
  acc_y = Wire.read()<<8|Wire.read();                                  
  acc_z = Wire.read()<<8|Wire.read();                                  
  temp = Wire.read()<<8|Wire.read();                                   
  gyro_x = Wire.read()<<8|Wire.read();                                 
  gyro_y = Wire.read()<<8|Wire.read();                                 
  gyro_z = Wire.read()<<8|Wire.read();                                 
}

(deleted)

(deleted)

aaron_wong:
@WaleedMohammed, I tried your code. On the serial monitor, I just see crazy symbols like ⸮ and ▯. Is there a problem with the code or is it just my computer? Attached is a screenshot of the serial monitor.

I'm no expert, but that could be caused by selecting the wrong baud rate? in this case it's 9600.
But this post is nearly 2 years old... probably the guy had it sorted by now.