0. Componentes y programación necesaria para el control del módulo acelerómetro + giroscopio 3 ejes MPU-6050

Componentes requeridos:

{Product:2000}{Product:841}

I. Cómo utilizar un sensor de posicionamiento con Arduino

En este corto tutorial se explica cómo poder detectar la posición mediante el movimiento. El módulo MPU6050 es un sensor de movimiento, capaz de medir la aceleración y el giro en los tres ejes del movimiento (x,y,z) con bastante buena precisión.

Tiene también un conversor ADC de 16 bits, el cual convierte los datos a un valor digital y los envía al Arduino mediante I2C.

Para obtener más información sobre productos o sus descripciones técnicas entre en nuestra web Solectro Shop.

II. Procedimientos experimentales

Conexión

El módulo se alimenta directamente de Arduino, así que no necesitamos una fuente de alimentación externa. Deberás soldar los pines o headers para usarla sobre una Protoboard o con cables DuPont. En este ejemplo conectaremos el módulo a la placa Arduino UNO mediante I2C.

El módulo se alimenta directamente de Arduino, así que no necesitamos una fuente de energía externa. Los pines están conectados según la tabla:

Pin del sensor

Pin de Arduino UNO

VCC

5V

GND

GND

SCL

A5

SDA

A4

INT

D0

 

Los otros dos pines del módulo del sensor se conectan a la sonda de medición mediante los cables suministrado, como se muestra en el siguiente diagrama:

Operación

Con el primer ejemplo para este módulo, podremos obtener los valores en bruto o RAW recogidos por el sensor y mostrarlos por el monitor serie.

Abre un nuevo sketch y pega el siguiente código:

 

//Incluimos la librería para I2C

#include <Wire.h>

 

//Definimos la dirección I2C del MPU

// Dependiendo del estado de AD0, la dirección puede ser 0x68 o 0x69

#define MPU 0x68

 

//Definimos las ratios de conversión

#define A_R 16384.0

#define G_R 131.0

 

//Definimos la conversión de radianes a grados 180/PI

#define RAD_A_DEG = 57.295779

 

//El MPU da los valores en enteros de 16 bits

//Declaramos memorias para los valores RAW

int16_t AcX;

int16_t AcY;

int16_t AcZ;

int16_t GyX;

int16_t GyY;

int16_t GyZ;

 

//Declaramos cadena de caracteres para los ángulos

float Acc[2];

float Gy[2];

float Angle[2];

 

void setup()

{

//Inicializamos el I2C y el puerto serie

Wire.begin();

Wire.beginTransmission(MPU);

Wire.write(0x6B);

Wire.write(0);

Wire.endTransmission(true);

Serial.begin(9600);

}

 

void loop()

{

   //Leemos los valores del Acelerometro

   Wire.beginTransmission(MPU);

   Wire.write(0x3B); //Pedimos el registro 0x3B - corresponde al AcX

   Wire.endTransmission(false);

   Wire.requestFrom(MPU,6,true); //A partir del 0x3B, se piden 6 registros

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

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

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

 

   //Leemos los valores del Giroscopio

   Wire.beginTransmission(MPU);

   Wire.write(0x43);

   Wire.endTransmission(false);

   Wire.requestFrom(MPU,4,true); //A diferencia del Acelerometro, solo se piden 4 registros

   GyX=Wire.read()<<8|Wire.read();

   GyY=Wire.read()<<8|Wire.read();

   

   /Mostramos los valores por el monitor serial

   Serial.print("Acelerometro bruto X: "); Serial.println(AcX);

   Serial.print("Acelerometro bruto Y: "); Serial.println(AcY);

   Serial.print("Acelerometro bruto Z: "); Serial.println(AcZ);

   Serial.print("Giroscopo bruto Y: "); Serial.println(GyX);

   Serial.print("Giroscopo bruto X: "); Serial.println(GyY);

   Serial.print("Giroscopo bruto Y: "); Serial.println(GyZ);

 

   //Esperamos 1 segundo para poder visualizarlo en el monitor serial

   delay(1000);

}

 

Una vez subido el proyecto, abrimos el Monitor Serial desde la pestaña Herramientas, y podremos ver los valores en bruto captados:

 

Como segundo ejemplo, mostramos como con este módulo captar el ángulo actual de inclinación. Copia el siguiente código en un sketch vacío:

 

//Incluimos la librería para I2C

#include <Wire.h>

 

