Paso nivel con barrera y leds (SOLUCIONADO)

Hola, Feliz Navidad y Prospero año 2022
Se trata de poner un servo controlado por dos FC-51 y varios leds.
Los leds me funcionan pero he probado de activar los servos y no hay forma de que funcionen, en Google lo que encuentro no funcionan los códigos. Soy un poco novato y no veo la forma de que funcione, cualquier ayuda me vendría bien o sugerencia.
Gracias de antemano:

// barrera de tren con 2 led rojos intermitentes y 1 led verde fijo.
// cuando la "barrera" esta subida el led verde se enciende y se apagan los leds rojos
// cuando la "barrera" esta abajo el led verde se apaga y enciende los leds rojos
// la "barrera" esta por poner sera activada con 1 servo

int sensePin1=A0; // analog Pin A0 on the arduino
int sensePin2=A1; // analog Pin A1 on the arduino
int Red1=6; // light on crossing signal
int Red2=5;  // light on crossing signal
int Verde=7;

void setup() {
  Serial.begin(9600); // enables display of sensor output
  pinMode(Red1,OUTPUT); //establishes pins as Output Pin
  pinMode(Red2,OUTPUT);  
  pinMode(Verde,OUTPUT);
  
}

enum CROSSINGSTATES
{
  ST_OFF,
  ST_FLASHING1,
  ST_FLASHING2,
  ST_FLASHING3,
}; //identifies our 4 crossing states

CROSSINGSTATES crossingState=ST_OFF; // default state of the crossing

void loop() {
  int valA1=analogRead(sensePin1); //reads and stores value of sensors
  int valA2=analogRead(sensePin2);
  
  switch(crossingState) // this is establishing where the program goes to when a sensor is read
  {
    case ST_OFF:
    crossingoff(valA1, valA2);
    break;
    case ST_FLASHING1:
    crossingflashing1(valA1, valA2);
    break;
    case ST_FLASHING2:
    crossingflashing2(valA1, valA2);
    break;
    case ST_FLASHING3:
    crossingflashing3(valA1, valA2);
    break;
  }
}

void crossingoff(int valA1, int valA2){
  digitalWrite(Red1,LOW);
  digitalWrite(Red2,LOW);
  digitalWrite(Verde,HIGH);
 
  if(valA1<500 && valA2>500){
    crossingState=ST_FLASHING1; // if sensePin1 is tripped the program switches to Flashing 1
  }
  else if (valA1>500 && valA2<500){
    crossingState=ST_FLASHING2; // if sensePin2 is tripped the program switches to Flashing 2
  }
}

void crossingflashing1(int valA1, int valA2){
  digitalWrite(Red1,HIGH);
  digitalWrite(Red2,LOW);
  digitalWrite(Verde,LOW); 
  delay(500);  // This is half of the flashing signal and it goes for 0.5 seconds
  digitalWrite(Red1,LOW);
  digitalWrite(Red2,HIGH);
  digitalWrite(Verde,LOW); 
  delay(500); // This will loop until a condition is met that would change it

  if (valA1>500 && valA2<500){
    crossingState=ST_FLASHING3;   
  }
}

void crossingflashing2(int valA1, int valA2){
  digitalWrite(Red1,HIGH);
  digitalWrite(Red2,LOW); 
  digitalWrite(Verde,LOW); 
  delay(500);  // This is half of the flashing signal and it goes for 0.5 seconds
  digitalWrite(Red1,LOW);
  digitalWrite(Red2,HIGH);
  digitalWrite(Verde,LOW);  
  delay(500); // This will loop until a condition is met that would change it

  if (valA1<500 && valA2>500){
    crossingState=ST_FLASHING3;
  }
  }

 void crossingflashing3(int valA1, int valA2){
  digitalWrite(Red1,HIGH);
  digitalWrite(Red2,LOW);
  digitalWrite(Verde,LOW);
  delay(500);  // This is half of the flashing signal and it goes for 0.5 seconds
  digitalWrite(Red1,LOW);
  digitalWrite(Red2,HIGH);
  digitalWrite(Verde,LOW); 
  delay(500); // This will loop until a condition is met that would change it

  if (valA1>500 && valA2>500){
    crossingState=ST_OFF;
  }
  } 

Hola

¿Qué es FC-51?
¿Qué tal leer: How to get the best out of this forum
¿Fue esto?
https://www.danfoss.com/pt-br/products/dds/ac-drives/vlt-micro-drive-fc-51/

FC-51 Sensor De Obstáculos Reflectivo Infrarrojo

Saludos

Hola @sevillalva .
Primero necesitas intalar y cargar la libreria para manejar el servo y defines una instancia para llamarlo:

