Lab DSM Practica#3 1914362
Lab DSM Practica#3 1914362
Lab DSM Practica#3 1914362
Acelerómetro
Mide la aceleración, inclinación o vibración y transforma la magnitud física de
aceleración en otra magnitud eléctrica que será la que emplearemos en los
equipos de adquisición estándar. Los rangos de medida van desde las décimas de
g, hasta los miles de g.
El circuito integrado MPU-6050 contiene un acelerómetro y giroscopio MEMS en
un solo empaque. Cuenta con una resolución de 16-bits, lo cual significa que
divide el rango dinámico en 65536 fracciones, estos aplican para cada eje X, Y y Z
al igual que en la velocidad angular..
Objetivo
El objetivo de la presente practica es calibrar el MPU6050 para que su sensor se
encuentre en una posición 100% horizontal para que posteriormente este pueda
funcionar correctamente y con ello nos proporcione lo datos correctos mediante
una programación de arduinio.
MÉTODOS Y MATERIALES.
Primero vamos a iniciar armando nuestro circuito en el protoboard, como se
indica a continuación.
Colocar el ATMEGA328P en el centro del protoboard
Colocar ambas resistencias en las siguientes coordenadas del protoboard.
RES 10K: (+,2) (A,4) RES 47K: (H,18) (H,22)
Insertar los capacitores en las siguientes coordenadas del protoboard.
CAP1 22pf: (E,18) (E,20) CAP2 22pf: (E,26) (E,28) CAP3 .1mf: (E,1) (E,3)
CAP4 10uf: (+,19) (-19)
Colocar el cristal 16Mhz en las coordenadas (E,22) (E,24).
Insertar el diodo 1N4001 en las coordenadas (H,29) (H,33).
Colocar el regulador de voltaje LM7805 colocando los 3 pines en sus
respectivas coordenadas.
PIN1(input voltage): (J,29) PIN2(gnd): (J,30) PIN3(output voltaje): (J,31)
Colocar el transistor 2N2222 colocando los 3 pines en sus respectivas
coordenadas.
PIN1(colector): (J,21) PIN2(base): (J,22) PIN3(emisor): (J,23)
Colocar el LED en las coordenadas (J,24) (J,25).
Lista de materiales
Codigo utlizado
// Librerias I2C para controlar el mpu6050
// la libreria MPU6050.h necesita I2Cdev.h, I2Cdev.h necesita Wire.h
#include "I2Cdev.h"
#include "MPU6050.h"
#include "Wire.h"
// La dirección del MPU6050 puede ser 0x68 o 0x69, dependiendo
// del estado de AD0. Si no se especifica, 0x68 estará implicito
MPU6050 sensor;
// Valores RAW (sin procesar) del acelerometro y giroscopio en los ejes x
,y,z
int ax, ay, az;
int gx, gy, gz;
//Variables usadas por el filtro pasa bajos
long f_ax,f_ay, f_az;
int p_ax, p_ay, p_az;
long f_gx,f_gy, f_gz;
int p_gx, p_gy, p_gz;
int counter=0;
//Valor de los offsets
int ax_o,ay_o,az_o;
int gx_o,gy_o,gz_o;
void setup() {
Serial.begin(57600); //Iniciando puerto serial
Wire.begin(); //Iniciando I2C
sensor.initialize(); //Iniciando el sensor
if (sensor.testConnection()) Serial.println("Sensor iniciado
correctamente"););
// Leer los offset los offsets anteriores
ax_o=sensor.getXAccelOffset();
ay_o=sensor.getYAccelOffset();
az_o=sensor.getZAccelOffset();
gx_o=sensor.getXGyroOffset();
gy_o=sensor.getYGyroOffset();
gz_o=sensor.getZGyroOffset();
Serial.println("Offsets:");
Serial.print(ax_o); Serial.print("\t");
Serial.print(ay_o); Serial.print("\t");
Serial.print(az_o); Serial.print("\t");
Serial.print(gx_o); Serial.print("\t");
Serial.print(gy_o); Serial.print("\t");
Serial.print(gz_o); Serial.print("\t");
Serial.println("nnEnvie cualquier caracter para empezar la
calibracionnn");
// Espera un caracter para empezar a calibrar
while (true){if (Serial.available()) break;}
Serial.println("Calibrando, no mover IMU");
}
void loop() {
// Leer las aceleraciones y velocidades angulares
sensor.getAcceleration(&ax, &ay, &az);
sensor.getRotation(&gx, &gy, &gz);
// Filtrar las lecturas
f_ax = f_ax-(f_ax>>5)+ax;
p_ax = f_ax>>5;
f_ay = f_ay-(f_ay>>5)+ay;
p_ay = f_ay>>5;
f_az = f_az-(f_az>>5)+az;
p_az = f_az>>5;
f_gx = f_gx-(f_gx>>3)+gx;
p_gx = f_gx>>3;
f_gy = f_gy-(f_gy>>3)+gy;
p_gy = f_gy>>3;
f_gz = f_gz-(f_gz>>3)+gz;
p_gz = f_gz>>3;
//Cada 100 lecturas corregir el offset
if (counter==100){
//Mostrar las lecturas separadas por un [tab]
Serial.print("promedio:"); Serial.print("t");
Serial.print(p_ax); Serial.print("\t");
Serial.print(p_ay); Serial.print("\t");
Serial.print(p_az); Serial.print("\t");
Serial.print(p_gx); Serial.print("\t");
Serial.print(p_gy); Serial.print("\t");
Serial.println(p_gz);
//Calibrar el acelerometro a 1g en el eje z (ajustar el offset)
if (p_ax>0) ax_o--;
else {ax_o++;}
if (p_ay>0) ay_o--;
else {ay_o++;}
if (p_az-16384>0) az_o--;
else {az_o++;}
sensor.setXAccelOffset(ax_o);
sensor.setYAccelOffset(ay_o);
sensor.setZAccelOffset(az_o);
//Calibrar el giroscopio a 0º/s en todos los ejes (ajustar el offset)
if (p_gx>0) gx_o--;
else {gx_o++;}
if (p_gy>0) gy_o--;
else {gy_o++;}
if (p_gz>0) gz_o--;
else {gz_o++;}
sensor.setXGyroOffset(gx_o);
sensor.setYGyroOffset(gy_o);
sensor.setZGyroOffset(gz_o);
counter=0;
}
counter++;
}
Resultados
Monitor al conectar el MPU6050 antes de la calibración
Conclusión
Al concluir la practica el objetivo se cumplió pues se pudo observar con las
lecturas en la pantalla como estas fueron cambiando al utilizar el OFFSETS en la
programación del MPU6050, y se observo como este de 1300 llegó hasta 0 como
este se requeria para comprobar la calibración.
Referencias bibliográficas
(1) Valdés, F., & Areny, R. P. (2007). Microcontroladores fundamentos y
aplicaciones con
PIC (Vol. 1149). Marcombo.
(2) Naylamp mechatronics. 2021. MPU6050, ACELERÓMETRO Y GIROSCOPIO.
Disponible en Internet en: https://naylampmechatronics.com/blog/45_tutorial-
mpu6050-
acelerometro-y-giroscopio.html
(3) HetPro Store. 2021. MPU6050 Arduino, Acelerómetro y Giroscopio. Disponible
en
Internet en: https://hetpro-store.com/TUTORIALES/modulo-acelerometro-y-
giroscopiompu6050-
i2c-twi/
Descargado