Probando el software completo


Índice:

  1.  Conceptos generales sobre drones
  2. Material necesario y montaje de los componentes hardware
  3. Mando RC y receptor. Programación en Arduino
  4. MPU6050 y su programación en Arduino
  5. Batería LiPo
  6. Control de estabilidad y PID
  7. Motores, ESC y su programación en Arduino
  8. Calibración de hélices y motores 
  9. Software completo y esquema detallado
  10. → Probando el software completo antes de volar
  11. Como leer variables de Arduino en Matlab
  12. Los mejores drones de 2018 | Comparativa y guía de compra

Introducción

Antes de volar el drone es necesario asegurar que el software completo funciona correctamente. En esta entrada vamos a ver cómo hacer estas comprobaciones de forma rápida y sencilla. Con estas pruebas garantizaremos que el montaje se ha hecho de forma correcta y que el software reacciona de forma lógica. Las variables que vamos a verificar son: la salida del sensor MPU6050, el mando RC y las cuatro salidas a los motores. Todas estas comprobaciones las haremos sin conectar la batería, únicamente alimentando la placa Arduino a través del cable USB.

En primer lugar, conviene recordar el convenio de signos que hemos tomado a la hora de construir y programar el drone. Recordad que la orientación en el frame del sensor MPU6050 define la parte delantera/trasera y la parte izquierda/derecha del drone, y también la numeración de los motores:

Si por la razón que sea vuestro hardware es diferente a este, es decir, si la numeración de los motores respecto a la orientación del sensor MPU6050 no se corresponde con la de la imagen, o si por error habéis conectado los motores a alguna salida digital diferente a la que se muestra, habrá que hacer algunas modificaciones en el código. Concretamente habrá que cambiar los signos de las siguientes ecuaciones:

// Modulador
ESC1_us = RC_Throttle_consigna + PID_W_Pitch_OUT - PID_W_Roll_OUT - PID_W_Yaw_OUT; // Motor 1
ESC2_us = RC_Throttle_consigna + PID_W_Pitch_OUT + PID_W_Roll_OUT + PID_W_Yaw_OUT; // Motor 2
ESC3_us = RC_Throttle_consigna - PID_W_Pitch_OUT + PID_W_Roll_OUT - PID_W_Yaw_OUT; // Motor 3
ESC4_us = RC_Throttle_consigna - PID_W_Pitch_OUT - PID_W_Roll_OUT + PID_W_Yaw_OUT; // Motor 4

Estas ecuaciones, que he llamado Modulador, son las encargadas de actuar sobre determinados motores en función de inclinación del drone. Si el control de estabilidad ordena acelerar o decelerar alguno de los motores para mantener el drone estable, pero esos motores están conectados donde no deberían (por ejemplo, en el brazo opuesto frame), el drone no podrá ni siquiera despegar, porque el motor que estamos acelerando estará en el lugar equivocado. En vez de contrarrestar la inclinación estaremos ayudando a que esta se acentúe, por lo que todo acabará en una vuelta de campana por parte del drone.

Para asegurarnos de que todo está bien antes de empezar a volar, vamos a realizar 3 sencillas pruebas. Si pasáis de forma satisfactoria la prueba número 3 que se muestra a continuación, el montaje y la integración con el software se ha hecho de forma correcta. Si no, habrá que modificar los algunos signos del código que os acabo de mencionar.

Si bien superando la prueba número 3 la 1 y la 2 quedan superadas de forma indirecta, recomiendo hacer las tres en el orden que se indica.

Comprobaciones

Después de mencionar esto, pasamos directamente a hacer las comprobaciones necesarias. Nos vamos a centrar en las tres comprobaciones mas críticas, sin las cuales no es posible volar el drone.

1.- Comprobación de montaje:

En primer lugar, asegurad que los motores giran en la dirección correcta y que las hélices están bien colocadas en función de la dirección de giro. Es muy importante. Tenéis mas información en en la entrada dedicada a la calibración de ESC y motores. 

