Motores, ESC y su programación en Arduino (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.

Motores brushless y ESC para drones

Los motores brushless o motores sin escobillas son motores trifásicos de corriente alterna (AC). Son los motores mas utilizados para volar drones. Al ser un motor trifásico tenemos que alimentar las tres fases con tensión alterna de 50Hz, por eso tenemos tres cables de colores para alimentar los motores (trifásico ⇒ tres fases ⇒ tres cables).  Idealmente, la tensión debería ser perfectamente sinusoidal, pero en la práctica es imposible generar 50Hz ‘limpios’ y sin ruido (armónicos). Una frecuencia de 50Hz equivale a un periodo de 20ms.

Comprar motor y ESC en Amazon AHORA

El motor girará a una velocidad proporcional a la tensión aplicada. Si tenemos motores 1000KV, estos giraran a 1000rpm (revoluciones por minuto) por cada voltio de alimentación aplicado. Con una batería 3S de 11.1V el motor podría llegar a girar a 11000rpm. ¿Cómo conseguimos convertir los 11.1V (DC) de nuestra batería en tensión alterna (AC) trifásica controlable? Como ya habréis imaginado, utilizando ESCs. ESC o Electronic Speed Controller, es un circuito electrónico que convierte la tensión DC de entrada (batería) en tensión AC regulable en función de la señal PWM de control que apliquemos.

La señal PWM para gobernar los motores deberá ser de frecuencia constante y de ancho de pulso variable en función de la velocidad de giro que queramos obtener. En la mayoría de ESC, aplicando un pulso de 1ms el motor permanece parado, con un pulso de 1.5ms el motor girará a mitad de velocidad y ante un pulso de 2ms girará a máxima velocidad. La frecuencia que utilizaremos para gobernar los motores será de 166Hz o 6ms, mas adelante veremos el por qué. Os dejo unas imágenes obtenidas con osciloscopio de una de las salidas PWM de control:

PMW control motor brushless. Arduino drone

¿Cómo generamos esta salidas PWM? Arduino ya cuenta con una función para generar pulsos, la función WriteMicroseconds() que viene con la librería servo.h. Simplemente hay que indicar entre paréntesis el tiempo de pulso en microsegundos que queremos en la señal PWM. La desventaja de esta función es que genera pulsos a una frecuencia de 50Hz (20ms), lo que resulta demasiado lento para controlar el drone, por lo que no sirve para esta aplicación. Como ya veremos más adelante en una entrada dedicada a los controladores PID y la estrategia de control, para mantener el drone estable en el aire hay que ejecutar los PID cada 5ms (200Hz) o 12ms (85Hz) aproximadamente. Por tanto, no serviría de nada ejecutar el control cada 6ms para luego enviar la información a los motores cada 20ms. Necesitamos generar los pulsos PWM a la misma frecuencia que ejecutamos el control de estabilidad, de otra manera los ESC recibirán la información suficiente para mantener el drone en el aire. Pero tranquilos si esto os ha sonado a chino, toda la información relativa a generar las salidas PWM para los motores y su correspondiente estrategia de control lo veremos más adelante.

Montaje y conexionado entre motor y ESC

El conexionado entre Batería-ESC-Motor es muy sencillo, basta con cablear los tres cables de la salida de cada ESC a cada motor por un lado (el orden es indiferente) y los dos cables de control por el otro (el cable rojo lo dejaremos sin conectar):

Comprar motor y ESC en Amazon AHORA

La conexión entre ESC y motor debe ser una conexión robusta y sin malos contactos para no dañar los componentes, para lo que recomiendo utilizar conectores adecuados (no estañar los cables). Fue un quebradero de cabeza para mi ver cómo tanto los motores como los ESC dejaban de funcionar sin razón aparente, hasta que tras leer mucho foros especializados llegue a la conclusión que mis conexiones (estañaduras) no eras las más adecuadas. Tras haber cambiado a esos conectores no he vuelto a tener problemas. Son muy fáciles de conseguir, simplemente buscadlos como ‘conectores tipo bala’ o ‘conectores tipo bala doble’ (tened en cuenta que hace falta una herramienta especial para apretar estos terminales):

Conector tipo bala. Arduino drone.

Comprar conectores tipo bala en Amazon AHORA

Conexión motor con ESC. Arduino drone.

En cuanto a las señales de control, he utilizado ‘terminales de tornillo’ para conectar las salidas PWM de la placa Arduino con cada ESC. Son conectores robustos y que permiten fácilmente soltar los cables en caso de que queramos desmontar el drone:

Conector atornillado. Arduino drone.

Comprar conectores a tornillos en Amazon AHORA

Conexionado drone arduino Conexionado drone arduino Conexionado drone arduino

Un aspecto importante a la hora de situar los motores es la numeración y disposición en el frame de los mismos. Como hemos vito en la entrada dedicada a al sensor MPU6050, orientaremos el sensor de forma que la ‘flecha Y‘ quede alineada con lo que consideremos parte delantera de nuestro drone. De esta forma, la numeración de los motores quedaría como en la siguiente imagen, siendo el motor delantero derecho siempre el motor número 1. Es imprescindible numerar los motores de esta forma:

Numeración de los motores. Drone Arduino

Otro de los aspectos importantes a la hora de construir nuestro drone es la dirección de giro de los motores. Es muy importante que los motores enfrentados giren en el mismo sentido. A continuación os dejo una imagen con el sentido de giro de cada motor que tenéis que utilizar. Ajustaremos el sentido de giro de cada motor una vez que los hayamos puesto en marcha y seamos capaces de hacerlos girar de forma controlada:

Sentido de giro de los motores. Drone Arduino.

Para variar el sentido de giro basta con intercambiar dos de los cables de alimentación del motor:

Código Arduino para control de motores Brushless con ESC

Para generar las salidas PWM de control vamos a utilizar el código que os he dejado mas abajo. Simplemente leeremos el canal throttle del mando RC y haremos girar los motores moviendo el correspondiente stick del mando (importante haber leído la entrada dedicada a la lectura del mando RC). Al principio puede que resulte un tanto complicado de entender, pero en cuento lo tengáis, comprenderéis que es una solución muy simple.

Analicemos el código parte por parte. Lo primero que hacemos al comienzo de cada nuevo ciclo de 6ms es leer el canal de throttle del mando y escalar las lecturas de forma que al mover el stick al máximo leamos 2ms y al pasarlo al mínimo 1ms. Aquí se podría utilizar la función map() de Arduino sin problemas. El siguiente paso es poner las 4 salidas PWM de los 4 motores en estado HIGH, de esta forma comenzaremos cada ciclo de control con los cuatro PWM en estado HIGH, sincronizando el control de estabilidad con la generación de las señales PWM:

Si habéis leído la entrada del mando RC y receptor, veréis como el canal throttle de mi mando está invertido, es decir, con el stick al mínimo leemos 2000us de pulso, y con el stick al máximo 1000us. Es necesario invertir esta salida. Se podría hacer o bien con la función map() de Arduino, o bien, como es mi caso, complicándome la vida y programando las ecuaciones por mi cuenta. Para ello he utilizado la siguiente ecuación, que no es más que la ecuación de una recta que pasa por dos puntos:

Si tenéis el mando invertido como yo, tenéis que dejar los parámetros tal como están:

Si por el contrario vuestro mando no está invertido, debéis invertir la configuración de esta forma. Tan simple como esto:

Mas adelante, cuando uséis el software completo y sea necesario configurar los demás canales (Pitch, Roll y Yaw), usaremos el mismo procedimiento. De todas formas, las implicaciones de no corregir estos tres canales no son graves, simplemente cuando Ordenemos al drone que avance, irá para atrás. Pero ya sabéis que hablar de ‘adelante’ o ‘atrás’ en el aire es bastante relativo y que depende de nosotros.

Una vez que las cuatro señales PWM están en estado HIGH, sabemos que tenemos un margen de tiempo de 1ms (que es el ancho de pulso mínimo para las señales PWM) donde Arduino no va a hacer nada, solo esperar. Mas adelante veremos como aprovechar ese mili-segundo para realizar tareas cortas como leer el mando RC o gestionar los leds. 

Después, y aquí viene el truco, sumamos el tiempo de throttle (entre 1ms y 2ms) con el tiempo total transcurrido desde el inicio del programa (loop_timer). Por ejemplo, si queremos que el motor gire a velocidad media, moveremos el stick hacia arriba hasta la mitad del recorrido, leyendo tras el escalado 1.5ms y sumamos este tiempo con el tiempo total transcurrido desde que hemos iniciado el software (loop_timer), pongamos 1 segundo:

accion_m1 = 1.5ms + 1000ms = 1001.5ms

Finalmente, utilizando el siguiente bucle while, pasamos a estado LOW  las cuatro señales PWM, cada una cuando corresponda. Cuando la variable esc_loop_timer (el tiempo real transcurrido) sea igual a las variables accion_m1, accion_m2, accion_m3 o accion_m4, significará que el pulso ha estado en estado HIGH exactamente 1.5ms, por lo que es hora de pasarlo a estado LOW.  Arduino no saldrá de este bucle while hasta que las cuatro señales PWM estén en estado LOW:

De esta forma conseguimos señales PWM de la misma frecuencia del ciclo que hayamos escogido. Os dejo un pequeño esquema que os ayudará a entender el funcionamiento de esta parte del código:

Control motores brushless. Arduino drone.

Una vez entendido como generar las señales PWM, vamos a proceder a conectar y hacer girar los motores por primera vez. Cuando conectamos los motores por primera vez hay que seguir un procedimiento para configurar los ESC. El esquema mínimo necesario se muestra a continuación, aunque también podemos montar el esquema completo mostrado en la entrada ‘Software completo y esquema detallado‘:

Montaje necesario para mover los motores brushless. Drone Arduino.

 MUY IMPORTANTE: hasta que no tengamos claro el funcionamiento del software y hayamos comprobado que funciona todo bien, NO PONEMOS LAS HÉLICES. Las pondremos mas adelante. Estas pruebas las haremos SIN HÉLICES

Es necesario configurar los ESC cuando vayamos a utilizarlos por primera vez, para lo que utilizaremos el código de abajo. Si no dispones de un interruptor puede hacer la conexión entre la batería y los ESC manualmente, aunque para el montaje final si que es recomendable disponer de uno. Os dejo también un vídeo para para que sigáis los pasos de forma mas sencilla:

  1. Sin conectar la batería, alimentamos la placa Arduino con USB y cargamos este programa.
  2. Ejecutamos el programa sin conectar la batería.
  3. Cuando el led 13 se encienda, encendemos el mando y subimos el throttle al máximo.
  4. Cuando el led 13 se apague conectamos la batería.
  5. El motor emitirá unos pitidos (pi,pi), bajamos el throttle al mínimo.
  6. Escucharemos otros pitidos, pipipi… piiii.
  7. Terminado, ya podemos apagar todo.

** Este proceso puede ser diferente en función del ESC que hayamos comprado

Esta secuencia hay que hacerla solo la primera vez que conectamos los ESC para poder configurarlos. Una vez que hemos configurado los ESC vamos a ver cómo podemos hacerlos girar en función de las órdenes recibidas del mando RC:

  1. Cargad el programa y desconectad el cable USB.
  2. Conectad la batería y cerrad el interruptor para alimentar la placa Arduino y los motores. Bajamos el throttle al mínimo y ejecutamos el programa.
  3. Cuando el led 13 se encienda, encendemos el mando.
  4. Los motores emitirán unos pitidos pipipi… piiiii.
  5. Listo, podemos empezar a girar los motores con el mando.

También podéis descargar el código en el siguiente enlace, archivos ‘CalibrarMotores‘ y ‘GirarMotores‘.

Ir al archivo 

Antes de continuar comprobad que sois capaces de gobernar los motores y que estos giran de forma controlada. Con el stick en su posición inferior los motores no se mueven, y al mover el stick los motores giran en proporción.

Os dejo un vídeo resumen para que veáis mas claro el proceso de puesta en marcha de los motores:


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
08

22
Comentar

avatar
10 Comment threads
12 Thread replies
1 Followers
 
Most reacted comment
Hottest comment thread
7 Comment authors
arduprojectLautaroAlejandroGonzaloDaniel Recent comment authors
  Subscribe  
newest oldest most voted
Notify of
paco
Guest
paco

Hola, buenas tardes y enhorabuena por el trabajo. Estoy intentando hacerme un dron siguiendo su proyecto. Me he quedado parado en este capítulo. He conseguido calibrar los motores y ESC, los pitidos son los correctos. El problema viene cuando intento girar los motores. No giran, se ponen a pitar, intentar moverse, pero no lo consiguen, no llegan a girar. He de decir que todavía no me ha llegado la batería, y estoy alimentando el drone de momento con una fuente de alimentación de pc a 12v. No se si esto tendrá algo que ver en que los motores no giran. Agradecería su ayuda. Un saludo.

ArduProject
Guest

Hola Paco,

Lo de la batería no debería ser un problema, las primeras pruebas también las hice con una fuente de alimentación de PC.
Una vez calibrados los motores y los ESC, puede hacer girar los motores con ese sketch? Es decir haces el proceso de calibración, y sin apagar nada y con el mismo sketch subes el stick de throttle… sucede algo?

paco
Guest
paco

Hola. He de decir que todos los pasos anteriores han salido perfectamente. Cuando acaba el proceso de calibración de los ESC, al levantar la palanca deberían de acelerarse los motores, pero no lo hace. Si la dejo abajo no hace nada. Si subo la palanca empiezan a pitar los motores de una forma rara, haciendo intentos de girar pero no consiguiéndolo. Si ayudo a girar a los motores giran durante unos segundos, pero al final se paran. Después de hacer esto varias veces la fuente de alimentación se ha jodido, pero igual se ha roto porque estaba en mal estado. No tengo ni idea del motivo por el cual los motores no giran.

ArduProject
Guest

Puede que sea que la fuente no puede dar esa corriente. De cuantos watios es la fuente que usas? Mis motores consumen 0.5Amp cada uno al 20% de throttle y al máximo 0.8Amp cada uno.
Necesitarías una fuente de unos 48W (a 12V de salida).
Sube el throttle y cuando los motores empiecen a pitar y a vibrar mide la tensión de salida de la fuente… si la tensión cae es que estas pidiendo demasiada corriente.

paco
Guest
paco

He cambiado de fuente de alimentación y he cogido la fuente de alimentación de la impresora 3d, una fuente con una salida de 12V y 30A. El resultado es el mismo, no creo que sea por falta de potencia. He de indicarte que para hacer el proyecto he empleado una PDB para distribuir la corriente (la que indicas en el listado de componentes), aunque creo que no sea este el motivo de que no funcionen los motores. Las tensiones de salida todas son correctas.

ArduProject
Guest

Sin tenerlo delante es difícil saber que pasa realmente. Has configurado el mando correctamente?
Si quieres graba un pequeño vídeo de que hacen los motores y mándamelo por email o compártemelo en google drive y veo que pasa exactamente.

dronedesdecero@gmail.com

Un saludo

Daniel
Guest
Daniel

Muy buenas, estoy siguiendo el tutorial de montaje del drone y tengo un duda en cuanto a los ESC. En la sección «Montaje y conexionado entre motor y ESC» indicas que de los cables de control, el rojo se queda sin conectar. Me ha llegado tal y como está en la foto, con los tres cables y su conector. Igual la respuesta es un poco obvia, pero entiendo que has cortado la parte del conector para dejar los tres cables de control independientes y has dejado sin utilizar el rojo, ¿me equivoco? No quisiera cortar el conector antes de asegurarme de esto.

Muchas gracias.

arduproject
Admin

Buenas Daniel, eso es, he tenido que cortar en conector. Si no quieres cortarlo, puede utilizarlo pero no conectes ese pin a nada.

Daniel
Guest
Daniel

Perfecto! No lo conectaré entonces. Aunque por curiosidad te pregunto, qué implica conectar o no conectar este cable? Muchas gracias!

arduproject
Admin

Buenas Daniel.
El cable rojo son 5V que genera el ESC a partir de los 11V de la batería. Se podría utilizar para alimentar la placa Arduino, pero nosotros lo hacemos directamente a la entrada Vin de la placa. Si alimentáramos la placa de ambas formas a la vez, podríamos hacer un corto. Por eso lo dejaremos sin conectar.
Un saludo

Daniel
Guest
Daniel

Igual estoy diciendo una tontería ahora pero, imagina que con la batería alimento dos placas, con el correspondiente gasto de batería que eso lleva. Si en lugar de alimentar las dos placas del drone con la batería, alimento una placa con la batería y para la otra placa reutilizo el cable rojo del ESC, se podría decir que estoy optimizando la duración del tiempo de vuelo del drone, o se seguiría consumiendo la misma cantidad de batería? Lo digo porque igual esa tensión que sale por ese cable se puede reutilizar para algo y se puede reducir un poco el consumo de batería, ya que la batería de manera directa evita alimentar dos placas a la vez con sus respectivos componentes…

Disculpa si estoy rizando mucho el rizo jeje.. es que estoy pensando en los componentes que le quiero incluir después de que lo consiga volar e igual este dato pueda ser relevante..

Mil gracias!

arduproject
Admin

A que te refieres con alimentar dos placas??
Estarías consumiendo la misma energía de la batería, ya que es la única fuente de energía del drone. La tensión que ‘sale’ de ese no consume energía, siempre que no extraigas corriente y si está al aire no se extrae nada.
Un cable puede tener tensión, y no haber consumo.

Un saludo

Gonzalo
Guest
Gonzalo

Hola,
Tienes fotos de cómo has distribuido la instalación entre los pisos que has hecho entre las placas? Leí que el montaje es libre a la imaginación pero me tiene algo perdido…
Muchas gracias!

Alejandro
Guest
Alejandro

Hola, yo tampoco consigo que se muevan los motores, cuando utilizo pulsos de entre 1 y 2 ms con un periodo de 6 ms. En cambio utilizo pulsos de entre 1 y 2ms con un periodo de 20 ms si me funcionan los motores. Este ultimo caso en el normal para gobernar los motores con un receptor de modelismo. ¿Has reconfigurado de alguna manera los ESC’s para poder funcionar con un periodo de 6 ms?

Lautaro
Guest
Lautaro

Hola…buenos dias….muy buen trabajo….yo estoy en la escuela tecnica y me gustaria mucha hacer unos de estos drones…queria saber si me podrias pasar un valor de todo lo que lleva el dron…mas o menos lo que gastastes para lograrlo

Lautaro
Guest
Lautaro

Hola…buenos dias…muy buen trabajo…soy de la escuela tecnica y me gustaria mucho hacer uno de estos para proyecto de fin de año..sigiendo todos los pasos que dijistes…nada mas queria saber el precio estimado que vos gastastes para poder armarlo….osea de cuanta plata estamos hblando para hacer uno de estos

arduproject
Admin

Buenas Laurato!! Pues en función de donde seas y donde compres el material… calcula entre 100€-150€.
Un saludo 😉

Lautaro
Guest
Lautaro

Hola arduprojet…genial soy de mar del plata es mas caro de lo que pense…y ya que estas metido en el tema…sabes si lo puedo hacer por la mitad del costo!!!!…es solo para saber

Lautaro
Guest
Lautaro

Y si me podrias pasar la lista de materiales de todo lo que lleva por que donde dice material necesario no tiene todo como seria eso????…por que no entiendo…si me podrias decir la verdad te agradeceria mucho

arduproject
Admin

Buenas Lautao… la lista de materiales con todo lo que lleva está en la entrada que dices… que dificultad tienes?? como montar los componentes en el frame?

Lautaro
Guest
Lautaro

Claro…se me dificulta el pensar de como montar los componentes en el frame

arduproject
Admin

Intentaré subir las imágenes los próximos días… la verdad que no tengo nada preparado sobre el tema del montaje.