The deadline for handing in your 4 class projects is 05/05/11
This date is after the Easter holidays so I suggest that you do as much as possible before the holidays so that you can come back and ask me questions. We will use the work you do here next year as one of your practical NABS. The more work and effort you put into this now, the easier you will pass this unit. It is also very imporant that you can problem solve following these steps so that you are properly prepared for any question in the exam.
I feel that some people are a little confused by what you need to include so hopefully this more thorough guide will help. I am going to use question 14 from the homework as my example.
Project Brief:
This is the question that you are trying to answer. You should copy it out so that I know which project you are doing and so that you can start thinking about it properly.
The layout of a new restaurant is quite spread out, with the kitchen quite far away from the restaurant. Design a system which could transport food quickly along a track between the two rooms.
System Diagram:
This is to help you work out the inputs and outputs that you are going to need to solve your project brief. Remember that if you use a motor, you may need to know where the output is i.e. a barrier lifting, or curtains closing, so you will need to add some sensors in. As these feed information into the microprocessor, they are also inputs.
In my example the buggy needs to stop when it gets to each location so I need two sensors. I also need another two buttons to "call" the buggy between rooms.
Flow Chart:
The flowchart is the planning stage to the program. This is where you work out the sequence you want to test inputs and switch on/off outputs. It should be completely in English, so use the terminology you have used in the system diagram, or words that explain what you are controlling easily.
Input/Output Table - Pin Diagram:
This is to decide which inputs and outputs you would like to connect to which pins. Remember that if you would like to use input switches you have to use 0,1,2 or 3 as these are the connections on the STAMP board. If you are using a motor which has to go both forwards and backwards, you need to use either pins 4&5 or 6&7.
PBASIC Program:
Now you have decided which pins you are going to use for which purpose, and you have decided on the sequence that you need to test inputs and switch on/off outputs in (flowchart). You need to convert each box of your flowchart into the PBASIC command required. You may find it useful to note in pencil next to each box of your flowchart the PBASIC command before writing the program completely.
init: let dirs = %11110000 'sets pins 7-4 as outputs
main: if pin1 = 0 then main 'waits for the restaurant call button to be pressed
rest: high 6 'switch on motor forwards
if pin3 = 0 then rest 'wait until buggy reaches the restaurant
low 6 'switch off motor
kit: if pin0 = 0 then kit 'waits for the kitchen call button to be pressed
to_kit: high 7 'switch on motor backwards
if pin2 = 0 then to_kit 'wait until buggy reaches the kitchen
low 7 'switch off motor
goto main 'loop back to start
You need to use white space comments (the text following the ' ) to explain what each line of the program means in English. In doing this you can also check back to your flowchart to make sure that your program follows the correct sequence.
Thursday, 31 March 2011
Monday, 28 March 2011
Blog Homework Answers
Use these answers to check through your homework and make sure you understand.
You must show that you can take information either from the blog or your class notes to answer questions in your own words or by problem solving.
You must show that you can take information either from the blog or your class notes to answer questions in your own words or by problem solving.
Thursday, 24 March 2011
Class Projects
Some tips in how to complete the class projects. Remember that you must complete at least 4.
First of all work out the inputs and outputs you will need. It may help you to draw a little picture (as I did in homework question 14) From this you can draw the system diagram, remember:
Real life input > input > microprocessor > T.D. > output > real life output
Now you can clearly see which inputs you need to test, and the outputs you need to control and you can write the flowchart to plan your sequence.
Remember the boxes required for a flowchart.
From your flowchart you should be able to find the correct PBASIC command for each part of the flowchart, in sequence.
ASK ANY QUESTIONS IF YOU ARE STUCK AT ANY POINT!
First of all work out the inputs and outputs you will need. It may help you to draw a little picture (as I did in homework question 14) From this you can draw the system diagram, remember:
Real life input > input > microprocessor > T.D. > output > real life output
Now you can clearly see which inputs you need to test, and the outputs you need to control and you can write the flowchart to plan your sequence.
Remember the boxes required for a flowchart.
From your flowchart you should be able to find the correct PBASIC command for each part of the flowchart, in sequence.
ASK ANY QUESTIONS IF YOU ARE STUCK AT ANY POINT!
Thursday, 17 March 2011
NEW feature! Reactions!
I have added some "reactions" to the blog. This allows you to quickly comment on how much you understand something. Please use this so that I can gauge how much people understand, and which areas I need to go over more.
You don't have to comment, and it's anonymous so please give me this feedback so that I can tailor my teaching to help you. If you would like me to go over something individually then leave a comment and I'll catch up with you :)
You don't have to comment, and it's anonymous so please give me this feedback so that I can tailor my teaching to help you. If you would like me to go over something individually then leave a comment and I'll catch up with you :)
Homework Due 22/3/11
You must write the answers to the following questions on a sheet of paper and hand it in on Tuesday 22nd March. (I know that you were all in class to hear this!)
- Which part of the microprocessor stores the program?
- What carries data from here to the ALU?
- What does EEPROM stand for and what is the advantage of using this type of ROM?
- Convert these numbers into binary:
- 24
- 208
- 7
- Convert these numbers into decimal:
- %10101111
- %11100110
- %11001
- Draw the flowchart box you need to use to "call" a sub-procedure from the main flowchart.
- Write a couple of lines of program which would test a start switch. Nothing should happen until the start switch is pressed.
- Write the whitespace comment for this line of programming: let dirs = %11101100
- Write a program which will turn a stepper motor 360 clockwise then 360 anticlockwise.
- What is the output voltage from the microprocessor? What is the voltage needed for a stepper motor? What do you need to use to ensure that the stepper motor will work properly?
- Write a program to slow down the speed of a DC motor to half its speed.
- Draw a system diagram for a warning light which comes on when it is too cold.
- What type of output driver do you use to control the direction of a motor? (not just "output driver" the type of output driver required)
- A restaurant's kitchen is far away from the restaurant so it uses a buggy system to transport food. The buggy is on a track. It starts in the kitchen and if the restaurant call button is pressed the buggy travels along the track until it hits the limit switch telling it that it is at the end of the track and it will stop. The buggy stays there until the kitchen call button is pressed, it travels back along the track until it hits the limit switch again telling it that it has reached the end of the track and the buggy will stop. Below is a sketch of this situation and the pin connections required.
- Draw a flowchart which will fulfill this brief
- Use your flowchart to write a program in PBASIC
Turning a Flowchart into a PBASIC Program
A flowchart is the planning stage for a program. It is important to use the correct shaped box so that it is clear when you are controlling an output, or asking a question etc. The flowchart is to help you understand the sequence so it is written in English.
The first flowchart is to practice asking about the condition of an input:
First you must choose which pins you are going to use as outputs and which as inputs. Looking at the board you know that pin 7 is a red LED and 5 is a green LED. I'm going to use pin 0 as my switch.
So I need to tell the microprocessor this:
init: let dirs = %10100000 'Sets pin 7 and 5 as outputs
Now I can write my main program. If I want to use English words, I must first of all tell the microprocessor this as well by setting the English words as symbols. If you prefer not to do this, use the black commands, if you would like to do this, follow the purple programming language.
To ask a question I need to use an IF . . . THEN . . . statement in relation to my input pin. Then I need to tell the microprocessor which bit of program to go to when my input is on, and when it is not. If the statement is not true, it will not go to the label which follows THEN but to the next line instead.
main: if pin0 = 1 then green_on 'Check the input pin, if it is on, go to the
'green_on sub-procedure.
goto red_on 'If the input pin is off, go to the
'red_on sub-procedure
red_on: high 7 high red 'Switch on the red LED
low 5 low green 'Switch off the green LED
goto main 'Loop back to the start to test the input
green_on: high 5 high green 'Switch the green LED on
low 7 low red 'Switch the red LED off
goto main 'Loop back to the start to test the input
The second flowchart incorporates testing an input and using a counter loop. To repeat something a certain number of times, you must use a temporary memory file in the RAM to store the number of times the loop has been repeated. Often we will use b0 for this purpose. Again, if you want to call b0 something in English you must use the symbol command.
The PBASIC language required to repeat a sequence is a FOR . . . NEXT loop. For must go at the top of the sequence and next at the bottom. Anything you write in between FOR and NEXT will be repeated.
Motors, as described earlier in the blog, must be connected using the push-pull driver on the output driver. 7&6 control one motor, and 4&5 control another motor if you require it. It is important to use the correct pairing to ensure that your motor will turn.
The program for this flowchart would therefore be:
init: let dirs = %11000000 'sets 7 and 6 as outputs
symbol counter = b0
main: if pin0 = 0 then main OR main: if pin0 = 1 then motor 'both of these statements check
goto main the input.
motor: for counter = 1 to 5 'Starts the loop to repeat 5 times
high 7 'motor clockwise on
pause 10000 'wait 10 seconds
low 7 'motor clockwise off
high 6 'motor anticlockwise on
pause 10000 'wait 10 seconds
low 6 'motor anticlockwise off
next counter 'If it has not been repeated 5 times, loop back to motor
end
The third flowchart is in two parts. This shows that the sequence uses a sub-procedure. Where "alarm" is in the main flowchart, it means that the whole of the alarm flowchart fits into that box. So from the main flowchart, the sequence goes to the start of alarm, and at the end of alarm it returns to the main program and follows the arrow back round to the start.
Here is the program:
init: let dirs = %10000000 'sets pin 7 as the output (buzzer)
main: if pin0 = 0 then alarm 'if the door is opened go to the sub-procedure alarm
if pin1 = 0 then alarm 'if the window is opened go to the sub-procedure alarm
if pin2 = 0 then alarm 'if the door mat is stepped on go to the sub-procedure alarm
goto main 'go back to the start and test the inputs again.
alarm: high 7 'buzzer on
pause 500 'wait half a second
low 7 'buzzer off
pause 500 'wait half a second
if pin3 = 0 then alarm 'test the reset switch, if it is not pressed then continue sounding the alarm
return / goto main 'return to the main program.
The first flowchart is to practice asking about the condition of an input:
First you must choose which pins you are going to use as outputs and which as inputs. Looking at the board you know that pin 7 is a red LED and 5 is a green LED. I'm going to use pin 0 as my switch.
So I need to tell the microprocessor this:
init: let dirs = %10100000 'Sets pin 7 and 5 as outputs
symbol green = 5
symbol red = 7 Now I can write my main program. If I want to use English words, I must first of all tell the microprocessor this as well by setting the English words as symbols. If you prefer not to do this, use the black commands, if you would like to do this, follow the purple programming language.
To ask a question I need to use an IF . . . THEN . . . statement in relation to my input pin. Then I need to tell the microprocessor which bit of program to go to when my input is on, and when it is not. If the statement is not true, it will not go to the label which follows THEN but to the next line instead.
main: if pin0 = 1 then green_on 'Check the input pin, if it is on, go to the
'green_on sub-procedure.
goto red_on 'If the input pin is off, go to the
'red_on sub-procedure
red_on: high 7 high red 'Switch on the red LED
low 5 low green 'Switch off the green LED
goto main 'Loop back to the start to test the input
green_on: high 5 high green 'Switch the green LED on
low 7 low red 'Switch the red LED off
goto main 'Loop back to the start to test the input
The second flowchart incorporates testing an input and using a counter loop. To repeat something a certain number of times, you must use a temporary memory file in the RAM to store the number of times the loop has been repeated. Often we will use b0 for this purpose. Again, if you want to call b0 something in English you must use the symbol command.
The PBASIC language required to repeat a sequence is a FOR . . . NEXT loop. For must go at the top of the sequence and next at the bottom. Anything you write in between FOR and NEXT will be repeated.
Motors, as described earlier in the blog, must be connected using the push-pull driver on the output driver. 7&6 control one motor, and 4&5 control another motor if you require it. It is important to use the correct pairing to ensure that your motor will turn.
The program for this flowchart would therefore be:
init: let dirs = %11000000 'sets 7 and 6 as outputs
symbol counter = b0
main: if pin0 = 0 then main OR main: if pin0 = 1 then motor 'both of these statements check
goto main the input.
motor: for counter = 1 to 5 'Starts the loop to repeat 5 times
high 7 'motor clockwise on
pause 10000 'wait 10 seconds
low 7 'motor clockwise off
high 6 'motor anticlockwise on
pause 10000 'wait 10 seconds
low 6 'motor anticlockwise off
next counter 'If it has not been repeated 5 times, loop back to motor
end
The third flowchart is in two parts. This shows that the sequence uses a sub-procedure. Where "alarm" is in the main flowchart, it means that the whole of the alarm flowchart fits into that box. So from the main flowchart, the sequence goes to the start of alarm, and at the end of alarm it returns to the main program and follows the arrow back round to the start.
Here is the program:
init: let dirs = %10000000 'sets pin 7 as the output (buzzer)
main: if pin0 = 0 then alarm 'if the door is opened go to the sub-procedure alarm
if pin1 = 0 then alarm 'if the window is opened go to the sub-procedure alarm
if pin2 = 0 then alarm 'if the door mat is stepped on go to the sub-procedure alarm
goto main 'go back to the start and test the inputs again.
alarm: high 7 'buzzer on
pause 500 'wait half a second
low 7 'buzzer off
pause 500 'wait half a second
if pin3 = 0 then alarm 'test the reset switch, if it is not pressed then continue sounding the alarm
return / goto main 'return to the main program.
Sunday, 13 March 2011
Stepper Motors
Stepper motors are motors which turn due electromagnetic coils pulling the axle round in a circle. There is an amination of this on this website:
Stepper Motor
This is useful for two reasons: you can make the stepper motor turn to a particular position and it has a "holding torque" meaning that as long as two of the magnets are energised it can hold something in position.
To make the stepper motor turn you must use a particular pattern to make sure that the coils energise in a circle. To make the stepper motor turn clockwise you type the pattern in as seen, to make it turn anticlockwise you simply use the same pattern but in reverse:
i.e.
symbol delay = b0
let delay = 100
clock: let pins = %10100000
pause delay
let pins = %10010000
pause delay
let pins = %01010000
pause delay
let pins = %01100000
pause delay
goto clock
anti: let pins = %01100000
pause delay
let pins = %01010000
pause delay
let pins = %10010000
pause delay
let pins = %10100000
pause delay
goto anti
Repeating like this will simply make the stepper motor turn continuously. By using b0 as the delay, we can quickly change the speed of the stepper motor by changing the value of "delay" The smaller the number the faster the motor will turn, but if you try to turn too quickly the magnets will not have time to pull the axle round so it may not turn at all.
To make the motor turn to a specific position, we must use a FOR . . . NEXT . . . loop. This will allow us to repeat the pattern a set number of times. Each line of the program is 7.5 degrees, so each 4 line pattern is 30 degrees. Therefore to turn one complete revolution we must repeat the pattern 12 times.
i.e.
symbol counter = b0
symbol delay = b1
let delay = 100
clock: for counter = 1 to 12
let pins = %10100000
pause delay
let pins = %10010000
pause delay
let pins = %01010000
pause delay
let pins = %01100000
pause delay
next counter
The stepper motor requires a 12v supply and the microprocessor can only supply a 5v signal. Therefore we must use an external power supply (a black box) to connect to our output driver.
Stepper Motor
This is useful for two reasons: you can make the stepper motor turn to a particular position and it has a "holding torque" meaning that as long as two of the magnets are energised it can hold something in position.
To make the stepper motor turn you must use a particular pattern to make sure that the coils energise in a circle. To make the stepper motor turn clockwise you type the pattern in as seen, to make it turn anticlockwise you simply use the same pattern but in reverse:
i.e.
symbol delay = b0
let delay = 100
clock: let pins = %10100000
pause delay
let pins = %10010000
pause delay
let pins = %01010000
pause delay
let pins = %01100000
pause delay
goto clock
anti: let pins = %01100000
pause delay
let pins = %01010000
pause delay
let pins = %10010000
pause delay
let pins = %10100000
pause delay
goto anti
Repeating like this will simply make the stepper motor turn continuously. By using b0 as the delay, we can quickly change the speed of the stepper motor by changing the value of "delay" The smaller the number the faster the motor will turn, but if you try to turn too quickly the magnets will not have time to pull the axle round so it may not turn at all.
To make the motor turn to a specific position, we must use a FOR . . . NEXT . . . loop. This will allow us to repeat the pattern a set number of times. Each line of the program is 7.5 degrees, so each 4 line pattern is 30 degrees. Therefore to turn one complete revolution we must repeat the pattern 12 times.
i.e.
symbol counter = b0
symbol delay = b1
let delay = 100
clock: for counter = 1 to 12
let pins = %10100000
pause delay
let pins = %10010000
pause delay
let pins = %01010000
pause delay
let pins = %01100000
pause delay
next counter
The stepper motor requires a 12v supply and the microprocessor can only supply a 5v signal. Therefore we must use an external power supply (a black box) to connect to our output driver.
Friday, 11 March 2011
Using Inputs
The next thing we need to learn about is how to use inputs in microprocessor control.
In real life there are a variety of different inputs we could test - switches, temperature sensors, light sensors, strain gauges (to measure how much something has been bent) etc. In class we are going to start by using simple switches:
Using the connections given we can only use pins 0-3 without adding any extra wiring.
Now that we are dealing with both inputs and outputs we have to make sure we set up the DDR (Data Direction Register) correctly:
init: let dirs = %11110000 'Sets pins 7, 6, 5, 4 as outputs, and 3, 2, 1, 0 as inputs
To "test" an input, we must ask about its state, i.e. whether it is on or off. In a flowchart we must do this using a rhombus box. Each question must be YES/NO.
Here is a flowchart using inputs, for a toy train which should travel along the track until it reaches the end. This system uses a start switch (pin 0) and an "end switch" (pin 1) as its inputs and a motor (pin 7) to drive the train.
This can be turned into a PBASIC program using "IF . . . THEN . . . "
init: let dirs = %11000000 'Sets pins 7 and 6 as outputs, and 5, 4, 3, 2, 1, 0 as inputs
main: if pin0 = 1 then train 'tests the start switch
goto main 'if the start switch is not pressed, go back to main
train: high 7 'switches on the motor
if pin1 = 0 then train 'tests to check if the motor has reached the end of the track
low 7 'switches off the motor.
end
If the IF . . . THEN . . . statement is true, it will go to the label stated. (following the then MUST be a label - another part of the program to go to). If the statement is not true, it will skip to the next line of the program. You can ask if the pin is '1' or '0' depending on what your flowchart says.
In real life there are a variety of different inputs we could test - switches, temperature sensors, light sensors, strain gauges (to measure how much something has been bent) etc. In class we are going to start by using simple switches:
Using the connections given we can only use pins 0-3 without adding any extra wiring.
Now that we are dealing with both inputs and outputs we have to make sure we set up the DDR (Data Direction Register) correctly:
init: let dirs = %11110000 'Sets pins 7, 6, 5, 4 as outputs, and 3, 2, 1, 0 as inputs
To "test" an input, we must ask about its state, i.e. whether it is on or off. In a flowchart we must do this using a rhombus box. Each question must be YES/NO.
Here is a flowchart using inputs, for a toy train which should travel along the track until it reaches the end. This system uses a start switch (pin 0) and an "end switch" (pin 1) as its inputs and a motor (pin 7) to drive the train.
This can be turned into a PBASIC program using "IF . . . THEN . . . "
init: let dirs = %11000000 'Sets pins 7 and 6 as outputs, and 5, 4, 3, 2, 1, 0 as inputs
main: if pin0 = 1 then train 'tests the start switch
goto main 'if the start switch is not pressed, go back to main
train: high 7 'switches on the motor
if pin1 = 0 then train 'tests to check if the motor has reached the end of the track
low 7 'switches off the motor.
end
If the IF . . . THEN . . . statement is true, it will go to the label stated. (following the then MUST be a label - another part of the program to go to). If the statement is not true, it will skip to the next line of the program. You can ask if the pin is '1' or '0' depending on what your flowchart says.
Tuesday, 8 March 2011
Today's Mini Test
Here are today's mini test answers:
1. What shape of box would you use to control an output in a flowchart?
2. What does the % sign mean? That the following number is in binary
3.a) Label the most significant bit: 10101010 (MSB is in red)
b) Which pin number is this? 7
4. a) What method of speed control do you have to use with a microprocessor? PWM - Pulse Width Modulation
b) Draw a graph to show a fast speed labeling the mark and space See the green graph below.
c) How would you alter this to make the motor turn slowly? Increase the space so that the mark to space ratio changes. The bigger the space the slower the motor will turn.
5. What is the value, in volts, of a "high" signal? 5V
6. What is b0? A memory file in the RAM where information can be stored whilst the program runs i.e. how many times a sequence has been repeated.
7. What is the name for the wires connecting the ROM to the ALU? The Program Bus
8. What connects the microcontroller to the "real world"? The I/O Port Input Output port
9. What unit of time does the microprocessor count in? Milliseconds (ms)
10. Draw a system diagram for a street lamp which will come on automatically at night.
You must show all the parts of the system in separate boxes with a system boundary around them, then real life inputs/outputs are not in boxes and outwith the system boundary.
Please leave a comment stating what part of today's test you found most difficult so that I can target my feedback to suit.
1. What shape of box would you use to control an output in a flowchart?
2. What does the % sign mean? That the following number is in binary
3.a) Label the most significant bit: 10101010 (MSB is in red)
b) Which pin number is this? 7
4. a) What method of speed control do you have to use with a microprocessor? PWM - Pulse Width Modulation
b) Draw a graph to show a fast speed labeling the mark and space See the green graph below.
c) How would you alter this to make the motor turn slowly? Increase the space so that the mark to space ratio changes. The bigger the space the slower the motor will turn.
5. What is the value, in volts, of a "high" signal? 5V
6. What is b0? A memory file in the RAM where information can be stored whilst the program runs i.e. how many times a sequence has been repeated.
7. What is the name for the wires connecting the ROM to the ALU? The Program Bus
8. What connects the microcontroller to the "real world"? The I/O Port Input Output port
9. What unit of time does the microprocessor count in? Milliseconds (ms)
10. Draw a system diagram for a street lamp which will come on automatically at night.
(I would accept "dark" as the real life input and "dark sensor" for the input transducer.)
Please leave a comment stating what part of today's test you found most difficult so that I can target my feedback to suit.
Thursday, 3 March 2011
Pneumatics Test
We recently sat the class test in Pneumatics. The answers are now deleted, I hope you found them useful.
Wednesday, 2 March 2011
Speed Control - Pulse Width Modulation
Because the microprocessor gives a digital signal out - either 5v or 0v and nothing in between, we must use Pulse Width Modulation (PWM) to control the speed of a D.C. motor.
This uses the Mark to Space ratio to vary the speed - that is the time a motor is on for (Mark) and the time the motor is off for (Space). This is in order of milliseconds so that it happens so quickly you can't see the pulse, only a constant speed.
Examples of the programs required for these graphs:
green: high 7 blue: high 7
pause 20 pause 10
low 7 high 7
pause 10 pause 20
goto green goto blue
Because the motor is on longer than it is off in the green graph, this is the program which will make the motor turn faster. You can increase the mark to space ratio to get a bigger difference in speed.
This uses the Mark to Space ratio to vary the speed - that is the time a motor is on for (Mark) and the time the motor is off for (Space). This is in order of milliseconds so that it happens so quickly you can't see the pulse, only a constant speed.
Examples of the programs required for these graphs:
pause 20 pause 10
low 7 high 7
pause 10 pause 20
goto green goto blue
Because the motor is on longer than it is off in the green graph, this is the program which will make the motor turn faster. You can increase the mark to space ratio to get a bigger difference in speed.
Using the Microprocessor
First we looked at the architecture of a microprocessor:
ALU: Arithmetic Logic Unit: The "brain" of the microprocessor, reads the program and carries out the mathematical calculations necessary.
ROM: Read Only Memory - where the program is stored. The type of ROM we are using is Electronically Erasable Programmable Read Only Memory, which means that to reprogram the microprocessor, all we have to do is connect is back to the computer and write over the old program with a new one. Other chips may be once use only, meaning that if you make a mistake, or need to change a part of your program, you need to get a brand new chip.
RAM: Random Access Memory. This is memory the microprocessor uses whilst the program is running. The parts of the RAM are called b0 - b13. You can ask it to remember any number, add and subtract, or count how many times a part of the program has been repeated.
Clock / Program Counter / Timers: Controls the speed of the mathematical calculations
I/O Ports: Connect the microprocessor to the real world so that we can control outputs and test inputs
Buses: Groups of wires which transport information from one part of the microcontroller to another.
Then we looked at the "Stamp Controller" we will be using for our programming.
To be able to use outputs with the Stamp Controller, we needed to add an output driver to boost the current from the microprocessor enough to drive output transducers like buzzers, motors and lamps.
There are two types of output driver. The Darlington Pair at the top, which is used to drive anything which requires on/off control - lamps, buzzers; and the Push Pull driver at the bottom which is used to drive motors so that they can turn in both directions. This means that a buzzer needs to be connected to one output pin, and a motor to two output pins - one to make it go forwards and one to make it go backwards.
Subscribe to:
Posts (Atom)