Take a look at the Pololu High-Power Motor Driver 18v15. It would seem to meet (and even exceed) your needs. I purchased one of these last week and it should arrive tomorrow. I'll edit this answer with my review.
Got it in the mail late yesterday. Assembled it tonight. Will be testing it out tomorrow.
My time with the switch was short yet incredibly productive. The boat in which the switch was placed eventually sunk taking a GPS, XBee, Arduino, and the switch with it. The switch was really easy to get up and running with. The soldering was quick and the provided capacitor worked nicely for my purposes. My battery's positive terminal connected to the
V+ header and the negative terminal connected to the
GND header. The motor's leads connected to the
OUTB headers. The polarity doesn't matter on those two headers as the device is capable of switching it.
On the logic side I connected the Arduino's
GND pin to the switch's
GND header. I didn't make use of the
FF2 fault flag indicators but reading them is as simple as a
digitalRead once they're connected to the Arduino. The
RESET pin is really easy to use. Just use
digitalWrite(resetPin, LOW); to put the board into sleep mode (this also clears any faults). Bring it back up to high to resume normal operation.
There are two ways to operate the board but I'll only discuss the one I used which I believe is simpler. The
DIR pin needs to be considered digital. So you set it up just like you would any normal digital output pin on the Arduino. You pull the pin
HIGH for one direction and
LOW for the opposite direction. This effectively reverses the polarity on the
OUTB headers. The
PWM pin needs to be connected to a PWM-supported pin on the Arduino. On the Arduino Uno these pins are 3, 5, 6, 9, 10, and 11. Make certain that the pin that you choose is not being obstructed by a timer interrupt. Controlling the speed of the motor is as easy as using
analogWrite on the pin with a number from 0 (stopped) to 255 (full speed). The
map function will be really useful here. You can use it to take any sane range and convert it to the range you need (in this case 0-255). I used it to take 0-255 down to 0-100 to create a thrust percentage I could display but in that case I could have just divided the the number by 2.55. ;) Check out this commit on GitHub to see how I implemented it. Contrary to that commit, you do not need to use
pinMode on the PWM pin.
The only "issue" I ran into with the board was that when running the motor it would create an audible tone depending on the speed. At full speed it wasn't noticeable but at lower speeds you could really tell. I didn't fix this issue before the boat sank but I'm told it can be resolved by using the Arduino PWM Frequency Library.
I hope this helps you and have fun with the motor driver. I would definitely buy another if a situation called for it. Definitely take a look at Pololu's product page for a very detailed explanation of the entire chipset.