Módulo 6

Sensores MEMS: acelerómetro, giroscopio, magnetómetro

Manejo de Sensores y Actuadores

ESP32 Mecatrónica IoT UNAM

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

MPU-6050 - Inicialización y Lectura
#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

Conversión a Unidades Físicas
// 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

1

Lectura Básica MPU-6050

Básico 30 min

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
2

Cálculo de Ángulos de Inclinación

Intermedio 45 min

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.

3

Fusión de Sensores (IMU Completa)

Avanzado 90 min

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