Control motor brushless

Saludos a todos:
Me dispongo a hacer una buena explicación sobre el control de los motores brushles...
Tengo que decir que aunque hay información por ahí, para mí no fue nada concluyente a la hora de proseguir con mi proyecto.

Primero de todo empezaremos con la conexion de todo:

  • Los tres cables del motor, directamente al ESC: 0 dudas, si resulta que gira al revés, canvia dos de los cables.
  • De los 3 cables de la tipica conexión Servo RC: Marron o Negro directamente a masa (GND del Arduino). Amarillo, Naranja o Blanco a un pin PWM. El Rojo (+5V) no hace falta conectarlo.
  • La alimentación del ESC es lo importante: Si utilizas una LiPo de buenas a primeras es probable que no llegues a entender el porqué del funcinamiento, y todos sabemos que éste es un punto muy importante.

Si como yo te dispones a montar tu quadricoptero utiliza una fuente de alimentacion ni que sea para hacer las primeras pruebas.
La conexion no es complicada: Positivo de la fuente al Rojo del ESC y negativo de la fuente al Negro del ESC.

Ahora biene un poco de teoria: A la hora de entender el funcionamiento del motor podemos pensar que simplemente cómo està alimentado y hay una patilla de control simplemente cuanto mas alto el valor del PWM mas rapido irá. Así sin más.
Realmente aunque el resultado sea así es importante entender el papel del ESC.

Cuando tú le mandas al ESC los valores a través del myservo.write(valor) lo que estas haciendo és que el ESC deje fluir mas o menos corriente de la bateria (o en este caso la fuente).

A ver si me esplico: Si tu le mandas el valor 50 al motor, éste no gira porque el valor sea 50. El motor gira porque el valor 50 está asociado a mas o menos 0,5A.
Si despues aumentas el valor a 60, verás (si eres inteligente y usas una fuente externa) que la corriente augmenta a unos 0,75A.

Al fin y al cabo creo que es sencillo de entender. Pero es sumamente importante para poderte orientar sobre los consumos que vas a obtener.

P.D: Los valores de 0,5A y 0,75A son orientativos, no me los se de memoria.

Ahora lo importante para el tipo que lleve varias pruebas y no se le mueva nadie.

Para controlar el motor:
Es necesario que se empieze con myservo.write(0). Seguidamente un delay (yo le pongo 100 per creo que con el minimo 15 ya funciona, te recomiendo 100 que esta probado :wink: ).

Ahora viene lo curioso (eso sí que no se el porqué). El famoso pitido que hay que oír al ESC para comprobar la conexion se obtiene con myservo.write(20). Podria ser 10 pero no. Es a 20. (Seguidamente el mismo delay).

Para que el motor de vueltas éste empieza a moverse con el valor 40.

Mi codigo de ejemplo (para controlar mi cuadricoptero utilizo el mando de la PS3 y para hacer éstas pruebas me va fenomenal ya que no hay cables enmedio. Así que lo importante es ver la estructura de funcionamiento del motor y sus valores):

#include <PS3BT.h>     // No importante para el motor
#include <Servo.h>

USB Usb;               // No importante para el motor
BTD Btd(&Usb);         // No importante para el motor

PS3BT PS3(&Btd);       // No importante para el motor 

Servo myservo;         //Declaramos un objeto de tipo servo
int velocidad = 0;     //Declaramos y inicializamos la variable que controlará la velocidad

void setup()
{
  Serial.begin(115200);                                              //Utilizo el monitor serie para comprovar los valores que está recibiendo el motor (ésta velocidad es por el tema del mando).
  
  myservo.attach(2);                                                 //Configuramos el pin 2 para el servo
  
  if (Usb.Init() == -1) {                                            // No importante para el motor
    Serial.print(F("\r\nOSC did not start"));                        // No importante para el motor
    while(1);                                                        // No importante para el motor         
  }
  Serial.print(F("\r\nPS3 Bluetooth Library Started"));              // No importante para el motor
  arm();                                                             // Importantísima funcion: Es la funcion con la que conseguimos el armado (Y pitido) del ESC (Está al final del programa).
}
void loop()
{
  Usb.Task(); // No importante para el motor
  if(PS3.PS3Connected || PS3.PS3NavigationConnected)                  // No importante para el motor
  {
    if(PS3.getAnalogHat(LeftHatX) > 137 || PS3.getAnalogHat(LeftHatX) < 117 || PS3.getAnalogHat(LeftHatY) > 137 || PS3.getAnalogHat(LeftHatY) < 117 )
    {
      Serial.print(F("\r\nLeftHatY: ")); 
      Serial.print(PS3.getAnalogHat(LeftHatY));                              //Con estas dos líneas lo que hace el programa és mostrarnos por el monitor serie la palabra LeftHatY: y su valor(de 0 a 255)

      velocidad = map (PS3.getAnalogHat(LeftHatY), 118 , 0, 40, 90);         //Con ésto yo controlo el motor: hago un mapeado que consta de 118-(valor con el que empiezo) 0-(Valor de gas al maximo) 40- (VALOR MINIMO QUE NECESITA EL MOTOR PARA MOVERSE) 90-(Valor maximo que le dejo girar al motor.)
      myservo.write(velocidad);                                              //En el mapeado anterior meto cada valor a la variable velocidad constantemente y ahora se la paso al ESC.
      delay(15);                                                             // delay necesario
    }
    if(PS3.getButtonClick(TRIANGLE))                                         //PARA NUESTRA SEGURIDAD
    {      
      velocidad = 0;                                                         // Si el control se nos va de las manos pulso éste boton y el motor para ya que velocidad = 0
      myservo.write(velocidad);
      delay(15);
    }
  }
}
void arm(){                                                                   // Funcion del armado del ESC
  myservo.write(0);
  delay(100);
  myservo.write(20);
  delay(100);
}

