Menu mobile
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.
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
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.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.write(0x43);
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:
//Definimos la direccion I2C del MPU
//Definimos los ratios de conversión
//Definimos la conversion de radianes a grados 180/PI
//Declaramos memorias para los valores brutos
//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;
//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]);
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: