Está en la página 1de 5

Arduino y el MPU 6050

1 INTRODUCCIÓN
El chip MPU6050 es conocido en la actualidad como un IMU (Inertial Measurement Unit). A lo largo del
presente trabajo se quiere abordar el uso del chip MPU6050 para su aplicación en diversos campos
como puede ser:

 Topografía.
 GPS.
 Control de posición e inclinación.
 UAVs

Es común que en la actualidad, un vehículo aéreo no tripulado (Dron) lleve incorporado un dispositivo
de estas características.

A lo largo del presente trabajo se quiere ilustrar su funcionamiento. Además se incluirá el código
necesario para implementarlo sobre una placa de desarrollo Arduino.

2 EL CHIP MPU 6050


Este chip contiene un acelerómetro y un giróscopo, lo suficientemente precisos como para obtener
lecturas muy fiables. Por cada canal, contiene un convertidor analógico digital de 16 bits. Para
interactuar con Arduino, se utilizará la comunicación I2C. El chip opera con 3,3V

Ilustración 2-1. El Chip MPU6050

2.1 EL ACELERÓMETRO
Para obtener las lecturas de aceleración, el chip opera de la siguiente manera. Si el chip está alineado
con el suelo, su eje Z se encontrará perpendicular, de manera que marcará 9,8, mientras que los otros
ejes marcarán 0.
Si se inclina 90 grados, en este caso el eje X marcará 9,8.

De esta manera y aplicando fórmulas de trigonometría, será posible calcular el ángulo de inclinación de
la IMU.

Que no es otra que:

𝑥2
𝐴𝑛𝑔𝑢𝑙𝑜 𝑋 = 𝑎𝑡𝑎𝑛 ( )
√𝑦 2 + 𝑧 2

Se muestra un extracto del código utilizado, y que más adelante se explicará.

2.2 EL GIRÓSCOPO
Mediante el giróscopo será posible medir la velocidad angular. Anteriormente se a descrito a obtención
del ángulo inicial de la IMU, por lo que, al sumarle el nuevo ángulo en cada momento se obtendrán las
lecturas de inclinación de manera instantánea. Así, mediante la fórmula:

Que no es otra que:

𝐴𝑛𝑔𝑢𝑙𝑜 𝑋 = 𝐴𝑛𝑔𝑢𝑙𝑜 𝑋 𝑎𝑛𝑡𝑒𝑟𝑖𝑜𝑟 + 𝐿𝑒𝑐𝑡𝑢𝑟𝑎𝐺𝑖𝑟𝑜𝑠𝑐𝑜𝑝𝑖𝑜𝑋 ∗ 𝑡


Donde 𝑡 es el tiempo que transcurre entre lecturas. En este caso se ha implementado 0,010s.

2.3 FILTRADO DE SEÑAL


Todas estas lecturas contienen mucho error asociado y ruido. Se hace necesario aplicar un filtro
denominado el “Filtro de Kalman”. No se va a entrar en detalle de este proceso de filtrado.
3 CONEXIÓN CON ARDUINO

3.1 PINES DEL MPU 6050


 Vcc con terminal 3,3V del arduino.
 Gnd con terminal Gnd del arduino.
 SCL con terminal A5 (Analog Input 5) del arduino.
 SDA con terminal A4 (Analog Input 5) del arduino.

3.2 LEDS INDICADORES


Se van a añadir dos leds (en la imagen aparecen 3) para indicar las posiciones en X del chip. Con un
ángulo suave (-5 grados) el led verde se iluminará. Con un ángulo más elevado (hasta 40 grados) se
iluminará el led amarillo. Se pretende simular un sistema de alarma ante una inclinación no
recomendada en algún sistema.
3.3 ESQUEMÁTICO

3.4 CÓDIGO EN ARDUINO


#include <Wire.h> //Se importa la librería wire, que nos permite comunicarnos por I2C.

#define MPU 0x68 //La dirección del MPU 6050

#define A_R 16384.0 // Ratios de conversión.


#define G_R 131.0

#define RAD_A_DEG = 57.295779 // 180/pi para convertir de radianes a grados.

int16_t AcX, AcY, AcZ, GyX, GyY, GyZ; // Valores en enteros de 16 bits

float Acc[2]; //Se definen los vectores para guardar las lecturas.
float Gy[2];
float Angle[2];

void setup()
{
Wire.begin(); //Comenzamos la transmisión en la dirección 0x68.
Wire.beginTransmission(MPU);
Wire.write(0x6B);
Wire.write(0); //"Despertamos el chip"
Wire.endTransmission(true);
Serial.begin(9600);// Si se conecta a un PC, podremos leer las lecturas por puerto serie.

//Se definen los puertos para los tres leds.


pinMode(3,OUTPUT); //Led verde
pinMode(4,OUTPUT); //Led amarillo

void loop()
{

Wire.beginTransmission(MPU);
Wire.write(0x3B); //Se pide el registro 0x3B, correspondiente al AcX
Wire.endTransmission(false);
Wire.requestFrom(MPU,6,true); //Se piden 6 registros de datos.

AcX=Wire.read()<<8|Wire.read(); //Cada valor ocupa 2 registros


AcY=Wire.read()<<8|Wire.read();
AcZ=Wire.read()<<8|Wire.read();

Acc[1] = atan(-1*(AcX/A_R)/sqrt(pow((AcY/A_R),2) + pow((AcZ/A_R),2)))*RAD_TO_DEG; //Con los valores


del acelerómetro, calculamos la aceleración en X e Y.
Acc[0] = atan((AcY/A_R)/sqrt(pow((AcX/A_R),2) + pow((AcZ/A_R),2)))*RAD_TO_DEG;

Wire.beginTransmission(MPU); //Se leen valores del giróscopo.


Wire.write(0x43);
Wire.endTransmission(false);
Wire.requestFrom(MPU,4,true); //Se piden 4 registros
GyX=Wire.read()<<8|Wire.read();
GyY=Wire.read()<<8|Wire.read();

Gy[0] = GyX/G_R; //Se calcula el ángulo del giróscopo.


Gy[1] = GyY/G_R;

//Se aplica el Filtro de Kalman.


Angle[0] = 0.98 *(Angle[0]+Gy[0]*0.010) + 0.02*Acc[0]; //Angulo con respecto al eje X.
Angle[1] = 0.98 *(Angle[1]+Gy[1]*0.010) + 0.02*Acc[1]; //Ángulo con respecto al eje Y.

Serial.println(Angle[0]); //Se pueden mostrar todos los valores por consola.


Serial.println(Angle[1]);

if (Angle[0] <= 5 and Angle[0] >= -5){


digitalWrite(3, HIGH); //La inclinación no es elevada, luz verde.
digitalWrite(4, LOW);

}
else if (Angle[0] < 5 and Angle[0] < 40 and Angle[0] < -5 and Angle[0] > -40){
digitalWrite(4, HIGH); //La inclinación empieza a ser considerable, luz amarilla.
digitalWrite(3, LOW);
}
delay(10); //0.010, el intervalo en cada medida.
}

4 VÍDEO DE LA PRÁCTICA
Se incluye el vídeo en la carpeta compartida en el zip adjunto.

También podría gustarte