SISTEMA DE ESTABILIZACIÓN AUTÓNOMA DE VUELO.

Introducción
En esta entrada se presenta el desarrollo de un prototipo de avión tipo ala volante con capacidad de estabilización lateral y frontal mediante flaps traseros, implementado como proyecto de sistemas empotrados. El objetivo principal fue diseñar una solución funcional, modular y de bajo coste que integrase hardware y software de forma coherente, tomando como referencia aeronaves reales no tripuladas.
Para la realización de este proyecto se basaron en el dron ruso/iraní Shahed-136/131, que cuenta con cuatro flaps traseros, y que para reducir los costes y simplificar el proyecto se redujeron a dos.
Objetivo del proyecto.
La idea inicial del proyecto fue crear un dron o avión de pequeñas dimensiones capaz de volar y estabilizarse utilizando flaps laterales o traseros, obteniendo la información de inclinación mediante un giroscopio. Sin embargo, debido a las limitaciones asociadas al peso, la potencia de los componentes y la complejidad del vuelo, se decidió descartar la capacidad de vuelo y centrarse en el comportamiento de estabilización.
El resultado final es un prototipo de avión sin vuelo real que utiliza dos flaps traseros para corregir inclinaciones laterales (roll) y frontales (pitch). Como complemento visual, se añadieron tres LEDs: dos en las alas para indicar la dirección de la inclinación y uno en la punta que actúa como luz de posición con parpadeo.
El diseño se inspira en el dron ruso/iraní Shahed-136/131, que dispone de cuatro flaps traseros. Para simplificar el proyecto y reducir costes, se optó por una versión reducida con solo dos flaps.
Estudio previo del comportamiento de estabilización
Las aeronaves tipo ala volante no disponen de estabilizadores de cola tradicionales, por lo que todo el control recae en las superficies traseras. En este tipo de configuraciones, los flaps actúan como elevones, combinando funciones de control de pitch y roll.
Pitch (cabeceo): ambos flaps se mueven en la misma dirección. Roll (inclinación lateral): los flaps se mueven en direcciones opuestas.
En este proyecto se ignoran factores reales como la velocidad del aire o las fuerzas aerodinámicas para simplificar la lógica interna y centrarse exclusivamente en el comportamiento del sistema empotrado.
Implementación del hardware
El hardware del sistema se estructura en tres bloques principales, todos ellos controlados por una placa Arduino Uno.
- Giroscopio MPU-6050: proporciona valores de inclinación mediante el protocolo I2C, utilizando dos líneas de comunicación (datos y reloj).
- Servomotores (SG90): dos servos controlan los flaps traseros. Cada uno recibe alimentación de 5V, conexión a tierra y una señal PWM desde el Arduino.
- Sistema LED: un led blanco que se pondrá en la punta y otros dos de color rojo y azul que irán en las alas.
El circuito se montó principalmente en una protoboard para facilitar pruebas y modificaciones, lo que permitió depurar las diferentes versiones de nuestro prototipo y sus componentes de manera eficaz. Es por esto por lo que recomendamos a cualquiera que quiera imitar nuestro proyecto que empiece de esta manera para facilitar el resto de trabajo y mantenimiento. Posteriormente se integró todo sobre una base de cartón con forma aproximada y reducida del dron de referencia.
En la siguiente imagen se puede apreciar con todo detalle el circuito completo de arduino. Fuente: Wokwi.com.

El Arduino va alimentado por una pila genérica de 9V con un adaptador de corriente para nuestra placa.
Desarrollo del software
El software se desarrolló en el entorno de Arduino, utilizando librerías específicas para el control del MPU-6050 y de los servomotores. Las principales tareas del firmware son:
- Lectura continua de los valores de pitch y roll.
- Limitación de los valores según una inclinación máxima configurable.
- Conversión de los valores de inclinación en ángulos de giro para los servos.
- Control de los LEDs en función de la inclinación detectada.
- Parpadeo periódico del LED de posición.
La lógica se diseñó de forma modular, permitiendo modificar fácilmente el comportamiento de los flaps o los límites de inclinación sin rehacer el código completo.
A continuación se muestran diferentes capturas del código para aquellos que quieran implementarlo junto a un cuadro de texto para facilitar la copia del mismo.




