-
Notifications
You must be signed in to change notification settings - Fork 0
Development
Para llevar a cabo este proyecto, necesitaremos los siguientes materiales:
1.1.1. Kit de Elegoo Smart Robot V4
-
Incluye:
- Motores
- Servo cardán
- Sensores:
- Sensor de ultrasonido
- Sensores infrarrojos para seguimiento de línea
- Sensor fotoeléctrico
- Controlador de motores: Chip TB6612 de doble canal
- Módulo WiFi: ESP32-Wover
- Cámara: OV2640
- Batería de litio: 7.4V (duración de 2 horas en modo de seguimiento de línea)
- Tamaño: 263 × 145 × 80 mm
- Peso: 1140 g
- Modelo: OV2640
- Función: Captura de imágenes y procesamiento de datos para detección de manos y obstáculos.
1.1.3. Piezas de LEGO
- 1000 piezas para personalización y soporte estructural del robot.
- Utilizado para programación, procesamiento de datos y control remoto.
-
Arduino IDE
- Para programación de microcontroladores y control de sensores/actuadores.
-
OpenCV
- Biblioteca para procesamiento de imágenes, detección de objetos y análisis visual.
-
Python
- Control de alto nivel.
- Integración con OpenCV para procesamiento de imágenes y análisis de datos.
Aquí adjunto el enlace para poder ver los planos proporcionados por elegoo. Los planos creados por nosotros parten de un modelo simplificado:

Los ficheros en svg en el siguiente enlace
- Parachoques:
Los ficheros en svg en el siguiente enlace
- Capota:
Los ficheros en svg en el siguiente enlace
- Funda cámara:
Los ficheros en svg en el siguiente enlace
- Alerón:
Los ficheros en svg en el siguiente enlace
- Cableado y Hardware:

