3 puntos por GN⁺ 2025-02-03 | 1 comentarios | Compartir por WhatsApp
  • ESP32 RC Cars es un sistema de cámara para autos a control remoto basado en ESP32-CAM que implementa tanto streaming de video en tiempo real como control de motor y servo mediante WebSocket
  • Una aplicación de servidor en Python gestiona la comunicación por WebSocket y ofrece una interfaz web desde la que se puede ver y controlar el dispositivo ESP32 desde el navegador
  • Sus funciones principales incluyen streaming de video en vivo desde el ESP32-CAM, control de motor y servo basado en comandos WebSocket, timeout automático que regresa al estado predeterminado si no se reciben comandos de control, y un lienzo de video para múltiples clientes
  • El hardware requiere un ESP32-CAM AI Thinker o compatible, motor y servo conectados a GPIO, una fuente de 5V estable, una red Wi-Fi y una tarjeta SD opcional
  • Los comandos de control usan los formatos MOTOR:<speed>, SERVO:<angle>, CONTROL:<speed>:<angle>, y el servidor organiza los cuadros de video de varios clientes ESP32 en una cuadrícula para transmitirlos a la interfaz web

Descripción general del proyecto

  • ESP32 RC Cars es un ejemplo de sistema de cámara para control remoto basado en ESP32
  • El ESP32-CAM transmite video en tiempo real por WebSocket, y el motor y el servo se controlan con comandos WebSocket
  • Una aplicación de servidor en Python administra la comunicación por WebSocket y permite ver y controlar dispositivos ESP32 desde una interfaz web
  • Video de demostración: https://youtu.be/OubYFXmvA1E

Funciones principales

  • Envía streaming de video en vivo desde el ESP32-CAM al servidor web
  • Permite controlar de forma remota el motor y el servo mediante comandos WebSocket
  • Si no hay comandos de control durante cierto tiempo, el motor y el servo vuelven automáticamente a su estado predeterminado
  • El servidor coloca dinámicamente los feeds de video de varios clientes en un lienzo

Hardware y materiales

  • Hardware necesario
    • ESP32-CAM, módulo AI Thinker o placa compatible
    • Motor y servo conectados a los pines GPIO adecuados
    • Fuente de 5V estable para el ESP32-CAM
    • Red Wi-Fi para la comunicación
    • Tarjeta SD opcional si se necesita para otras funciones
  • Los materiales usados son componentes de un kit comprado en AliExpress
    • Chasis del auto
    • Controlador electrónico de velocidad
      • Se usó una versión de 30A, y la salida BEC de 5V 3A parecía ofrecer corriente suficiente para alimentar el ESC y el servo
    • Portabaterías
    • 2 celdas 18650 de 3.6V o un paquete de baterías de 7.4V
      • Se usaron ambos, y las celdas pueden aprovecharse con más flexibilidad en otros proyectos
    • ESP32-CAM
      • Es muy importante un modelo con antena externa, y se usa una cámara ojo de pez de 170 grados
    • Bluetooth Gamepad
      • Se usa un control de PS4

Forma de cableado

  • Se retira el adaptador JST de 3 pines del servo incluido en el chasis del auto y se cambia a un conector JST de 4 pines para poder conectarlo al ESP32
  • Se unen los cables positivo y negativo del servo, y se agrega un conector JST hembra de 3 pines con una herramienta de crimpado
  • El cable de control blanco del ESC se conecta al conector JST de 4 pines y al conector hembra de 3 pines

Configuración de software

  • Bibliotecas usadas en el código del ESP32
    • WiFi.h: conexión Wi-Fi
    • ArduinoWebsockets.h: comunicación WebSocket
    • esp_camera.h: control de la cámara del ESP32-CAM
    • ServoControl.h, Esc.h: control del servo y del motor
    • Arduino.h: funciones estándar de Arduino
  • Las dependencias del servidor en Python se instalan con el siguiente comando
sudo apt install python3-aiohttp python3-opencv python3-numpy

Configuración y ejecución

  • Configuración del firmware del ESP32
    • En secrets.h se configuran las credenciales de Wi-Fi y la URL del servidor WebSocket
