Motores, ESC y su programación en Arduino
Í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
Motores brushless y ESC para drones
Los motores brushless o motores sin escobillas son motores trifásicos de corriente alterna (AC) y son los motores mas utilizados para volar drones.
El motor girará a una velocidad proporcional a la tensión aplicada en la entrada trifásica. 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 Electronic Speed Controllers (ESCs). Se trata de unos dispositivos que convierten la tensión DC de entrada (batería) en tensión AC regulable a la salida 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 1000μs el motor permanece parado, con un pulso de 1500μs el motor gira a mitad de velocidad y ante un pulso de 2000μs gira a máxima velocidad. La frecuencia que utilizaremos para gobernar los motores será de 166Hz o 6000μs, mas adelante veremos el por qué. Os dejo unas imágenes obtenidas con osciloscopio de una de las salidas PWM, donde se puede ver como la frecuencia se mantiene constante, y es el ancho de pulso el que varía:
¿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 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.
Montaje y conexionado entre motor y ESC
El conexionado entre batería-ESC-motor es muy sencillo, basta con cablear la salida trifásica de cada ESC a un motor (el orden de la conexión trifásica es indiferente) y los dos cables de control a la placa Arduino como se muestra en la siguiente figura (el cable rojo central lo dejaremos sin conectar):
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 los siguiente conectores tipo bala 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):
Comprar conectores tipo bala en Amazon
En cuanto a las señales de control, he utilizado ‘terminales atornillados’ para enviar las señales PWM desde la placa Arduino a cada ESC. Son conectores robustos y que permiten soltar los cables fácilmente en caso de que querer desmontar el drone. Utilizar terminales adecuados también en los cables:
Comprar conectores a tornillos en Amazon
Como hemos visto en la entrada dedicada 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 tiene que ser la siguiente, siendo el motor delantero derecho siempre el motor número 1. Es imprescindible numerar los motores de esta forma si queréis utilizar el software completo que os he dejado en la entrada número 9:
El hecho de numerar los motores va mas allá de simplemente colocarles una etiqueta, hay que conectar cada señal PWM para cada ESC a un pin determinado de la placa Arduino:
- Motor 1 de la figura superior ⇒ al pin 3 de la placa Arduino
- Motor 2 de la figura superior ⇒ al pin 4 de la placa Arduino
- Motor 3 de la figura superior ⇒ al pin 5 de la placa Arduino
- Motor 4 de la figura superior ⇒ al pin 6 de la placa 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 en diagonal giren en el mismo sentido. La siguiente figura muestra el sentido de giro de cada motor. Ajustaremos el sentido de giro de cada motor hasta que encaje con la figura una vez que hayamos puesto todo en marcha y seamos capaces de hacer girar de los motores de forma controlada:
Para variar el sentido de giro basta con intercambiar dos de loas fases de alimentación del motor:
Código Arduino para control de motores Brushless con ESC
Todo el software que utilizaremos a lo largo de esta entrada está subido a GitHub:
Para generar las salidas PWM de control vamos a utilizar el código que os he dejado en GitHub. Simplemente leeremos el canal Throttle del mando radio control y haremos girar los motores moviendo el correspondiente stick del mando (importante haber leído la entrada dedicada a la lectura del mando radio control ). 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 6000μs es leer el canal de Throttle del mando y escalar las lecturas para obtener 2000μs con el stick al máximo y 1000μs con el stick al mínimo como hemos visto en la entrada dedicada al mando radio control. Para ello utilizaremos la función map() de Arduino:
// Nuevo ciclo
while (micros() - loop_timer < usCiclo);
loop_timer = micros();
// Ecuaciones de procesamiento de la señal Throttle
RC_Throttle_consigna = map(RC_Throttle_raw, us_min_Throttle_raw, us_max_Throttle_raw, us_min_Throttle_adj, us_max_Throttle_adj);
En este caso, queremos que el ancho de pulso de las señales PWM sea fijado únicamente por la consigna Throttle del mando radio control, es decir, mover lo motores de forma proporcional al canal Throttle:
// La señal RC_Throttle_consigna define el tiempo que la señal PWM está en estado HIGH
ESC1_us = RC_Throttle_consigna;
ESC2_us = RC_Throttle_consigna;
ESC3_us = RC_Throttle_consigna;
ESC4_us = RC_Throttle_consigna;
El siguiente paso es poner las 4 salidas PWM de los 4 motores en estado HIGH y registrar ese instante en la variable tiempo_motores_start:
// Para generar las 4 señales PWM, el primer paso es poner estas señales a 1 (HIGH).
digitalWrite(pin_motor1, HIGH); // MOTOR 1
digitalWrite(pin_motor2, HIGH); // MOTOR 2
digitalWrite(pin_motor3, HIGH); // MOTOR 3
digitalWrite(pin_motor4, HIGH); // MOTOR 4
tiempo_motores_start = micros();
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 milisegundo para realizar tareas cortas como leer el mando radio control o gestionar los LEDs.
Finalmente, sumamos los tiempos ESC1_us, ESC2_us, ESC3_us y ESC4_us, que oscilarán entre 1000us y 2000us, con el instante en el que hemos puesto las señales en estado HIGH (tiempo_motores_start). De esta forma, obtenemos el instante en que hay que bajar las señales PWM a estado LOW para terminar el ciclo PWM.
Utilizando el siguiente bucle while, pasamos a estado LOW las cuatro señales PWM, cada una cuando corresponda. De esta forma conseguimos señales PWM de la misma frecuencia del ciclo que hayamos escogido:
// Cuando se cumpa el tiempo de PWM definido en ESCx_us, se pasa cada señal a 0 (LOW) para terminar el ciclo PWM.
while (digitalRead(pin_motor1) == HIGH || digitalRead(pin_motor2) == HIGH || digitalRead(pin_motor3) == HIGH || digitalRead(pin_motor4) == HIGH) {
if (tiempo_motores_start + ESC1_us <= micros()) digitalWrite(pin_motor1, LOW); // MOTOR 1
if (tiempo_motores_start + ESC2_us <= micros()) digitalWrite(pin_motor2, LOW); // MOTOR 2
if (tiempo_motores_start + ESC3_us <= micros()) digitalWrite(pin_motor3, LOW); // MOTOR 3
if (tiempo_motores_start + ESC4_us <= micros()) digitalWrite(pin_motor4, LOW); // MOTOR 4
}
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:
⊗ 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 disponemos de un interruptor se 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:
- Sin conectar la batería, alimentamos la placa Arduino con USB y cargamos este programa.
- Ejecutamos el programa sin conectar la batería.
- Cuando el led 13 se encienda, encendemos el mando y subimos el throttle al máximo.
- Cuando el led 13 se apague conectamos la batería.
- El motor emitirá unos pitidos (pi,pi), bajamos el throttle al mínimo.
- Escucharemos otros pitidos, pipipi… piiii.
- Terminado, ya podemos apagar todo.
** Este proceso puede ser diferente en función del ESC que hayamos comprado
#define usCiclo 6000 // Ciclo de ejecucion de software en microsegundos (PWM)
#define pin_motor1 3 // Pin motor 1
#define pin_motor2 4 // Pin motor 2
#define pin_motor3 5 // Pin motor 3
#define pin_motor4 6 // Pin motor 4
#define pin_Throttle 8 // Pin throttle del mando RC
#define pin_LED_rojo 13 // Pin LED rojo
#include <EnableInterrupt.h>
// PWM
float ESC1_us, ESC2_us, ESC3_us, ESC4_us, loop_timer;
long tiempo_motores_start;
// AJUSTE MANDO RC - THROTLLE
float RC_Throttle_consigna;
const int us_max_Throttle_adj = 2000;
const int us_min_Throttle_adj = 950;
const float us_max_Throttle_raw = 2004; // <-- Si teneis la entrada Throttle invertida sustituid este valor
const float us_min_Throttle_raw = 1116; // <-- por este y viceversa
// INTERRUPCIÓN MANDO RC --> THROTTLE
volatile long Throttle_HIGH_us;
volatile int RC_Throttle_raw;
void INT_Throttle() {
if (digitalRead(pin_Throttle) == HIGH) Throttle_HIGH_us = micros();
if (digitalRead(pin_Throttle) == LOW) RC_Throttle_raw = micros() - Throttle_HIGH_us;
}
void setup() {
// Decalaración de LEDs
pinMode(pin_LED_rojo, OUTPUT);
digitalWrite(pin_LED_rojo, HIGH);
// Serial.begin()
Serial.begin(115200);
// Interrupción para canal Thrtottle
pinMode(pin_Throttle, INPUT_PULLUP);
enableInterrupt(pin_Throttle, INT_Throttle, CHANGE);
// Decalaración de motores
pinMode(pin_motor1, OUTPUT); // Declarar motor 1
pinMode(pin_motor2, OUTPUT); // Declarar motor 2
pinMode(pin_motor3, OUTPUT); // Declarar motor 3
pinMode(pin_motor4, OUTPUT); // Declarar motor 4
digitalWrite(pin_motor1, LOW); // Motor 1 LOW por seguridad
digitalWrite(pin_motor2, LOW); // Motor 2 LOW por seguridad
digitalWrite(pin_motor3, LOW); // Motor 3 LOW por seguridad
digitalWrite(pin_motor4, LOW); // Motor 4 LOW por seguridad
Serial.print("Encender mando RC y subir throttle al maximo");
// Hasta no subir Throttle al maximo no salimos de este bucle while
while (RC_Throttle_consigna > 2100 || RC_Throttle_consigna < 1900) {
RC_Throttle_consigna = map(RC_Throttle_raw, us_min_Throttle_raw, us_max_Throttle_raw, us_min_Throttle_adj, us_max_Throttle_adj);
}
digitalWrite(pin_LED_rojo, LOW);
}
void loop() {
// Nuevo ciclo
while (micros() - loop_timer < usCiclo);
loop_timer = micros();
// Ecuaciones de procesamiento de la señal Throttle
RC_Throttle_consigna = map(RC_Throttle_raw, us_min_Throttle_raw, us_max_Throttle_raw, us_min_Throttle_adj, us_max_Throttle_adj);
// La señal RC_Throttle_consigna define el tiempo que la señal PWM está en estado HIGH
ESC1_us = RC_Throttle_consigna;
ESC2_us = RC_Throttle_consigna;
ESC3_us = RC_Throttle_consigna;
ESC4_us = RC_Throttle_consigna;
// Para generar las 4 señales PWM, el primer paso es poner estas señales a 1 (HIGH).
digitalWrite(pin_motor1, HIGH); // MOTOR 1
digitalWrite(pin_motor2, HIGH); // MOTOR 2
digitalWrite(pin_motor3, HIGH); // MOTOR 3
digitalWrite(pin_motor4, HIGH); // MOTOR 4
tiempo_motores_start = micros();
// Cuando se cumpa el tiempo de PWM definido en ESCx_us, se pasa cada señal a 0 (LOW) para terminar el ciclo PWM.
while (digitalRead(pin_motor1) == HIGH || digitalRead(pin_motor2) == HIGH || digitalRead(pin_motor3) == HIGH || digitalRead(pin_motor4) == HIGH) {
if (tiempo_motores_start + ESC1_us <= micros()) digitalWrite(pin_motor1, LOW); // MOTOR 1
if (tiempo_motores_start + ESC2_us <= micros()) digitalWrite(pin_motor2, LOW); // MOTOR 2
if (tiempo_motores_start + ESC3_us <= micros()) digitalWrite(pin_motor3, LOW); // MOTOR 3
if (tiempo_motores_start + ESC4_us <= micros()) digitalWrite(pin_motor4, LOW); // MOTOR 4
}
// Monitor serie
Serial.println(RC_Throttle_consigna);
}
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:
- Con el Throttle al mínimo conectar la batería y cerrar el interruptor principal para alimentar la placa Arduino y los motores.
- Cuando se encienda el LED 13, encendemos el mando radio control.
- Los motores emitirán una serie de pitidos pipipi… piiiii.
- Terminado, podemos empezar a girar los motores con el mando radio control.
#define usCiclo 6000 // Ciclo de ejecucion de software en microsegundos (PWM)
#define pin_motor1 3 // Pin motor 1
#define pin_motor2 4 // Pin motor 2
#define pin_motor3 5 // Pin motor 3
#define pin_motor4 6 // Pin motor 4
#define pin_Throttle 8 // Pin throttle del mando RC
#define pin_LED_rojo 13 // Pin LED rojo
#include <EnableInterrupt.h>
// PWM
float ESC1_us, ESC2_us, ESC3_us, ESC4_us, loop_timer;
long tiempo_motores_start;
// AJUSTE MANDO RC - THROTLLE
float RC_Throttle_consigna;
const int us_max_Throttle_adj = 2000;
const int us_min_Throttle_adj = 950;
const float us_max_Throttle_raw = 2004; // <-- Si teneis la entrada Throttle invertida sustituid este valor
const float us_min_Throttle_raw = 1116; // <-- por este y viceversa
// INTERRUPCIÓN MANDO RC --> THROTTLE
volatile long Throttle_HIGH_us;
volatile int RC_Throttle_raw;
void INT_Throttle() {
if (digitalRead(pin_Throttle) == HIGH) Throttle_HIGH_us = micros();
if (digitalRead(pin_Throttle) == LOW) RC_Throttle_raw = micros() - Throttle_HIGH_us;
}
void setup() {
// Decalaración de LEDs
pinMode(pin_LED_rojo, OUTPUT);
digitalWrite(pin_LED_rojo, HIGH);
// Serial.begin()
Serial.begin(115200);
// Interrupción para canal Thrtottle
pinMode(pin_Throttle, INPUT_PULLUP);
enableInterrupt(pin_Throttle, INT_Throttle, CHANGE);
// Decalaración de motores
pinMode(pin_motor1, OUTPUT); // Declarar motor 1
pinMode(pin_motor2, OUTPUT); // Declarar motor 2
pinMode(pin_motor3, OUTPUT); // Declarar motor 3
pinMode(pin_motor4, OUTPUT); // Declarar motor 4
digitalWrite(pin_motor1, LOW); // Motor 1 LOW por seguridad
digitalWrite(pin_motor2, LOW); // Motor 2 LOW por seguridad
digitalWrite(pin_motor3, LOW); // Motor 3 LOW por seguridad
digitalWrite(pin_motor4, LOW); // Motor 4 LOW por seguridad
Serial.print("Encender mando RC y bajar Throttle al mínimo");
// Hasta no bajar Throttle al mínimo no salimos de este bucle while
while (RC_Throttle_consigna > 1100 || RC_Throttle_consigna < 900) {
RC_Throttle_consigna = map(RC_Throttle_raw, us_min_Throttle_raw, us_max_Throttle_raw, us_min_Throttle_adj, us_max_Throttle_adj);
}
digitalWrite(pin_LED_rojo, LOW);
}
void loop() {
// Nuevo ciclo
while (micros() - loop_timer < usCiclo);
loop_timer = micros();
// Ecuaciones de procesamiento de la señal Throttle
RC_Throttle_consigna = map(RC_Throttle_raw, us_min_Throttle_raw, us_max_Throttle_raw, us_min_Throttle_adj, us_max_Throttle_adj);
// La señal RC_Throttle_consigna define el tiempo que la señal PWM está en estado HIGH
ESC1_us = RC_Throttle_consigna;
ESC2_us = RC_Throttle_consigna;
ESC3_us = RC_Throttle_consigna;
ESC4_us = RC_Throttle_consigna;
// Para generar las 4 señales PWM, el primer paso es poner estas señales a 1 (HIGH).
digitalWrite(pin_motor1, HIGH); // MOTOR 1
digitalWrite(pin_motor2, HIGH); // MOTOR 2
digitalWrite(pin_motor3, HIGH); // MOTOR 3
digitalWrite(pin_motor4, HIGH); // MOTOR 4
tiempo_motores_start = micros();
// Cuando se cumpa el tiempo de PWM definido en ESCx_us, se pasa cada señal a 0 (LOW) para terminar el ciclo PWM.
while (digitalRead(pin_motor1) == HIGH || digitalRead(pin_motor2) == HIGH || digitalRead(pin_motor3) == HIGH || digitalRead(pin_motor4) == HIGH) {
if (tiempo_motores_start + ESC1_us <= micros()) digitalWrite(pin_motor1, LOW); // MOTOR 1
if (tiempo_motores_start + ESC2_us <= micros()) digitalWrite(pin_motor2, LOW); // MOTOR 2
if (tiempo_motores_start + ESC3_us <= micros()) digitalWrite(pin_motor3, LOW); // MOTOR 3
if (tiempo_motores_start + ESC4_us <= micros()) digitalWrite(pin_motor4, LOW); // MOTOR 4
}
// Monitor serie
Serial.println(RC_Throttle_consigna);
}
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:
- 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
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.
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?
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.
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.
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.
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
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.
Buenas Daniel, eso es, he tenido que cortar en conector. Si no quieres cortarlo, puede utilizarlo pero no conectes ese pin a nada.
Perfecto! No lo conectaré entonces. Aunque por curiosidad te pregunto, qué implica conectar o no conectar este cable? Muchas gracias!
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
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!
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
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!
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?
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
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
Buenas Laurato!! Pues en función de donde seas y donde compres el material… calcula entre 100€-150€.
Un saludo 😉
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
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
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?
Claro…se me dificulta el pensar de como montar los componentes en el frame
Intentaré subir las imágenes los próximos días… la verdad que no tengo nada preparado sobre el tema del montaje.
Hola, muy buen trabajo.
Estoy siguiendo tu proyecto hasta casi tenerlo todo ok. Pero a la hora de intentar probar el vuelo vi que algo no marchaba del todo bien.
Uno de los motores vi que tardaba más que los demás en girar. Entonces probe a ver cual era el pulso mínimo que tenia que pasar a los motores para empezar a girar y vi que aunque todos los motores y ESC son iguales, a uno con tan solo un pulso de 1080 ya empezaba a girar y otros con algo mas y uno de ellos tenia que superar los 1200.
Sabes a qué puede ser debido?
Entiendo que si he hecho todo correcto aun teniendo esta diferencia el drone volará estable no?
Si aumento potencia y se empieza a elevar y uno de los motores va mas lento se inclinara hacia ese motor y el código enviara mas potencia a ese motor entiendo no?
Gracias.
Buenas Yeray,
Si eso es. Aun así, intenta solucionarlo antes de volar. Prueba a re-calibrar los motores. Tanta diferencia no es normal, y puede el el control no sea capaz de mentarlo estable.
🙂
He intentado re-calibrar los motores. pero me he dado cuenta que el código de calibrar motores y el de girar motores es el mismo. Que es lo que hace exactamente el código de calibrar motores?
Buenas Yeray,
Básicamente son iguales, la diferencia principal es que en para girar empezamos siempre con «Encender mando con throttle al mínimo» y para calibrar «Encender mando RC y subir throttle al máximo».
La diferencia es esa, para calibrar los motores, empezamos subiendo Throttle al máximo para registrar ese valor.
Recuerda hacerlo sin hélices.
😉
Hola buenas,
Como se conectaría la batería con la placa Arduino? Medianta la PDB? En que pines? Gracias!
Tengo el mismo problema que Paco, los motores nadamas pitan una vez y no se mueven para nada, tuvo solución su problema?
¿que motores tienes? cada motor funciona de una forma distinta…
¿podrías decirme los pasos que has seguido? ¿el mando lo tienes bien ajustado? ¿los motores están calibrados?
Un saludo!
He seguido pasó a paso el seguimiento del proyecto, sólo que entró en dos problemas. Al hacer el calibrado de los motores funcionan bien, menos el tercero, enciende unos pocos segundos después de los demás, el segundo es que al cambiar el programa de calibración al programa completo, no pasa nada, en calibración si se mueven los motores pero al estar en el otro programa no sucede nada ¿me podrías apoyar con estos dos casos?
Buenas.
A mi me ocurre algo similar. Con los programas de CalibrarMotores.ino todo bien. Suenan los pitidos necesarios y todos los motores obedecen las órdenes del mando (subir y bajar potencia). Al utilizar el programa GirarMotores.ino también funciona todo estupendamente, los motores se mueven aunque algunos empiezan ligeramente antes que otros. Sin embargo, al pasar al programa completo, solamente se mueve uno de los motores (en concreto el 2). He comprobado tanto las señales ESC del programa como los voltaje de las señales PWM que manda la placa a los ESC y el voltaje de la PDB al que están conectados los ESC. Todo parece en orden. Los cuatro motores tienen los mismos voltajes y las mismas señales pero solo se mueve uno de los motores. He probado recalibrando los motores y sigue sin dar resultado… No entiendo por qué con un programa funciona y con otro no…
Gracias por la ayuda
Haciendo más pruebas he logrado detectar que si cargo el programa principal y dejo el USB conectado y a continuación enciendo el interruptor para dar corriente a todo el dron desde la batería (yo solo tengo un interruptor principal justo entre la bateria y la PDB) si que funcionan los 4 motores. Al encender el interruptor los cuatro motores pitan (pipipi) y despues pitan intermitentemente (aunque se van descompasando) hasta que llega la parte de calibrar los motores donde los 4 motores pitan de nuevo como al principio (pipipi).
Sin embargo. Si pruebo con el USB desconectado y encendiendo el interruptor se escucha el pitido inicial en los cuatro motores (pipipi) pero solo pita uno intermitentemente y ese es el que funciona.
Por otro lado, con el programa GirarMotores.ino todo va bien con o sin USB. He pensado que puede ser un problema de conexiones entre los ESC y la PDB o el arduino pero todo parece estar bien y eso no explica por qué funciona correctamente con el código de GirarMotores.ino
Buenas Alvaro,
He estado ausente un par de meses, y no he podido atender las consultas que me habéis dejado hasta ahora. ¿Has conseguido solucionar el problema?
El problema creo que puede venir de la longitud de pulso que se le está enviando con un software y con otro. Puede que en del software principal sea algo diferente por los valores que vienen puesto por defecto. Es algo bastante común. Intenta tirar por ahí.
Un saludo!
Buenas Artista,
Lo primero muchas gracias por compartir tu trabajo. Me está sirviendo muchísimo, tengo el drone casi finalizado. Tengo el mismo problema que hace tiempo comentó Yeray, cada motor necesita un valor de pulso diferente para comenzar a girar, uno de ellos empieza a girar nada más subir el throttle un poquito y los demás van necesitando subirlo más, llegando a tener que subir casi la mitad para que el 4º comience a girar.
He de decir que el 4º motor es un modelo diferente, si consiguiera uno igual que los demás entiendo que se solucionaría en parte. Aún así, los otros 3 son el mismo modelo, y hay bastante diferencia entre ellos. En principio la calibración está correcta, he probado varias veces y el resultado es el mismo.
Alguna idea de qué puede estar pasando?
Si no he pensado en limitar todos los motores a que empiecen a girar con el valor de pulso del que más le cuesta, qué opinas?
Entiendo que con el PID se compensarían estas diferencias pero son bastante grandes.
Muchas gracias!!
Hola de nuevo, he podido solucionarlo calibrando los ESC por separado. Para ello simplemente he cogido el código del primer programa de esta entrada y lo he dejado igual pero únicamente para un motor. Físicamente he desenchufado todo excepto el ESC – Motor correspondiente, y así con los cuatro, uno por uno. Después he cargado directamente el segundo programa y los motores ya comienzan a girar casi al unísono.
A ver si a alguien le sirve!!
Saludos
Gracias por compartir la solución! 😉
Buenas tardes, primero agradecerte que compartas toda tu experiencia y lo que has aprendido haciendo este drone. He realizado gran parte del drone, pero estoy parado en esta parte, en el momento de calibrar los motores, los dos primeros pitidos se escuchan y entonces bajo el throttle al mínimo. Pero entonces, suena un tercer pitido y los motores empiezan a acelerar. No entiendo porque no logro realizar bien la calibración, por favor sabes cual es el motivo?
Muchísimas gracias por adelantado.
El problema debía ser algún tipo de fallo en la conexión, que después de desmontar y volver a montar ya funciona. Pero no entiendo porque cuando el throttle está al mínimo los motores aceleran, y cuando esta al máximo, desaceleran. Esto lo he solucionado cambiando los valores PulsoMinPotencia y PulsoMaxPotencia, pero no entiendo el por que. ¿A caso se debe a lo que mencionas en la primera entrada sobre el mando, que el throttle pueda estar invertido?
Muchas gracias y espero tu respuesta.
Buenas Guillermo, si, casi seguro que tienes el mando invertido. De hecho, lo que te ha pasado es bastante peligroso, de ahí la importancia de hacer SIN hélices hasta validar todo.
Un saludo;)
otra forma de controlar los motores es declarándolos como un servo. esto permite ganar mucho tiempo. y es bastante fácil de operar. incluso funciona con delay() de 5 o mas segundo siempre y cuando tengamos en cuenta los tiempo de ejecución de los demás programas.
Buenos días, al cargar el software de calibrar motores todo funciona correctamente en cuanto a la calibración. Pero en el momento de mover los motores, cada uno se enciende en un momento distinto, a pesar de que la diferencia no es mucha, sí que es suficiente para desestabilizarlo y volcarlo evitando que llegue a levantar el vuelo cuando uso el software principal.
Ya he probado lo de calibrar cada motor por separado, pero no he obtenido resultados, ¿que puedo hacer para que todos empiezen a la vez o al menos bastante juntos?
Buenas Guillermo,
En mi caso también un motor comienza a girar algo antes que los demás, pero el control de estabilidad lo contrarresta bien. Los 4 motores son iguales?
Me parece raro que el drone llegue a volcar, me da la impresión de que los motores no están bien situados en el frame… has seguido las comprobaciones de ‘Probando el Software completo antes de volar’. Si tiene algún motor mal colocado lo deberías detectar siguiendo los pasos de esa entrada. Fíjate también en que las hélices estén bien colocadas, y que el empuje se da en la dirección correcta.
Un saludo
Buenos días, los motores sí que estan colocados correctamente y son iguales. Y el drone ha llegado a volar correctamente una vez. Para lograrlo, he calibrado cada motor por separado con el Pmin anterior al primero que hace girar el motor con el theottle al mínimo. Para encontrar esté valor, he cargado CalibrarMotores.ino seguido de DroneArsuino_v1 muchas veces con los demás valores(PMax=2, PMin(DroneArsuino_v1)=1 y PMax(DroneArsuino_v1)=2) y he ido comprobando cual era el Pmin necesario para cada motor. Después de esto el drone voló correctamente, pero he comprobado que debo recalibrarlos cada vez antes de volver a subir DroneArduino_v1.
Debo decir que los motores que estoy utilizando son los a2212 2200KV, estoy a la espera de que me lleguen unos de 1000KV. Creo que esto puede provocar que se accentue la diferencia de tiempo de encendido de los motores.
Estoy haciendo este drone como un proyecto de Bachillerato y agradezco mucho tu ayuda.
Muchas gracias.
Buenas Guillermo. Estoy teniendo un problema similar, por no decir calcado, al que has expuesto tú. ¿Podrías explicar más detalladamente cómo has conseguido sincronizar los 4 ESC? ¿Y cuando dices «recalibrarlos cada vez antes de volver a subir DroneArduino_v1» a qué te refieres exactamente?. Muchas gracias. 🙂
Una consulta todos los codigos de programacion del dron, van todo juntos??
Queria saber como van ordenados..
Hola, estoy pensando en realizar un dron pero cuando busco las características técnicas de los ESC, me suele aparecer que no son programables. No entiendo bien a que se refieren pero han declarado que si se entra a la librería del ESC, el mismo se quema. No se si para este proyecto si compro esos ESC puede que eso me suceda. Saludos
Hola
He llegado a tu web trás muchas búsquedas sin obtener un resultado que me funcione. Agradecería me orientes hacía donde buscar.
Estoy haciendo un vehiculo tipo tanque pero con 6 ruedas. 6 motores brushed 12V, 300rpm. 6 ESC 320A para motores brushed(dos hilos). Emisora flysky con su receptor y arduino MEGA. Como todos los motores funcionaran de la misma manera, para la pregunta me centraré en uno solo activado por Pitch. Lectura receptor/arduino: atrás 995, centro 1500 y adelante 1975.
Como consigo que mi motor vaya adelante, atrás y parado, basandome en lo que recibo de la emisora(995/1500/1975) Solo consigo hacerlo avanzar con decenas de codigos que he probado.
Alimento en receptor/arduino GND y 5V. Señal a pin digital 3. Aalimento ESC desde bat externa, GND de ESC a arduino y señal del ESC a pin digital 9. Solo avanza, no consigo que el motor vaya atrás. Cuando consiga esto, luego ya enlazaré los valores recibidos del receptor con los valores a enviar al ESC, pero estoy todavía en esta fase. Gracias de antemano
Buenas Jose,
Lo siento pero no te puedo ayudar, no conozco estos motores… ni como funcionan.
Un saludo
HOLA ARDUPROJECTS quisiera hacerle una consulta estoy trabajando con el dron f450 motores de 920 Kv controlado por el Arduino uno R3 estoy haciendo este paso pero no se por que la configuración de los motores quedo invertida es decir en máxima potencia esta apagados los motores y al bajar la potencia acelera , otra cosa generalmente mi compañero le había dañado una esc la cambiamos por una igual no se creo que es diferente de algún modo porque ahora ese motor que esta conecta a la nueva esc es el que funciona bien es el que primero arrancha cuando tengo la potencia al 50% encienden los otros debo cambiar los esc o que me aconseja agradezco su ayuda y pronta respuesta
Buenas Cristian,
No entiendo muy bien lo que te sucede… parece que tienes la emisora invertida… tiene que hacer que con el stick abajo los motores estén quietos. Prueba a cambiar de esto:
const float tMaxPotencia = 1.83;
const float tMinPotencia = 1.12;
A esto:
const float tMaxPotencia = 1.12;
const float tMinPotencia = 1.83;
Un saludo
MUCHAS GRACIAS ARDUPROJETC voy a hacer esa modificacion para probar otra cosita es no entiendo por que los motores arrancan disparejos hay un motor que se le cambio una esc y ese es el que arranca con la minima potencia los otros entran en funcionamiento cuando la potencia va a la mitad que prodria ser ese error agradezco su respuesta
Buenas,
estoy intentando entender el código pero hay una parte que no entiendo, me la podrias explicar?
Es esta linea de codigo:
while (micros() – loop_timer < usCiclo);
como funciona y para que sirve? no se supone que se tendría que quedar ahi atascado durante el primer ciclo ya que micros será un numero mayor a 6000 y loop timer, al no haber avanzado a la siguiente linea de código por defecto será cero.
Un saludo y gracias!!
Buenas Diego,
Se guarda el instante en el que empieza un nuevo ciclo en la variable loop_timer. Al llegar de nuevo al while, el valor que se va actualizando es el de micros()… cuando han pasado los microsegundos especificados en usCiclo, salimos del while.
Un saludo
Sí si eso lo he entendido. Mi principal duda es qué ocurre en el primer ciclo, es decir, ¿cómo llega a ejecutarse esta linea» loop_timer = micros();» si está debajo del while que nunca debería cumplirse. Es decir, el codigo no debería ser asi?
void setup (){
loop_timer = micros(); //actualización para que se cumpla la condición en el primer ciclo
}
void loop(){
while (micros() – loop_timer < usCiclo); // esto ya se cumpliría la primera vez
loop_timer = micros();
}
Un saludo y gracias por responder tan rapidamente
Disculpa, ya lo he entendido. Ha sido un error conceptual con el bucle while.
Un saludo
Hola!! Quería saber si este sketch funciona en ESC’s que trabajan con protocolos más
modernos como multishot ó dshot ???
Hola Jorge, pues desconozco el funcionamiento de esos protocolos que mencionas, por lo que no puedo contestar a tu pregunta.
Un saludo
Hola buenas una pregunta, según el post es necesario para mantener estable el dron en el aire leer pulsos cada 6ms. En mi proyecto no uso mando, simplemente envío una orden a base de comandos para que el dron vaya más rápido o más lento (o se quede quieto en el aire). Mi objetivo no es un dron de carreras, si no algo más «calmado» por así decirlo. Entonces creo que con leer pulsos cada 20ms usando writemicroseconds() puede ser suficiente, ¿estoy en lo cierto?
Buenas Alfonso. Los pulsos a 6ms se escriben, no se leen. 6ms es el periodo de las señales PWM para gobernar los motores. No tiene nada que ver el periodo de 20ms del mando con el del control de estabilidad que va a 6ms. Da igual cada cuanto transmitas al drone la orden de que se desplace (con un mando o por comandos como dices), pero en ese rato el drone tiene que mantenerse estable en el aire y no estrellarse, y para ello el lazo de control tiene que ejecutarse a 6ms o menos.
Hola,
Estoy ejecutando el código para mover motores y todo marcha bien. Pero luego al bajar el throttle al mínimo y al cabo de unos segundo de descanso repentinamente se activan dos de los motores (uno a baja velocidad y el otro a pasos), sabe porque puede suceder esto?
Hola, buenas tardes, días o lo que proceda. Primero de todo, agradecer la información y experiencia proporcionada en tu proyecto ya que me ha sido de extremada utilidad. Mi objetivo era redimensionar tu proyecto, con batería 6S, unos motores, Flash Hobby Arthur 1400KV y unas ESC de 35A (también configurables con BLheli_s). Ya tengo el proyecto casi terminado, solo falta levantar el vuelo, he calibrado los motores, pitidos correctos y todo funcional, y cuando he levantado el throttle por segunda vez en el programa calibrar motores, estos hacen como un intento de moverse y no arrancan, muy similar al caso descrito por Paco, el dron es un hexacóptero, pero igualmente aunque le ponga el código para que funcionen cuatro de los motores, sigue dando la misma respuesta, esta vez con solo cuatro de ellos.
Muchas gracias
Hola, muchas gracias por el proyecto. Tenía una pequeña duda sobre el movimiento de los motores. A mí, los motores me funcionan, pero unos empiezan a girar antes que otros. La diferencia entre unos y otros es poca, pero cuando las hélices giran a pocas revoluciones se nota la diferencia. Con el mismo tiempo de pulso, unos giran a más velocidad que otros. Los controladores y los motores son de la misma marca y modelo. ¿Cómo puedo solucionar el problema?
Hola, tranquilo por eso, es normal. El control de estabilidad se encargará después de compensar esas desviaciones. Un saludo