
Medir el ángulo de inclinación usando el giroscopio/acelerómetro MPU6050 y Arduino
Se puede medir el ángulo de inclinación usando MPU6050 simplemente conectando el sensor giroscópico/acelerómetro de 6 ejes MPU6050. El acelerómetro envía fuerzas de aceleración X, Y y Z. Necesitamos convertir las fuerzas en ángulos 3D X, Y, Z para determinar la orientación 3D del sensor.
El giroscopio mide la velocidad de rotación o la tasa de cambio de la 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 medir. Las salidas del giroscopio están en grados por segundo, por lo que para obtener la posición angular, sólo necesitamos integrar la velocidad angular.
El acelerómetro puede medir la aceleración gravitacional a lo largo de los 3 ejes y usando algunas matemáticas de trigonometría podemos calcular el ángulo en el que está posicionado el sensor. Entonces, si fusionamos o combinamos los datos del acelerómetro y el giroscopio del MPU6050, podemos obtener información muy precisa sobre la orientación del sensor. Por lo tanto, MPU6050 con Arduino puede medir el ángulo de inclinación.
Giroscopio/acelerómetro MPU6050
El sensor InvenSense MPU-6050 contiene un acelerómetro MEMS y un giroscopio MEMS en un solo chip. Es muy preciso, ya que contiene un hardware de conversión de analógico a digital de 16 bits para cada canal. Por lo tanto, captura los canales x, y y z al mismo tiempo. El sensor utiliza el bus I2C para interactuar con Arduino.
El MPU-6050 no es caro, especialmente teniendo en cuenta que combina un acelerómetro y un giroscopio.
Distribución de pines del MPU6050:
El módulo MPU-6050 tiene 8 pines:
INT: Interrumpe el pin de salida digital.
AD0: pin LSB de dirección esclava I2C. Este es el bit 0 en la dirección esclava de 7 bits del dispositivo. Si está conectado a VCC, se lee como uno lógico y la dirección del esclavo cambia.
XCL: Pin de reloj serie auxiliar. Este pin se utiliza para conectar el pin SCL de otros sensores habilitados para interfaz I2C al MPU-6050.
XDA: Pin de datos serie auxiliar. Este pin se utiliza para conectar el pin SDA de otros sensores habilitados para interfaz I2C al MPU-6050.
SCL: pin de reloj serie. Conecte este pin al pin SCL del microcontrolador.
SDA: pin de datos serie. Conecte este pin al pin SDA del microcontrolador.
GND: clavija de tierra. Conecte este pin a la conexión a tierra.
VCC: Pin de fuente de alimentación. Conecte este pin al suministro de +5 V CC.
Giroscopio de 3 ejes:
El MPU6050 consta de un giroscopio de 3 ejes con tecnología Micro Electro Mechanical System (MEMS). Se utiliza para detectar la velocidad de rotación a lo largo de los ejes X, Y, Z como se muestra en la siguiente figura.

Acelerómetro de 3 ejes:
El MPU6050 consta de un acelerómetro de 3 ejes con tecnología microelectromecánica (MEM). Solía detectar el ángulo de inclinación o inclinación a lo largo de los ejes X, Y y Z como se muestra en la siguiente figura.

Diagrama de circuito y conexión
MPU6050 tiene pines I2C. Por lo tanto, debe estar conectado a los pines I2C de Arduino. Conecte los pines SDA de MPU6050 a A4 de Arduino y SCL a A5. Suministre una entrada de 5 V al MPU6050 y también conecte el GND como se muestra en la siguiente figura.
Conexión del MPU6050 con el Microcontrolador
Ejemplos: Wemos D1 Mini y Arduino Uno


Código fuente/programa
A continuación se muestra el código para medir el ángulo de inclinación usando MPU6050 y Arduino. Copie el código y cárguelo en la placa Arduino.
#include<Wire.h>
const int MPU_addr = 0x68;
int16_t AcX, AcY, AcZ, Tmp, GyX, GyY, GyZ;
int minVal = 265;
int maxVal = 402;
double x;
double y;
double z;
void setup() {
Wire.begin();
Wire.beginTransmission(MPU_addr);
Wire.write(0x6B); //Dirección de memoria del Sensor
Wire.write(0);
Wire.endTransmission(true);
Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
String textoAImprimir; //Imprime el resultado por consola.
delay (2);
unsigned long tiempoInicio = millis();
Wire.beginTransmission(MPU_addr);
Wire.write(0x3B);
Wire.endTransmission(false);
Wire.requestFrom(MPU_addr, 14, true);
AcX = Wire.read() << 8 | Wire.read();
AcY = Wire.read() << 8 | Wire.read();
AcZ = Wire.read() << 8 | Wire.read();
if (AcX == -1 && AcY == -1 && AcZ == -1 ) {
Serial.println("No conection MPU6050");
delay (1000);
}
else {
int xAng = map(AcX, minVal, maxVal, -90, 90);
int yAng = map(AcY, minVal, maxVal, -90, 90);
int zAng = map(AcZ, minVal, maxVal, -90, 90);
x = RAD_TO_DEG * (atan2(-yAng, -zAng) + PI);
y = RAD_TO_DEG * (atan2(-xAng, -zAng) + PI);
z = RAD_TO_DEG * (atan2(-yAng, -xAng) + PI);
Serial.print("x="+(String)x);
Serial.print(", y="+(String)y);
Serial.println(", z="+(String)z);
}
//////////Parpadeo//////////////////Parpadeo//////////////////Parpadeo////////
static unsigned long timerBlink;
if (millis() > timerBlink + 500) {
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
timerBlink = millis();
}
}
absolutamente hermoso que prescindes de librerías como la de ADAFRUIT que era totalmente innecesaria y es como la enseñan en todos lados. Una pasada el MPU6050. Muchas gracias.