1. Introducción a los Sensores MEMS
Los sensores MEMS (Micro-Electro-Mechanical Systems) son dispositivos electro-mecánicos miniaturizados que combinan componentes mecánicos, sensores, actuadores y electrónica en una sola unidad integrada. Los tres tipos principales son:
Acelerómetro
Mide aceleración lineal en 3 ejes (X, Y, Z)
Giroscopio
Mide velocidad angular (rotación) en 3 ejes
Magnetómetro
Mide intensidad y dirección del campo magnético
Estos sensores son esenciales en mecatrónica e IoT para aplicaciones como navegación de drones, estabilización de vehículos, dispositivos wearables, y sistemas de realidad virtual.
2. Explicación Técnica: Sensor MPU-6050/MPU-9250
El MPU-6050 integra acelerómetro y giroscopio de 3 ejes, mientras que el MPU-9250 añade un magnetómetro. Ambos se comunican vía I2C con el ESP32.
Configuración Básica MPU-6050
#include
const int MPU_ADDR = 0x68; // Dirección I2C del MPU-6050
int16_t accelX, accelY, accelZ; // Variables para acelerómetro
int16_t gyroX, gyroY, gyroZ; // Variables para giroscopio
float temperatura;
void setup() {
Serial.begin(115200);
Wire.begin();
// Despertar el MPU-6050 (por defecto está en modo sleep)
Wire.beginTransmission(MPU_ADDR);
Wire.write(0x6B); // Registro de administración de energía
Wire.write(0); // Poner en 0 para despertar
Wire.endTransmission(true);
Serial.println("MPU-6050 inicializado");
}
void loop() {
// Leer acelerómetro
Wire.beginTransmission(MPU_ADDR);
Wire.write(0x3B); // Registro inicial del acelerómetro
Wire.endTransmission(false);
Wire.requestFrom(MPU_ADDR, 6, true); // Solicitar 6 bytes
accelX = Wire.read() << 8 | Wire.read(); // 0x3B y 0x3C
accelY = Wire.read() << 8 | Wire.read(); // 0x3D y 0x3E
accelZ = Wire.read() << 8 | Wire.read(); // 0x3F y 0x40
// Leer temperatura
Wire.beginTransmission(MPU_ADDR);
Wire.write(0x41); // Registro de temperatura
Wire.endTransmission(false);
Wire.requestFrom(MPU_ADDR, 2, true);
int16_t temp_raw = Wire.read() << 8 | Wire.read();
temperatura = temp_raw / 340.0 + 36.53; // Fórmula del datasheet
// Leer giroscopio
Wire.beginTransmission(MPU_ADDR);
Wire.write(0x43); // Registro inicial del giroscopio
Wire.endTransmission(false);
Wire.requestFrom(MPU_ADDR, 6, true);
gyroX = Wire.read() << 8 | Wire.read();
gyroY = Wire.read() << 8 | Wire.read();
gyroZ = Wire.read() << 8 | Wire.read();
// Mostrar resultados
Serial.println("=== DATOS MPU-6050 ===");
Serial.printf("Acelerómetro: X=%d, Y=%d, Z=%d\n", accelX, accelY, accelZ);
Serial.printf("Giroscopio: X=%d, Y=%d, Z=%d\n", gyroX, gyroY, gyroZ);
Serial.printf("Temperatura: %.2f°C\n", temperatura);
Serial.println();
delay(1000);
}
Cálculos y Calibración
// Factores de escala (dependen de la configuración del sensor)
float accel_scale = 16384.0; // Para ±2g
float gyro_scale = 131.0; // Para ±250°/s
void mostrarDatosCalibrasdos() {
// Convertir a unidades físicas
float ax = accelX / accel_scale; // g (gravedad)
float ay = accelY / accel_scale;
float az = accelZ / accel_scale;
float gx = gyroX / gyro_scale; // °/s
float gy = gyroY / gyro_scale;
float gz = gyroZ / gyro_scale;
// Cálculos de ángulos (aproximados)
float roll = atan2(ay, az) * 180 / PI;
float pitch = atan2(-ax, sqrt(ay*ay + az*az)) * 180 / PI;
Serial.println("=== DATOS CALIBRADOS ===");
Serial.printf("Aceleración: X=%.2fg, Y=%.2fg, Z=%.2fg\n", ax, ay, az);
Serial.printf("Velocidad angular: X=%.2f°/s, Y=%.2f°/s, Z=%.2f°/s\n", gx, gy, gz);
Serial.printf("Ángulos: Roll=%.1f°, Pitch=%.1f°\n", roll, pitch);
}
3. Ejercicios Prácticos
Objetivo: Leer datos raw del acelerómetro y giroscopio.
Materiales:
- ESP32
- Sensor MPU-6050
- Cables jumper
- Protoboard
Conexiones I2C:
- VCC → 3.3V
- GND → GND
- SCL → Pin 22
- SDA → Pin 21
Objetivo: Calcular roll y pitch usando datos del acelerómetro.
Conceptos:
- Conversión de datos raw a unidades físicas
- Cálculo de ángulos con funciones trigonométricas
- Filtrado de ruido en las mediciones
Resultado esperado: Ángulos de inclinación precisos en tiempo real.
Objetivo: Implementar filtro complementario para combinar acelerómetro y giroscopio.
Conceptos avanzados:
- Filtro complementario
- Filtro de Kalman (opcional)
- Compensación de deriva del giroscopio
- Estimación de orientación 3D
Aplicaciones: Drones, gimbal, control de estabilidad.
4. Proyecto: Sistema de Estabilización para Drone/Gimbal
Plataforma Auto-Estabilizada
Objetivo: Desarrollar un sistema de estabilización activa utilizando datos de sensores MEMS para mantener una plataforma nivelada ante perturbaciones externas.
Componentes del Sistema:
- ESP32
- MPU-6050 o MPU-9250
- 2-3 Servomotores
- Estructura mecánica (gimbal)
- Control remoto (Bluetooth)
- Batería LiPo
- Driver de motores
- Software de monitoreo
Características del Sistema:
- Control PID para estabilización de 2-3 ejes
- Respuesta en tiempo real (<10ms)
- Interfaz de configuración vía web
- Logging de datos para análisis
- Modos manual y automático
5. Evaluación y Troubleshooting
Problemas Comunes
- No se detecta sensor I2C: Verificar conexiones SDA/SCL
- Datos inestables: Añadir capacitores de filtrado
- Deriva del giroscopio: Implementar calibración automática
- Interferencia magnética: Alejar de fuentes metálicas
- Ángulos incorrectos: Revisar orientación del sensor
Criterios de Evaluación
- Comunicación I2C estable
- Lecturas consistentes y calibradas
- Cálculos matemáticos correctos
- Implementación de filtros apropiados
- Respuesta en tiempo real del sistema