Building the robot's motor drivers
The two designs that looked best for my situation were:
- Bob Blick's Darlington-based H-bridge. I really liked the risk-free braking behaviour of this design. I'm confident enough in my coding abilities, but I'd feel much more comfortable with a design that made it difficult to destroy hardware with software. Darlingtons have the advantage of being cheap and less likely to spontaneously combust than MOSFETs - but they'll get hot and waste a fair bit of power. Since I'm aiming to run off as low a voltage as possible, this was an issue. So I went with:
- Eugene Blanchard's MOSFET-based H-bridge. It's about the same complexity, but is a riskier and more expensive design due to the MOSFETs. It would be able to drive much more powerful motors, and heat would be less of an issue. It doesn't have the idiotproof braking behaviour, so I'd have to code carefully.
Again, I assembled the circuit on Veroboard. I really don't like Veroboard for high-power designs like this one, but empirically, I've never had a problem. My main concern was in the braking design, which routes the motor current through the ground tracks. The current is burnt off as heat somewhere, like in the tracks or MOSFETs, neither of which was particularly appealing to me. I hoped that this wouldn't be an issue in operation, where worst-case, I could be braking while getting pushed hard by another robot.
Another problem became apparent during the design phase: how would I control the H-bridge inputs? I wanted to use braking, which meant that I'd need to control all four inputs of the H-bridge. I decided to have a dedicated motor controller of some sort; it would translate between the commands from the main microcontroller and the H-bridge inputs. I'd need two of these, one for each wheel.
About this time, I was wondering how bad it would be to go with a simple 'forward only' motor design!
I was quite paranoid about the H-bridge simply exploding the first time I connected it up, so it was tested it carefully as I constructed it. I used a bench power supply with the current limiting set to 100mA to reduce the chance of anything overheating. Putting a resistor in series with the power rails (say, 22 ohms at 5W) will achieve roughly the same goal. I tested each quadrant of the circuit separately and verified that the outputs (drain pin of the MOSFET - conveniently located on the tab) had the correct voltage when I pulled the input pin high or low. It's a simple circuit, but very easy to destroy if built incorrectly!
Front of the H-bridge and controller board
Back of the H-bridge and controller board
A few reasons; the main one
A few reasons; the main one being that I can't easily buy the things, living in Australia. Second, this is my first attempt at driving a motor in this way, so I have nothing to compare the performance against. If I can build the driver, blow it up and rebuild it at will, that's preferable to committing to a particular IC and finding it inadequate down the track.
It's definitely a possibility in the future (dedicating so much space and weight to running *one* motor is not ideal), but for now I'm mostly experimenting.

Why a discrete gate drive circuit?
I've been building various FET applications (including switching power supplies), and I've found that the easiest (and perhaps best-performance) gate drives in this voltage range tend to be the purpose-built gate drive ICs available from various vendors (I've been using the IRF ones, but there's lots of them out there). No extra components (other than bypass caps and maybe a low-value resistor in series with the gate); you can get dual (and quad, as I recall) units, and they're fast and strong. Compared to the lackluster performance of some discrete transistor circuits (especially important with 250KHz switching power supplies, but probably noticeable as heat in slower motor drives), they're a breeze to use. Add to this the programmable dead-time generation available from today's microcontroller PWM units, and you have a winning combination.