Mal posicionamiento del servo al inicio

Soy nuevo por este foro, necesito un poco de vuestra ayuda y conocimientos.
Estoy intentando manejar 12 servos con una arduino Mega con las salidas PWM.
El problema es que al iniciar el sistema los servos no se posiciona en los puntos de partidas que están programados.
Cuando doy a los pulsadores se van colocando en sus posiciones determinadas pero no al arranque, lógicamente esto provoca el bloqueo de los brazos del servo.
El sistema lo tengo alimentado con un fuente de 12v y a los servos con la misma fuente pero con un regulador LM2596 ajustado a 5v.
No tengo ni idea de lo que estoy haciendo mal, en el programa estoy utilizando la librería servo.h, .
Me podéis ayudar.

Un saludo atentamente Pablo.

Brawa:
Soy nuevo por este foro, necesito un poco de vuestra ayuda y conocimientos.
Estoy intentando manejar 12 servos con una arduino Mega con las salidas PWM.
El problema es que al iniciar el sistema los servos no se posiciona en los puntos de partidas que están programados.
Cuando doy a los pulsadores se van colocando en sus posiciones determinadas pero no al arranque, lógicamente esto provoca el bloqueo de los brazos del servo.
El sistema lo tengo alimentado con un fuente de 12v y a los servos con la misma fuente pero con un regulador LM2596 ajustado a 5v.
No tengo ni idea de lo que estoy haciendo mal, en el programa estoy utilizando la librería servo.h, .
Me podéis ayudar.

Un saludo atentamente Pablo.

Hay un pequeño espacio de tiempo mientras arranca el controlador y carga el programa en que el servo no recibe ninguna señal y se va a la posicion de neutro o mitad de su recorrido ,aunque tambien puede ser que ese sea su comportamiento predeterminado ,es decir que lo primero que hace al recibir alimentacion sea ir a posicion de neutro.puedes hacer una prueba con un solo servo solo conectado con el cable de señal ,sin alimentacion,y una vez encendido el arduino ,entonces alimentas el servo ,a ver si se va a la posicion programada o se va a neutro y luego a la posicion.de todas maneras ,pon el sketch que estas usando.

//
// Block array
//
#include <Servo.h>
//
//---------------------------- crear el control del servo
Servo myservo207;
Servo myservo206;
Servo myservo205;
Servo myservo204;
//
//---------------------------- Posicion de inico de los servos
//
int pos206 = 90;
int pos207 = 85;
int pos205 = 70; // final 90
int pos204 = 52; // final 70
int velocidad = 10;
//------------------------------ Posicion del espadin
int posicion206 = 0; // posicion del desvio
int posicion207 = 0; // 0 = desvio, 1= recto
int posicion205 = 0;
int posicion204 = 0;

int ViadePaso = 0; // Via libre = 0 y ocupada = 1
int Libre = 0; // Cruce libre = 0 y ocupado = 1
int SalidaEstacion = 0; // = 0 entrada Fabrica, = 1 entrada montaña
int SENTIDO = 0; // Sentido dentro del bucle de retorno
int RUTA=2; // switch define las acciones dentro de la ruta
int CTRRUTA = 0;
int SERVO = 0; // switch define los movimientos de los servos

int CTRSERVO = 0;
int x = 0;
//
//-------------------------------- Arrays
int Block[] = {22,24,26,28,30,32,34,36};
int SEN[] = {23,25,27,29,31,33,35,49,50,51,52,53,37.39};

int buttonsen[14];
int ctrsen[14];
int isen; // indice sensores
int iblock;

//---------------------------------------------

