- 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
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
Opiniones de Hacker News
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.
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.
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.
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
Agregué al README el enlace de la antena que usé.
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
No sé mucho sobre construcción de RC; ¿normalmente cómo se controla? ¿Se conecta el control de PS4 directamente al ESP?
Me da curiosidad saber cuánta latencia tiene este proyecto.
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
Y también: https://github.com/gyrex/CrystalVideo
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.
¿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.
Cuando tenga tiempo quiero combinar ambos para manejar el auto y ver también el feed de la cámara en la pantalla.
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.
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...
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.