Added a railway crossing project (#407)
This commit is contained in:
parent
aa6618894c
commit
fdf3d0e902
@ -85,6 +85,10 @@ Fun games to build with your @boardname@.
|
||||
"name": "Milky Monster",
|
||||
"url":"/projects/milky-monster",
|
||||
"imageUrl":"/static/mb/projects/milky-monster.jpg"
|
||||
}, {
|
||||
"name": "Railway crossing",
|
||||
"url":"/projects/railway-crossing",
|
||||
"imageUrl":"/static/mb/projects/railway-crossing.png"
|
||||
}]
|
||||
```
|
||||
|
||||
|
178
docs/projects/railway-crossing.md
Normal file
178
docs/projects/railway-crossing.md
Normal file
@ -0,0 +1,178 @@
|
||||
# Railway crossing
|
||||
|
||||
### ~
|
||||
|
||||
https://youtu.be/xBInZN2ZWRI
|
||||
|
||||
## Duration
|
||||
|
||||
7 steps, about 15-30 minutes each.
|
||||
|
||||
## Step 1: Light sensor
|
||||
|
||||
We are going to use the light sensor to detect if a train is passing. We will do this by detecting the shadow of the train.
|
||||
|
||||
Let's first explore how the light sensor works by downloading the following program onto our @boardname@.
|
||||
|
||||
```block
|
||||
input.onButtonPressed(Button.A, () => {
|
||||
basic.showNumber(input.lightLevel())
|
||||
})
|
||||
```
|
||||
|
||||
Now press button A and the @boardname@ responds with a number. This number indicates the amount of light that falls
|
||||
on the LEDs (yes, LEDs can also be used to detect light). If the number that you receive is either 255 or 0 it means
|
||||
the brightness sensor is initializing, so you need to press the button once more.
|
||||
|
||||
## Step 2: The scene
|
||||
|
||||
NOTE: If you do not possess a train, you can also use a car or even your hand to create a shadow.
|
||||
|
||||
Detecting a shadow can be a bit tricky. For this to work we need to have a bright lamp on the other side of the train,
|
||||
that is not too high. A desk lamp should work. Furthermore, we do not want too much light from other light sources,
|
||||
so you may have to close curtains or blinds and dim ceiling lamps.
|
||||
|
||||
You should now see a shadow of the train that is big enough to place your @boardname@ in. Make sure the board is laying
|
||||
down flat on the table and write down the amount of light that is measured in the shadow and the amount of light
|
||||
that is measured when there is no shadow. The number in the light should be at least 2 times the number in the shadow.
|
||||
|
||||
## Step 3: Detecting the train
|
||||
|
||||
![Train detection](/static/mb/projects/railway-crossing/railway-crossing-action.png)
|
||||
|
||||
We are going to turn on the top-left LED on our @boardname@ when a train is passing by.
|
||||
For this you need to pick a threshold. This should be a number that is roughly in between the
|
||||
two numbers you wrote down in step 2.
|
||||
For example, if the brightness in the shadow was 20 and in the light it was 60, you should use 40 as the threshold.
|
||||
|
||||
Add the following blocks to your program to make the top-left led indicate if a train is detected.
|
||||
Replace 40 with your threshold.
|
||||
|
||||
```block
|
||||
basic.forever(() => {
|
||||
if (input.lightLevel() < 40) {
|
||||
led.plot(0, 0)
|
||||
} else {
|
||||
led.unplot(0, 0)
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
Now try it out! If the led turns on even when no train passes, you should try lowering the threshold.
|
||||
If the led does not turn on when a train passes, you should try increasing the threshold.
|
||||
|
||||
NOTE: If you cannot get this to work reliably, you can still continue with the rest of the steps and
|
||||
close the railway crossing using a button.
|
||||
|
||||
## Step 4: Making the lights
|
||||
|
||||
For the lights we need the following materials:
|
||||
|
||||
- A piece of cardboard (There is nothing wrong with recycling!)
|
||||
- Two red LEDs, preferably 5mm with diffused light and long connectors
|
||||
- A resistor that roughly matches the LEDs at 3 Volt
|
||||
- Crocodile clips
|
||||
- glue
|
||||
- tape
|
||||
|
||||
https://youtu.be/No1qK51tHNQ
|
||||
|
||||
The movie shows how to build the pole. A short summary:
|
||||
- Build the pole using cardboard
|
||||
- Put a resistor at the bottom of the pole and add 2 LEDs in parallel above it.
|
||||
These LEDs should be placed in opposite directions.
|
||||
- Use the crocodile clips to complete the circuit.
|
||||
- Now connect the circuit to the 3V and GND pins of the @boardname@. One of the LEDs should now light up.
|
||||
- Swap the crocodile clips and now the other LED should light up.
|
||||
|
||||
## Step 5: Making the lights blink
|
||||
|
||||
Now we are going to program the @boardname@ to make the LEDs blink like a railway crossing. For this we are
|
||||
going to connect the lights from the previous step to pins 1 and 2 of the @boardname@.
|
||||
|
||||
We can turn on one LED by writing a digital 1 to one pin and a digital 0 to the other
|
||||
(digital 1 means 3 Volt, digital 0 means GND). The other LED can be turned on by swapping 0 and 1.
|
||||
Now use the following program to make the lights blink indefinitely.
|
||||
|
||||
```block
|
||||
basic.forever(() => {
|
||||
pins.digitalWritePin(DigitalPin.P1, 1)
|
||||
pins.digitalWritePin(DigitalPin.P2, 0)
|
||||
basic.pause(300)
|
||||
pins.digitalWritePin(DigitalPin.P1, 0)
|
||||
pins.digitalWritePin(DigitalPin.P2, 1)
|
||||
basic.pause(300)
|
||||
})
|
||||
```
|
||||
|
||||
## Step 6: Programming the railway crossing
|
||||
|
||||
In order to make a safe railway crossing, we want the railway crossing to keep the lights
|
||||
flashing for 5 more times after a train is no longer detected.
|
||||
This means that our program needs to remember how many flashes are remaining.
|
||||
For this we use a variable called `flashes_remaining`.
|
||||
When a train is detected, we set this variable to 5 and after each flash,
|
||||
we subtract 1 from the variable until it reaches 0. Then the flashing stops.
|
||||
|
||||
We also want to manually close the railway when button B is pressed.
|
||||
First of all, remove the forever block from step 5. Then add the following code:
|
||||
|
||||
```block
|
||||
let flashes_remaining = 0
|
||||
|
||||
input.onButtonPressed(Button.B, () => {
|
||||
flashes_remaining = 5
|
||||
})
|
||||
|
||||
basic.forever(() => {
|
||||
while (flashes_remaining > 0) {
|
||||
pins.digitalWritePin(DigitalPin.P1, 0)
|
||||
pins.digitalWritePin(DigitalPin.P2, 1)
|
||||
basic.pause(300)
|
||||
pins.digitalWritePin(DigitalPin.P1, 1)
|
||||
pins.digitalWritePin(DigitalPin.P2, 0)
|
||||
basic.pause(300)
|
||||
flashes_remaining += -1
|
||||
pins.digitalWritePin(DigitalPin.P1, 0)
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
The lights will now flash for 5 times when button B is pressed.
|
||||
You can now go ahead and add blocks to the train detection program from step 3 to start flashing the lights
|
||||
when a train is detected.
|
||||
|
||||
## Step 7: Adding the barrier
|
||||
|
||||
![Railway crossing with servo](/static/mb/projects/railway-crossing/railway-crossing-with-servo.jpg)
|
||||
|
||||
For the barrier you need:
|
||||
|
||||
- An SG90 9g servo, [equipped with crocodile clips](../device/servo)
|
||||
- A straw (preferably white)
|
||||
- Some red tape for decoration
|
||||
|
||||
### Instructions
|
||||
|
||||
- Glue the servo to the pole
|
||||
- Glue a strip of cardboard over it for stability
|
||||
- Tape the straw to the servo
|
||||
- Add the instructions below at the right location in your program
|
||||
- Connect the servo to the 3V, GND and PIN0 as shown in the simulator
|
||||
|
||||
#### Open the barrier
|
||||
```block
|
||||
pins.servoWritePin(AnalogPin.P0, 90)
|
||||
```
|
||||
|
||||
#### Close the barrier
|
||||
```block
|
||||
pins.servoWritePin(AnalogPin.P0, 180)
|
||||
```
|
||||
|
||||
Good luck and have fun!
|
||||
|
||||
### ~
|
||||
|
||||
## about the author
|
||||
This project was contributed by Johan Gorter [@JohanGorter](https://twitter.com/JohanGorter).
|
BIN
docs/static/mb/projects/railway-crossing.png
vendored
Normal file
BIN
docs/static/mb/projects/railway-crossing.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.3 MiB |
BIN
docs/static/mb/projects/railway-crossing/railway-crossing-action.png
vendored
Normal file
BIN
docs/static/mb/projects/railway-crossing/railway-crossing-action.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.3 MiB |
BIN
docs/static/mb/projects/railway-crossing/railway-crossing-with-servo.jpg
vendored
Normal file
BIN
docs/static/mb/projects/railway-crossing/railway-crossing-with-servo.jpg
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 276 KiB |
BIN
docs/static/mb/projects/railway-crossing/railway-crossing.png
vendored
Normal file
BIN
docs/static/mb/projects/railway-crossing/railway-crossing.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 594 KiB |
Loading…
Reference in New Issue
Block a user