Tutorial de Acelerómetro y Giroscopio con Arduino y MPU6050

En este tutorial, te mostraremos cómo utilizar un acelerómetro y giroscopio con un Arduino y MPU6050. Estos sensores te permitirán realizar mediciones de movimiento y orientación con precisión. ¡Sigue leyendo para descubrir cómo incorporar estas herramientas a tus proyectos electrónicos!

En este tutorial aprenderemos a utilizar el sensor de acelerómetro y giroscopio MPU6050 con Arduino. Primero explicaré cómo funciona el MPU6050 y cómo leer los datos del mismo, y luego haremos dos ejemplos prácticos.

Puede ver el vídeo a continuación o leer el tutorial escrito a continuación.

descripción general

En el primer ejemplo, creamos una visualización 3D de la alineación del sensor utilizando el entorno de desarrollo de Processing y en el segundo ejemplo creamos una plataforma autoestabilizadora simple o un cardán de bricolaje. Según la orientación del MPU6050 y sus datos combinados de acelerómetro y giroscopio, controlamos los tres servos que mantienen la plataforma nivelada.

Cómo funciona

La IMU MPU6050 cuenta con un acelerómetro de 3 ejes y un giroscopio de 3 ejes integrados en un solo chip.

El giroscopio mide la velocidad de rotación o la tasa de cambio de posición angular a lo largo del tiempo a lo largo de los ejes X, Y y Z. Utiliza tecnología MEMS y el efecto Coriolis para la medición, pero puedes encontrar más detalles al respecto en mi tutorial dedicado “Cómo funcionan los sensores MEMS”. Las salidas del giroscopio están en grados por segundo. Entonces, para obtener la posición angular solo necesitamos integrar la velocidad angular.

Tutorial de Acelerómetro y Giroscopio con Arduino y MPU6050

Por>

La IMU MPU6050 también se denomina dispositivo de seguimiento de movimiento de seis ejes o dispositivo 6-DoF (seis grados de libertad) debido a sus 6 salidas o 3 salidas de acelerómetro y 3 salidas de giroscopio.

Tutorial de Acelerómetro y Giroscopio con Arduino y MPU6050

Ver también
Cómo realizar un seguimiento de la orientación utilizando Arduino y el acelerómetro ADXL345

Arduino y MPU6050

Veamos cómo podemos conectar el sensor MPU6050 al Arduino y leer sus datos. Usamos el protocolo I2C para comunicarnos con el Arduino, por lo que solo necesitamos dos cables para la conexión y dos cables para la alimentación.

Tutorial de Acelerómetro y Giroscopio con Arduino y MPU6050

Puede>

  • MPU6050 IMU………………………………..…. Amazonas / Banggood / AliExpress
  • Placa Arduino………………………….….. Amazonas / Banggood / AliExpress
  • Cables de puente y placa de pruebas………… Amazonas / Banggood / AliExpress

Divulgación: estos son enlaces de afiliados. Como asociado de Amazon, gano con compras que califican.

Código Arduino MPU6050

Aquí está el código Arduino para leer los datos del sensor MPU6050. Debajo del código encontrará una descripción detallada.