void setup() {

myservo207.attach(8); // ENTRADA SEÑAL SERVOS
myservo206.attach(9 );
myservo205.attach(10);
myservo204.attach(11);

pinMode(prueba, OUTPUT);

for (isen = 0; isen < 14; isen++) // inicializar las arrays
{
buttonsen[isen] = 0;
ctrsen[isen] = 0;
pinMode(SEN[isen], INPUT);
digitalWrite(SEN[isen],HIGH); //Activar resistencia Pullup
}
for (iblock = 0; iblock < 8; iblock++) // inicializar los block, se activan con cero
{
Block[iblock] = 1;
pinMode (Block[iblock], OUTPUT);
}
}
void loop(){

//----------------------------------- // INICIO
if (inicio ==0 ){
delay (tiempo);
inicio = 1;
}
//----------------------------------- // lectura de sensores

for (isen = 0; isen < 14; isen++)
{
buttonsen[isen] = digitalRead(SEN[isen]);
if (buttonsen[isen] == LOW)
{
ctrsen[isen] = HIGH;
}
if (isen < 8)
{
if (buttonsen[isen] == LOW && ctrsen[isen] == 1) // Activmmos los reles cuando tenemos algo.
{
Block[isen] = 1;
}
if (buttonsen[isen] == HIGH && ctrsen[isen] == 0) // Desactivamos los reles cuando no hay nada.
{
Block[isen] = 0;
}
}

}
//
//----------------------------------------------- inicializar los block, se activan con cero
//

//
//------------------------------------------- Bucle de retorno
//
if (buttonsen[11] == LOW) // SEN20
{
RUTA = 4;
}
if (buttonsen[10] == LOW) // SEN19
{

RUTA = 5;
}
//

// -------------------------------------------------------------------------

for ( x=0+CTRSERVO; x < 5; x++ ){
SERVO = x;

switch (SERVO){
case 0:
//------------------- no hace nada
break;
case 1:
if (posicion204 == 1) {
if (pos204 != 70){
pos204 += 1;
myservo204.write(pos204);
delay(velocidad);
}
}
if (posicion204 == 0){
if (pos204 != 52){
pos204 -= 1;
myservo204.write(pos204);
delay(velocidad);
}
}

digitalWrite(Block[4],HIGH);
break;

default:
break;
}
}
}

Gracias Jose.
Este sería el stetch cortado,de la RUTA 4 o 5 nos llevaría a otrta case y desde ese case ya no al stwich SERVO
para mover a las posisicones programadas.

Espero tu ayuda, muchas gracias.

Un saludo.
Pablo

Por favor ,usa los tags adecuados para postear codigo (echale un ojo a las normas del foro).
Aunque defines unas variables de posicion de inicio,no veo en el codigo que has posteado que se las asignes a los servos ,por lo que en el bloque setup() deberias mover los servos a esas posiciones que has definido:

void setup() {
 
 myservo207.attach(8);       //  ENTRADA SEÑAL SERVOS 
 myservo206.attach(9 );  
 myservo205.attach(10);
 myservo204.attach(11);
  
myservo204.write(pos204);  
myservo205.write(pos205);
myservo206.write(pos206);
myservo207.write(pos207);

 pinMode(prueba, OUTPUT);
  
  for (isen = 0; isen < 14; isen++)           // inicializar las arrays
      {
       buttonsen[isen] = 0; 
       ctrsen[isen] = 0; 
       pinMode(SEN[isen], INPUT);
       digitalWrite(SEN[isen],HIGH);          //Activar resistencia Pullup
      }
   for (iblock = 0; iblock < 8; iblock++)     // inicializar los block, se activan con cero 
      {
       Block[iblock] = 1; 
       pinMode (Block[iblock], OUTPUT);
      }   
}

Hola Jose.
Ante todo pedir disculpa por lo del codigo, las prisas nunca son buenas, la verdad que no me di cuenta de ese tema, es mucho más complicado entenderlo como lo envié, pido mil disculpas.

Efectivamente como me habías comentado, tenía o tengo dos problemas uno el que me indica que no posiciona los servos en el setup (me hace lo mismo, pero es lo correcto poscionar los servos) y la otra el tren de impulso que recibe el servo. El servo se debe activar mucho antes que mi sistema y se posiciona en un punto determinado por el fabricante.

Si dejo sin alimentación el servo espero unos segundo y conecto el servo se inicializa en el punto programado, la única idea que tengo sería colocar un relé a la salida del regulador esperar unos segundo y que lo active el arduino, dando alimentación a todos los servo.

Si tienes alguna idea mejor te lo agradecería, muchas gracias por la ayuda.

Un saludo.

es lo que te iba a proponer.si alimentar el servo despues de posicionarlo te funciona,activa el rele tambien en el setup ,despues de las lineas de posicionamento inicial.

Asi lo haré.
Muchas gracias por la ayuda, me estaba volviendo loco, ya que todos los test me iba bien, hasta que lo implemente en todo el sistema.

Un saludo.