paint-brush
Construcción de un dron Raspberry Pi + ESP32: mis primeros pasos en la robóticapor@tohntobshi
10,329 lecturas
10,329 lecturas

Construcción de un dron Raspberry Pi + ESP32: mis primeros pasos en la robótica

por Anton D2022/04/26
Read on Terminal Reader
Read this story w/o Javascript

Demasiado Largo; Para Leer

Anton escribió sobre sus primeros pasos en la robótica y en particular sobre su dron Raspberry Pi + ESP32. Anton diseñó partes en Blender y luego las imprimió en 3D en una impresora 3D barata. El dron está controlado por una aplicación, donde los usuarios pueden monitorear y monitorear el dron con una aplicación similar a la analógica. Anton también hizo un video al respecto y lo adjuntó al final del artículo.

Companies Mentioned

Mention Thumbnail
Mention Thumbnail
featured image - Construcción de un dron Raspberry Pi + ESP32: mis primeros pasos en la robótica
Anton D HackerNoon profile picture

¡Hola a todos! Mi nombre es Antón. Y quiero compartir la historia de mis primeros pasos en la robótica y particularmente sobre mi dron Raspberry Pi + ESP32. (También hice un video al respecto y lo adjunto al final del artículo)

Prefacio

Al comienzo de la historia, trabajaba como desarrollador web (React, Typescript, etc.), tenía algunos conocimientos de C ++, en cuanto a habilidades electrónicas: podía soldar cables de auriculares rotos. El problema fue que, como desarrollador web, comencé a sentirme insatisfecho porque lo que hago no afecta el mundo físico de manera significativa. Por supuesto, hay muchos proyectos solo de software que impactan en el mundo real, pero decidí adoptar el enfoque más directo y sumergirme en la robótica.


Así que leí algunos libros sobre el tema, vi algunos videos en YouTube, leí algunos artículos y compré un equipo de soldadura y una impresora 3D, ya que las impresoras 3D son baratas y están disponibles hoy en día y pueden ahorrarme el dolor de cabeza de hacer piezas con recipientes de alimentos y chatarra similar.

el primer robot

Mi primer robot fue esta plataforma oruga:


mi primer robot


Diseñé partes en Blender y luego las imprimí. Usé Raspberry Pi como cerebro y un banco de energía como suministro. Soldé el controlador del motor con relés y transistores. En el proceso de hacer esto me encontré con un problema, cuando monté todo, los motores apenas se movían. Resultó que mezclé el colector y el emisor de los transistores, y después de volver a soldarlos, todo comenzó a funcionar. Es difícil llamar a esto un robot porque no hace nada por sí mismo y solo se controla de forma remota. De todos modos, me sentí muy bien al hacerlo, creí en mí mismo y decidí hacer lo mismo pero volador.

el segundo robot

Después de investigar un poco, decidí usar algunas piezas de cuadricópteros convencionales, como motores sin escobillas, controladores electrónicos de velocidad y una batería lipo capaz de proporcionar alta corriente a los motores. Como cerebro, todavía usaba la misma Raspberry Pi. Después de descubrir cómo conectar Raspberry Pi con ESC, comencé a diseñar un marco para sostener todas las partes. Lo estaba haciendo confiando solo en la intuición con la esperanza de que los requisitos para un marco no fueran muy estrictos porque vi drones de formas tan extrañas que aún podían volar.


También compré una placa que incorpora un giroscopio, acelerómetro, barómetro y magnetómetro en el bus i2c. Antes incluso de saber qué es un controlador PID, mi primer enfoque intuitivo fue similar a la forma en que funciona su componente P: simplemente aumente o disminuya la velocidad del motor proporcionalmente al ángulo en que el dron diverge del plano horizontal.


Al principio, pensé que no sería una tarea muy difícil, pero después de todos los intentos fallidos, no tenía idea de cómo hacerlo de la manera correcta porque hay muchas cosas que pueden no funcionar correctamente. Y al contrario de hacer algo solo de software, cada ejecución puede terminar con daños físicos y el próximo intento será posible solo después de que se reemplacen las piezas dañadas. Además, no es tan fácil probar esto en un pequeño piso alquilado. Si hubiera tenido un garaje grande, un cobertizo o algo así, podría haber hecho una construcción que restringiera el movimiento del dron.