/*
   Arduino and MPU6050 Accelerometer and Gyroscope Sensor Tutorial
   by Dejan, https://howtomechatronics.com
*/
#include <Wire.h>
const int MPU = 0x68; // MPU6050 I2C address
float AccX, AccY, AccZ;
float GyroX, GyroY, GyroZ;
float accAngleX, accAngleY, gyroAngleX, gyroAngleY, gyroAngleZ;
float roll, pitch, yaw;
float AccErrorX, AccErrorY, GyroErrorX, GyroErrorY, GyroErrorZ;
float elapsedTime, currentTime, previousTime;
int c = 0;
void setup() {
  Serial.begin(19200);
  Wire.begin();                      // Initialize comunication
  Wire.beginTransmission(MPU);       // Start communication with MPU6050 // MPU=0x68
  Wire.write(0x6B);                  // Talk to the register 6B
  Wire.write(0x00);                  // Make reset - place a 0 into the 6B register
  Wire.endTransmission(true);        //end the transmission
  /*
  // Configure Accelerometer Sensitivity - Full Scale Range (default +/- 2g)
  Wire.beginTransmission(MPU);
  Wire.write(0x1C);                  //Talk to the ACCEL_CONFIG register (1C hex)
  Wire.write(0x10);                  //Set the register bits as 00010000 (+/- 8g full scale range)
  Wire.endTransmission(true);
  // Configure Gyro Sensitivity - Full Scale Range (default +/- 250deg/s)
  Wire.beginTransmission(MPU);
  Wire.write(0x1B);                   // Talk to the GYRO_CONFIG register (1B hex)
  Wire.write(0x10);                   // Set the register bits as 00010000 (1000deg/s full scale)
  Wire.endTransmission(true);
  delay(20);
  */
  // Call this function if you need to get the IMU error values for your module
  calculate_IMU_error();
  delay(20);
}
void loop() {
  // === Read acceleromter data === //
  Wire.beginTransmission(MPU);
  Wire.write(0x3B); // Start with register 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(MPU, 6, true); // Read 6 registers total, each axis value is stored in 2 registers
  //For a range of +-2g, we need to divide the raw values by 16384, according to the datasheet
  AccX = (Wire.read() << 8 | Wire.read()) / 16384.0; // X-axis value
  AccY = (Wire.read() << 8 | Wire.read()) / 16384.0; // Y-axis value
  AccZ = (Wire.read() << 8 | Wire.read()) / 16384.0; // Z-axis value
  // Calculating Roll and Pitch from the accelerometer data
  accAngleX = (atan(AccY / sqrt(pow(AccX, 2) + pow(AccZ, 2))) * 180 / PI) - 0.58; // AccErrorX ~(0.58) See the calculate_IMU_error()custom function for more details
  accAngleY = (atan(-1 * AccX / sqrt(pow(AccY, 2) + pow(AccZ, 2))) * 180 / PI) + 1.58; // AccErrorY ~(-1.58)
  // === Read gyroscope data === //
  previousTime = currentTime;        // Previous time is stored before the actual time read
  currentTime = millis();            // Current time actual time read
  elapsedTime = (currentTime - previousTime) / 1000; // Divide by 1000 to get seconds
  Wire.beginTransmission(MPU);
  Wire.write(0x43); // Gyro data first register address 0x43
  Wire.endTransmission(false);
  Wire.requestFrom(MPU, 6, true); // Read 4 registers total, each axis value is stored in 2 registers
  GyroX = (Wire.read() << 8 | Wire.read()) / 131.0; // For a 250deg/s range we have to divide first the raw value by 131.0, according to the datasheet
  GyroY = (Wire.read() << 8 | Wire.read()) / 131.0;
  GyroZ = (Wire.read() << 8 | Wire.read()) / 131.0;
  // Correct the outputs with the calculated error values
  GyroX = GyroX + 0.56; // GyroErrorX ~(-0.56)
  GyroY = GyroY - 2; // GyroErrorY ~(2)
  GyroZ = GyroZ + 0.79; // GyroErrorZ ~ (-0.8)
  // Currently the raw values are in degrees per seconds, deg/s, so we need to multiply by sendonds (s) to get the angle in degrees
  gyroAngleX = gyroAngleX + GyroX * elapsedTime; // deg/s * s = deg
  gyroAngleY = gyroAngleY + GyroY * elapsedTime;
  yaw =  yaw + GyroZ * elapsedTime;
  // Complementary filter - combine acceleromter and gyro angle values
  roll = 0.96 * gyroAngleX + 0.04 * accAngleX;
  pitch = 0.96 * gyroAngleY + 0.04 * accAngleY;
  
  // Print the values on the serial monitor
  Serial.print(roll);
  Serial.print("/");
  Serial.print(pitch);
  Serial.print("/");
  Serial.println(yaw);
}
void calculate_IMU_error() {
  // We can call this funtion in the setup section to calculate the accelerometer and gyro data error. From here we will get the error values used in the above equations printed on the Serial Monitor.
  // Note that we should place the IMU flat in order to get the proper values, so that we then can the correct values
  // Read accelerometer values 200 times
  while (c < 200) {
    Wire.beginTransmission(MPU);
    Wire.write(0x3B);
    Wire.endTransmission(false);
    Wire.requestFrom(MPU, 6, true);
    AccX = (Wire.read() << 8 | Wire.read()) / 16384.0 ;
    AccY = (Wire.read() << 8 | Wire.read()) / 16384.0 ;
    AccZ = (Wire.read() << 8 | Wire.read()) / 16384.0 ;
    // Sum all readings
    AccErrorX = AccErrorX + ((atan((AccY) / sqrt(pow((AccX), 2) + pow((AccZ), 2))) * 180 / PI));
    AccErrorY = AccErrorY + ((atan(-1 * (AccX) / sqrt(pow((AccY), 2) + pow((AccZ), 2))) * 180 / PI));
    c++;
  }
  //Divide the sum by 200 to get the error value
  AccErrorX = AccErrorX / 200;
  AccErrorY = AccErrorY / 200;
  c = 0;
  // Read gyro values 200 times
  while (c < 200) {
    Wire.beginTransmission(MPU);
    Wire.write(0x43);
    Wire.endTransmission(false);
    Wire.requestFrom(MPU, 6, true);
    GyroX = Wire.read() << 8 | Wire.read();
    GyroY = Wire.read() << 8 | Wire.read();
    GyroZ = Wire.read() << 8 | Wire.read();
    // Sum all readings
    GyroErrorX = GyroErrorX + (GyroX / 131.0);
    GyroErrorY = GyroErrorY + (GyroY / 131.0);
    GyroErrorZ = GyroErrorZ + (GyroZ / 131.0);
    c++;
  }
  //Divide the sum by 200 to get the error value
  GyroErrorX = GyroErrorX / 200;
  GyroErrorY = GyroErrorY / 200;
  GyroErrorZ = GyroErrorZ / 200;
  // Print the error values on the Serial Monitor
  Serial.print("AccErrorX: ");
  Serial.println(AccErrorX);
  Serial.print("AccErrorY: ");
  Serial.println(AccErrorY);
  Serial.print("GyroErrorX: ");
  Serial.println(GyroErrorX);
  Serial.print("GyroErrorY: ");
  Serial.println(GyroErrorY);
  Serial.print("GyroErrorZ: ");
  Serial.println(GyroErrorZ);
}Code language: Arduino (arduino)

