Software completo y esquema detallado (sketch)


Índice:

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

En esta entrada vamos a ver como utilizar el software para hacer volar el drone que hemos construido utilizando la plataforma Arduino. Esta es la última entrada de la serie ‘Drone Arduino desde cero, por lo que si has llegado hasta significa que has leído y entendido las demás entradas. Si no es así, recomiendo empezar por la entrada número uno, dedicada a los conceptos generales sobre drones. Cada entrada analiza un componente básico del drone, por lo que es muy importante haber leído todas las entradas para tener claros los conceptos de funcionamiento.

Montaje Hardware del ‘Drone Arduino’

El montaje que necesitamos es el que hemos visto en la entrada correspondiente al montaje de los componentes hardware. Os dejo el esquema como recordatorio, y recordad seguir las recomendación que hemos mencionado en el citado articulo:

drone arduino | esquema hardware completo

Utilización del Software ‘Drone Arduino’

Podéis descargar el software completo en el siguiente enlace, archivo ‘SoftwarePrincipal_v1.01.ino‘.

Ir al archivo

Utilizar el software es muy sencillo. Simplemente cargad el software y seguid los pasos que os dejo en el siguiente vídeo. Podéis modificar el software y añadir todas las funcionalidad de que os ocurran, recordad que en el mundo de la programación vosotros ponéis los limites:

** Los parámetros de los controladores PID funcionan en mi drone, pero es probable que tengáis que ajustarlos vosotros mismos.

** Puede ser que cuando carguéis en software completo los motores giren un poco, o lo intenten, teniendo el throttle al mínimo. Si sucede esto, bajad el valor del parámetro PulsoMinPotencia hasta que dejen de hacerlo, por ejemplo, de 940 a 920. Con el stick de throttle al mínimo los motores han de esta completamente parados.



Continuar con la siguiente entrada:

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

35
Comentar

avatar
15 Comment threads
20 Thread replies
1 Followers
 
Most reacted comment
Hottest comment thread
13 Comment authors
arduprojectMisaelDavid 24Jaime SaucedoArduProject Recent comment authors
  Subscribe  
newest oldest most voted
Notify of
paco
Guest
paco

Hola, ayer me llegó la batería del dron. Con la batería alimentando al dron con el código completo, cuando bajo el throttle del mándo al mínimo los motores deberían estar parados, pero en teoría hacen pequeños giros, y hacen el intento de girar pero no pueden, producen pequeñas vibraciones y hacen ruidillos,… ¿Qué parámetro tengo que tocar para corregir esto y en que parte del código se encuentra?

arduproject
Admin

Buenas Paco,

Perdón por la tardanza. Utiliza el mismo valor de ‘PulsoMinPotencia’ que usaste para girar los motores por primera vez una vez calibrados. Si no, prueba a reducirlo de 940 a 900, por ejemplo:

const int PulsoMinPotencia = 900;

Puede ser que haya calibrado los motores a 900us en el pulso de throttle mínimo, y que ahora en el código completo el mínimo esté a 940us, por lo que los motores girarán a pesar de tener la palanca de throttle al mínimo.

Ya me dirás si los has solucionado 😉

Un saludo!!

sergio
Guest
sergio

Hola, hace tiempo inicie el mismo proyecto de drone con arduino es muy similar pero con arduino uno, y otro código diferente, solo que lo tengo aparcado por el problema de las vibraciones, el drone vibra mucho y es inestable al volarlo. No se donde puede estar el fallo ya que esta bien calibrado de hélices y motor, creo que puede ser un mal ajuste de PID pero ya he probado a reajustarlo varias veces y nada.
¿Podría usar su código para ver si se resuelve el problema?
El problema esta en que no es el mismo arduino ni mando ni receptor ni tiene pantalla ni leds

arduproject
Admin

Buenas Sergio 🙂

Tranquilo, es un problema muy común. Yo mismo estuve a punto de abandonar por esta razón. Pero no te desanimes. Hay luz después del túnel 😉

Las vibraciones de las que yo hablo son imperceptibles para nosotros, no se ven, pero el acelerómetro, que es muy sensible, las capta y alteran las estimaciones de la inclinación. Sobre el tema de vibraciones tengo una entrada, puedes buscarla en el índice -> ‘Calibración de hélices y motores (código)’. Si tus vibraciones están dentro del rango que se muestra ahí, puede que sea tema de ajustar los parámetros del PID. Comprueba esto para descartar cosas.

Pero por lo que me dices, las vibraciones de las que me hablas son a la hora de volar, y son más oscilaciones del drone que vibraciones propiamente dichas. Yo diría que más que un problema de vibraciones, tienes que ajustar los parámetros del PID correctamente.

¿Puede ser que estés utilizando un PI en vez de un PID (tienes la kd=0)? La parte D es muy importante en esta aplicación y no usarla puede provocar oscilaciones.
¿Qué frecuencia de lazo de control utilizas?
¿Cuántos PID utilizas para controlar cada movimiento? ¿Uno de inclinación y otro de velocidad en cascada, no?
Prueba a reducir todos los parámetros a la mitad, y vete subiéndolos poco a poco.

En principio el código que he subido sirve para arduino UNO y para NANO, pero tendrás que comprobar que el mando los lees de forma correcta. Léete la entrada correspondiente. De hecho, si vas a usar el código, te recomiendo leer todas las entradas e ir haciéndolo poco a poco.

Por el LCD y los leds no te preocupes, son recomendables, por que dan mucha información cuando no estamos conectados al PC, pero no son imprescindibles. Simplemente borra las líneas del LCD y listo, no son muchas.

Un saludo y animo 😉

AA.P Ramirez
Guest
AA.P Ramirez

Mil gracias por tu gran trabajo… conseguí montarlo y hacerlo funcionar

arduproject
Admin

Me alegra saberlo!! a darle caña 🙂

Daniel
Guest
Daniel

Muy buenas! Gran aporte! Voy a probar a realizarlo a ver si consigo hacerlo volar!

arduproject
Admin

Animo!!! 😉

Daniel
Guest
Daniel

Tengo una duda respecto al mando RC. Tiene que ser ese modelo o se podría utilizar otro distinto? O incluso utilizar un par de simples joysticks conectados a un arduino y con un sensor de radiofrecuencia?

arduproject
Admin

Buenas Daniel,

Efectivamente podrías utilizar cualquier mando, o como bien dices, un par de joysticks y un radiotransmisor tipo nfr24l01… yo de hecho me los compré pensando en un futuro hacerme yo el mando y que fuera bidireccional, es decir, que el drone mandara datos también al mando, como por ejemplo la tensión de batería y visualizarlo en un LCD…

Mucho animo!!

Antonio
Guest
Antonio

Hola. Estoy esperando los componentes para montarlo.
En cuanto al receptor, voy a transformar un viejo mando de PS2 con nRF24L01 +antena.

En el drone también montaré otro nRF24L01 igual para algún día (intentar) transmitir telemetría. De momento será PWM, pero en un futuro quisiera implementar PPM (32 canales con sólo 2 cables)

El chasis lo imprimiré en 3d, aunque será más pequeño (250mm) y motores 1804 2400kv. (si alguien cree que es una mala combinación, que lo diga, please).

Utilizaré el imu MPU9255.

Si todo funciona y no muere el proyecto en el intento… le añadiré gps, bme 280, un rtc para hacer log en microSD, etc…

Al menos, esa es la idea.
Un saludo desde Murcia.

arduproject
Admin

Suena genial!!
Yo también tengo pensado introducir mejoras, entre otras cosas, tenía en mente hacer exactamente lo mismo que propones. Eso si, en vez de BMP280, pensaba usar el MS5611, que es mas preciso.
Cunado saque tiempo me pondré a ello.
Un saludo y mucha suerte 😉

alfonso
Guest
alfonso

Buenas tardes, has probado ha ponerle una camara para hacer fpv ? seria muy interesante

arduproject
Admin

Se la voy ha poner en breves…
Un saludo!

José
Guest
José

Hola,

Entonces deberia de adjuntar todos los archivos en uno y cargarlo verdad?