//Definimos la direccion I2C del MPU

#define MPU 0x68

 

//Definimos los ratios de conversión

#define A_R 16384.0

#define G_R 131.0

 

//Definimos la conversion de radianes a grados 180/PI

#define RAD_A_DEG = 57.295779

 

//El MPU da los valores en enteros de 16 bits

//Declaramos memorias para los valores brutos

int16_t AcX;

int16_t AcY;

int16_t AcZ;

int16_t GyX;

int16_t GyY;

int16_t GyZ;

 

//Declaramos cadena de caracteres para los ángulos

float Acc[2];

float Gy[2];

float Angle[2];

 

void setup()

{

//Inicializamos el I2C y el puerto serie

Wire.begin();

Wire.beginTransmission(MPU);

Wire.write(0x6B);

Wire.write(0);

Wire.endTransmission(true);

Serial.begin(9600);

}

 

void loop()

{

   //Leemos los valores del Acelerometro

   Wire.beginTransmission(MPU);

   Wire.write(0x3B); //Pedimos el registro 0x3B - corresponde al AcX

   Wire.endTransmission(false);

   Wire.requestFrom(MPU,6,true); //A partir del 0x3B, se piden 6 registros

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

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

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

 

   //Calculamos los angulos Y, X respectivamente.

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

  Acc[0] = atan((AcY/A_R)/sqrt(pow((AcX/A_R),2) + pow((AcZ/A_R),2)))*RAD_TO_DEG;

 

   //Leemos los valores del Giroscopio

   Wire.beginTransmission(MPU);

   Wire.write(0x43);

   Wire.endTransmission(false);

   Wire.requestFrom(MPU,4,true); //A diferencia del Acelerometro, solo se piden 4 registros

   GyX=Wire.read()<<8|Wire.read();

   GyY=Wire.read()<<8|Wire.read();

 

   //Calculamos el angulo del Giroscopio

   Gy[0] = GyX/G_R;

   Gy[1] = GyY/G_R;

 

   //Aplicamos un Filtro Complementario

   Angle[0] = 0.98 *(Angle[0]+Gy[0]*0.010) + 0.02*Acc[0];

   Angle[1] = 0.98 *(Angle[1]+Gy[1]*0.010) + 0.02*Acc[1];

 

   //Mostramos los valores por el monitor serial

   Serial.print("Angle X: "); Serial.println(Angle[0]);

   Serial.print("Angle Y: "); Serial.println(Angle[1]);

  

  //Esperamos 1 segundo para poder visualizarlo en el monitor serial

   delay(1000);

}

 

Una vez subido el proyecto, abrimos el Monitor Serial desde la pestaña Herramientas, y podremos ver los valores en bruto de los ángulos X e Y captados:

 

 

 

 

 

Por último, también podemos instalar la librería “MPU6050.h” como habitualmente desde el “Gestor de Librerías” y usar el código siguiente en un nuevo sketch:

 

#include "I2Cdev.h"

#include "MPU6050.h"

#include "Wire.h"

 

// Dependiendo del estado de AD0, la dirección puede ser 0x68 o 0x69, para controlar así el esclavo que leerá por el bus I2C

MPU6050 sensor;

 

// Valores RAW o en crudo leidos del acelerometro y giroscopio en los ejes x,y,z

int ax, ay, az;

int gx, gy, gz;

 

void setup() {

  Serial.begin(57600);    //Función para iniciar el puerto serie con 57600 baudios

  Wire.begin();           //Inicio para el bus I2C

  sensor.initialize();    //Iniciando del sensor MPU6050

 

  if (sensor.testConnection()) Serial.println("Sensor iniciado correctamente");

  else Serial.println("Error al iniciar el sensor");

}

 

void loop() {

  // Leer las aceleraciones y velocidades angulares

  sensor.getAcceleration(&ax, &ay, &az);

  sensor.getRotation(&gx, &gy, &gz);

 

  // Muestra las lecturas que va registrando separadas por una tabulación

  Serial.print("a[x y z] g[x y z]:\t");

  Serial.print(ax); Serial.print("\t");

  Serial.print(ay); Serial.print("\t");

  Serial.print(az); Serial.print("\t");

  Serial.print(gx); Serial.print("\t");

  Serial.print(gy); Serial.print("\t");

  Serial.println(gz);

 

  delay(100);

}

Cuyo esquemático de conexión es el siguiente: