Muy buenas a todos!!!
Vamos a ver que funcionalidades tiene el sensor MPU6050 el cual integra un acelerómetro de 3 ejes un giroscopio de 3 ejes y un sensor de temperatura, aunque este último no es muy preciso.
Antes de empezar vamos a destacar algunos de los términos que se usan con este sensor:
¿Que mide el acelerómetro?
Como su nombre indica, un acelerómetro mide la aceleración que es una magnitud vectorial, es decir, magnitud el cambio de velocidad, y la dirección, hacia donde se realiza el cambio.
A grandes rasgos hay tres tipos de aceleración:
- Aceleración positiva: La velocidad de un objeto aumenta en el tiempo.
- Aceleración negativa: La velocidad de un objeto disminuye con el tiempo.
- Aceleración centrípeta: La dirección cambia a una velocidad constante.
¿Que mide el giroscopio?
Un giroscopio es un dispositivo que mide la velocidad angular o tasa de rotación de un objeto en los ejes X, Y y Z. La velocidad angular se expresa en grados por segundo (°/s) o radianes por segundo (rad/s).
El MPU6050, está basado en tecnología Micro-Electro-Mechanical Systems más conocido como MEMS . Esta tecnología utilizan un pequeño elemento vibrante que, al girar, experimenta una fuerza llamada efecto Coriolis. Esta fuerza es detectada y convertida en una señal eléctrica, que luego se traduce en una medida de la velocidad angular. Esto nos permite detectar rotaciones en cualquier dirección.También podemos configurar el rango de medición teniendo en cuenta que rotaciones más rápidas equivalen a una menor precisión.
El rango de medición es configurable con los siguientes valores:
- ±250 °/s
- ±500 °/s
- ±1000 °/s
- ±2000 °/s
Resumen de aceleración y giroscopio en el contexto del MPU6050
El acelerómetro del MPU6050 mide la aceleración en los ejes X, Y, Z. Esto incluye:
- La aceleración debida al movimiento por ejemplo, si mueves el sensor.
- La aceleración debida a la gravedad 9.8 m/s² hacia el centro de la Tierra.
El acelerómetro del MPU6050 mide la velocidad angular en los ejes: X, Y y Z.
- La velocidad angular se expresa en grados por segundo (°/s) o radianes por segundo (rad/s).
Diferencia entre giroscopio y acelerómetro
- Acelerómetro: Mide la aceleración lineal (cambios en la velocidad en línea recta) y la inclinación respecto a la gravedad.
- Giroscopio: Mide la velocidad angular (cambios en la rotación o giro).
La combinación de ambos sensores trabajando juntos para proporcionan una imagen completa del movimiento de un objeto. Por ejemplo:
- El acelerómetro puede decirte si un objeto está inclinado.
- El giroscopio puede decirte si el objeto está girando y a qué velocidad.
Conexiones MPU6050:
- VCC: Alimentación +.
- GND: Alimentación - o masas.
- SCL: Serial Clock pin para la interfaz I2C.
- SDA: Serial Data pin para la interfaz I2C.
- XDA: I2C externo Serial Data para conectar sensores externos como un magnetómetro.
- XCL: I2C externo Serial clock.
- AD0: Cambia de dirección para evitar conflictos: GND -> Dirección 0X68 o +3.3V -> Dirección 0x69.
- INT: Pin de interrupción. El MPU6050 puede programarse para generar interrupciones al detectar ciertos gestos o vibraciones.
Librerías para MPU650:
- MPU6050 by Jeff Rowberg: Una de las más populares y completas. Puedes ver el ejemplo de uso en GitHub.
- Adafruit MPU6050: Otra opción sencilla y bien documentada. ejemplo de uso en GitHub.
- Librería Wire.h incluida con Arduino: Con esta librería leeremos los registros directamente desde el sensor MPU6050
#include <Wire.h>
// Dirección del sensor
const int MPU6050_addr=0x68;
int16_t AccX, AccY, AccZ;
int16_t GyroX, GyroY, GyroZ;
int16_t Temp;
void setup(){
Wire.begin();
Wire.beginTransmission(MPU6050_addr);
Wire.write(0x6B);
Wire.write(0);
Wire.endTransmission(true);
Serial.begin(115200);
}
void loop(){
Wire.beginTransmission(MPU6050_addr);
Wire.write(0x3B);
Wire.endTransmission(false);
Wire.requestFrom(MPU6050_addr,14,true);
AccX=Wire.read()<<8|Wire.read();
AccY=Wire.read()<<8|Wire.read();
AccZ=Wire.read()<<8|Wire.read();
Temp=Wire.read()<<8|Wire.read();
GyroX=Wire.read()<<8|Wire.read();
GyroY=Wire.read()<<8|Wire.read();
GyroZ=Wire.read()<<8|Wire.read();
Serial.print("AccX = "); Serial.print(AccX);
Serial.print(" || AccY = "); Serial.print(AccY);
Serial.print(" || AccZ = "); Serial.print(AccZ);
Serial.print(" || Temp = "); Serial.print(Temp/340.00+36.53);
Serial.print(" || GyroX = "); Serial.print(GyroX);
Serial.print(" || GyroY = "); Serial.print(GyroY);
Serial.print(" || GyroZ = "); Serial.println(GyroZ);
delay(100);
}
Una vez que subamos el programa al microcontrolador, en el monitor serial, tendremos la siguiente salida:
AccX = 13432 || AccY = -792 || AccZ = 9780 || Temp = 44.06 || GyroX = 911 || GyroY = -10038 || GyroZ = -5514
Problemas con las librerías
Mientras he realizado las pruebas he tenido algunos problemas con las librerías, por lo que al final he usado la obtención de datos usando unicamente la librería "Wire.h". Con estos datos podemos hacer casí cualquier sistema que necesite conocer su posición, movimiento y posición angular tales como...
- Drones: Para estabilizar el vuelo y detectar cambios de orientación.
- Robótica: Para controlar la dirección y el movimiento de robots.
- Realidad virtual: Para rastrear movimientos de la cabeza o manos.
- Navegación: En sistemas de navegación inercial para vehículos.
Aquí tienes otros enlaces de este blog relacionados con sensores y Arduino:
Esp8266 y adxl345 acelerómetro de 3 ejes, lectura serial
Arduino: Grabación y lectura de Infrarrojos (IR) y control de 4 reles
Saludos!!