arduproject
Admin

Buenas Jose,

No hace falta. Cundo abres cualquiera de los archivos .ino, verás que se abren todos en diferentes pestañas. Simplemente dale a cargar y se cargarán todos

Un saludo

Fran
Guest
Fran

Hola!

Tengo problemas al cargar el programa…

C:\Users\l***\Desktop\Programas\*****\drive-download-20190410T211822Z-001\SoftwarePrincipal_v1.01\SoftwarePrincipal_v1.01.ino: In function ‘void setup()’:

SoftwarePrincipal_v1.01:64:16: error: ‘init_General’ was not declared in this scope

SoftwarePrincipal_v1.01:65:16: error: ‘init_MPU6050’ was not declared in this scope

SoftwarePrincipal_v1.01:66:13: error: ‘VbatCheck’ was not declared in this scope

SoftwarePrincipal_v1.01:67:17: error: ‘Calib_MandoRC’ was not declared in this scope

SoftwarePrincipal_v1.01:68:17: error: ‘Calib_MPU6050’ was not declared in this scope

SoftwarePrincipal_v1.01:69:17: error: ‘Calib_Motores’ was not declared in this scope

C:\Users\l***c\Desktop\Programas\*****\drive-download-20190410T211822Z-001\SoftwarePrincipal_v1.01\SoftwarePrincipal_v1.01.ino: In function ‘void loop()’:

SoftwarePrincipal_v1.01:76:13: error: ‘ProcesMPU’ was not declared in this scope

SoftwarePrincipal_v1.01:77:29: error: ‘PID_ang’ was not declared in this scope

SoftwarePrincipal_v1.01:78:9: error: ‘PID_w’ was not declared in this scope

SoftwarePrincipal_v1.01:79:13: error: ‘Modulador’ was not declared in this scope

SoftwarePrincipal_v1.01:85:7: error: ‘PWM’ was not declared in this scope

SoftwarePrincipal_v1.01:90:12: error: ‘MPU_6050’ was not declared in this scope

SoftwarePrincipal_v1.01:92:48: error: ‘Visualizaciones’ was not declared in this scope

Se encontraron varias bibliotecas para «LiquidCrystal_I2C.h»
Usado: C:\Users\l***\Documents\Arduino\libraries\LiquidCrystal_I2C-master
No usado: C:\Users\l**c\Documents\Arduino\libraries\fmalpartida-new-liquidcrystal-2d860f818971
No usado: C:\Users\l**c\Documents\Arduino\libraries\LiquidCrystal
exit status 1
‘init_General’ was not declared in this scope

arduproject
Admin

Hola Jose,

Tienes que copiarte la carpeta entera DroneNano_v7 en tu PC, abrir cualquiera de los .ino que hay dentro, y darle a cargar. Se subirán todos a la vez. Para compilarlo lo mismo.
Me parece que has generado una carpeta nueva y has metido el archivo principal no??
El archivo LiquidCrystal_I2C.h es una librería, descargatela de google:
https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library

Un saludo!!

Daniel
Guest
Daniel

Muy buenas! Estoy tratando de compilar la solución para subirla a mi Arduino Nano. Como otro compañero ha dicho previamente, he tenido problemas al compilar por primera vez porque no encontraba la libería LiquidCrystal_I2C.h. He descargado la librería del enlace a github que has puesto y lo ha reconocido bien, pero ahora al compilar me da un error en el archivo init_comun diciendo lo siguiente:

Arduino:1.8.9 (Windows 10), Tarjeta:»Arduino Nano, ATmega328P»

Init_comun:4:7: error: ‘class LiquidCrystal_I2C’ has no member named ‘init’

lcd.init();

^

exit status 1
‘class LiquidCrystal_I2C’ has no member named ‘init’

Me he fijado en la librería y en el código no se ve declarada ninguna función llamada init(). ¿Cómo podría solucionar este error?

Mil gracias.

arduproject
Admin

Buenas, que raro. Te he subido la librería que yo utilizo:
https://drive.google.com/drive/folders/1-OOmyK0BshskXw__zBbbLwD8kA_25rQA?usp=sharing