Primero de todo perdon por el formato del codigo, nunca habia posteado y nose como hacerlo mejor.
Y en segundo lugar decir que voy a poner imagenes y algun video, pero tengo que hacer aún las fotos y videos....

Muchas gracias por su interes. Cualquier duda pusteen y comenten

Saludos!!!

Éste es un video del motor funcionando, pero con una version anterior de código. Aquí el armado se hace simplemente incrementando el valor de velocidad.

Si lo apreciáis bien se ve que la primera vez que se pulsa triangulo no pasa nada (velocidad=10) y rapidito le doy otra vez y hace la conexión. (velocidad = 20) después vuelvo a pulsar y arranca (velocidad=30) pero es inestable y seguidamente le doy otra vez rapido (velocidad=40 ) y el motor ya esta estable.

muchas gracias.

P.D: Triangulo -> velocidad += 10
Cruz -> velocidad -= 10
Cuadrado - > velocidad = 0

Ya he mejorado un poco el codigo y la grabación para apreciar lo de los consumos.
Ahora ya sí que se controla mediante el joystick:

Perdón por mis compañeros gritones jajaja También están metidos con sus proyectos....

Aquí subo dos imágenes para apreciar mejor las conexiones:

Hola slipy.

Está muy bien esta explicación que has elaborado para los que comienzan a manejarse con motores brushless. Sin embargo me permito comentar alguna cosa.

Cuando tú le mandas al ESC los valores a través del myservo.write(valor) lo que estas haciendo és que el ESC deje fluir mas o menos corriente de la bateria (o en este caso la fuente).

A ver si me esplico: Si tu le mandas el valor 50 al motor, éste no gira porque el valor sea 50. El motor gira porque el valor 50 está asociado a mas o menos 0,5A.
Si despues aumentas el valor a 60, verás (si eres inteligente y usas una fuente externa) que la corriente augmenta a unos 0,75A.

Al fin y al cabo creo que es sencillo de entender. Pero es sumamente importante para poderte orientar sobre los consumos que vas a obtener.

P.D: Los valores de 0,5A y 0,75A son orientativos, no me los se de memoria.

Esto no es exactamente así. De hecho ante un mismo valor de myservo.write(valor) el consumo será mayor o menor dependiendo de la hélice que hayamos puesto al motor. Y es que la respuesta de un brushless a través de un ESC comercial guarda más o menos una proporcionalidad entre la tensión de alimentación (es decir el valor de myservo.write(valor)) y la velocidad del motor. Como lo que se conoce como "par ventilador" (el caso de un cuadricóptero, un motor con una hélice) es proporcional el par a la velocidad y como el par es proporcional al consumo de intensidad esto resulta en que para una misma hélice el consumo de intensidad es proporcional al valor de myservo.write(valor). Pero con otros usos del motor ya no se cumpliría. Puedes comprobarlo por ejemplo quitando sin más la hélice, el motor apenas consumirá y los valores de myservo.write(valor) regularán la velocidad.

Ahora viene lo curioso (eso sí que no se el porqué). El famoso pitido que hay que oír al ESC para comprobar la conexion se obtiene con myservo.write(20). Podria ser 10 pero no. Es a 20. (Seguidamente el mismo delay).

Para que el motor de vueltas éste empieza a moverse con el valor 40.

Un ESC realmente entiende el tiempo que se le envía un HIGH (igual que un servo realmente). La librería Servo hace una conversión entre los grados de un servo y ese tiempo. De hecho la librería admite dar el tiempo (en microsegundos) en lugar del ángulo en grados ya que es práctico en un servo hablar en grados pero no en un ESC. La instrucción es myservo.writemicroseconds(valor).
El proceso que describes es lo que se llama armar el ESC que consiste en enviarle la señal con el pulso HIGH de 1000 microsegundos. Imagino que la correspondencia de los 1000 microsegundos será aproximadamente los 20º que pones. La finalidad de tener que armar un ESC es como seguridad, si los tienes conectados directamente a una emisora sólo se arman si las palancas de los mandos están al mínimo (que es cuando la emisora envía la señal de los 1000 microsegundos). Así evitas el peligro de encender la emisora, algún mando no esté a cero y ponga de repente algún motor en marcha.

Slipy muchas gracias por postear esta informacion yo estoy en proceso de montar uno. Podrias poner porfavor el link de los motores, helices y ESC.

Gracias y suerte con el proyecto !!

soy nuevo en esto y quisiera empesar a controlar motores brushless solo que con un arduino mega2560 el cual no es compatible con el codigo de programacion de arriba si me pudieran ayudar!!! grasias

hola, disculpen si mi ESC es nuevo osea sin programar, lo puedo hacer por primera vez con arduino y un potenciometro por ejemplo o necesito el transmisor de radio de RC para programarlo?