Motor brushless arranca de golpe a màxima potència

Hola a todos,

Soy nuevo en arduino, y estoy haciendo un quadcopter. Utilizo el arduino Mega 2560, unos ESC Turnigy multistar 15A, i unos motores ST2210. El problema que tengo es que he intentado inicializar los motors enviando primero un pulso de 0 microsegundos y despues uno de 1000. No se porque, el ESC suena dos veces, i solo quando quiere. A veces funciona i arranca el motor bien (a 1100 microsegundos), pero lo que más me preocupa es que el motor, en dos ocasiones, ha arrancado de golpe si previó aviso desmontandome todo. Incluso le desconectaba la corriente al arduino, i el motor no paraba. El còdigo que utilizo es el siguiente:

#include <Servo.h>

#define PINMOTOR 10
#define POLSMINIM 1000
#define POLSMAXIM 1600
#define PAS 10

int polsmotor = 1000;
int lectura;

Servo motor;

void setup()
{
  Serial.begin(9600);
  motor.attach(PINMOTOR);
  Serial.println(" Pitja \"a\" per a inicialitzar el motor");
  while(Serial.read() != 'a');
  inicialitzarmotor();
  Serial.println(" Pitja \"a\" per aaugmentar la potencia, \"z\" per a disminuir-la, i \"s\" per a parar el motor.");
}

void loop()
{
  motor.writeMicroseconds(polsmotor);

  delay(100);
  if(Serial.available() > 0)
  {
    lectura = Serial.read();
    switch (lectura)
    {
      case 'a':
      polsmotor += PAS;
      break;
      case 'z':
      polsmotor -= PAS;
      break;
      case 's':
      polsmotor = 1000;
      break;
    }
    polsmotor = constrain(polsmotor, POLSMINIM, POLSMAXIM);
    
    Serial.println(polsmotor);
    
   }
  
}

void inicialitzarmotor()
{
  long t=millis();
  while((millis()-t)<1000)  motor.writeMicroseconds(0);
  motor.writeMicroseconds(1000);
}

Alguien sabe qual es el problema i como solucionarlo?
Gracias de antemano.

Tenes que tener Varios datos imporantes

Los motores Brusheless, tienen una velocidad de “PWM” De inicio.

Por ejemplo si la velocidad de inicio es 60

Cuando vos haces el write y le envias 60 solo tiene que hacer un pitido el variador, luego apartir de ahi haces un “Mapeo” y envias los datos.

Mira te dejo este , podes jugar con la velocidad Maxima y la velocidad minima , y vas probando de pulsos en pulsos.

/**************************************************************************************************

  • Alberto López Gassó 22/12/2011 *
  • www.dieBotReise.blogspot.com *
  • alblopgas@gmail.com *
  • Descripción: Programa que controla la velocidad de un control Brushless a través del *
  • puerto Serial usando el monitor de Arduino. *
  • Software de libre distribucion Licencia Creative Commons 3.0 *
    **************************************************************************************************/

#include <Servo.h>
#define PINMOTOR 8 //pin conectado al ESC, en este caso CH_5 en ARDUPILOT corresponde al pin 8
#define MAXIMOPWM 150 // Son grados Podia llegar hasta 180,paramas seguridad lo dejo bajo
#define MINIMOPWM 50 // por si acaso empezar con un valor inferior, mi motor no arranca hasta 65
#define PASO 1 // Incrementos del teclado
#define BAUD 9600 //velocidad puerto serial funciona hasta 38400

int pulsoMotor;
int ordenTeclado=0;
Servo myservo; // creamos el motor como elemento en la libreria
byte recibiendoByte ;
boolean iniciado = false;
void setup()
{
Serial.begin(BAUD);
myservo.attach(PINMOTOR); // inicializo el ESC en el pin determinado
Serial.println(" Comienzo del test"); //
Serial.println (" Pulsar ‘A’ para arrancar \n Cuando escuche el pitido de confirmación");
while ( iniciado==false ){
myservo.write(0); // Aramado
recibiendoByte = Serial.read(); // Leemos el Byte recibido
if (recibiendoByte == 65 || recibiendoByte ==97) { // A o a Mayusculas o minusculas
iniciado=true;
}
}
Serial.println(“inicio del loop principal \n Para subir controlar velocidad pulse \n ‘A’ para subir \n ‘Z’ para bajar \n ‘S’ para terminar Stop \n”);
}

void loop(){

ordenTeclado =OrdenSubirBajar ();

if (ordenTeclado != 0) { // Distinto de Cero
pulsoMotor = pulsoMotor + ordenTeclado;

pulsoMotor= constrain( pulsoMotor , MINIMOPWM, MAXIMOPWM); //
myservo.write(pulsoMotor); //Mientras no hay cambios,automaticamente se siguen enviando los mismos pulsos
Serial.print("Velocidad del pulso–> ");
Serial.println (pulsoMotor);
}

delay (150); //delay para no colapsar
}

int OrdenSubirBajar (){
int orden=0;
// Serial.flush();// Limpiamos el Bufer de entrada (evitar efecto ametralladora)
//delay (150);

if (Serial.available() > 0) {
recibiendoByte = Serial.read(); // Leemos el Byte recibido
if (recibiendoByte == 65 || recibiendoByte ==97) { // A o A Mayusculas o minusculas
Serial.println( " SUBIR");
orden = PASO;
}
if (recibiendoByte == 90 || recibiendoByte ==122) { // Z o z Mayusculas o minisculas
Serial.println( " BAJAR");
orden = -PASO;
}
if (recibiendoByte == 83 || recibiendoByte == 115){ // t o T Mayusculas o minisculas
Serial.println( " Stop!!");
orden = -(pulsoMotor- MINIMOPWM); // Deja el pulso en MINIMOPWM
}
}
return (orden);
}

Despues usa mapeo para hacer todo:

http://arduino.cc/en/pmwiki.php?n=Reference/Map

Suerte !