Saltar al contenido
Andrés Cuello
English
← Todos los proyectos
Caso de estudioCódigo abierto

RoveLink

Control de baja latencia de un robot ESP32 desde el navegador. El navegador y el robot abren conexiones salientes hacia un relay en Cloudflare Workers y Durable Objects, así que el robot no necesita IP pública ni puertos abiertos.

Estado
Repositorio público en GitHub.
Tecnologías
TypeScript · Cloudflare Workers · Durable Objects · WebSockets · ESP32
Enlaces
Repositorio

Contexto

Manejar un robot pequeño por internet normalmente implica abrir puertos o exponer el dispositivo. RoveLink evita ambas cosas: el navegador y el ESP32 abren cada uno un WebSocket saliente hacia un relay, y el relay solo reenvía mensajes entre ellos.

Qué construí

  • Un relay de control en Cloudflare Workers con un Durable Object por sala. Autentica dispositivos y controladores con secretos compartidos y nunca interpreta la física del robot.
  • Un relay de video separado (su propio Worker y Durable Object) para video en vivo, con autorización por tickets para los espectadores.
  • Un panel web con Vite, TypeScript y Tailwind. Soporta la Gamepad API, teclado como alternativa y controles táctiles, con aceleración y dirección analógicas y zona muerta.
  • Firmware para ESP32 con cliente WSS, validación de certificados TLS contra CA raíz fijadas y reconexión con backoff.
  • Un paquete de protocolo compartido, que incluye una sola función differentialMix() usada por el navegador y el firmware, para que el PWM que se ve en pantalla sea exactamente el que reciben los motores.
  • Una demo sin hardware (pnpm dev:demo) que ejecuta los protocolos reales de control y video contra un simulador de robot y una cámara simulada.

Decisiones

  • Gana el último estado. No hay cola de comandos, así que una entrada vieja se descarta en vez de repetirse.
  • Seguridad por defecto: un watchdog de 500 ms detiene el robot cuando dejan de llegar comandos, y la parada de emergencia lo desarma y pone en cero todos los ejes.
  • Telemetría para el operador: RSSI, números de secuencia confirmados y eco de aceleración y dirección.

Estado

Código abierto con licencia Apache 2.0. El panel desplegado requiere una clave de operador.