el movimiento vertical está restringido por los cordones de los zapatos


En cambio, tuve que improvisar y usar cordones de zapatos y mis propias manos, lo que a veces me provocó lesiones menores pero desagradables.


En algún momento, pensé que no era conveniente controlar el dron con un mouse y un teclado y decidí hacer una aplicación de controlador, donde puedo cambiar los parámetros, monitorear las lecturas de los sensores y controlar gradualmente el dron con una interfaz de usuario similar a la analógica.


captura de pantalla de la aplicación móvil

otra captura de pantalla


Inicialmente, por alguna razón, me concentré en el control de nivelación horizontal solo para darme cuenta de que no puedo probarlo de manera segura y lo que más necesitaba es el control de altura automático. Mi primer pensamiento fue usar las lecturas del barómetro, pero no eran lo suficientemente precisas para controlar la altura en interiores (o tal vez las usé de manera incorrecta), así que compré un sensor ultrasónico en una tienda local de componentes electrónicos. En realidad, tenía una interfaz extraña que hace que uno de los pines se vuelva alto durante la medición y tienes que contar el tiempo para deducir la distancia. Cuando la Raspberry Pi estaba relativamente inactiva, funcionaba bien, pero bajo carga computacional simplemente se saltaba los tiempos y las lecturas eran basura. Así que tuve que agregar un controlador AVR adicional al proyecto únicamente para medir estos tiempos y generar resultados en forma digital conveniente en la interfaz SPI.


También compré dos cables de freno para bicicleta y guías impresas para que el dron restrinja su movimiento hacia arriba y hacia abajo y así poder concentrarme en el control de altura sin pensar en controlar otros grados de libertad.

el movimiento horizontal está restringido por el cable del freno


Y funcionó un poco, excepto en el caso en que las hélices funcionaban, creando turbulencias que interferían con las lecturas del sensor ultrasónico a alturas superiores a 40 cm. Cuando finalmente lo descubrí, tuve que reemplazar el sensor ultrasónico por uno láser.


En ese momento, ya tenía control de altura pero aún no podía lograr una nivelación horizontal estable, aunque había implementado el control PID para ello. Supuse varias razones para ello y no estoy seguro de cuál de ellas contribuyó más al problema. Pero aquí están:


  • Para el primero y probablemente el más importante, utilicé hélices baratas (e incluso traté de imprimirlas) y descuidé la necesidad de equilibrarlas, lo que a su vez sobrecarga los sensores IMU con ruido que reduce su precisión. Cuando finalmente decidí abordar este problema, agregué una función a mi aplicación para tomar las últimas 100 lecturas del giroscopio y el rango de salida entre el valor más grande y el más pequeño. Cuanto mayor es el rango cuando la hélice está funcionando, más desequilibrada está. Pegué al azar cinta adhesiva en las palas de las hélices, luego las ejecuté para verificar el valor, si aumenta, probablemente sea un mal lugar para pegar allí, si el ruido disminuye, estoy en el camino correcto, luego traté de pegar más o más cerca del centro y verifique nuevamente, así reduje el ruido en cada hélice.
  • El segundo problema posible es que Raspberry Pi solo tiene dos canales PWM, pero hay cuatro ESC controlados con él, y el software PWM puede no ser lo suficientemente preciso y también desperdicia ciclos de CPU. Así que decidí usar ESP32 para esta tarea porque son baratos, fáciles de conseguir y tienen muchas interfaces de las que carece Raspberry Pi. Empecé controlando ESC a través de ESP32 conectado con Raspberry Pi sobre SPI y terminé moviendo toda la lógica del controlador de vuelo a ESP32.
  • El tercer problema probablemente no fue un marco lo suficientemente rígido, que rediseñé e imprimí varias veces.
  • Otro problema son los coeficientes subóptimos para el filtro complementario que utilicé para estimar el ángulo de inclinación. El valor óptimo es 0,999 para el ángulo estimado por las lecturas del giroscopio integrado y 0,001 para el ángulo medido por el acelerómetro.
  • No consideré que el cabeceo se convierte en alabeo y viceversa si el dron inclinado se gira alrededor de su eje z local.
  • Las oscilaciones muy lentas del ángulo de inclinación pueden corregirse aumentando el coeficiente P varias veces en lugar de disminuirlo, como sugieren algunas fuentes.



En algún momento del proceso de desarrollo, me frustré con la cantidad de cables entre los módulos y la forma en que estaban colocados. Así que decidí invertir algo de tiempo en la habilidad de hacer PCB personalizados. Lo pensé durante mucho tiempo, pero me desanimó la necesidad de comprar herramientas caras y tratar con productos químicos.


De hecho, resultó más fácil de lo que pensaba, vi algunos tutoriales en KiCAD para crear el diseño de mi PCB. Compré una impresora láser de segunda mano por 40$, también compré una plancha normal sin agujeros por 5$, y la herramienta más cara fue una taladradora por 75$. Los químicos resultaron no ser tan peligrosos, no disolverán tu piel si los tocas.


diseño en KiCAD

después de grabar y aplicar máscara de soldadura


Así que hice este PCB en el cuarto intento. La parte más difícil fue aplicar la máscara de soldadura. Lo que hace esta PCB es que interconecta sensores, ESP32 y Raspberry Pi y entrega el voltaje apropiado a diferentes partes.


Los gráficos sofisticados que muestran las lecturas actuales de los sensores en la aplicación resultaron ser difíciles de analizar mientras se intentaba evitar que el dron se estrellara. Así que agregué la capacidad de registrar los datos del sensor y escribí un script de Python para analizarlo cuadro por cuadro con el registro de video del vuelo.

guión del analizador de vuelo


Si lo hubiera hecho antes, habría dedicado mucho menos tiempo a investigar los problemas causados por el sensor ultrasónico defectuoso que mencioné anteriormente.


En algún momento, logré un control de altura, dirección y nivelación horizontal relativamente estable, pero aún así no pude evitar la deriva horizontal. Y si alguien sabe si es posible deshacerse de la deriva horizontal usando solo sensores IMU, hágamelo saber en los comentarios.


Investigué un poco y descubrí que algunos drones usan GPS para mantener la posición y traté de implementar la misma técnica. Pero el problema es que solo funciona en el exterior, pero incluso en el exterior no pude lograr ningún resultado satisfactorio. El clima era terrible esa temporada con viento, lluvia y nieve, así que no hice muchos intentos, salí con GPS y probé un enfoque de visión por computadora.


boceto de un guión que rastrea la marca azul


Coloqué una cámara en la parte inferior del dron e intenté mantener esta marca azul en el suelo usando la biblioteca OpenCV. Después de varios intentos y ajustes aquí está el resultado:


https://www.youtube.com/watch?v=poqQmvoBlP8

Ahora puede flotar en un punto sin control manual y sin ataduras. Este fue mi objetivo intermedio que finalmente logré, así que decidí documentar y compartir mi progreso.



También agregué la transferencia de un flujo de video del dron a la aplicación, por lo que ahora puedo experimentar con la visión por computadora para probar diferentes enfoques para hacer que la posición general se mantenga sin marcas especiales en el piso y para hacer otras funciones.




En la configuración actual, el dron está hecho así: ESP32 es responsable del control de altura, dirección y nivelación. Toma datos de sensores IMU y un sensor de distancia láser en la parte inferior. Da comandos a los controladores de motor y también recibe comandos de raspberry pi, que a su vez es responsable de la comunicación con la aplicación y el control de posición utilizando datos de la cámara.


Si a alguien le interesa ver el codigo

ESP32 parte

parte de frambuesa pi

aplicación de Android del cliente


El código no es muy limpio, ya que cambié la implementación con frecuencia tratando de que funcione correctamente. Tal vez lo limpie en el futuro :)


Además, hice un video al respecto:

https://www.youtube.com/watch?v=3mAFEW0YOJ0


¡Gracias por tu atención! ¡Salud!