Descripción
El IMU MPU6050 6 Grados de libertad es un circuito integrado que combina un giroscopio de 3-ejes y un acelerómetro de 3-ejes en el mismo chip, teniendo 6 grados de libertad(DoF).
¿Para qué sirve el IMU MPU6050?
El MPU6050 es útil para sistemas de control, medición de vibración, sistemas de medición inercial (IMU), detección de caídas, sensor de distancia y/o velocidad o goniometría (medición de ángulos).
ESPECIFICACIÓN Y CARACTERÍSTICAS
- Voltaje de funcionamiento: 3.3V a 5V
- Chip: MPU-6050.
- Grados de libertad (DoF): 6
- Protocolo de comunicación: I2C
- Convertidor analógico a digital: 16 bit en todos los ejes.
- Rango
- Giroscopio: +/-250,+/- 500,+/- 1000 y +/- 2000° /s(dps)
- Acelerómetro: +/-2 ,+/-4 ,+/-8 y +/-16g
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.3V (por lo cual se puede alimentar con los 5V 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 fabrica. Para mas 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ácters 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.