#include <Wire.h>
#include <MPU6050_light.h>
#include <Servo.h>
MPU6050 mpu(Wire);
Servo miServo; // Servo 1
Servo miServo2; // Servo 2
unsigned long timer = 0;
unsigned long ledTimer = 0;
// Pines de LEDs
const int ledPunta = 6; // LED de la punta
const int ledIzq = 7; // LED indica inclinación hacia la izquierda
const int ledDer = 8; // LED indica inclinación hacia la derecha
// Estado del LED de la punta
bool ledPuntaState = false;
// Límite máximo de inclinación
int maxInclinacion = 45; // grados
void setup() {
Serial.begin(9600);
Wire.begin();
// servos
miServo.attach(9);
miServo2.attach(10);
miServo.write(90);
miServo2.write(90);
// leds
pinMode(ledPunta, OUTPUT);
pinMode(ledIzq, OUTPUT);
pinMode(ledDer, OUTPUT);
Serial.println("Inicializando...");
if (mpu.begin() != 0) {
Serial.println("Error: mpu no encontrado");
while (1);
}
Serial.println("Calibrando el mpu");
delay(1000);
mpu.calcOffsets();
Serial.println("Listo");
}
int obtenerAngulo(int izqOrDer) {
float pitch = mpu.getAngleX(); // Adelante/atrás
float roll = mpu.getAngleY(); // Lateral izquierda/derecha
// Limitar valores
pitch = constrain(pitch, -maxInclinacion, maxInclinacion);
roll = constrain(roll, -maxInclinacion, maxInclinacion);
int x = 90; // Posición neutra
// Movimiento por pitch
int angPitch = map(pitch, -maxInclinacion, maxInclinacion, 45, -45);
// Movimiento por roll
int angRoll = map(roll, -maxInclinacion, maxInclinacion, -40, 40);
if (izqOrDer == 0) {
// flap derecho
x = 90 + angPitch + angRoll; // pitch sube/baja, roll opuesto
} else {
// flap izquierdo
x = 90 + angPitch - angRoll; // pitch sube/baja, roll normal
}
// Limitar el angulo entre 0 y 180
x = constrain(x, 0, 180);
return x;
}
void loop() {
mpu.update();
// Actualización de servos cada 50 ms
if ((millis() - timer) > 50) {
float pitch = mpu.getAngleX(); // Inclinación izquierda/derecha
pitch = constrain(pitch, -maxInclinacion, maxInclinacion);
//Invertir la dirección de los servos
int anguloIzq = obtenerAngulo(1);
int anguloDer = obtenerAngulo(0);
miServo.write(anguloDer);
miServo2.write(anguloIzq);
// Leds según la inclinación del mpu
if (pitch > 5) { // Inclinación hacia adelante
digitalWrite(ledDer, HIGH);
digitalWrite(ledIzq, LOW);
} else if (pitch < -5) { // Inclinación hacia atrás
digitalWrite(ledIzq, HIGH);
digitalWrite(ledDer, LOW);
} else { // Neutro
digitalWrite(ledIzq, LOW);
digitalWrite(ledDer, LOW);
}
timer = millis();
}
// Led de la punta intermitente
if (millis() - ledTimer > 500) {
ledPuntaState = !ledPuntaState;
digitalWrite(ledPunta, ledPuntaState ? HIGH : LOW);
ledTimer = millis();
}
}
Funcionamiento del sistema
Al iniciar el sistema, el avión se considera en posición estable y los flaps se colocan en su posición neutra (90°). A partir de ese momento:
Si el avión se inclina lateralmente, los flaps se mueven en sentidos opuestos y se enciende el LED del ala correspondiente.
Si existe inclinación frontal, ambos flaps se mueven en la misma dirección.
Si el avión está estable, los LEDs de las alas permanecen apagados.
El LED blanco de la punta parpadea continuamente como luz de posición.
Este comportamiento simula el funcionamiento básico de un sistema de estabilización real.
Costes

En esta tabla no se tiene en cuenta el coste de los materiales proporcionados en la asignatura.
Teniendo en cuenta un precio estimado de estos componentes, el precio total ascendería a más
del doble.
Imágenes del prototipo






Aspectos a mejorar
El primer aspecto a mejorar es la capacidad de vuelo del dron. La idea inicial era hacer uno que fuera capaz de mantenerse en el aire pero debido a la complejidad del proyecto e incertidumbres técnicas se optó por no incluir esta funcionalidad que le hubiera dado mucha más personalidad.
En una versión futura sería conveniente a la hora de integrar el vuelo como parte de nuestro proyecto, realizar un estudio aerodinámico a fondo.
También hubiera convenido pintar el dron de colores pero el coste de los materiales excedía el presupuesto que en un principio habíamos planteado. Tanto materiales como estética es un factor susceptible a mejorar en futuras versiones, aunque estas se vieron limitadas por el espacio que ocupaba el hardware.