I’ve been fiddling with this for quite some time. My initial experiments didn’t work out too well as the IR sensors didn’t like the waterproofing and the “stainless” steel wire I was using rusted out.
But here’s some progress
The servos are mounted in the bottom of a set of LGB crossing gates.
The servos are controlled by an Arduino board.
The program is set up to close the gates when a trigger is sensed (currently a reed switch). Then it starts counting to three seconds and monitors the switch. If another trigger occurs within the three seconds, the timer starts over. Once no trigger has been sensed for three seconds, the gates raise.
Here’s a circuit drawing
Here’s the Arduino sketch
// include the servo header file #include <Servo.h> // create servo object to control a servo Servo myservo1; Servo myservo2; // constants for pins const int buttonPin = 1; const int servo1Pin = 2; const int servo2Pin = 3; const int ledPin = 13; // variables boolean gateClosed = false; int buttonState = 0; int pos = 80; int oppos = 0; long detectTime; long t; //setup routine void setup(){ // initialize the LED pin as an output: pinMode(ledPin, OUTPUT); // initialize the pushbutton pin as an input: pinMode(buttonPin, INPUT); // set the LED to off digitalWrite(ledPin, LOW); // initialize the servo pin as a servo myservo1.attach(servo1Pin); myservo2.attach(servo2Pin); } // main program loop void loop(){ // read the button buttonState = digitalRead(buttonPin); // if the button state is HIGH then the switch is closed if (buttonState == HIGH){ // set time of switch closed detection detectTime=millis(); //call the closeGate subroutine closeGate(); } // set t to the value of current time minus // switch detection time t= millis()-detectTime; //check if it has been more than 4 seconds since the // last switch closed detection if (gateClosed==true && t>=3500 ){ // call the openGate subroutine openGate(); } } // subroutine to close the gates void closeGate(){ // only run if the gate state is open if (gateClosed==false){ //set the LED "on" for visual feedback' digitalWrite(ledPin, HIGH); //run the servo to the closed position for (pos = 80; pos >= 0; pos -= 1) { myservo1.write(pos); oppos = (pos*1.375); myservo2.write(oppos); delay(30); } } //set the gate state to closed gateClosed=true; } // subroutine to open the gates void openGate(){ // only run if the gate state is open if (gateClosed==true){ //set the LED "on" for visual feedback' digitalWrite(ledPin, LOW); //run the servo to the open position for (pos = 0; pos <= 80; pos += 1) { myservo1.write(pos); oppos = (pos*1.375); myservo2.write(oppos); delay(30); } } //set the gate state to open gateClosed=false; }