Descripción del código: Primero debemos incluir la biblioteca Wire.h que se usa para la comunicación I2C y definir algunas variables necesarias para almacenar los datos.

En la sección de configuración, debemos inicializar la biblioteca de cables y restablecer el sensor a través del registro de administración de energía. Para hacer esto tenemos que Hoja de datos del sensor desde donde podemos ver la dirección de registro.

Tutorial de Acelerómetro y Giroscopio con Arduino y MPU6050

Si>

// Configure Accelerometer Sensitivity - Full Scale Range (default +/- 2g)
  Wire.beginTransmission(MPU);
  Wire.write(0x1C);                  //Talk to the ACCEL_CONFIG register (1C hex)
  Wire.write(0x10);                  //Set the register bits as 00010000 (+/- 8g full scale range)
  Wire.endTransmission(true);
  // Configure Gyro Sensitivity - Full Scale Range (default +/- 250deg/s)
  Wire.beginTransmission(MPU);
  Wire.write(0x1B);                   // Talk to the GYRO_CONFIG register (1B hex)
  Wire.write(0x10);                   // Set the register bits as 00010000 (1000deg/s full scale)
  Wire.endTransmission(true);
  */Code language: Arduino (arduino)

En la sección de bucle, comenzamos a leer los datos del acelerómetro. Los datos de cada eje se almacenan en dos bytes o registros y podemos encontrar las direcciones de estos registros en la hoja de datos del sensor.

Tutorial de Acelerómetro y Giroscopio con Arduino y MPU6050

Para>

// === Read acceleromter data === //
  Wire.beginTransmission(MPU);
  Wire.write(0x3B); // Start with register 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(MPU, 6, true); // Read 6 registers total, each axis value is stored in 2 registers
  //For a range of +-2g, we need to divide the raw values by 16384, according to the datasheet
  AccX = (Wire.read() << 8 | Wire.read()) / 16384.0; // X-axis value
  AccY = (Wire.read() << 8 | Wire.read()) / 16384.0; // Y-axis value
  AccZ = (Wire.read() << 8 | Wire.read()) / 16384.0; // Z-axis valueCode language: Arduino (arduino)