// Incluye la librería Servo
#include <Servo.h>.
// Creas como llamar al servo
Servo myServo;

En el setup defies a que pin PWM va conectado el servo:

void setup() {
  // Lo que tengas en tu setup
  myServo.attach(Pin PWM); // Defines el pin del servo
}

Y luego donde lo necesites dentro de tus funciones lo abres o cierras:

myServo.write(Angulo);

Donde Angulo puede tomar valores enteros entre 0 y 180 grados, cero todo a la izquieda, 90 posicion central, 180 todo a la derecha.
Saludos.

Comenta además como tienes alimentado el servo. No uses la fuente de 5V del Arduino, en gral no es suficiente para ellos a menos que sea un servo chico.
Busca un tutorial de servos.

Hola, ya he echo lo que me dices @gonpezzi pero no funciona, aquí pongo el código
y @Surbyte el servo es pequeño un sg90 , en las pruebas los 5v lo saco del Arduino nano,
pero luego cuando funcione será con 5v exterior para no cargar el Arduino .

P.D. he quitado los comentarios originales y dejado solo los nuevo para mayor claridad en el código

Gracias a los dos

// barrera de tren con 2 led rojos intermitentes y 1 led verde fijo.
// cuando la "barrera" esta subida el led verde se enciende y se apagan los leds rojos
// cuando la "barrera" esta abajo el led verde se apaga y enciende los leds rojos
// la "barrera" esta por poner sera activada con 1 servo

#include <Servo.h>                      //incluido nuevo

int sensePin1=A0; 
int sensePin2=A1; 
int Red1=6; 
int Red2=5;  
int Verde=7;

Servo barrera;                               //Servo myServo;

void setup() {
  Serial.begin(9600); 
  pinMode(Red1,OUTPUT); 
  pinMode(Red2,OUTPUT);  
  pinMode(Verde,OUTPUT);
  barrera.attach(9);                         //myServo.attach(Pin PWM);
  
}

enum CROSSINGSTATES
{
  ST_OFF,
  ST_FLASHING1,
  ST_FLASHING2,
  ST_FLASHING3,
}; 

CROSSINGSTATES crossingState=ST_OFF; 

void loop() {
  int valA1=analogRead(sensePin1); 
  int valA2=analogRead(sensePin2);
  
  switch(crossingState) 
  {
    case ST_OFF:
    crossingoff(valA1, valA2);
    break;
    case ST_FLASHING1:
    crossingflashing1(valA1, valA2);
    break;
    case ST_FLASHING2:
    crossingflashing2(valA1, valA2);
    break;
    case ST_FLASHING3:
    crossingflashing3(valA1, valA2);
    break;
  }
}

void crossingoff(int valA1, int valA2){
  digitalWrite(Red1,LOW);
  digitalWrite(Red2,LOW);
  digitalWrite(Verde,HIGH);
  barrera.write (0);                         //myServo.write(Angulo);
 
  if(valA1<500 && valA2>500){
    crossingState=ST_FLASHING1;
  }
  else if (valA1>500 && valA2<500){
    crossingState=ST_FLASHING2; 
  }
}

void crossingflashing1(int valA1, int valA2){
  digitalWrite(Red1,HIGH);
  digitalWrite(Red2,LOW);
  digitalWrite(Verde,LOW); 
  barrera.write (90);                      //myServo.write(Angulo);
  delay(500);  
  digitalWrite(Red1,LOW);
  digitalWrite(Red2,HIGH);
  digitalWrite(Verde,LOW); 
  barrera.write (90);                       // myServo.write(Angulo);
  delay(500); 

  if (valA1>500 && valA2<500){
    crossingState=ST_FLASHING3;   
  }
}

void crossingflashing2(int valA1, int valA2){
  digitalWrite(Red1,HIGH);
  digitalWrite(Red2,LOW); 
  digitalWrite(Verde,LOW);
  barrera.write (90);                        // myServo.write(Angulo); 
  delay(500);  
  digitalWrite(Red1,LOW);
  digitalWrite(Red2,HIGH);
  digitalWrite(Verde,LOW); 
  barrera.write (90);                       // myServo.write(Angulo); 
  delay(500); 

  if (valA1<500 && valA2>500){
    crossingState=ST_FLASHING3;
  }
  }

 void crossingflashing3(int valA1, int valA2){
  digitalWrite(Red1,HIGH);
  digitalWrite(Red2,LOW);
  digitalWrite(Verde,LOW);
  barrera.write (0);                          // myServo.write(Angulo);
  delay(500);  
  digitalWrite(Red1,LOW);
  digitalWrite(Red2,HIGH);
  digitalWrite(Verde,LOW);
  barrera.write (0);                          // myServo.write(Angulo); 
  delay(500); 

  if (valA1>500 && valA2>500){
    crossingState=ST_OFF;
  }
  } 

