Relé 50 miliseg On después Off

Hola:

A ver si me podéis, por favor, ayudar!!

Estoy intentando hacer un cambio de vias para la maqueta de tren que funcione automáticamente.

Se trata de que si un detector de IR detecta un tren, el cambio de vía anterior cambie para evitar colisión.

Para ello estoy intentando utilizar 2 relés y sensor IR.

El problema de los cambios de vias es que utilizan corriente alterna de 15 vol y que necesitan un pulso de unos 50 milseg y después para evitar que se queme la bobina que los acciona, deben ser puestos en off .

Para ello estoy utilizando 2 Reles (1 y 2) y un sensor de IR

Si Sensor IR low (hay obstaculo) R 1 ON 50 milseg y después Off para evitar que se queme, pero entra en bucle y hace esto constantemente. Lo paro algo con delay de 5 seg.

Si el Sensor IR high (no obstaculo en la vía) R2 fuerza el cambio ON 5 milseg y despúes OFF para evitar que se a queme pero entra en bucle (lo para con delay 5 seg)

A alguien se le ocurre algo para solucionarlo??

Me gustaría que si hay un obstáculo R1 On 50 milseg y después OFF, y que pare. Si desaparece el obstaculo, que vuelva a esa posición inicial y pare.

Gracias por adelantado...!!!

Adjunto programa:

// IR Obstacle Collision Detection Module


int isObstaclePin = 2; // This is our input pin
int isObstacle = HIGH; // HIGH MEANS NO OBSTACLE
int RELE1 = 3;  
int RELE2 = 4;  
int LedROJO= 5;
int LedVERDE= 6;

void setup() {

pinMode(isObstaclePin, INPUT);
pinMode(RELE1, OUTPUT);  
pinMode (LedROJO,OUTPUT);
pinMode(RELE2, OUTPUT); 
pinMode (LedVERDE,OUTPUT);
  
  Serial.begin(9600);

}

void loop() {
  isObstacle = digitalRead(isObstaclePin);
  if (isObstacle == LOW) {
      
Serial.println("Tren en la Via!!");

digitalWrite(RELE1, HIGH); // apagado del modulo de rele con un nivel alto
digitalWrite(LedROJO, LOW);

delay(50);     
 
digitalWrite(RELE1, LOW);// activacion del modulo de rele con un nivel bajo
digitalWrite(LedROJO, HIGH);
digitalWrite(LedVERDE, LOW);
delay(5000); 

  } 
  
  else {
Serial.println("Despejado");


digitalWrite(RELE2, HIGH);
digitalWrite(LedVERDE, HIGH);
digitalWrite(LedROJO, LOW);   

delay(50);
digitalWrite(RELE2, LOW);
delay(5000); 
  
        }
 
}

Lee las normas del foro y edita tu post usando etiquetas, cuando lo hagas al menos yo te responderé.

Tendrías que tener una variable de control que indicara en que posición esta la vía. Si detecta el tren pero la vía ya esta en la posición adecuada que no la intente mover, y al revés, que si no hay tren pero la vía ya esta en su sitio que tampoco haga nada.

En el mundo real faltaría un sensor que indicara la posición real de la vía, y que al compararlo con la variable mencionada pudiera avisar de un mal funcionamiento del sistema y parar los trenes.

mueve_via_a-posicion_1();

posicionvia=1;


loop

si detecta_tren y posicionvia es 1(
    mueve_via_a_posicion_2()
    posicionvia=2)

Si no detecta_tren y posicionvia es 2(
    mueve_via_a_posicion_1()
    posicionvia=1)

Veo que estas muy verde programando @Alf66.
Deberías ponerte a leer mas guias/tutoriales de Arduino.
Mi consejo es que vayas a Documentación y mires el primer hilo Indice de temas tutoriales y luego veas Youtube y libros.

Aunque la respuesta que te dieron creo que esta mas orientada a un buen control de vias, al menos con lo que has planteado te dará un empujón aunque luego verás que puede no ser suficiente.

// IR Obstacle Collision Detection Module

const byte isObstaclePin = 2;    // pin del sensor IR
bool isObstacle          = true; // HIGH significa no hay obstáculo
bool isObstacleAnt       = false;
const byte RELE1         = 3;  
const byte RELE2         = 4;  
const byte LedROJO       = 5;
const byte LedVERDE      = 6;
byte estado1 = 0, estado2 = 0;
unsigned long start;

void setup() {

  pinMode(isObstaclePin, INPUT);
  pinMode(RELE1, OUTPUT);  
  pinMode (LedROJO,OUTPUT);
  pinMode(RELE2, OUTPUT); 
  pinMode (LedVERDE,OUTPUT);
  Serial.begin(9600);

}

void loop() {

  isObstacle = digitalRead(isObstaclePin);
  if (isObstacle == LOW) {
      if (!isObstacle && isObstacleAnt) 
          estado1 = 0;
      switch(estado1) {
        case 0: Serial.println("Tren en la Via!!");
                digitalWrite(RELE1,   HIGH);    // apagado del modulo de rele con un nivel alto
                digitalWrite(LedROJO, LOW);
                start = millis();
                estado1 = 1;
                break;
        case 1: if (millis() - start > 50UL) {      // espero 50 mseg para siguiente estado
                    digitalWrite(RELE1,   LOW);     // activacion del modulo de rele con un nivel bajo
                    digitalWrite(LedROJO, HIGH);
                    digitalWrite(LedVERDE,LOW);
                }
                estado1 = 2;
                break;
        default: break;
      }
  } 
  else {
      if (isObstacle && !isObstacleAnt) 
          estado2 = 0;
      switch(estado2) {
        case 0: Serial.println("Despejado");
                digitalWrite(RELE2, HIGH);
                digitalWrite(LedVERDE, HIGH);
                digitalWrite(LedROJO, LOW); 
                start = millis();
                estado2= 1;
                break;
        case 1: if (millis() - start > 50UL) {      // espero 50 mseg para siguiente estado
                    digitalWrite(RELE2, LOW);
                }
                estado2 = 2;
                break;
        default: break;
      }
  }
  isObstacleAnt = isObstacle;
}

Gracias a los 2. probaré...

Y Surbyte, llevas razón, estoy verde en programación.... pero aprendo rápido jejeejj..

Veremos.. si te saltas años.... siempre quedan huecos.

Libro y a estudiar.