One of the simplest ways to get a motor to turn in both directions is by using a double-pole, double-throw (DPDT) relay. Along with the relay, this hookup requires two transistors and two Stamp pins, one for on/off control and the other for direction control.
The diagram below contains the schematic for this setup. The DPDT relay is switching the direction of current flow through the motor to get it to turn in either direction. The direction control transistor can be a 2N3904 because most relays require much less than 100 mA through the coil to trip the contacts. A TIP120 can also be used for the direction control. A TIP120 is required for on/off control because it must be able to handle the motor currents. For very high current motors, replace the TIP120 on/off control with a low on-resistance FET or with a SPST relay. In the diagram, the location of the relay pins matches a top view of the DPDT relay sold in the Robot Store (Jameco 174378) and the Radio Shack 275-249A relay.
The next diagram illustrates how to lay this circuit out. The pinouts shown are correct for the Jameco 174377 and Radio Shack 275-249A relays.
Here is an example Arduino program that runs the motor for two seconds in one direction and then two seconds in the other direction.
The 10 ms pauses are to minimize noise spikes caused by turning off the motor and the relay at exactly the same time.
If your program hangs when you switch the motor off or change directions, you might be getting spurious voltage spikes that are causing your program to jump into never-never land. You'll know this is happening when the motor keeps spinning when you expect it to stop or change direction. After confirming that this is indeed what is going on and that you don't have any wiring errors, try adding an 0.47 micro-farad, 100 V filter capacitor right across the motor terminals. If things are still bad, add a flyback diode between the two common pins on the relay (making sure that the plus or band end of the diode points toward the plus voltage of the battery). Consult the Controlling motors technote for additional info on noise suppression.
If things are still not working, you may have to opto-isolate the circuit. With two SPDT relays and two 4N33 isolators, you can construct an isolated, bi-directional control circuit for your motor. Here's how.
The 4N33 is an opto-isolator whose pinout is shown below