Instituto Politcnico Nacional
Unidad Profesional Interdisciplinaria en Ingeniera
y Tecnologas Avanzadas
Tpicos avanzados de sensores
Practica 3: Configuracin y uso del sensor
MPU6050.
Profesora: Abarca Jimnez Griselda Stephany
Integrantes:
-Blanco Corona Eduardo
-Evia Urban Erick Alfredo
-Galindo Fuentes Alejandro
Grupo: 3MM4
Introduccin
Para esta prctica se utilizar el sensor MPU6050 el cual contiene un acelermetro y un giroscopio. Su
protocolo de comunicacin es mediante
El protocolo de comunicacin
I C
I C .
es una forma de comunicacin serial. La caracterstica principal
de este protocolo es el uso de dos lneas para la comunicacin, una de ellas es para transmitir los datos y
otra para controlar la seal de reloj. La seal de reloj se encuentra en el pin con el nombre SCL y la de
los datos en el pin SDA. Para esta prctica se utilizara la tarjeta de desarrollo Arduino UNO, una ventaja
es que tiene puertos especiales para este tipo de protocolo y libreras que facilitan el manejo de este
sensor.
Para configurar este sensor primeramente se requiere conocer la direccin del sensor y configurarla en
Arduino, en este caso es 0x68. Una vez conocida la direccin, Arduino enva un bit a dicha direccin
para iniciar la comunicacin, luego enva la direccin del registro que se quiere leer o escribir para
despus recibir o enviar el dato deseado. Cada que se hace una lectura el registro se autoincrementa para
continuar con el siguiente dato.
Mediante la hoja de registros del sensor podemos configurar los parmetros de inters, como lo son la
resolucin del acelermetro y el giroscopio o el filtro interno. Una vez que se tienen los datos deseados
estos se mandan a MatLab y se grafican en tiempo real visualizando el cambio de las aceleraciones con
ejes coordenados.
En la siguiente imagen tenemos el sensor MPU6050:
Figura 1. Sensor MPU6050
Desarrollo
Para la prctica es necesario que el Arduino enve datos constantemente hacia MatLab, este ltimo ser
el encargado de procesar los datos recibidos de tal forma que pueda graficar los ejes coordenados en
funcin de la informacin que recibe del acelermetro.
El siguiente cdigo es para programar Arduino, el sensor se configura a 2G, lo que nos interesa saber
son los ngulos relacionados a las aceleraciones de los 3 ejes del sensor.
#include <Wire.h>
#include <math.h>
//Registros de acuerdo a la hoja de especificaciones
#define MPU6050_CONFIG
0x1A
#define MPU6050_GYRO_CONFIG
0x1B
#define MPU6050_ACCEL_CONFIG
0x1C
#define MPU6050_ACCEL_XOUT_H
0x3B
#define MPU6050_ACCEL_XOUT_L 0x3C
#define MPU6050_ACCEL_YOUT_H
0x3D
#define MPU6050_ACCEL_YOUT_L 0x3E
#define MPU6050_ACCEL_ZOUT_H
0x3F
#define MPU6050_ACCEL_ZOUT_L 0x40
#define MPU6050_TEMP_OUT_H
0x41
#define MPU6050_TEMP_OUT_L
0x42
#define MPU6050_GYRO_XOUT_H
0x43
#define MPU6050_GYRO_XOUT_L
0x44
#define MPU6050_GYRO_YOUT_H
0x45
#define MPU6050_GYRO_YOUT_L
0x46
#define MPU6050_GYRO_ZOUT_H
0x47
#define MPU6050_GYRO_ZOUT_L
0x48
#define MPU6050_PWR_MGHT_1
0x6B
#define MPU6050_ADDRESS
0x68
void setup(void){
[Link](9600);
[Link]();
delay(50);
//Parametros de configuracin
MPU6050_configuracion(MPU6050_CONFIG,0x03);
MPU6050_configuracion(MPU6050_GYRO_CONFIG,0x10);
MPU6050_configuracion(MPU6050_ACCEL_CONFIG,0x00);
MPU6050_configuracion(MPU6050_PWR_MGHT_1,0x00);
delay(50);
}
void loop(void){
//Declaracin de variables
unsigned short int accel_x_h=0, accel_x_l=0, accel_y_h=0, accel_y_l=0, accel_z_h=0, accel_z_l=0;
long int accel_x=0, accel_y=0, accel_z=0;
double alpha=0, beta=0, gama=0;
//Lectura de datos
[Link](MPU6050_ADDRESS);
[Link](MPU6050_ACCEL_XOUT_H);
[Link](MPU6050_ADDRESS, 6);
accel_x_h = [Link]();
accel_x_l = [Link]();
accel_y_h = [Link]();
accel_y_l = [Link]();
accel_z_h = [Link]();
accel_z_l = [Link]();
[Link]();
//Obtencion de valores y calibracion
accel_x=(long int)((((int)accel_x_h)<<8 ) | ((int)accel_x_l))-325;
accel_y=(long int)((((int)accel_y_h)<<8 ) | ((int)accel_y_l))+50;
accel_z=(long int)((((int)accel_z_h)<<8 ) | ((int)accel_z_l))-900;
//Calculo de angulos
alpha=(accel_x*90)/16500;
beta=(accel_y*90)/16500;
gama=((accel_z*90)/16500)-90;
//Impresion de valores
[Link](alpha);
[Link](",");
[Link](beta);
[Link](",");
[Link](gama);
delay(50);
}
//Funcin para configuracin
void MPU6050_configuracion(int r1, int r2){
[Link](MPU6050_ADDRESS);
[Link](r1);
[Link](r2);
[Link]();
delayMicroseconds(20);
}
Los siguientes cdigos son para graficar los ejes coordenados en MatLab, se incluye el programa
principal y la funcin encargada de rotar la figura dados los datos que enva el sensor.
El programa principal es el siguiente:
clear;
close all;
clc;
% Inicializacin del puerto serial
delete(instrfind({'Port'},{'COM3'}));
s = serial('COM3','BaudRate',9600);
warning('off','MATLAB:serial:fscanf:unsucesfulRead');
fopen(s);
% Inicializacin de los parmetros de la Figura
f = figure('Name','Inclinmetro');
a = axes('XLim',[-1 1],'YLim',[-1 1],'ZLim',[-1 1]);
v = view(135,30);
title('Inclinmetro MPU6050');
grid on;
hold on;
l=0;
while l==0
for i=[Link]
%Lectura de los valores enviados desde Arduino
ang=fscanf(s,'%f,%f,%f');
end
deg=ang';
cla;
%Llama la funcin Rotacin, usando como parmetros
%los valores ledos del puerto serial
Rotacion(deg(1),deg(2),deg(3));
drawnow
end
% Fin de la comunicacin serial
fclose(s);
delete(s);
El cdigo de la funcin que rota los ejes coordenados es la siguiente:
function Rotacion(a0, b0, c0)
% Funcin para rotar ejes coordenados, recibe como parmetros
% el ngulo rotado en los ejes X Y Z
%
a
b
c
Conversin de grados a radianes
= pi*a0/180;
= pi*b0/180;
= pi*c0/180;
% Se construye la matriz para rotar
Rx = [1 0 0; 0 cos(a) -sin(a); 0 sin(a) cos(a)];
Ry = [cos(b) 0 sin(b); 0 1 0; -sin(b) 0 cos(b)];
Rz = [cos(c) -sin(c) 0; sin(c) cos(c) 0; 0 0 1];
R = Rx*Ry*Rz;
Ro = R';
% Obtiene los componentes de cada nuevo eje
X = Ro*[1 0 0]';
Y = Ro*[0 1 0]';
Z = Ro*[0 0 1]';
% Construye los pares de puntos para dibujar los ejes
O = [0 0 0]';
Xaxis = [O X];
Yaxis = [O Y];
Zaxis = [O Z];
plot3(Xaxis(1,:), Xaxis(2,:), Xaxis(3,:),'r','LineWidth',2);
plot3(Yaxis(1,:), Yaxis(2,:), Yaxis(3,:),'g','LineWidth',2);
plot3(Zaxis(1,:), Zaxis(2,:), Zaxis(3,:),'LineWidth',2);
end
Resultados
Los datos que enva Arduino se pueden ver en el monitor serial:
Figura 2. Visualizacin de los datos en el monitor serial de Arduino.
Los 3 valores que se pueden ver son los ngulos relacionados con las aceleraciones, el primero de ellos
es alpha, el segundo beta y el tercero es gama.
Los ejes coordenados se grafican de la siguiente manera en MatLab:
Figura 3. Ejes coordenados en funcin de los ngulos del acelermetro.
En la primera imagen se pueden ver los ejes coordenados cuando el sensor est en su posicin original.
La segunda imagen tiene una inclinacin debido a que el sensor tambin fue inclinado de la misma
manera.
Conclusiones
Blanco Corona Eduardo
Para este sensor se tienen varios parmetros para configurar, en esta prctica se hizo nfasis en la parte
de la resolucin, ya que al requerir mediciones de aceleraciones pequeas se opt por usar la resolucin
de 2G. La calibracin tambin es importante y nica para cada sensor, esta nos permite realizar
mediciones correctamente. Por ltimo es necesario darle sentido a los valores que se estn obteniendo,
en este caso el clculo de los ngulos es lo que nos permite hacer esta interpretacin.
Evia Urban Erick Alfredo
En esta prctica pude hacer uso del sensor digital MPU6050, configurando algunos de los registros ms
importantes para poder modificar el rango y hacer uso de las lecturas del acelermetro, giroscopio y
termmetro que estn incluidos en el sensor. La aplicacin que realizamos como inclinmetro hizo uso
de las mediciones del acelermetro en los diferentes ejes, sobre los cuales se realiz la calibracin y as
poder convertir el valor medido a un ngulo en grados y poder representar la inclinacin sobre el eje
coordenada.
Galindo Fuentes David Alejandro
Al finalizar esta prctica se conoce la configuracin bsica del sensor MPU6050 para la adquisicin de
datos de este y posteriormente se implementan mediante relaciones matemticas que permitan generar
parmetros con interpretacin fsica, para nuestro caso se implement en un inclinmetro, para usos
especficos del sensor ya que sus mediciones permiten una gran diversidad de aplicaciones. Finalmente
un parmetro importante en este tipo de sensores es la calibracin ya que cada sensor requiere una
propia.