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 ).
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!!!