#define WIFI_SSID "YourWiFiSSID"
#define WIFI_PASSWORD "YourWiFiPassword"
#define WS_SERVER_URL "ws://YourServerIP:Port"
  • Los pines GPIO de la cámara ya están configurados para la placa AI Thinker ESP32-CAM
  • Si hace falta, se modifican los pines del motor y del servo según la configuración del hardware
  • Configuración del servidor en Python
    • El script del servidor se coloca en el mismo directorio que el archivo index.html de la interfaz web
    • El servidor se ejecuta con el siguiente comando
python3 app.py

Uso y comandos WebSocket

  • Procedimiento de uso del ESP32
    • Se sube el sketch proporcionado al ESP32-CAM usando Arduino IDE o una plataforma compatible
    • Se revisa la salida serial para confirmar que la conexión a Wi-Fi y al servidor WebSocket fue exitosa
  • Procedimiento de uso del servidor
    • Se ejecuta el script del servidor en Python
    • Se abre la interfaz web en el navegador para ver el stream de video en vivo
    • Se envían comandos de control mediante la conexión WebSocket
  • Comandos compatibles
    • MOTOR:<speed>: establece la velocidad del motor, con rango de -255 a 255
    • SERVO:<angle>: establece el ángulo del servo, con rango de 0 a 180
    • CONTROL:<speed>:<angle>: controla al mismo tiempo la velocidad del motor y el ángulo del servo

Detalles de funcionamiento y solución de problemas

  • Etapas de inicialización del ESP32
    • Se conecta a la red Wi-Fi especificada
    • Configura el ESP32-CAM para streaming de video
    • Establece la conexión WebSocket con el servidor
  • El manejo de timeout devuelve la velocidad del motor a 0 y el ángulo del servo a 90 cuando no hay comandos de control durante un tiempo determinado
  • El servidor en Python se comunica con varios clientes ESP32 mediante WebSocket
  • El servidor procesa los cuadros de video entrantes, los organiza dinámicamente en una cuadrícula y luego los transmite a la interfaz web
  • Si hay problemas de conexión, revisa las credenciales de Wi-Fi en secrets.h y verifica que el servidor WebSocket esté en ejecución y sea accesible
  • Si hay problemas con el stream de video, revisa que la alimentación del ESP32-CAM sea adecuada y la configuración de inicialización de la cámara
  • El proyecto se publica bajo MIT License