Para obtener valores de salida de -1g a +1g adecuados para el cálculo de ángulos, dividimos la salida por la sensibilidad previamente seleccionada.

Tutorial de Acelerómetro y Giroscopio con Arduino y MPU6050

Finalmente>estas dos fórmulasCalculamos el ángulo de balanceo y cabeceo a partir de los datos del acelerómetro.

// Calculating Roll and Pitch from the accelerometer data
  accAngleX = (atan(AccY / sqrt(pow(AccX, 2) + pow(AccZ, 2))) * 180 / PI) - 0.58; // AccErrorX ~(0.58) See the calculate_IMU_error()custom function for more details
  accAngleY = (atan(-1 * AccX / sqrt(pow(AccY, 2) + pow(AccZ, 2))) * 180 / PI) + 1.58; // AccErrorY ~(-1.58)Code language: Arduino (arduino)

A continuación, obtenemos los datos del giroscopio utilizando el mismo método.

Tutorial de Acelerómetro y Giroscopio con Arduino y MPU6050

Leemos>

// === Read gyroscope data === //
  previousTime = currentTime;        // Previous time is stored before the actual time read
  currentTime = millis();            // Current time actual time read
  elapsedTime = (currentTime - previousTime) / 1000; // Divide by 1000 to get seconds
  Wire.beginTransmission(MPU);
  Wire.write(0x43); // Gyro data first register address 0x43
  Wire.endTransmission(false);
  Wire.requestFrom(MPU, 6, true); // Read 4 registers total, each axis value is stored in 2 registers
  GyroX = (Wire.read() << 8 | Wire.read()) / 131.0; // For a 250deg/s range we have to divide first the raw value by 131.0, according to the datasheet
  GyroY = (Wire.read() << 8 | Wire.read()) / 131.0;
  GyroZ = (Wire.read() << 8 | Wire.read()) / 131.0;Code language: Arduino (arduino)
Tutorial de Acelerómetro y Giroscopio con Arduino y MPU6050

Aquí>

// Correct the outputs with the calculated error values
  GyroX = GyroX + 0.56; // GyroErrorX ~(-0.56)
  GyroY = GyroY - 2; // GyroErrorY ~(2)
  GyroZ = GyroZ + 0.79; // GyroErrorZ ~ (-0.8)
  // Currently the raw values are in degrees per seconds, deg/s, so we need to multiply by sendonds (s) to get the angle in degrees
  gyroAngleX = gyroAngleX + GyroX * elapsedTime; // deg/s * s = deg
  gyroAngleY = gyroAngleY + GyroY * elapsedTime;
  yaw =  yaw + GyroZ * elapsedTime;Code language: Arduino (arduino)

Finalmente, combinamos los datos del acelerómetro y giroscopio usando un filtro complementario. Utilizamos el 96% de los datos del giroscopio porque son muy precisos y no se ven afectados por influencias externas. La desventaja del giroscopio es que se desvía o introduce errores en la salida con el tiempo. Por tanto, a largo plazo utilizamos los datos del acelerómetro, en este caso un 4%, que es suficiente para eliminar el error de deriva del giroscopio.

// Complementary filter - combine acceleromter and gyro angle values
  roll = 0.96 * gyroAngleX + 0.04 * accAngleX;
  pitch = 0.96 * gyroAngleY + 0.04 * accAngleY;Code language: Arduino (arduino)

Sin embargo, dado que no podemos calcular la guiñada a partir de los datos del acelerómetro, no podemos implementar el filtro complementario.

Antes de ver los resultados, me gustaría explicar brevemente cómo obtener los valores de corrección de errores. Para calcular estos errores, podemos llamar a la función personalizada calcular_IMU_error() mientras el sensor está en una posición plana y quieta. Aquí tomamos 200 mediciones para todas las salidas, las sumamos y las dividimos por 200. Dado que mantenemos el sensor en una posición plana y quieta, los valores de salida esperados deben ser 0. Entonces con este cálculo podemos encontrar el error promedio que comete el sensor.