@sevillalva podrías poner el link a los FC-51 que estás usando?
Me llama la atención que uses analogRead() para un módulo que, hasta donde conozco, es digital.

Saludos

Bueno lo puede hacer acota <500 como LOW y >500 como HIGH, las lecturas son 0 y 1023 , la cosa funciona.

Pero... ¿ No se mueve el servo para nada? o ¿no hace lo que debe hacer ?

hola para @ gatul, este es el que uso FC-51 IR obstáculo
FC_51

Sensor infrarrojo del módulo de evitación de obstáculos del IR de reflexión, según el código que saque de esta pagina esta en analogRead pinchado.
foto Crossing

Pagina "DIY and Digital Railroad"
Youtube: Arduino Crossing Signal for Model Trains

Hola para @gonpezzi no se mueve nada pero los leds si hacen su función
según usted en que sitio lo tendría que poner ?

(else if (valA1<500 && valA2>500){
// aquí entre la linea 99 y 100
    crossingState=ST_FLASHING3; // if sensePin2 is tripped the program switches to Flashing 2
  }

Gracias a los dos.

Estan bien donde estan pero siento decirte que a mi con ese codigo, si me mueve un servo. ¿ lo has conectado bien al pin 9 ?.
Por otro lado la funcion crossingState=ST_FLASHING3 no deberia ser asi:

void crossingflashing3(int valA1, int valA2) {
  Serial.println ("crossingflashing3");
  digitalWrite(Red1, HIGH);
  digitalWrite(Red2, LOW);
  digitalWrite(Verde, LOW);
  barrera.write (90);                          // myServo.write(Angulo);
  delay(500);
  digitalWrite(Red1, LOW);
  digitalWrite(Red2, HIGH);
  digitalWrite(Verde, LOW);
  barrera.write (90);                          // myServo.write(Angulo);
  delay(500);

  if (valA1 > 500 && valA2 > 500) {
    crossingState = ST_OFF;
  }
}

es decir barrera cerrada hasta que los dos sensores esten a uno, (ha pasado el tren).

EDITO: No me habia leido el datasheet del sensor y no tuve encuenta que va en logica invertida, corrijo todo.

¿Es en serio?
Que funcione no quiere decir que esté bien.
Solo los 18 useg en promedio que tarda la conversión A-D y que además es bloqueante, es suficiente motivo para no usarlo.

¿Usarías un dimmer para encender (a tope) y apagar una lámpara o usarías una tecla?
Porque funcionar, funciona.

Saludos

No digo que sea lo mejor, obiamente deberia usar pines digitales, pero funcionar funciona.
Sin embargo es curioso que una maquina de estados tan perfecta para un cruce de doble via use esos pines. Sin duda eso es parte de un proyecto mayor y el autor andaba escaso de pines.
Saludos

Ya hemos discutido el tema de medidor sensores digitales como análogos. Es algo que se le pasa al autor por desconocimiento.
Lo que @anon90500195 te quiere decir es que te conviene usar los FC51 como sensores digitales, ya que eso son.
Puedes leerlos con A0 y A1 pero como entradas digitales y ganaras en velocidad de respuesta.

Ahora ve por pasos.
Has verificado que los sensores responden bien?
Has probado por separado el servo y tmb se mueve como es de esperar?

Para @gonpezzi. ya lo he cambiado a digital y funciona igual, pin14 y pin15 como entradas, bueno los leds rojos y verde, pero el servo sigue sin funcionar.

Para @Surbyte. si he verificado los sensores tanto analógico A1,A2 y digital 14,15 (creo que 14,15 son digitales?) y funcionan bien a derecha e izquierda, al servo lo he cambiado de posición todos, 0º, 90º,180º en ( posición y en digitalWrite) y sigue sin funcionar, este cruce funciona cuando el tren va de derecha (enciende Red1,Red2 apaga Verde) a izquierda y cuando a pasado (apaga Red1,Red2,enciende Verde) y cuando el tren va de izquierda a derecha funciona igual.

Ahora voy a probar lo siguiente montarlo todo en una (Terminal Shield Tarjeta de expansión de E/S para Arduino para Nano) para ver que ocurre y si fallan los servos (he probado 2 sg90), mientras tanto seguiré probando cosas.

Gracias, y saludos.
(el tmb no se que significa?)
Nota, Lo alimentare con 5v , puedo hacer una derivación, para el Nano y el servo? y asin tendría el servo alimentación exterior?

No me has entendido.
A1 y A2 puedes usarlos como analógicos (lo que tu haces) o digitales (lo que no has hecho).
Es mas rapido hacerlo como digitales y además mas adecuado considerando que usas los FC51.
No hablo de usar otros pines, hablo de usar los mismos con una u otra funcionalidad.
Y por si no queda claro, con hacer en el setup esto

pinMode(A1, INPUT);
pinMode(A2, INPUT);

ya los tienes como entradas digitales y por supuesto obliga a cambiar la parte del código que los verifica usando digitalRead(pin)

Ya lo he probado y no funciona, pinMode(A1,INPUT) y digitalRead(A1) o digitalRead(sensePin1)
de la otra forma si que funciona como "int valA1=analogRead(sensePin1);"
Gracias, seguiré probando

Ahora lo reprogramo para que hagas otra prueba.

void loop() {
  int valA1=digitalRead(sensePin1); 
  int valA2=digitalRead(sensePin2);
  
  switch(crossingState)   {
    case ST_OFF:      
                      crossingoff(valA1, valA2);
                      break;
    case ST_FLASHING1:
                      crossingflashing1(valA1, valA2);
                      break;
    case ST_FLASHING2:
                      crossingflashing2(valA1, valA2);
                      break;
    case ST_FLASHING3:
                      crossingflashing3(valA1, valA2);
                      break;
  }
}

void crossingoff(int valA1, int valA2){
  digitalWrite(Red1,LOW);
  digitalWrite(Red2,LOW);
  digitalWrite(Verde,HIGH);
  barrera.write (0);                         //myServo.write(Angulo);
 
  if (!valA1 && valA2){
      crossingState = ST_FLASHING1;
  }
  else if (valA1 && !valA2){
      crossingState = ST_FLASHING2; 
  }
}

void crossingflashing1(int valA1, int valA2){
  digitalWrite(Red1,HIGH);
  digitalWrite(Red2,LOW);
  digitalWrite(Verde,LOW); 
  barrera.write (90);                      //myServo.write(Angulo);
  delay(500);  
  digitalWrite(Red1,LOW);
  digitalWrite(Red2,HIGH);
  digitalWrite(Verde,LOW); 
  barrera.write (90);                       // myServo.write(Angulo);
  delay(500); 

  if (valA1 && !valA2){
      crossingState = ST_FLASHING3;   
  }
}

void crossingflashing2(int valA1, int valA2){
    digitalWrite(Red1,HIGH);
    digitalWrite(Red2,LOW); 
    digitalWrite(Verde,LOW);
    barrera.write (90);                        // myServo.write(Angulo); 
    delay(500);  
    digitalWrite(Red1,LOW);
    digitalWrite(Red2,HIGH);
    digitalWrite(Verde,LOW); 
    barrera.write (90);                       // myServo.write(Angulo); 
    delay(500); 

    if (!valA1 && valA2){
      crossingState = ST_FLASHING3;
    }
}

void crossingflashing3(int valA1, int valA2){
  digitalWrite(Red1,HIGH);
  digitalWrite(Red2,LOW);
  digitalWrite(Verde,LOW);
  barrera.write (0);                          // myServo.write(Angulo);
  delay(500);  
  digitalWrite(Red1,LOW);
  digitalWrite(Red2,HIGH);
  digitalWrite(Verde,LOW);
  barrera.write (0);                          // myServo.write(Angulo); 
  delay(500); 

  if (valA1 && valA2){
    crossingState = ST_OFF;
  }
}

Hola a todos. @sevillalva ya el codigo que corregiste y publicaste en el post #6 FUNCIONABA, con este ultimo código propuesto por @Surbyte tabien debe funcionar. Solo repito la sugerencia hecha en el post# 11 , para que la maquina de estados funcione correctamente en la funcion "crossingflashing3" la barrera ha de estar a 90

barrera.write (90);  

Pero el servo se ha de mover, si no se mueve tal como lo tienes es porque algo estas conectando mal a nivel harware . revisa cuidadosamente las conexiones.
Saludos a todos.

Hola a todos, estoy muy contento y agradezco las ayudas que me habéis dado.
Ahora pongo el código y como ha quedado, para que otros lo use y funciona muy bien.

Gracias a todos (SOLUCIONADO)

// barrera de tren con 2 led rojos intermitentes y 1 led verde fijo.
// cuando la "barrera" esta subida el led verde se enciende y se apagan los leds rojos
// cuando la "barrera" esta abajo el led verde se apaga y enciende los leds rojos
// la "barrera" esta por poner sera activada con 1 servo

#include <Servo.h>

int sensePin1=A0;              // digital Pin A0 en arduino
int sensePin2=A1;              // digital Pin A1 en arduino
int Red1=6;                    // led Red1 intermitente en cruce (sube o baja, barrera)
int Red2=5;                    // led Red2 intermitente en cruce (sube o baja, barrera)
int Verde=7;                   // led Verde fijo en cruce paso de vehiculos

Servo barrera;  //Servo myServo;

void setup() {
  Serial.begin(9600);          // habilita la visualización de la salida del sensor
  pinMode(Red1,OUTPUT);        // establese los pines salida (OUTPUT)
  pinMode(Red2,OUTPUT);  
  pinMode(Verde,OUTPUT);
  pinMode(sensePin1,INPUT);    // establese los pines entrada (INPUT)
  pinMode(sensePin2,INPUT);
  barrera.attach(9);           // establece, barrera.attach en(Pin PWM (9);
  
}

enum CROSSINGSTATES
{
  ST_OFF,
  ST_FLASHING1,
  ST_FLASHING2,
  ST_FLASHING3,
};                                      // identifica los 4 crossing estados

CROSSINGSTATES crossingState=ST_OFF;    // estado predeterminado del cruce
void loop() {
  int valA1=digitalRead(sensePin1);     // lee y almacena el valor de los sensores
  int valA2=digitalRead(sensePin2);
  
  switch(crossingState)                 // esto es establecer a dónde va el programa cuando se lee un sensor
  {
    case ST_OFF:
    crossingoff(valA1, valA2);
    break;
    case ST_FLASHING1:
    crossingflashing1(valA1, valA2);
    break;
    case ST_FLASHING2:
    crossingflashing2(valA1, valA2);
    break;
    case ST_FLASHING3:
    crossingflashing3(valA1, valA2);
    break;
  }
}

void crossingoff(int valA1, int valA2){
  digitalWrite(Red1,LOW);
  digitalWrite(Red2,LOW);
  digitalWrite(Verde,HIGH);
  barrera.write (0);                          // barrera.write(Angulo);
 
  if(!valA1 && valA2){
    crossingState=ST_FLASHING1;               // si se activa el sensePin1, el programa cambia a Flashing 1
  }
  else if (valA1 && !valA2){
    crossingState=ST_FLASHING2;               // si se activa el sensePin2, el programa cambia a Flashing 2
  }
}

void crossingflashing1(int valA1, int valA2){
  digitalWrite(Red1,HIGH);
  digitalWrite(Red2,LOW);
  digitalWrite(Verde,LOW); 
  barrera.write (90);                         // barrera.write(Angulo);
  delay(500);                                 // Esta es la mitad de la señal intermitente y dura 0,5 segundos.
  digitalWrite(Red1,LOW);
  digitalWrite(Red2,HIGH);
  digitalWrite(Verde,LOW); 
  barrera.write (90);                         // barrera.write(Angulo);
  delay(500);                                 // Esto se repetirá hasta que se cumpla una condición que lo cambiaría

  if (valA1 && !valA2){
    crossingState=ST_FLASHING3;   
  }
}

void crossingflashing2(int valA1, int valA2){
  digitalWrite(Red1,HIGH);
  digitalWrite(Red2,LOW); 
  digitalWrite(Verde,LOW);
  barrera.write (90);                          // barrera.write(Angulo); 
  delay(500);                                  // Esta es la mitad de la señal intermitente y dura 0,5 segundos.
  digitalWrite(Red1,LOW);
  digitalWrite(Red2,HIGH);
  digitalWrite(Verde,LOW); 
  barrera.write (90);                          // barrera.write(Angulo); 
  delay(500);                                  // Esto se repetirá hasta que se cumpla una condición que lo cambiaría

  if (!valA1 && valA2){
    crossingState=ST_FLASHING3;
  }
  }

 void crossingflashing3(int valA1, int valA2){
  digitalWrite(Red1,HIGH);
  digitalWrite(Red2,LOW);
  digitalWrite(Verde,LOW);
  barrera.write (0);                           // barrera.write(Angulo);
  delay(500);                                  // Esta es la mitad de la señal intermitente y dura 0,5 segundos.
  digitalWrite(Red1,LOW);
  digitalWrite(Red2,HIGH);
  digitalWrite(Verde,LOW);
  barrera.write (0);                           // barrera.write(Angulo); 
  delay(500);                                  // Esto se repetirá hasta que se cumpla una condición que lo cambiaría

  if (valA1 && valA2){
    crossingState=ST_OFF;
  }
  }