In India, 61% of railway related fatalities are attributed to accidents at Unmanned Level Crossings as shown in fig.1.
Nearly two thirds of the total number of Level crossing accidents occur at unmanned Level Crossings and this proportion has been increasing ever since.
There are many ways to solve this problem. One solution could be to use manned crossing. Other one could be to use over bridges. But they have some drawbacks like making it manned will need more man power, cost, etc.
Moonpreneur students has created a passion project to solve this problem.
The project requires following items.
(Any other object can also be used to mimic the action of train)
Microbit Breakout Board | IR Sensor 1 | |
3.3V | VCC | |
GND | GND | |
P0 | OUT | |
Microbit Breakout Board | IR Sensor 2 | |
3.3V | VCC | |
GND | GND | |
P1 | OUT | |
NOTE: Calibrate the IR sensors by rotating the potentiometer such that it can sense the train/object from some appropriate distance.
Microbit Breakout Board | Servo Motor | |
3.3V | VCC | |
GND | GND | |
P2 | Sig | |
NOTE: Make sure that the arm of servo is mounted vertically (facing upwards) when the servo is at 0 degree position in order to get it horizontal when rotated to 90 degree.
The code monitors the passage of trains using infrared sensors. When a train enters the monitored area, it increments the count and closes the servo-controlled gate. When the train exits, it opens the gate.
# Imports go at the top from microbit import * #***************************** class Servo: def __init__(self, pin, freq=50, min_us=600, max_us=2400, angle=180): self.min_us = min_us self.max_us = max_us self.us = 0 self.freq = freq self.angle = angle self.analog_period = 0 self.pin = pin analog_period = round((1/self.freq) * 1000) # hertz to miliseconds self.pin.set_analog_period(analog_period) def write_us(self, us): us = min(self.max_us, max(self.min_us, us)) duty = round(us * 1024 * self.freq // 1000000) self.pin.write_analog(duty) sleep(100) self.pin.write_digital(0) # turn the pin off def write_angle(self, degrees=None): if degrees is None: degrees = math.degrees(radians) degrees = degrees % 360 total_range = self.max_us - self.min_us us = self.min_us + total_range * degrees // self.angle self.write_us(us) #*********************************** # Initialize servo motor on pin 2 sv1 = Servo(pin2) sv1.write_angle(0) # Set initial angle of servo to 0 degrees # Initialize variables to keep track of last state of IR sensors and train count lastIR1state = 1 lastIR2state = 1 count = 0 # Function to handle actions when train enters def entered(): global lastIR2state while True: IR2state = pin1.read_digital() # Read digital value from IR sensor 2 if IR2state != lastIR2state: # Check if state of IR sensor 2 has changed if IR2state == 1: # If train exits (IR sensor detects no train) print("Train Exits") sv1.write_angle(0) # Set angle of servo to 0 degrees (open position) sleep(200) # Pause for 200 milliseconds lastIR2state = IR2state # Update lastIR2state to current state break # Exit the loop # Main loop to continuously check state of IR sensor 1 while True: IR1state = pin0.read_digital() # Read digital value from IR sensor 1 if IR1state != lastIR1state: # Check if state of IR sensor 1 has changed if IR1state == 0: # If train enters (IR sensor detects train) print("Train Entered") sv1.write_angle(90) # Set angle of servo to 90 degrees (closed position) sleep(200) # Pause for 200 milliseconds count += 1 # Increment train count lastIR1state = IR1state # Update lastIR1state to current state display.show(count) # Display current train count on LED display entered() # Call the entered function to handle train exit
Many pins of breakout board are available to add more features like a railway crossing sign.
References: