Desarrollando el proyecto Edubótica Marina (EduROV) durante el curso 2025-26
Dentro del proyecto de Edubótica Marina impulsado por PLOCAN, uno de los desarrollos más interesantes ha sido la creación de un mando de control inalámbrico para un ROV (Remotely Operated Vehicle) utilizando tecnología BLE (Bluetooth Low Energy).
El objetivo era claro: construir un sistema de control sencillo, económico y replicable en entornos educativos, permitiendo al alumnado comprender conceptos de electrónica, programación y comunicaciones inalámbricas aplicadas a la robótica submarina.
Para este desarrollo se eligió el ESP32-C3 SuperMini, una placa extremadamente compacta, eficiente y con conectividad BLE integrada, ideal para este tipo de aplicaciones. Sin embargo, debido a su reducido tamaño, trabajar directamente sobre ella puede resultar incómodo a nivel de prototipado. Por ello se utilizó una placa adaptadora tipo Funduino, que permite exponer todos sus pines de forma accesible y facilita enormemente la conexión con drivers, motores y sensores.
La experiencia de desarrollo fue muy positiva: el sistema respondió de forma estable, con baja latencia y gran fiabilidad durante las pruebas. Además, se diseñó una aplicación móvil personalizada mediante MIT App Inventor, integrando la librería BLE necesaria para enviar órdenes al ROV de manera intuitiva.
Arquitectura del sistema
Podríamos decir que el sistema se divide en tres elementos esenciales:
- Móvil Android con APP desarrollada en App Inventor como interfaz de control.
- ESP32-C3 SuperMini como receptor BLE y cerebro del sistema, con puentes en H para controlar los motores.
- ROV con tres ejes de movimiento:
- Eje X-Y (avance, retroceso y giro)
- Eje Z (subida y bajada)


Para poder dar las órdenes de movimiento sobre el ROV, la APP envía un carácter por BLE, cada vez que se pulsa o libere los botones dispuestos en la pantalla:
F → Forward (avanzar)
B → Backward (retroceder)
L → Left (giro izquierda)
R → Right (giro derecha)
S → Stop horizontal
U → Up (subir)
D → Down (bajar)
V → Stop vertical
Programando el ESP32-C3 Supermini
¿Qué hacer cuando el dispositivo se conecta y desconecta por BLE?
Lo primero es definir las librería a usar para el BLE. Debes tener en cuenta que el ESP32 C3 Supermini no tiene BT normal por lo solo podemos usar BLE, que aunque es un pelín más complejo, nos permite tener un mundo de posibilidades.
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>
// UUIDs para la conexión BLE
#define SERVICE_UUID "4fa124a6-9954-4697-97d1-5056f87f91ba"
#define CHARACTERISTIC_UUID "62fbd229-3c4f-4d94-a134-c09cfec6e56a"
Ya con las librerías y los UUIDs definidos, toca describir cómo reaccionará el ESP32 C3 cuando la aplicación móvil se conecte o desconecte.
class MisCallbacksServidor: public BLEServerCallbacks {
void onConnect(BLEServer* pServer) {
Serial.println("App Conectada");
digitalWrite(led, HIGH);
}
void onDisconnect(BLEServer* pServer) {
Serial.println("App Desconectada - Motores detenidos por seguridad");
digitalWrite(led, LOW);
pararTodo();
pServer->getAdvertising()->start();
}
};
¿Qué hace este código tan loco?
Este fragmento crea una clase personalizada que hereda de BLEServerCallbacks, lo que permite capturar eventos importantes del Bluetooth.
onConnect()
Se ejecuta cuando la app se conecta correctamente:
- Muestra un mensaje por monitor serie.
- Enciende el LED integrado para indicar conexión activa.
Esto sirve como indicador visual y de depuración.
onDisconnect()
Se ejecuta cuando se pierde la conexión:
- Informa de la desconexión.
- Apaga el LED.
- Detiene todos los motores por seguridad.
- Reinicia el advertising BLE para permitir nuevas conexiones.
Este punto es especialmente importante en un ROV: evita que los motores sigan activos sin control.
Callback de recepción de órdenes
Gracias a esta función somos capaces de recibir las órdenes del control remoto y llamar a una función en concreto para actuar en consecuencia.
class MisCallbacksCaracteristica: public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *pCharacteristic) {
String valor = pCharacteristic->getValue();
if (valor.length() > 0) {
char comando = valor[0];
Serial.print("Orden recibida: ");
Serial.println(comando);
switch(comando) {
case 'F': avanzar(); break;
case 'B': retroceder(); break;
case 'L': girarIzquierda(); break;
case 'R': girarDerecha(); break;
case 'S': pararHorizontal(); break;
case 'U': subir(); break;
case 'D': bajar(); break;
case 'V': pararVertical(); break;
default: pararTodo(); break;
}
}
}
};
¿Cómo funciona este código?
Esta función se ejecuta cada vez que la APP envía datos por medio de BLE.
Su funcionamiento es simple:
- Lee el dato recibido por BLE.
- Extrae el primer carácter.
- Lo interpreta como comando.
- Ejecuta la acción correspondiente. (Vamos, el
switchactúa como traductor entre la app y el movimiento físico del ROV.)
Vemos un ejemplo:
Si la app envía:
F
El ESP32 ejecuta:
avanzar();
Y activa los motores para mover el vehículo hacia delante.
Resultado del proyecto
Las pruebas realizadas fueron muy satisfactorias y el resultado es un sistema de control desde APP donde se puede destacar:
✅ Conexión BLE rápida y estable
✅ Respuesta inmediata a los comandos
✅ Bajo consumo energético
✅ Fácil integración con App Inventor
✅ Código modular y fácil de ampliar
El uso del ESP32-C3 SuperMini demostró ser una solución excelente para proyectos educativos de robótica submarina con pocas necesidades de pines, especialmente al combinarlo con una placa adaptadora que simplifica el montaje del cableado.