void calculate_IMU_error() {
  // We can call this funtion in the setup section to calculate the accelerometer and gyro data error. From here we will get the error values used in the above equations printed on the Serial Monitor.
  // Note that we should place the IMU flat in order to get the proper values, so that we then can the correct values
  // Read accelerometer values 200 times
  while (c < 200) {
    Wire.beginTransmission(MPU);
    Wire.write(0x3B);
    Wire.endTransmission(false);
    Wire.requestFrom(MPU, 6, true);
    AccX = (Wire.read() << 8 | Wire.read()) / 16384.0 ;
    AccY = (Wire.read() << 8 | Wire.read()) / 16384.0 ;
    AccZ = (Wire.read() << 8 | Wire.read()) / 16384.0 ;
    // Sum all readings
    AccErrorX = AccErrorX + ((atan((AccY) / sqrt(pow((AccX), 2) + pow((AccZ), 2))) * 180 / PI));
    AccErrorY = AccErrorY + ((atan(-1 * (AccX) / sqrt(pow((AccY), 2) + pow((AccZ), 2))) * 180 / PI));
    c++;
  }
  //Divide the sum by 200 to get the error value
  AccErrorX = AccErrorX / 200;
  AccErrorY = AccErrorY / 200;
  c = 0;
  // Read gyro values 200 times
  while (c < 200) {
    Wire.beginTransmission(MPU);
    Wire.write(0x43);
    Wire.endTransmission(false);
    Wire.requestFrom(MPU, 6, true);
    GyroX = Wire.read() << 8 | Wire.read();
    GyroY = Wire.read() << 8 | Wire.read();
    GyroZ = Wire.read() << 8 | Wire.read();
    // Sum all readings
    GyroErrorX = GyroErrorX + (GyroX / 131.0);
    GyroErrorY = GyroErrorY + (GyroY / 131.0);
    GyroErrorZ = GyroErrorZ + (GyroZ / 131.0);
    c++;
  }
  //Divide the sum by 200 to get the error value
  GyroErrorX = GyroErrorX / 200;
  GyroErrorY = GyroErrorY / 200;
  GyroErrorZ = GyroErrorZ / 200;
  // Print the error values on the Serial Monitor
  Serial.print("AccErrorX: ");
  Serial.println(AccErrorX);
  Serial.print("AccErrorY: ");
  Serial.println(AccErrorY);
  Serial.print("GyroErrorX: ");
  Serial.println(GyroErrorX);
  Serial.print("GyroErrorY: ");
  Serial.println(GyroErrorY);
  Serial.print("GyroErrorZ: ");
  Serial.println(GyroErrorZ);
}Code language: Arduino (arduino)

Simplemente imprimimos los valores en el monitor de serie y una vez que los conocemos podemos implementarlos en el código como se mostró anteriormente, tanto para el cálculo de balanceo y cabeceo como para las tres salidas del giroscopio.

Tutorial de Acelerómetro y Giroscopio con Arduino y MPU6050

Finalmente,>

Seguimiento de orientación MPU6050: visualización 3D

A continuación, para crear el ejemplo de visualización 3D, solo necesitamos aceptar estos datos que el Arduino envía a través del puerto serie en Entorno de desarrollo de procesamiento. Aquí está el código de procesamiento completo:

/*
    Arduino and MPU6050 IMU - 3D Visualization Example 
     by Dejan, https://howtomechatronics.com
*/
import processing.serial.*;
import java.awt.event.KeyEvent;
import java.io.IOException;
Serial myPort;
String data="";
float roll, pitch,yaw;
void setup() {
  size (2560, 1440, P3D);
  myPort = new Serial(this, "COM7", 19200); // starts the serial communication
  myPort.bufferUntil('n');
}
void draw() {
  translate(width/2, height/2, 0);
  background(233);
  textSize(22);
  text("Roll: " + int(roll) + "     Pitch: " + int(pitch), -100, 265);
  // Rotate the object
  rotateX(radians(-pitch));
  rotateZ(radians(roll));
  rotateY(radians(yaw));
  
  // 3D 0bject
  textSize(30);  
  fill(0, 76, 153);
  box (386, 40, 200); // Draw box
  textSize(25);
  fill(255, 255, 255);
  text("www.HowToMechatronics.com", -183, 10, 101);
  //delay(10);
  //println("ypr:t" + angleX + "t" + angleY); // Print the values to check whether we are getting proper values
}
// Read data from the Serial Port
void serialEvent (Serial myPort) { 
  // reads the data from the Serial Port up to the character '.' and puts it into the String variable "data".
  data = myPort.readStringUntil('n');
  // if you got any bytes other than the linefeed:
  if (data != null) {
    data = trim(data);
    // split the string at "/"
    String items[] = split(data, '/');
    if (items.length > 1) {
      //--- Roll,Pitch in degrees
      roll = float(items[0]);
      pitch = float(items[1]);
      yaw = float(items[2]);
    }
  }
}Code language: Arduino (arduino)