1 comentarios

 
GN⁺ 2025-02-03
Opiniones de Hacker News
  • Hace 12 años, cuando existía Arduino pero no el ESP32, hice algo parecido: https://newton-net-pl.translate.goog/2012/01/robot/?_x_tr_sl...
    Usé un viejo teléfono HTC Magic como cámara + transmisor Wi-Fi, y lo conecté a un Arduino mediante un puerto serial y un level shifter para controlar servos y LED RGB.
    La conexión no era muy estable, pero fue bastante divertido; quizá ya sea hora de revivir el proyecto con la siguiente generación de microcontroladores.
  • Gracias por el feedback del proyecto; me gustaría seguir avanzándolo y también recibir PR.
    Si te gusta el proyecto, lo que más ayudaría sería recomendarme con alguien que esté buscando desarrolladores remotos.
    Mi trabajo principal es como desarrollador Ruby on Rails, pero también podría considerar trabajos de robótica.
  • Antes de comprar una ESP32 CAM, conviene considerar un modelo con antena externa.
    Vale la pena leer esto: https://www.reddit.com/r/esp32/comments/r7kqtt/esp32cam_supe...
    Hasta que apliqué algunos consejos, el frame rate era bastante malo.
    • Según la página de administración del router, en cuanto volví a soldar la resistencia y conecté la antena, pasó de 1Mbps inestable a 20Mbps estables.
      Volver a soldar la resistencia de 0Ω fue casi una aventura, pero de algún modo la conecté al pin correcto, y el resultado se ve así: https://imgur.com/a/LJflZ80
    • Por mi experiencia con este proyecto, la antena externa fue casi imprescindible.
      Agregué al README el enlace de la antena que usé.
    • ¿Puedes recomendar el modelo exacto?
  • Genial. Construí un tanque RC con orugas impulsado por ESP32 y lo conecté por Bluetooth a un control de PlayStation 4 para manejarlo.
    El software básico se puede poner en marcha fácilmente con unas 20 líneas de C usando una biblioteca de controladores Bluetooth.
    Después agregué funciones para facilitar el manejo: controlar dos orugas con dos sticks está bien a baja velocidad, pero como usé dos motores de dron y llegaba casi a 20 km/h, necesitaba otro esquema de control.
    Al final hice control directo de las orugas con límite de RPM usando los gatillos del control DualShock, y para manejo a alta velocidad usé arriba/abajo del stick izquierdo para acelerar y izquierda/derecha del stick derecho para dirigir, de modo que se maneje como un auto RC normal.
    Este es un video del mismo modelo impreso en 3D que usé como base; desde 00:50 se aprecia bien la velocidad: https://www.youtube.com/watch?v=3Mv_tDY89Zw
    • Realmente impresionante.
      No sé mucho sobre construcción de RC; ¿normalmente cómo se controla? ¿Se conecta el control de PS4 directamente al ESP?
  • El gran problema de FPV, y la razón por la que se mantuvo durante mucho tiempo en tecnología analógica, es la latencia.
    Me da curiosidad saber cuánta latencia tiene este proyecto.
    • Hoy en día FPV usa mayormente ExpressLRS[0], un protocolo abierto para el enlace de control de cuadricópteros FPV, que normalmente también usa ESP32.
      En cambio, el video de los cuadricópteros FPV está más dividido. Algunos usan analógico porque, cuando la señal se corta, se degrada gradualmente en lugar de desconectarse por completo y reconectar; otros usan comunicación basada en 802.11, que en la práctica es bastante competitiva.
      Por ejemplo, las Walksnail Goggles usan 802.11 para el enlace de video y, aunque no es algo muy abierto ni bien documentado, hay gente investigando sus internals, como en el trabajo de Chris Rosser.
      La latencia de este tipo de configuración parece ser lo bastante baja incluso para carreras rápidas de cuadricópteros de competición.
      [0] https://www.expresslrs.org
    • Proyecto relacionado: https://github.com/wooky/esp32-analog-video-over-wifi
      Y también: https://github.com/gyrex/CrystalVideo
    • No tengo un punto de comparación como experiencia con drones FPV, pero en la red inalámbrica de mi casa la latencia no fue un problema, incluso con todos los demás dispositivos domésticos conectados.
      El frame rate parece estar limitado principalmente por qué tan rápido puede capturar imágenes el ESP32.
      Al medir los FPS con un script de Python, recibía alrededor de 50fps desde los ESP32, y hace poco compré un router de viaje para probarlo fuera de casa.
  • Estoy pensando en hacer un proyecto parecido, así que me interesa tu experiencia con la latencia.
    ¿Se puede manejar a distancia mirando el feed de video? Mi mayor preocupación es que, para evitar obstáculos a la mayoría de las velocidades, parecería demasiado lento.
  • El año pasado compré el mismo kit, y hace poco también compré un control de juegos ESP32 con una pantallita: https://github.com/01studio-lab/pyController
    Cuando tenga tiempo quiero combinar ambos para manejar el auto y ver también el feed de la cámara en la pantalla.
  • Si te importa más el resultado que la diversión de construirlo, hoy en AliExpress se puede comprar un auto RC de 2.5 pulgadas decente por 30 dólares, y una cámara analógica 5.8GHz independiente por 25 dólares.
    • Si con independiente te refieres a una cámara todo en uno, las cámaras con VTX integrado suelen ser incluso peores que las analógicas comunes, y de todos modos necesitas goggles analógicos.
      Para alguien que no necesita lentes graduados o usa lentes de contacto, la combinación de DJI O4 “lite” con goggles N3 es una opción mucho mejor.
  • Si quieres automatizar un auto RC, esto puede ser una lectura interesante.
    Es de hace unos años, así que quizá hoy se puedan lograr resultados parecidos de forma más fácil o mejor: https://hackaday.com/2021/10/25/fast-indoor-robot-watches-ce...
  • Todo el mundo conoce los cuadricópteros FPV usados en el campo de batalla, pero también está creciendo el interés por los vehículos terrestres.
    No se parecen en nada a una mezcla de los perros robot de Boston Dynamics de las películas y Terminator, pero son muy útiles en tareas “aburridas” y menos llamativas, como colocar minas, detonar minas o llevar pequeñas cantidades de suministros a soldados escondidos en algún punto del frente.