INFORMACIÓN
El MPU6050 es un sensor IMU (Unidad de Medición Inercial) de 6 grados de libertad que combina en un solo chip un acelerómetro de 3 ejes y un giroscopio de 3 ejes, lo que le permite medir tanto la aceleración lineal como la velocidad angular en los ejes X, Y y Z. Funciona mediante sensores MEMS (sistemas microelectromecánicos), que detectan el movimiento del dispositivo y generan señales analógicas convertidas internamente en datos digitales. El MPU6050 se comunica a través del protocolo I2C, lo que facilita su conexión con microcontroladores y tarjetas de desarrollo.
El IMU MPU6050 de 6 grados de libertad se utiliza en una amplia variedad de aplicaciones donde es necesario detectar movimiento, orientación o vibración del objeto o sistema en el que está integrado. Sus principales usos incluyen sistemas de navegación inercial, estabilización de drones, robots autónomos, plataformas de control de gestos, sistemas de balanceo como segways o vehículos autoequilibrados, así como en dispositivos portátiles y proyectos de realidad virtual o aumentada. Gracias a su comunicación mediante el protocolo I2C, el MPU6050 es fácilmente compatible con una amplia gama de tarjetas de desarrollo como Arduino (UNO, Mega, Nano), ESP32, ESP8266, STM32 y Raspberry Pi, lo que lo convierte en un sensor accesible, versátil y esencial para proyectos de electrónica y robótica que requieren detección precisa de aceleración y rotación en tiempo real.
ESPECIFICACIONES Y CARACTERÍSTICAS
- Voltaje de funcionamiento: 3.3 V a 5 V.
- Chip: MPU-6050.
- Grados de libertad (DoF): 6.
- Protocolo de comunicación: I2C.
- Convertidor analógico a digital: 16 bits en todos los ejes.
- Rangos:
- Giroscopio: +/-250,+/- 500,+/- 1000 y +/- 2000° /s(dps).
- Acelerómetro: +/-2, +/-4, +/-8 y +/-16 g.
- Dimensiones: 40 mm x 25 mm x 5 mm.
- Peso: 3 g.
DOCUMENTACIÓN Y RECURSOS
INFORMACIÓN ADICIONAL
¿Cómo funciona el IMU MPU6050?
Este sensor se comunica a través de la interfaz I2C, cuenta con un regulador de tensión a 3.3 V (por lo cual se puede alimentar con los 5 V de placas de Arduino).
Las direcciones para poder trabajar en I2C son:
| PIN AD0 | Dirección I2C |
|---|---|
| AD0=HIGH (5V) | 0x69 |
| AD0=LOW (GND o NC) | 0x68 |
Esto permitirá usar dos dispositivos en el mismo bus o en caso de que haya un conflicto de dirección con otro dispositivo en el bus. A continuación las conexiones para usar el dispositivo en Arduino UNO:
Conexión del Arduino a MPU-6050 para interfaz de I2C
Código de prueba para MPU-6050 GY-521.
Se presenta el siguiente código con la finalidad de que puedas probar el funcionamiento del MPU, cabe mencionar que se requiere calibración y los datos arrojados son de fábrica. Para más información, revisar el datasheet.
#include "Wire.h" //Librería para poder comunicarse con dispositivos por I2C
const int MPU_ADDR = 0x68; // Dirección I2C del MPU-6050. Si AD0(0x69) HIGH, de lo contrario I2C(0x69)es LOW
int16_t a_x, a_y, a_z; // variables para el acelerómetro
int16_t g_x, g_y, g_z; // variables para giroscopio
int16_t t; // variables para temperatura
char tmp_str[7]; // variable temporal con 7 carácter
char* convert_int16_to_str(int16_t i) { // variables para conversión de int16 a texto
sprintf(tmp_str, "%6d", i);
return tmp_str;
}
void setup() {
Serial.begin(9600);
Wire.begin();
Wire.beginTransmission(MPU_ADDR); // Comienza la comunicación entre GY-521 por I2C
Wire.write(0x6B); // registro para direcciones
Wire.write(0); // empieza en cero (encender MPU-6050)
Wire.endTransmission(true);
}
void loop() {
Wire.beginTransmission(MPU_ADDR);
Wire.write(0x3B); // se empieza con el registro 0x3B salida del acelerómetro(ACCEL_XOUT_H)
Wire.endTransmission(false); // Parámetro que indica que el Arduino mandara reset. O se mantendrá la conexión activa.
Wire.requestFrom(MPU_ADDR, 7 * 2, true); // solicitud de 14 registros
// "Wire.read()<<8 | Wire.read();" significa 2 registros son leídos y guardados en la misma variable
a_x = Wire.read() << 8 | Wire.read(); // lectura del registro para acelerómetro: 0x3B (A_XOUT_H) y 0x3C (A_XOUT_L) (HIGH/LOW)
a_y = Wire.read() << 8 | Wire.read(); // lectura del registro: 0x3D (A_YOUT_H) y 0x3E (A_YOUT_L)(HIGH/LOW)
a_z = Wire.read() << 8 | Wire.read(); //lectura del registro: 0x3F (A_ZOUT_H) y 0x40 (A_ZOUT_L)(HIGH/LOW)
t = Wire.read() << 8 | Wire.read(); // lectura del registro para temperatura: 0x41 (T_OUT_H) y 0x42 (T_OUT_L)(HIGH/LOW)
g_x = Wire.read() << 8 | Wire.read(); // lectura del registro para giroscopio: 0x43 (G_XOUT_H) and 0x44 (GYRO_XOUT_L)
g_y = Wire.read() << 8 | Wire.read(); // lectura del registro: 0x45 (G_YOUT_H) and 0x46 (G_YOUT_L)
g_z = Wire.read() << 8 | Wire.read(); // lectura del registro: 0x47 (G_ZOUT_H) and 0x48 (G_ZOUT_L)
// Impresión de la información
Serial.print("aX = "); Serial.print(convert_int16_to_str(a_x));
Serial.print(" | aY = "); Serial.print(convert_int16_to_str(a_y));
Serial.print(" | aZ = "); Serial.print(convert_int16_to_str(a_z));
Serial.print(" | tmp = "); Serial.print(t / 340.00 + 36.53); // ecuación recomendada en el datasheet para la temperatura
Serial.print(" | gX = "); Serial.print(convert_int16_to_str(g_x));
Serial.print(" | gY = "); Serial.print(convert_int16_to_str(g_y));
Serial.print(" | gZ = "); Serial.print(convert_int16_to_str(g_z));
Serial.println();
// espera 1s para la siguiente lectura
delay(1000);
}




























Valoraciones
No hay valoraciones aún.