
BermejaSat #17: IMU a Bordo — Instalación de la ESP32 STEAMakers y Lectura del GY-91 (MPU9250 + BMP280)
- publicado por José Luis Usero Vílchez
- Categorías: AIDARAC – Proyectos, BermejaSat, Proyecto AIDARAC
- Fecha: septiembre 2026
Introducción
Tras validar el sensor barométrico BMP280 en un banco de pruebas con la Raspberry Pi Pico W, tocaba dar el siguiente paso: incorporar un sensor inercial (IMU) que aporte a BermejaSat un dato que, hasta ahora, no teníamos — la orientación y el movimiento del CanSat durante el descenso. Para ello hemos usado el módulo GY-91, que combina en una sola placa un MPU9250 (acelerómetro + giroscopio + magnetómetro de 9 ejes) y un BMP280 (presión + temperatura), y lo hemos montado sobre una ESP32 Plus STEAMakers, una placa de control pensada para el aula que resultó ser justo lo que necesitábamos para resolver un problema muy real de esta serie: la inestabilidad del cableado en protoboard.
🔌 Por qué cambiamos de placa para esta prueba
En la entrada anterior nos quedamos atascados con el GY-91 montado en una protoboard genérica: el Chip ID del sensor se leía como 0x0 — es decir, ninguna respuesta en el bus I2C — y el diagnóstico apuntaba a un problema mecánico, no de código: los 8 pines del módulo, en una sola fila, no hacían buen contacto al quedar a caballo del canal central de la protoboard.
La ESP32 STEAMakers resuelve justo ese problema: trae un conector I2C hembra dedicado, con alimentación integrada, en el que basta con enchufar 4 cables (VIN, GND, SCL, SDA) sin depender de que cada pin haga presión individual contra un agujero de protoboard. Con esa única mejora mecánica, el mismo módulo que antes no respondía en absoluto pasó a detectarse sin problemas.
💻 Instalación de la ESP32 STEAMakers en Arduino IDE
A diferencia de la Pico W, que necesita un core de terceros, la ESP32 STEAMakers usa el core oficial de Espressif, el mismo que cualquier ESP32-WROOM-32 genérico — así que el proceso es más corto:
Archivo → Preferencias → URLs Adicionales de Gestor de Tarjetas, añadir:https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.jsonHerramientas → Placa → Gestor de placas, buscar “esp32” e instalar el paquete “esp32 by Espressif Systems”.Herramientas → Placa → ESP32 Arduino → ESP32 Dev Module. La STEAMakers no tiene un perfil propio en el gestor de placas: al estar basada en un ESP32-WROOM-32 genérico, se programa con el perfil genérico “ESP32 Dev Module”, el mismo que usan la mayoría de placas ESP32 del mercado.- Conectar por USB y seleccionar el puerto en
Herramientas → Puerto. Si la subida falla, mantener pulsado el botón físico BOOT al empezar a subir — el mismo principio que el modo BOOTSEL de la Pico W, aunque en el ESP32 clásico hace falta con menos frecuencia.
🔌 Mapa de pines — GY-91 al conector I2C de la ESP32 STEAMakers
La placa trae sus pines I2C ya cableados de fábrica a los pines por defecto de cualquier ESP32:
| GY-91 (módulo) | Función | ESP32 STEAMakers |
|---|---|---|
| VIN | Alimentación | Conector I2C (lleva alimentación integrada) |
| GND | Tierra | Conector I2C |
| SCL | Reloj I2C | GPIO22 |
| SDA | Datos I2C | GPIO21 |
| SDO/SAO, NCS, CSB | Selección de dirección / SPI | Sin conectar |
Solo 4 cables — el resto de pines del módulo (SDO/SAO, NCS, CSB) son para configurar direcciones alternativas o el modo SPI, que no usamos aquí. Con el escáner I2C confirmamos las direcciones que estaban usando por defecto:
Dispositivo encontrado en 0x68 <- MPU9250
Dispositivo encontrado en 0x76 <- BMP280
2 dispositivo(s) encontrado(s).
💻 Código completo: lectura combinada con verificación de fiabilidad
Con un cableado no soldado (aunque ya mucho más firme que en la protoboard), añadimos dos comprobaciones extra al código para poder confiar en los datos: la magnitud del acelerómetro (que en reposo debe rondar 1g) y la detección de errores de transmisión I2C en cada ciclo de lectura.
Librerías necesarias (Herramientas → Gestionar Bibliotecas): Adafruit BMP280 Library, Adafruit Unified Sensor, MPU9250_asukiaaa.
// BermejaSat - Lectura combinada GY-91 (MPU9250 + BMP280)
// ESP32 STEAMakers - direcciones confirmadas: MPU9250 en 0x68, BMP280 en 0x76
// Incluye deteccion de errores I2C y verificacion de magnitud del acelerometro
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#include <MPU9250_asukiaaa.h>
#define SDA_PIN 21
#define SCL_PIN 22
Adafruit_BMP280 bmp;
MPU9250_asukiaaa mpu;
void setup() {
Serial.begin(115200);
while (!Serial) delay(10);
Wire.begin(SDA_PIN, SCL_PIN);
Serial.println("BermejaSat - GY-91 en ESP32 STEAMakers");
// Inicializar BMP280 en su direccion confirmada
if (!bmp.begin(0x76)) {
Serial.println("ERROR: BMP280 no responde en 0x76");
} else {
Serial.println("BMP280 inicializado correctamente.");
}
// Inicializar MPU9250
mpu.setWire(&Wire);
mpu.beginAccel();
mpu.beginGyro();
mpu.beginMag();
Serial.println("MPU9250 inicializado.\n");
}
void loop() {
Serial.println("--- Lectura GY-91 ---");
// --- BMP280: presion y temperatura ---
Serial.print("Temperatura: ");
Serial.print(bmp.readTemperature());
Serial.println(" C");
Serial.print("Presion: ");
Serial.print(bmp.readPressure() / 100.0F);
Serial.println(" hPa");
// --- MPU9250: aceleracion, con magnitud y deteccion de error I2C ---
if (mpu.accelUpdate() == 0) {
float aX = mpu.accelX();
float aY = mpu.accelY();
float aZ = mpu.accelZ();
float magnitud = sqrt(aX*aX + aY*aY + aZ*aZ);
Serial.print("Accel X/Y/Z: ");
Serial.print(aX); Serial.print(" / ");
Serial.print(aY); Serial.print(" / ");
Serial.print(aZ);
Serial.print(" g | Magnitud: ");
Serial.print(magnitud);
Serial.println(" g (deberia ser ~1g en reposo)");
} else {
Serial.println("AVISO: fallo de lectura I2C en el acelerometro - dato descartado");
}
// --- MPU9250: giroscopio, con deteccion de error I2C ---
if (mpu.gyroUpdate() == 0) {
Serial.print("Gyro X/Y/Z: ");
Serial.print(mpu.gyroX()); Serial.print(" / ");
Serial.print(mpu.gyroY()); Serial.print(" / ");
Serial.print(mpu.gyroZ());
Serial.println(" deg/s (deberia rondar 0 en reposo)");
} else {
Serial.println("AVISO: fallo de lectura I2C en el giroscopio - dato descartado");
}
Serial.println();
delay(1000);
}
Con el sensor quieto sobre la mesa, la magnitud del acelerómetro se mantuvo estable en torno a 1g durante varias lecturas consecutivas — señal de que, pese al cableado sin soldar, la conexión es fiable para seguir trabajando con ella.
🚀 Qué uso tendrá el GY-91 en el CanSat
El BMP280 del GY-91 duplica lo que ya mide el barómetro dedicado que va en la trama principal de telemetría, así que su aportación real a la misión no es la presión, sino los tres ejes de aceleración y los tres de giroscopio del MPU9250. En el CanSat definitivo, esa información servirá para:
- Confirmar la apertura del paracaídas. Un cambio brusco en la magnitud de la aceleración (de caída libre a frenado) es la señal más directa de que el paracaídas se ha desplegado correctamente en el momento esperado.
- Detectar rotación o inestabilidad durante el descenso. El giroscopio permite saber si el CanSat desciende girando sobre sí mismo (algo habitual bajo paracaídas) y con qué velocidad angular, un dato relevante para valorar la calidad aerodinámica del diseño final.
- Detectar el momento del aterrizaje. Un pico brusco y breve de aceleración, seguido de una lectura estable cercana a 1g sin apenas variación, es la firma característica del impacto contra el suelo — útil para marcar automáticamente el final de la fase de descenso en el análisis posterior de los datos.
Es, por tanto, un sensor de misión secundaria: no sustituye a los datos obligatorios de presión y temperatura exigidos por las bases de la ESA, sino que los complementa con información sobre el comportamiento físico del CanSat durante el vuelo.
Conclusión Pedagógica
Esta entrada conecta dos aprendizajes que, a primera vista, parecen no tener relación: elegir bien el hardware de soporte (una placa con conectores dedicados en vez de una protoboard genérica) puede resolver por sí solo un problema que parecía de programación. Además, incorporar el GY-91 introduce al alumnado en el concepto de misión secundaria en un proyecto espacial: no todos los sensores a bordo son obligatorios, pero los que se añaden de forma voluntaria — bien elegidos y bien justificados — enriquecen enormemente el análisis final del vuelo.
Etiqueta:acelerómetro, cansat, ESA, ESP32 STEAMakers, giroscopio, GY-91, I2C, IMU, misión secundaria, MPU9250