Cada motor gira en un sentido concreto según su posición en el frame
En función del sentido de giro de cada motor, hay que utilizar una hélice o la otra. En el paquete siempre vendrán dos tipos de hélices, uno para cada sentido de giro del motor. Comprobad también que no las estáis poniendo boca abajo. La serigrafía con el tipo de hélice (en mi caso 10×4.5R), siempre hacia arriba.

2.- Validación de sensor MPU6050

El primer lugar vamos a comprobar el funcionamiento del sensor MPU6050. Comprobaremos que la estimación del ángulo de inclinación (angulo_pitch y angulo_Roll) se hace de forma correcta y de que la orientación del sensor en el frame es el adecuado.

Para ello, cargamos el software principal y activamos el modo de visualizaciones:

bool visu = 1;  

En este caso queremos visualizar la inclinación del drone:

int visu_select = 3;   // 0: mando RC, 1: giro, 2: acc, 3: ang, 4: esc

En primer lugar, aseguraos de que la estimación de la inclinación se hace bien, que con el drone en una superficie plana el valor de las variables angulo_pitch y angulo_roll es de 0º, y que a medida que lo inclinamos la estimación calcula el ángulo de inclinación bien.

Con el drone en una superficie plana la estimación de la inclinación es de 0º, inclinando el drone la estimación varía

Después comprobaremos que los signos en función de a qué lado orientemos el drone son correctos. Si inclinamos el drone hacia adelante, es decir, en dirección a la ‘flecha Y’ del sensor MPU6050, la inclinación en ese eje tiene que ser negativa, mientras que, si lo inclinamos hacia atrás, la inclinación será positiva:

Inclinando el drone hacia ‘adelante’, inclinación en el eje Pitch negativa

En el eje Roll en cambio, inclinando el drone a la derecha obtenemos un ángulo positivo en ese eje, mientras que si lo inclinamos a la izquierda obtenemos una estimación negativa. Si alguno de estos signos es diferente al aquí mencionado, habrá que modificar los signos en el software, cosa que no es tan evidente de hacer. Significará que no hemos orientado el sensor MPU6050 en el frame de forma adecuada. Mas adelante veremos cómo solucionarlo.

Inclinando el drone hacia la ‘derecha’, inclinación en el eje Roll positiva

2.- Validación del mando RC

Comprobar el funcionamiento del mando RC es igual de importante. A continuación, vamos a testear las variables wPitchConsigna, wRollConsigna, wYawConsigna y PotenciaFilt.

int visu_select = 0;   // 0: mando RC, 1: giro, 2: acc, 3: ang, 4: esc

Moved uno por uno los stick del mando y analizar los resultados por el monitor serie. Mas que en el valor final, fijaos en el signo (si es positivo o negativo). Si alguno de los signos es diferente al mencionado abajo, habrá que modificar la parte del código donde se declaran las variables de ese canal:

  • Moviendo stick de Pitch hacia arriba, wPitchConsigna = -30º aprox. 
  • Moviendo stick de Pitch hacia abajo, wPitchConsigna = +30º aprox. 
  • Moviendo stick de Roll hacia la derecha, wRollConsigna = +30º aprox. 
  • Moviendo stick de Roll hacia la izquierda, wRollConsigna = -30º aprox. 
  • Moviendo stick de Yaw hacia la derecha, wYawConsigna = +30º aprox. 
  • Moviendo stick de Yaw hacia la izquierda, wYawConsigna = +30 aprox.

Modificar el código para solucionar este problema es tan fácil como invertir estos dos parámetros del canal que esté invertido. De esto:

const int us_max_Pitch_adj = -30;   // <-- Si teneis la entrada Pitch invertido sustituid este valor
const int us_min_Pitch_adj = 30;    // <-- por este y viceversa

A esto:

const int us_max_Pitch_adj = 30;   // <-- Si teneis la entrada Pitch invertido sustituid este valor
const int us_min_Pitch_adj = -30;  // <-- por este y viceversa

Las implicaciones de no hacer esta modificación no son tan graves, simplemente, cuando ordenáramos al drone ‘avanzar’, este retrocedería. Nada grave, pero conviene corregirlo.