Prueba con esta si te da el mismo problema y me dices.

Suerte

JESUS MOSQUERA
Guest

me podrías ayudar con este error por favor
Opciones de compilación cambiadas, reconstruyendo todo
SoftwarePrincipal_v1.01:21:29: error: EnableInterrupt.h: No such file or directory

compilation terminated.

exit status 1
EnableInterrupt.h: No such file or directory

arduproject
Admin

Buenas Jesus, tiene que decargate la librería EnableInterrupt.h como vimos en la entrada dedicada al mando RC.
Un saludo!

Jaime Saucedo
Guest
Jaime Saucedo

Hola buenas noches tengo duda de como modificar el PID

arduproject
Admin

Buenas Jaime. Parte de los valores que vienen por defecto, y vete modificandolos hasta conseguir un vuelo estable. Hay que hacerlo a prueba y error. Modificalos muy poco a poco. Hay 5 PID.

Por ejemplo, partes de esto con un PID, lo pruebas y ves que no va bien:
float Kp_pitch_w = 1.9, Ki_pitch_w = 0.07, Kd_pitch_w = 12;

Modificas a esto y vuelves a probar:
float Kp_pitch_w = 1.9, Ki_pitch_w = 0.09, Kd_pitch_w = 12;

Así hasta conseguir un vuelo estable.

Puede llevar su tiempo, pero no te desesperes.

Muchas suerte!!! 😉

David 24
Guest
David 24

Hola buenos dias , he montado este drone i tengo un par de problemas; el primero es que el YAW no hace nada , el problema es que si lo detecta el mando , pero es solo a la hora de volar que no funciona. El otro problema es que al acelerar el drone tiembla muchisimo , he probado cambiando el Lowpassfilter de la IMU pero solo he conseguido que los temblores sean mas «pequeños». Por lo demas perfecto y muchisimas gracias por compartirlo!!

arduproject
Admin

Buenas David, a que te refieres con que el yaw no hace nada??? el drone gira sobre ese eje sin que toques nada?? especifica un poco mas tu problema please 🙂
Lo de las vibraciones, has calibrado las hélices como puse en esta entrada?

Un saludo!!

David 24
Guest
David 24

Hola ,con lo del Yaw me vengo a referir que al volar el drone i mover el stick que corresponde al movimiento el drone no gira , el problema es que al mover el stick todos otros pasos me lo detecta correctamente , me he fijado en el programa la parte de PID–> angle falta la parte del Yaw pero no se si tiene mucho que ver. Gracias por tu ayuda!

arduproject
Admin

Buenas David!!!

En el angulo Yaw no controlamos el ángulo en si, solo la velocidad de giro. Lo que queremos es que no gire sobre su eje yaw descontroladamente… pero deberías de ser capaz de girarlo accionando el mando… algo se nos escapa…
El drone despega y se mantiene estable?? los demas caneles funcionan??

Un saludo! 🙂

Misael
Guest
Misael

Hola disculpa el programa principal al compilarlo me marca un error en init_General

arduproject
Admin

Como has abierto los archivos??
Tienes que ir a la carpeta donde están todos los .ino y abrir cualquier de ellos, te deberían salir todos en pestañas… y compilar.
Que error te da?? seguramente te falte alguna librería.
Un saludo!

Misael
Guest
Misael

Saludos así los abrí,y ya descargue las librerías necesarias pero el error que sale es:
«init_General» was not declared in this scope

Misael
Guest
Misael

Saludos así los abrí,y ya descargue las librerías necesarias pero el error que sale es:
«init_General» was not declared in this scope

arduproject
Admin

Buenas… me parece raro, no se lo que estará pasando. Acabo de descargarme los archivos y los he compilado sin problema…

Misael
Guest
Misael

Gracias amigo ya encontré el problema, pero otra pregunta Como conecto la LCD , esque, la que compre no tiene los pines SDA Y SCL

arduproject
Admin

Buenas Misael, que LCD has comprado?? puede el adaptador I2C hay que comprarlo a parte en algunos modelos. Busca en google ‘adaptador I2C LCD arduino’.