Aquí podéis descargar el modelo
Sigue estos pasos para instalar y configurar el entorno necesario para el proyecto.
- Descarga e instala el Arduino IDE.
- Configura la placa y el puerto para el esp32 de Elegoo V4:
- Abre Arduino IDE.
- Ve a Tools > Board > AI Thinker ESP32-CAM.
- Configura el puerto donde esté conectado el Elegoo en tu ordenador.
- Añadir el URL necesario para la esp32:
- Ve a File > Preferences > Additional Board Manager URL > Pegar: https://dl.espressif.com/dl/package_esp32_index.json.
- Instala Python desde python.org. Es necesario instalar la versión 3.8.3 ya que es la versión compatible con mediapipe.
- Abre la terminal y ejecuta el siguiente comando para instalar OpenCV y mediapipe (es la librería que permite la detección de manos):
pip install opencv-python
pip install mediapipeAsegúrate de instalar todas las dependencias necesarias para controlar el Elegoo Smart Robot. Algunas librerías adicionales pueden incluir:
pip install numpy
pip install pyautogui
pip install paho-mqttDentro del propio Arduino es necesario instalarse la libreria esp32 by Espressif systems:
Para poder depurar la mensajería por MQTT, hemos instalado el mosquitto para poder ver lo que se publica en el topic.
sudo apt install mosquitto mosquitto-clientsUna vez instalado, es necesario usar el siguiente comando en una terminal. Ten en cuenta que tiene que estar conectado a la misma red wifi que el portátil y la esp32:
mosquitto_sub -h test.mosquitto.org -p 1883 -t "gestos/mano"Para programar la placa de Arduino para poder controlar los motres del coche y sus sensores, es necesario cambiar el board:
- Abre Arduino IDE.
- Ve a Tools > Board > Arduino Uno.
Para que la comunicación sea viable es necesario que la ESP32 y el PC estén conectados a la misma red wifi. Para no publicar los mensajes enviados por el portátil en la red de la universidad hemos optado por utilizar nuestra wifi privada.
En primer lugar, para disponer del material necesario se solicitó un kit Smart Robot Car V4.0 en los laboratorios de la universidad. Al venir por piezas, el primer paso era montarlo:
Una vez logramos montar el Smart robot, el siguiente paso fue construir la estructura LEGO para la protección del mismo.
La estructura principal del vehículo está rodeada por una carcasa colorida hecha con bloques de LEGO. Esta carcasa cumple dos funciones:
-
Protección de Cables y Componentes: al encerrar los componentes electrónicos, como el controlador y los cables, evitamos que se dañen por contacto accidental con objetos externos o durante la manipulación.
-
Estabilidad: la estructura de LEGO aporta rigidez al montaje, lo cual ayuda a mantener los componentes en su lugar mientras el vehículo está en movimiento.
En la parte delantera del vehículo, hemos agregado un parachoques hecho con piezas de LEGO que sobresale ligeramente. Este parachoques tiene dos propósitos:
-
Absorber Impactos: protege al vehículo en caso de colisiones frontales, evitando que los sensores y otros componentes reciban daños directos.
-
Integración con Sensores: se ha dejado espacio para un módulo de sensor ultrasónico, montado en la parte frontal, que permite la detección de obstáculos. Esto es esencial para la navegación autónoma, ya que el sensor ayuda a que el vehículo detecte y evite obstáculos en su trayectoria.
Para darle a la estructura un diseño más elegante y monocromático, decidimos pintar todas las piezas de color negro mate.
El uso de piezas de LEGO para la carcasa y el parachoques permite una gran flexibilidad y personalización. Se puede adaptar el diseño fácilmente según los cambios que se realicen en el hardware, y es sencillo desarmar y volver a montar la estructura para ajustes rápidos. Además, esta elección facilita que el proyecto sea accesible y seguro para trabajos experimentales, especialmente en entornos educativos.
Para programar la cámara y la conexión MQTT, es necesario usar la aplicación Arduino IDE anteriormente comentada.
Para procesar la información que nos proporciona la cámara, hay que usar una aplicación de programación al estilo de Visual Studio Code e instalarse las dependencias anteriormente indicadas.
Por último, para programar la placa de arduino hay que usar también Arduino IDE. Cabe destacar que cada vez que se sube código a la placa es necesario ponerla en modo upload, mientras que cuando queremos ejecutarlo hay que poner en cam. A continuación adjunto una foto donde se puede apreciar la parte del arduino donde está esto que he comentado:
Para permitir que el robot siga una mano, se utiliza OpenCV para identificar la forma de la mano en el video capturado y calcular su posición en relación con el robot. El algoritmo básico es el siguiente:
- Captura continua de video con la esp-32.
- Publicación de la imagen en un servidor.
- Suscripción con un código python a la URL del servidor.
- Procesamiento de la imagen con el código python y con mediapipe.
- Comunicación por MQTT entre el código python y la esp32.
- Comunicación en serie entre la esp32 y el arduino.
- Respuesta del arduino ante la información procesada.
-El primer problema con el que nos hemos enfrentado ha sido que nuestra esp32, la esp32-Wroover, es un modelo distinto al normal, ya que está un poco modificada respecto a la original. Esto nos causó que a la hora de incluir el modelo, no fuese el de la documentación de esp32 ni la que aparece en internet, sino que tuvimos que ir probando los modelos que aparecen en el código de ejemplo hasta encontrar el nuestro, ya que no aparecía en la documentación de Elegoo. El modelo es:
define CAMERA_MODEL_M5STACK_WIDE // Has PSRAM-Otro error que nos entorpeció bastante fue que la cámara, cuando su fuente de alimentación era la batería del robot, hacía que la calidad del streaming bajase, quedándose incluso pillado. Para solucionar esto, ajustamos a mano unos valores del streaming. La mejor combinación de valores fuela siguiente:

-Otro error que tuvimos que solventar fue que la versión 3.8.3 de python no es compatible con selenium, lo cual nos permitía abrir el navegador con python. Entonces, decidimos que lo mejor era abrirlo a mano nosotoros y capturar la pantalla con pyautogui.
-Un error muy tedioso que tuvimos fue que en la conexión en serie hay que añadir los pines de la esp32 para que se envíen los mensajes con exíto, no basta con hacer un simple print.
-El último error que tuvimos fue a la hora de transmitirse los mensajes entre la placa de arduino y la esp32. El problema consistía en que no solo se mandaban los caracteres correspondientes, sino que también se mandaba /n y /r. Para solucionarlos, cuando leíamos el mensaje, hacíamos message.tim(), siendo message la variable donde leíamos el mensaje en el arduino.
La versión creada es la 1.1.4. Para un futuro, sería conveniente mejorar los siguientes aspectos:
- Cambiar la esp32-Wrover por la ESP32-S3-WROOM, la cual es superior en términos de procesamiento y conectividad. Esto la hace más adecuada para nuestro proyecto, el cual necesitan una transmisión en vivo de alta calidad y una conectividad Wi-Fi más confiable. Además cuenta con soporte para Bluetooth 5.0.
- Añadir una Raspberry Pi al chasis para que no sea necesario tener que usar el portátil y que sea más compacto.
- Implementarle en el software que gire a la izquierda o a la derecha
- Implementar el ultrasonidos para evitar colisiones.
- Implementar el servo para que si no encuentra una mano gire la cámara en busca de ella.