Aquí leemos los datos entrantes del Arduino y los colocamos en las variables apropiadas de balanceo, cabeceo y guiñada. En el bucle principal usamos estos valores para rotar el objeto 3D. En este caso es un cuadro simple con un color determinado y algo de texto.

Si ejecutamos el boceto, podemos ver qué tan bien el sensor MPU6050 sigue la orientación. El objeto 3D sigue la orientación del sensor con bastante precisión y además reacciona muy rápidamente.

Tutorial de Acelerómetro y Giroscopio con Arduino y MPU6050

Como>

Tutorial de Acelerómetro y Giroscopio con Arduino y MPU6050

Aquí>Cuaterniones que se utilizan para representar orientaciones y rotaciones de objetos en tres dimensiones. En este ejemplo, en realidad usamos cuaterniones para representar la orientación, lo que tampoco sufre el bloqueo del cardán que ocurre cuando se usa ángulo de euler.

Tutorial de Acelerómetro y Giroscopio con Arduino y MPU6050

Aún>

Tutorial de Acelerómetro y Giroscopio con Arduino y MPU6050

El>Biblioteca i2cdevlib de Jeff Rowberg. Esta biblioteca se puede descargar desde GitHub e incluiré un enlace en el artículo del sitio.

Una vez que hayamos instalado la biblioteca, podemos abrir el ejemplo MPU6050_DMP6 desde la biblioteca. Este ejemplo está bien explicado con comentarios para cada línea.

Tutorial de Acelerómetro y Giroscopio con Arduino y MPU6050

Aquí>

/*
    Arduino and MPU6050 IMU - 3D Visualization Example 
     by Dejan, https://howtomechatronics.com
*/
import processing.serial.*;
import java.awt.event.KeyEvent;
import java.io.IOException;
Serial myPort;
String data="";
float roll, pitch,yaw;
void setup() {
  size (2560, 1440, P3D);
  myPort = new Serial(this, "COM7", 19200); // starts the serial communication
  myPort.bufferUntil('n');
}
void draw() {
  translate(width/2, height/2, 0);
  background(233);
  textSize(22);
  text("Roll: " + int(roll) + "     Pitch: " + int(pitch), -100, 265);
  // Rotate the object
  rotateX(radians(-pitch));
  rotateZ(radians(roll));
  rotateY(radians(yaw));
  
  // 3D 0bject
  textSize(30);  
  fill(0, 76, 153);
  box (386, 40, 200); // Draw box
  textSize(25);
  fill(255, 255, 255);
  text("www.HowToMechatronics.com", -183, 10, 101);
  //delay(10);
  //println("ypr:t" + angleX + "t" + angleY); // Print the values to check whether we are getting proper values
}
// Read data from the Serial Port
void serialEvent (Serial myPort) { 
  // reads the data from the Serial Port up to the character '.' and puts it into the String variable "data".
  data = myPort.readStringUntil('n');
  // if you got any bytes other than the linefeed:
  if (data != null) {
    data = trim(data);
    // split the string at "/"
    String items[] = split(data, '/');
    if (items.length > 1) {
      //--- Roll,Pitch in degrees
      roll = float(items[0]);
      pitch = float(items[1]);
      yaw = float(items[2]);
    }
  }
}Code language: Arduino (arduino)

Entonces aquí usamos la función serialEvent() para obtener los cuaterniones provenientes del Arduino y usarlos en el bucle principal para rotar el objeto 3D. Si ejecutamos el boceto, podemos ver qué tan adecuados son los cuaterniones para rotar objetos en tres dimensiones.

Para no saturar este tutorial, he puesto el segundo ejemplo, el DIY Arduino Gimbal o plataforma autoestabilizadora, en un artículo aparte.

Tutorial de Acelerómetro y Giroscopio con Arduino y MPU6050

No>

Categorías tutoriales de arduino
Error 403 The request cannot be completed because you have exceeded your quota. : quotaExceeded

Tutorial de Acelerómetro y Giroscopio con Arduino y MPU6050

En este tutorial aprenderemos cómo utilizar el sensor MPU6050 Acelerómetro y Giroscopio con Arduino. Primero, explicaré cómo funciona el MPU6050 y cómo leer los datos de él, y luego haremos dos ejemplos prácticos. Puedes ver el siguiente video o leer el tutorial escrito a continuación.

Visión General

En el primer ejemplo, utilizando el entorno de desarrollo Processing, haremos una visualización en 3D de la orientación del sensor, y en el segundo ejemplo haremos una plataforma simple de autoestabilización o un Gimbal casero. Basándonos en la orientación del MPU6050 y sus datos fusionados de acelerómetro y giroscopio, controlamos los tres servos que mantienen la plataforma nivelada.

¿Cómo Funciona?

El MPU6050 IMU tiene tanto un acelerómetro de 3 ejes como un giroscopio de 3 ejes integrados en un solo chip. El giroscopio mide la velocidad de rotación o la tasa de cambio de la posición angular a lo largo de los ejes X, Y y Z. Utiliza la tecnología MEMS y el Efecto Coriolis para la medición. Los datos del giroscopio están en grados por segundo, por lo que para obtener la posición angular solo necesitamos integrar la velocidad angular.

Por otro lado, el acelerómetro MPU6050 mide la aceleración de la misma manera que se explicó en un tutorial anterior para el sensor acelerómetro ADXL345. Brevemente, puede medir la aceleración gravitacional a lo largo de los 3 ejes y, utilizando algunas matemáticas trigonométricas, podemos calcular el ángulo en el que está posicionado el sensor.

El MPU6050 IMU también se llama dispositivo de seguimiento de movimiento de seis ejes o dispositivo 6 DoF (seis grados de libertad) debido a sus 6 salidas o los 3 ejes de salida del acelerómetro y los 3 ejes de salida del giroscopio.

¿Cómo conectar el Arduino y el MPU6050?

Podemos ver cómo podemos conectar y leer los datos del sensor MPU6050 utilizando el Arduino. Estamos utilizando el protocolo I2C para la comunicación con el Arduino, por lo que solo necesitamos dos cables para conectarlo, además de los dos cables de alimentación.

Puedes ver los componentes necesarios para este Tutorial de Arduino en los siguientes enlaces:

  • MPU6050 IMU …………………………..…. Amazon / Banggood / AliExpress
  • Placa Arduino ………………………….….. Amazon / Banggood / AliExpress
  • Breadboard y cables de puente ………… Amazon / Banggood / AliExpress

Código Arduino MPU6050

Aquí está el código Arduino para leer los datos del sensor MPU6050. A continuación del código puedes encontrar una descripción detallada del mismo.

[incluir código aquí]

Este código nos permite leer los datos del acelerómetro y el giroscopio del MPU6050 y calcular la orientación del sensor utilizando un filtro complementario.

Para obtener más detalles, puedes ver el tutorial completo y el vídeo en el enlace proporcionado.

Serialización MPU6050 – Visualización en 3D

Para la visualización en 3D, simplemente necesitamos aceptar los datos que Arduino envía a través del puerto serial en el entorno de desarrollo Processing. Aquí está el código de Processing que se utiliza para la visualización en 3D de la orientación del sensor.

[incluir código de Processing aquí]

Este código nos permite visualizar la orientación del sensor en un objeto 3D dentro de Processing, utilizando los datos recibidos del Arduino a través del puerto serial.

Si deseas profundizar en este tema, no dudes en realizar cualquier pregunta relacionada con este tutorial en la sección de comentarios. ¡Espero que encuentres útil esta información!


En este artículo hemos explorado cómo utilizar el acelerómetro y giroscopio MPU6050 con Arduino para el seguimiento de la orientación. Para obtener información detallada sobre cómo implementar diferentes aplicaciones prácticas con este sensor, visita nuestra página web.

4 comentarios en «Tutorial de Acelerómetro y Giroscopio con Arduino y MPU6050»

Deja un comentario