Un punto muy importante para tener en cuenta en los canales Pitch, Roll y Yaw: hay que asegurar que con los sticks en tu posición central (sin moverlos), las variables RC_Pitch_consigna, RC_Roll_consigna yRC_Yaw_consigna son cero. Exactamente cero. Si no, el drone podría desplazarse hacia un lado sin que nosotros lo ordenáramos, simplemente porque con el stick en su posición central estamos leyendo valores diferentes de cero. Para asegurar que esto se cumple, he añadido estas líneas de código, para hacer forzar a cero la señal siempre que estemos dentro de un rango determinado:

// Si las lecturas son cercanas a 0, las forzamos a 0 para evitar inclinar el drone por error
if (RC_Pitch_consigna < 3 && RC_Pitch_consigna > -3)RC_Pitch_consigna = 0;
if (RC_Roll_consigna  < 3 && RC_Roll_consigna  > -3)RC_Roll_consigna  = 0;
if (RC_Yaw_consigna   < 3 && RC_Yaw_consigna   > -3)RC_Yaw_consigna   = 0;

El correcto ajuste del canal throttle es el mas importante de todos. Para la consigna de Throttle o RC_Throttle_consigna, hay que comprobar que con el stick al mínimo obtenemos valores cercanos a 950us y con el stick al máximo valores cercanos a 1800us (el valor de Throttle máximo está limitado a 1800us para dar margen al control de estabilidad):

Throttle al mínimo y al máximo

Este si es un punto crítico. Hay que asegurar que con el stick al mínimo la señal de Throttle es cercano a 900-1000us. Si tuviéramos este canal invertido, es decir, si con el stick al mínimo obtuviéramos lecturas de 1800us, el drone despegaría a máxima potencia nada más entrar al loop principal, cosa que queremos evitar.

Si tenéis el canal invertido, corregirlo cambiando de orden los parámetros de entrada. De esto:

const float us_max_Throttle_raw = 2004; // <-- Si tenéis la entrada Throttle invertida sustituid este valor
const float us_min_Throttle_raw = 1116; // <-- por este y viceversa

A esto:

const float us_max_Throttle_raw = 1116; // <-- Si tenéis la entrada Throttle invertida sustituid este valor
const float us_min_Throttle_raw = 2004; // <-- por este y viceversa

Por ultimo, el software está preparado para evitar que la señal enviada a los motores con el Stick de throttle al mínimo sea inferior a un valor determinado. La señal mínima que enviamos a los motores viene definida por este valor, que tiene que ser menor al valor con el que hayamos calibrado los motores, si no, los motores girarán o intentarán girar con el stick de throttle al mínimo. 

// Si lo motores giran con el stick de Throttle al mínimo, recudir este valor
if (ESC1_us < 1000) ESC1_us = 950;
if (ESC2_us < 1000) ESC2_us = 950;
if (ESC3_us < 1000) ESC3_us = 950;
if (ESC4_us < 1000) ESC4_us = 950;

Si al acabar las pruebas, cuando conectéis la batería, los motores giran un poco o intentan girar con el Stick de throttle al mínimo, reducir ese valor de 950 a 920, por ejemplo. Hay que conseguir que estén completamente parados.

3.- Validación control de estabilidad

Llegamos a la parte más importante. Si la estimación de la inclinación y la lectura del mando se hacen de forma correcta, vamos a comprobar que el control d estabilidad funciona de forma adecuada y de que las señales ESC1_us, ESC2_us, ESC3_us y ESC4_us se ajustan de forma correcta en función de la inclinación del drone. Para ello, es imprescindible haber cableado los motores a las salidas digitales correctamente. Es decir, que la señal ESC1_us actúe sobre el motor 1, la señal ESC2_us sobre el motor 2… De nada servirá hacer estas pruebas si después hemos cableado la señal esc1 al motor número 2 por error.

// Declarar motores
pinMode(pin_motor1, OUTPUT);  //Motor 1
pinMode(pin_motor2, OUTPUT);  //Motor 2
pinMode(pin_motor3, OUTPUT);  //Motor 3
pinMode(pin_motor4, OUTPUT);  //Motor 4

Es muy importante que tengáis identificado claramente cada motor y a que salida digital está cableado.

