Our goal was to develop something that would enhance the EF train system. We created a gate that would prevent cars from driving onto the track before a train passes, keeping them from being hit.
Step 1: Step 1: Wiring
First we had to figure out our circuitry. All of our schematics were derived from the booklet that came along with the provided raspberry pi, following the wiring for LED lights, motion detectors, and timers.
Step 2: Step 2: Construction
Next we 3-D printed and constructed the arms themselves. The "railway cross" and the housing for the LED lights were 3-D printed, and the arms, base and stem were made out of small pieces of wood. All of our pieces were taped or glued together, and then finally the arms was attached to a provided servo.
Step 3: Step 3: Coding
The following is the code for our project. We used our knowledge from EF 230, suggestions from the booklet, and code found the research in order to get the motion detector working, and then using that data to activate the gate.
clear all; close all; format compact; clc; display('Default delay for re-raising gates is set to 10 seconds.'); display('To change this, modify ''gate_delay'' variable.'); display('See details in annotation below.'); display('Note: To disable program and reset, press CTRL-C, manually'); display('reset gates, change variable, and start program again'); pause(5); gates_state = 0; % 0 for open; 1 for closed; % lights_state = 0; ALARM = 21; % input pin from PIR Motion Sensor
mypi = raspi('169.254.0.2','pi','raspberry') s = servo(mypi,18,'MinPulseDuration',5e-4,'MaxPulseDuration',2.5e-3);
gate_delay = 10; % value in seconds; gives how many seconds that no motion % has been detected before raising the gates counter = 0;
while true % clc; % tic % used for timing loop cycle; goes with 'toc' below pin_state = readDigitalPin(mypi,ALARM); % 1 means no motion % 0 means motion % pin_state = 0; % used for testing loop cycle time pause(0.1);
if pin_state == 0 display('MOTION!!!'); display('LOWER GATES!!!'); writeDigitalPin(mypi,17,1) display('Started blinking!'); counter = 0; lower_gates(s,gates_state); gates_state = 1; pause(1); else counter = counter + 1; pause(1); end
if counter == double(int8(gate_delay./1.1343)) display('NO MOTION!!!'); display('RAISE GATES!!!'); writeDigitalPin(mypi,17,0); counter = 0; raise_gates(s,gates_state); gates_state = 0; pause(1) end % x = toc % used for timing loop cycle; used with 'tic' above % break % used for timing loop cycle with 'tic' and 'toc'
end end % main
if gates_state == 0 for i = 20:0.5:90 writePosition(s,90-i) end gates_state = 1; end
end % lower_gates
if gates_state == 1 for i = 20:0.5:90 writePosition(s,i) end gates_state = 0; end
end % raise_gates
% function flash_lights(lights_state) % % warning_lamps = 21; % % while true % writeDigitalPin(mypi,warning_lamps,1); % pause(0.5); % writeDigitalPin(mypi,warning_lamps,0); % pause(0.5); % end % % end % flash_lights
Step 4: Step 4: Put It Together
Finally, place the apparatus around the track so that there are gates on each side of the tracks in order to prevent cars on both sides from trying to cross in front of a train. Once everything is set up, run the train and lower the gates.