10 julio, 2018
Software completo listo para volar
Índice:
- Conceptos generales sobre drones
- Material necesario y montaje de los componentes hardware
- Mando RC y receptor. Programación en Arduino
- MPU6050 y su programación en Arduino
- Batería LiPo
- Control de estabilidad y PID
- Motores, ESC y su programación en Arduino
- Calibración de hélices y motores
- → Software completo y esquema detallado
- Probando el Software completo antes de volar
- Como leer variables de Arduino en Matlab
En esta entrada vamos a cargar 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.
Podéis descargar el software completo en el siguiente enlace de GitHub:
No olvidéis validar que todo funciona correctamente antes de comenzar con las pruebas de vuelo. En la siguiente entrada os dejo una serie de pruebas mínimas que todos deberíais pasar para garantizar el correcto funcionamiento de nuestro drone.
Continuar con la siguiente entrada:
- Conceptos generales sobre drones
- Material necesario y montaje de los componentes hardware
- Mando RC y receptor. Programación en Arduino
- MPU6050 y su programación en Arduino
- Batería LiPo
- Control de estabilidad y PID
- Motores, ESC y su programación en Arduino
- Calibración de hélices y motores
- Software completo y esquema detallado
- → Probando el software completo antes de volar
- Como leer variables de Arduino en Matlab
78 Comentarios
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?
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!!
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
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 😉
Mil gracias por tu gran trabajo… conseguí montarlo y hacerlo funcionar
Me alegra saberlo!! a darle caña 🙂
Muy buenas! Gran aporte! Voy a probar a realizarlo a ver si consigo hacerlo volar!
Animo!!! 😉
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?
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!!
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.
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 😉
Buenas tardes, has probado ha ponerle una camara para hacer fpv ? seria muy interesante
Se la voy ha poner en breves…
Un saludo!
Hola,
Entonces deberia de adjuntar todos los archivos en uno y cargarlo verdad?
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
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
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!!
En dónde se encuentra esa carpeta?
Cuando le pongo Ir a Archivo, solo aparecen archivos.ino, pero ninguna carpeta.
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.
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
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
Buenas Jesus, tiene que decargate la librería EnableInterrupt.h como vimos en la entrada dedicada al mando RC.
Un saludo!
Hola buenas noches tengo duda de como modificar el PID
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!!! 😉
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!!
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!!
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!
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! 🙂
Hola disculpa el programa principal al compilarlo me marca un error en init_General
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!
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
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
Buenas… me parece raro, no se lo que estará pasando. Acabo de descargarme los archivos y los he compilado sin problema…
Gracias amigo ya encontré el problema, pero otra pregunta Como conecto la LCD , esque, la que compre no tiene los pines SDA Y SCL
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’.
Hola amigo, tengo un problema, al encender el drone se queda estancado en la parte de «Encender Mando» aun cuando lo enciendo sigue ahí y seguí todos los pasos y revisé las conexiones, no se que podría ser
Buenas Jorge, si vas a Mando_RC –> Calib_MandoRC(), verás que ‘while (pulsoPotencia > 2500 || pulsoPotencia < 500) {'. Hasta que el mando no esté de ese rango, no avanza al siguiente comando. Visualiza la variable 'pulsoPotencia' dentro del while, y verás como no estás dentro del rango. Tendrás que modificar esos parámetros. Un saludo
Muchas gracias, ya logré corregirlo
Hola amigo, saludos cordiales.
En dónde se encuentra la carpeta DroneNano_v7 ?
Cuando le pongo Ir a Archivo, solo aparecen archivos.ino, pero ninguna carpeta.
Hola buenas, me gustaría saber que librerias de Arduino usaste para todos los programas y que version de Arduino
Buenas Alexis,
Acabo de añadir las librerías que he usado para descargar, espero que te sirva 😉
Te refieres a que versión de IDE??
Un saludo
como subo el código???
Buenas Jose,
Simplemente conecta la placa Arduino a tu PC, abre cualquiera de los archivos de la carpeta y pulsa el botón de Subir’.
Un saludo
Hola
En dónde se encuentra la carpeta DroneNano_v7 ?
Cuando le pongo Ir a Archivo, solo aparecen archivos.ino, pero ninguna carpeta.
Gracias
Buenas Alberto,
La carpeta se abre al pinchar en el enlace, y los archivos que hay que cargar son los .ino.
Abre cualquiera de ello, y dale a ‘Subir’
Un saludo
estimado cuales son los pines scl y sda en el LCD?
gracias muy buen blog
Si el LCD es compatible con comunicación I2C, lo pondrá claramente en los pines. Un saludo!
Buenos días , en primer lugar felicitarte por todas las horas , esfuerzo y trabajo que te ha llevado el subir de forma altruista todos los pasos necesarios para que pueda trastear en este mundillo y construir un dron .
Gracias
Mil gracias!! se agradecen estos comentarios.
Buenas primero darte las gracias por este gran proyecto que has realizado y has compartido de forma altruista. Soy novato en este mundo pero me parece súper interesante y llevaba mucho tiempo queriendo empezar y en un futuro proximo intentare realizar este proyecto. 👌🏻
Suerte y mucho ánimo! 🙂
Buenos días, como descargo la carpeta dronearduino_v1 degithub hay que estar registrado.
Gracias
Buenas tardes,
todo parecía funcionar correctamente con los pequeños programas .ino separados del blog. Pero al cargar el software principal encuentro un problema. Cuando subo la palanca del throttle, cada motor empieza en un momento distinto. He calibrado cada motor por separado y además he aumentado el valor de la variable tMinPotencia hasta el punto en que cuando la palanca está bajada, ningun motor se enciende ni hace nada raro. Pero ahora, cuando la palanca está digamos al 50% todos los motores no están a la misma velocidad. Esto hace que el drone empiece a volar más de un lado que de otro y se da la vuelta haciendo imposible un vuelo normal.
He pensado que el problema puede estar en que a pesar de que haya disminuido el problema de la calibración, este aun siga ahí y cause que cada motor empieze a un momento distinto aunque sea imperceptible para la vista humana. Pero no creo que este sea el motivo, básicamente el problema es que algunos motores tienen más fuerza que otros siendo el mismo modelo y recibiendo todos el mismo valor del Throttle.
¿Alguna idea de cual puede ser la solución o si os ha pasado?
Muchas gracias.
Hola, venia todo muy bien hasta que cargo el programa principal……solo muestra en el display «Encender mando » y no sale de ahi…pero con las pruebas de los motores me fue bien….el firmware principal es un rejunte de los otros o quizas usaste valores diferentes? tengo que cambiar los valores de modo acrobatico y modo estable?
gracias
HOLA AMIGO ANTES DE TODO QUIERO DARTE LAS GRACIAS POR TODA ESTA INFORMACIÓN QUE NOS COMPARTES. MUCHAS FELICIDADES POR TU BLOG, ETÁ GENIAL. POR OTRO LADO QUISIERA SABER POR QUÉ UTILIZAS LA SALIDA DIGITAL 4 PARA EL ESC 2 .
DE ACUERDO A LAS ESPECIFICACIONES DEL ARDUINO NANO LA SALIDA DIGITAL 4 NO CUENTA CON PWM.
Muy buenas, gracias!! 😉
No importa, no usamos la función de PWM ya que generamos la señal PWM nosotros mismo a la frecuencia que queramos. Viene todo en la entrada ‘Control de estabilidad y PID’.
Un salduo
OK YA VEO. MUCHÍSIMAS GRACIAS. UN SALUDO Y UN ABRASO
hola no veo el archivo del codigo completo pudieras agregarlo a la pagina muchas gracias
gracias por poner este proyecto a disposición de tod@s!
Creo que me voy a animar aunque no tenga experiencia en arduino, pero sí en programación de software.
He visto en Github que te estás pensando el hacer otra versión con control de altitud (supongo que basado en un sensor de ultrasonidos), ¿también basado en arduino nano? ¿o por el número de pines haría falta otra placa? (la pantalla LCD se lleva un montón de pines)
Muchas gracias,
Ahhh, me acabo de dar cuenta de que con el adaptador I2C solo usas 2 pines para el LCD en lugar de los 6 que usa mi LCD1602… tendré que buscarme el adaptador.
Buenas! si… necesitarás un adaptador a I2C…
Un saludo
HOLA QUE TAL SI ALGUN COMPAÑERO TIENE EL CODIGO COMPLETO SE LO AGRADECERIA YA QUE EN EL GITHUB ESTA LOS CODIGOS POR PARTES PERO NO ESTA EL CODIGO COMPLETO ..LES AGRADECERIA INFINITAMENTE YA QUE SOLO ME FALTA ESO PARA HACERLO FUNCIONAR ME LO PUEDEN ENVIAR A GMAIL:
pefacris@gmail.com
hola compañeros si alguien tiene el codigo completo les agredeceria me lo pasaran ya que en el GitHub no esta completo esta por partes y no entiendo como unirlo ..les agradeceria me lo enviaran al gmail: pefacris@hotmail.com le agradezco
Buenas Cristian,
No tienes que juntar los ficheros… descarga toda la carpeta y abre cualquiera de los ficheros. Se te abrirán todos los ficheros en diferentes pestañas. Pulsa el botón de cargar en cualquiera de ellos, y cargarás todo el conjunto.
Un saludo
muchas gracias ya cargue e hize todo ,, nose si falle en calibrar motores o que pasa pero a la hora de elevar el dron los motores arrancan dos primero acelero mas y luego aceleran los otrosdos, no se que puedo hacer para solucionarlo le agradecería..
el dron inmediatamente se voltea
Hola! en el programa principal al compilarlo me marca tambien error en init_General, como puedo solucionarlo?.
Buenas! ¿Qué error te sale? a mi me compila bien, ¿has instalado las librerías?
Hola, a la hora de compilar el programa me sale un error en el que dice que el programa es demasiado grande para la placa, ¿cómo podría hacer para solucionarlo? He usado los mismos componentes que mencionas en el blog y el mismo código
Hola! Muy bueno el proyecto. Yo estoy armando uno similar pero agregé sensores de proximidad, me hice un propio control remoto que se unen por medio de los Nrf24l01+ Pa Lna y un MPU9250 entre otros componentes adicionales y los motores los controlo con la librería Servo. El problema que me traen todos estos adicionales es que el ciclo de loop no me permite correr el PID con una periodicidad menor a 40ms y a esa frecuencia puede oscilar desde los 40 a los 60ms. Esta puede ser la causa de que no logre configurar los valores PID para que se mantenga estable? O Esta frecuencia de actualización es aceptable para lograr la estabilidad del drone y tengo que buscar el problema por otro lado? Te agradezco tu tiempo y cualquier tipo de tip que me puedas dar.
Buenas Alejandro,
El problema diría que está en usar la librería servo… las señales PWM que genera son de 50Hz, y es demasiado lento para controlar un drone. Tendrás que generar tus propias señales PWM, en la entrada ‘Control de estabilidad y PID’ tienes mas información de como hacerlo 😉
Muchas gracias por el dato y por tomarte el tiempo de leer mi comentario!!
Buenas tardes:
En primer lugar agradecerte todo el trabajo que te has tomado.
En principio diría que todo está correcto. Tengo todo montado y me he descargado todo el software. Lo he compilado y ningún problema. La cosa es que cuando lo enciendo no me hace nada de nada. ¿Qué puedo estar haciendo mal?
Buenas, pues puede ser cualquier cosa… tendrás que especificar lo que te sucede algo mejor.
Muy buen trabajo!
el esquema de conexionado de los elementos donde lo puedo encontrar
Hola, antes que nada muchas gracias por compartir tu proyecto. Te cuento que lo monte y es bastante estable en pitch y roll, pero tengo una rotación constante en sentido horario en yaw. Te ha pasado algo similar, sera que falta un poco más de tuning en los valores de PID?
Eso es! tendrás que ajustar algo esos PID, prueba a subir Kp.