Para la primera fase no es necesario utilizar el mando RC, simplemente vamos a ir inclinando el drone en sus diferentes ángulos con la mano, y vamos a analizar las salidas ESC1_us, ESC2_us, ESC3_us y ESC4_us. No conectaremos la batería en ningún momento. Únicamente alimentaremos la placa Arduino con el cable USB. En este caso queremos visualizar las señales ESC1_us, ESC2_us, ESC3_us y ESC4_us:

int visu_select = 4;   // 0: mando RC, 1: giro, 2: acc, 3: ang, 4: esc

Por seguridad, el control de estabilidad se activa solo cuando subimos el throttle por encima de los 1300us, por lo que para visualizar el comportamiento de ESC1_us, ESC2_us, ESC3_us y ESC4_us tendréis que subir la stick por encima de este valor.

El trabajo del control de estabilidad es mantener el drone siempre estable. Si inclinamos el drone hacia adelante, es decir, en dirección a la ‘flecha Y’ del sensor MPU6050, la consigna de los motores 1 y 2 tiene que aumentar, mientras que la de los motores 3 y 4 tiene que reducirse. Si accionáramos por error cualquier otro motor que no fueran estos, estaríamos ayudando a que continuara inclinándose, y perderíamos el control del done. Esta es la prueba más importante de todas:

Inclinando el drone hacia ‘adelante’, las variables ESC1_us y ESC2_us aumentan. Las variables ESC3_us  y ESC4_us se reducen. Fiaos en la numeración de los motores en el frame.

Esta es la base del control de estabilidad y es una NORMA que hay que cumplir SIEMPRE: el sensor detecta inclinaciones, y el control las contrarresta ajustando las señales ESC1_us, ESC2_us, ESC3_us y ESC4_us.

Si en cambio movemos el drone hacia la ‘derecha’, la consigna de los motores 1 y 4 tiene que aumentar, mientras que la de los motores 2 y 3 a de reducirse:

Inclinando el drone hacia la ‘derecha’, las variables ESC1_us y ESC4_us aumentan. Las variables ESC2_us y ESC3_us se reducen. Fiaos en la numeración de los motores en el frame.

Comprobad esto en todos los ejes y en todas direcciones. Como veis, es la fase final del control de estabilidad. Estamos comprobando que las señales ESC1_us, ESC2_us, ESC3_us y ESC4_us son ajustadas de forma correcta en función de la inclinación del drone.

En caso de no haber fijado la posición del sensor MPU6050 de forma correcta, o de haber empezado con el blog con el drone ya montado, en definitiva, si no hemos superado las pruebas que acabamos de hacer en este punto 3, será necesario modificar los signos de esas ecuaciones hasta hacer que la pruebas que hemos hecho más arriba se cumplan. Esto es imprescindible. Independientemente de como hayamos montado el hardware, siempre tendremos que comprobar esto y asegurarnos de que funciona correctamente. Las señales ESC1_us, ESC2_us, ESC3_us y ESC4_us siempre tienen que ajustarse de forma correcta en función de la inclinación del drone.

Modificar esta parte del software es bastante sencillo, pero hay que saber lo que se está haciendo. Si inclinando el drone en el eje Pitch hemos visto que se aceleran los motores que no deberían, habrá que modificar el signo del modular PID_W_Pitch_OUT. Si hemos visto que sucede en el eje Roll, los signos dl parámetro PID_W_Roll_OUT. Así hasta conseguir cumplir la NORMA del punto 3.

Si por ejemplo es el eje Pitch el que está dando problemas, invertimos los signos correspondientes a ese eje y volvemos a probar:

ESC1_us = RC_Throttle_consigna + PID_W_Pitch_OUT - PID_W_Roll_OUT - PID_W_Yaw_OUT; // Motor 1
ESC2_us = RC_Throttle_consigna + PID_W_Pitch_OUT + PID_W_Roll_OUT + PID_W_Yaw_OUT; // Motor 2
ESC3_us = RC_Throttle_consigna - PID_W_Pitch_OUT + PID_W_Roll_OUT - PID_W_Yaw_OUT; // Motor 3
ESC4_us = RC_Throttle_consigna - PID_W_Pitch_OUT - PID_W_Roll_OUT + PID_W_Yaw_OUT; // Motor 4
ESC1_us = RC_Throttle_consigna - PID_W_Pitch_OUT - PID_W_Roll_OUT - PID_W_Yaw_OUT; // Motor 1
ESC2_us = RC_Throttle_consigna - PID_W_Pitch_OUT + PID_W_Roll_OUT + PID_W_Yaw_OUT; // Motor 2
ESC3_us = RC_Throttle_consigna + PID_W_Pitch_OUT + PID_W_Roll_OUT - PID_W_Yaw_OUT; // Motor 3
ESC4_us = RC_Throttle_consigna + PID_W_Pitch_OUT - PID_W_Roll_OUT + PID_W_Yaw_OUT; // Motor 4

Realmente, la posición del sensor MPU6050 en el frame es indiferentes, siempre que consigamos que se cumplan las pruebas que acabamos de hacer en este punto 3. En este blog, en la entrada dedicada al sensor MPU6050, insistíamos en orientar el sensor de una forma determinada. Con esto conseguimos hacer más fácil la utilización del software principal y no tener que modificarlo. Simplemente, hemos fijado la posición del sensor en una orientación determinada para poder utilizar las ecuaciones que se incluyen en el Modulador del software principal sin modificarlas.

La misma lógica la vamos a utilizar para comprobar que el drone actúa según lo esperado ante las ordenes recibidas desde el mando RC. Para ello vamos a dejar el drone posado sobre una superficie plana y vamos a coger el mando RC.

Si movemos el stick del canal Pitch hacia arriba, estamos ordenando al drone avanzar (hacia adelante). Para ello, según el convenio de signos que hemos escogido, la consigna de los motores 3 y 4 tiene que aumentar, mientras que la de los motores 1 y 2 tiene que reducirse. De esta forma, el done se inclinará en el eje Pitch y avanzará en esa dirección:

mando rc drone arduino
Subiendo el stick asociado al eje Pitch hacia arriba (ordenando a drone ir hacia adelante), las variables ESC3_us y ESC4_us aumenta. las variables ESC1_us y ESC2_us se reducen.

Lo mismo sucede con el eje Roll. Si movemos el stick del canal Roll hacia la derecha, estamos ordenando al drone desplazarse en esa dirección. Para ello, según el convenio de signos que hemos escogido, la consigna de los motores 2 y 3 tiene que aumentar, mientras que la de los motores 1 y 4 tiene que reducirse. De esta forma, el done se inclinará en esa dirección en el eje Roll y avanzará en esa dirección:

ando rc drone arduino
Subiendo el stick asociado al eje Roll hacia la derecha (ordenando a drone ir hacia la derecha), las variables ESC2_us y ESC3_us aumentan. las variables ESC1_us y ESC4_us se reducen.

Comprobad esto en todos los ejes y en todas direcciones.

El eje Yaw es más es algo mas complicado de comprender. Controlando el eje Yaw el drone no se desplaza, simplemente gira sobre su eje central. Por ello, recomiendo en un principio no hacer comprobaciones. Simplemente volad el drone. Si este empieza a rotar sobre su propio eje, los signos del eje Yaw estarán invertidos. Solucionarlo es muy sencillo. Simplemente tenéis que modificar los signos en el modulador. De esto:

ESC1_us = RC_Throttle_consigna + PID_W_Pitch_OUT - PID_W_Roll_OUT - PID_W_Yaw_OUT; // Motor 1
ESC2_us = RC_Throttle_consigna + PID_W_Pitch_OUT + PID_W_Roll_OUT + PID_W_Yaw_OUT; // Motor 2
ESC3_us = RC_Throttle_consigna - PID_W_Pitch_OUT + PID_W_Roll_OUT - PID_W_Yaw_OUT; // Motor 3
ESC4_us = RC_Throttle_consigna - PID_W_Pitch_OUT - PID_W_Roll_OUT + PID_W_Yaw_OUT; // Motor 4

A esto:

ESC1_us = RC_Throttle_consigna + PID_W_Pitch_OUT - PID_W_Roll_OUT + PID_W_Yaw_OUT; // Motor 1
ESC2_us = RC_Throttle_consigna + PID_W_Pitch_OUT + PID_W_Roll_OUT - PID_W_Yaw_OUT; // Motor 2
ESC3_us = RC_Throttle_consigna - PID_W_Pitch_OUT + PID_W_Roll_OUT + PID_W_Yaw_OUT; // Motor 3
ESC4_us = RC_Throttle_consigna - PID_W_Pitch_OUT - PID_W_Roll_OUT - PID_W_Yaw_OUT; // Motor 4

3.- Otras comprobaciones

El LED 13, que indica que la ejecución del código se hace dentro de los tiempos requeridos, nunca debería encenderse. Si se enciende, significa que el tiempo que necesita la placa Arduino para ejecutar el código es mayor que el tiempo de ciclo que hemos puesto (uCliclo). Si no habéis modificado el tiempo de ciclo ni añadido nada al código, esto no debería pasar nunca, el LED 13 estará siempre apagado.

Eso es todo… 🙂

Recomiendo dedicar algo de tiempo al tema de las comprobaciones y asegurar que todo funciona como es debido. A nadie le gusta estrellar el drone en la primera prueba de vuelo. Además de los puntos que hemos mencionado, se pueden comprobar otra serie de elementos menos críticos, como la lectura de tensión de la batería.

Un tema por el que muchos me preguntáis es el de ajustar los controladores PID. Desafortunadamente, es necesario hacer el ajuste a prueba y error mientras volamos. Para ajustar los valores de los controladores en base a simulación sería necesario conocer el modelo matemático completo del drone, cosa que es extremadamente complejo y que se escapa completamente del objetivo de este blog. Por lo que no queda otra que justar los parámetros on-line.

No hay una forma fija de configurar los parámetros de los PID. Estos dependen del tamaño, del peso, de la construcción… que hayamos llevado a cabo. Cada drone necesita unos parámetros específicos para volar de forma suave. Como consejo, recomendaría dividir entre dos los valores que utilizo yo e ir incrementando su valor poco a poco a medida que vamos haciendo pruebas de vuelo, hasta alcanzar el punto óptimo.

Los parámetros que tenéis que modificar son los siguientes (en el ejemplo solo se muestran los parámetros de uno de los PID pero hay que modificar todos):

float Pitch_W_Kp   = 1.9, Pitch_W_Ki   = 0.07, Pitch_W_Kd   = 12;

Por último, cuando terminéis con las pruebas, recordad poner a cero la opción de visualizaciones:

bool visu = 0;  

Vídeo de puesta en marcha:

Como hacer un drone con Arduino, paso a paso (Código incluido)



Índice:

  1. Conceptos generales sobre drones
  2. Material necesario y montaje de los componentes hardware
  3. Mando RC y receptor. Programación en Arduino
  4. MPU6050 y su programación en Arduino
  5. Batería LiPo
  6. Control de estabilidad y PID
  7. Motores, ESC y su programación en Arduino
  8. Calibración de hélices y motores
  9. Software completo y esquema detallado 
  10. Probando el software completo antes de volar
  11. → Como leer variables de Arduino en Matlab

🛫¡¡A VOLAR!!🛬

Espero que os haya gustado esta serie dedicada al montaje y programación de un drone utilizando Arduino. Espero que sepáis apreciar el esfuerzo que ha supuesto llevar este blog a cabo, ya que todo el contenido, incluyendo código e imágenes han sido generadas por mí.

¡A VOLAR AMIGOS!


¡NUEVO curso de diseño PCB ! Controlador de vuelo para drones 100% Arduino 

NUEVO curso de diseño de tarjetas electrónicas (PCB) para principiantes, donde aprendemos a diseñar PCB complejos que cubran las necesidades de vuestros proyectos DIY. Para llegar a este objetivo, vamos a diseñar desde cero un PCB controlador de vuelo para drones basado 100% en Arduino, donde como punto final enviaremos el PCB a fabricar para recibirlo en casa completamente montado y listo para ser programado.

Más INFORMACIÓN sobre el CURSO

5/5 - (4 votos)
28 Comentarios

Añadir un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *