Gordons Projects

--> Projects Top-Level GIT

Initial GIT submission
[pibrella] / tuxx.sh
1 #!/bin/bash
2
3 # tuxx:
4 #       Tux Crossing. A variant on the UK "Pelican" crossing for
5 #       pedestrians going over roads.
6 #
7 #       This version designed to be used with the Pibrella board.
8 #
9 #       There is a set of Red, Yellow (sometimes called amber) and
10 #       Green traffic lights to control the traffic, and a "Red Man"
11 #       and "Green Man" indicators for pedestrians, and a button for
12 #       them to push.
13 #       Push the button and the lights cycle to Red, then the Green Man
14 #       comes on (often with a beeping sound), then afte a short while
15 #       the Green man starts to flash, meaning to not start crossing,
16 #       and the Yellow traffic light flashes too - meaning that if the
17 #       crossing is clear, traffic can pass... Then after a few more seconds
18 #       the flashing stops and it revers to Go for traffic and Stop for
19 #       pedestrians.
20 #
21 #       Gordon Henderson, June 2012 (Updated 2014 for the Pibrella)
22
23 red=2
24 yellow=0
25 green=7
26
27 button=14
28
29 # No separate red/green men - we'll use the secondary outputs which are
30 #       white, but they'll have to do.
31
32 redMan=3        # Top one
33 greenMan=6      # Bottom one
34
35 # tuxxSetup:
36 #       Initialise the LEDs for the crossing
37 #######################################################################
38
39 tuxxSetup ()
40 {
41   for led in $red yellow $green $greenMan $redMan
42   do
43     gpio mode $led out
44     gpio write $led 0
45   done
46
47   gpio mode $button in
48   gpio mode $button down        # Enable pull-down
49
50   gpio write $green    1
51   gpio write $redMan   1
52   gpio write $greenMan 0
53   gpio mode  1 pwm
54   gpio pwm-ms
55 }
56
57
58 # waitButton:
59 #       Wait for the button to be pressed. 
60 #######################################################################
61
62 waitButton ()
63 {
64   echo -n "Waiting for button ... "
65   while [ `gpio read $button` = 0 ]; do
66     sleep 0.1
67   done
68   echo "Got it"
69 }
70
71 # stopTraffic:
72 #       Cycle the traffic lights from Green to Red
73 #######################################################################
74
75 stopTraffic ()
76 {
77   echo -n "Stopping traffic ... "
78   gpio write $green  0
79   gpio write $yellow 1
80   sleep 2
81   gpio write $yellow 0
82   gpio write $red    1
83   sleep 2
84   echo "Stopped"
85 }
86
87 # peep:
88 #       Output a brief "peep" on the buzzer
89 #######################################################################
90
91 peep ()
92 {
93   gpio pwmr 600
94   gpio pwm  1 300       # 1000Hz
95   sleep 0.1
96   gpio pwm  1 0
97   sleep 0.1
98 }
99
100
101 # walk:
102 #       Signal the red/green man to walk and when time is up,
103 #       start the traffic light sequence to let the traffic move again
104 #######################################################################
105
106 walk ()
107 {
108   echo "Walk now ... "
109   gpio write $redMan   0
110   gpio write $greenMan 1
111   for i in `seq 10 -1 0`; do
112     echo -n $i " "
113     for j in 0 1; do
114       peep
115     done
116   done
117   gpio write $red    0
118   gpio write $yellow 1
119   echo "Walked"
120 }
121
122 # graceTime:
123 #       This is the time when the green man is flashing, and the yellow
124 #       traffic light is also flashing - to signal to pedestrians to not
125 #       start to cross and to drivers that they can move on if the 
126 #       crossing is clear.
127 #######################################################################
128
129 graceTime ()
130 {
131   echo "Grace time ... "
132   for i in `seq 0 7` ; do
133     sleep 0.5
134     gpio write $greenMan 0
135     gpio write $yellow   0
136     sleep 0.5
137     gpio write $greenMan 1
138     gpio write $yellow   1
139   done
140   echo "time up!"
141 }
142
143 # startTraffic:
144 #       Back to the Red Man and Green traffic light
145 #######################################################################
146
147 startTraffic ()
148 {
149   echo "Starting traffic ... "
150   gpio write $greenMan 0
151   gpio write $redMan   1
152   sleep 0.5
153   gpio write $yellow 0
154   gpio write $green  1
155   echo "Going"
156 }
157
158
159 #######################################################################
160 # The main program
161 #       Call our setup routines once, then sit in a loop, waiting for
162 #       the button to be pressed then executing the sequence.
163 #######################################################################
164
165 tuxxSetup
166
167 while true; do
168   waitButton
169   stopTraffic
170   walk
171   graceTime
172   startTraffic
173 done