Controlling 4 motors, reading their encoders, monitoring their current draw requires a lot of processor pins so the first thing I did was to make the shield I²C controlled.
This way only two pins were needed leaving all the other pins free for use with other shields, circuits or sensors.
Each FET "H" bridge can handle 2.5A continuous and up to 4A peak.
Current monitoring allows the peak current to be limited. Unlike most I²C motor control shields,
The ComMotion shield does more than just pass on PWM and direction data.
The twin ATmega328P processors monitor encoder inputs using their external interrupt pins and control PWM to the motors.
This has two major advantages.
Accurate speed control for travelling in straight lines.
Full motor torque at low speeds to prevent stalling.
Using encoder feedback, a straight line is easily acheived because the ComMotion shield will automatically compensate for differences such as friction between motors / gearboxes.
Using encoder feedback allows the ComMotion controller to increase power to motors to compensate for load. This means that even at very low speeds the controller can prevent stalling under heavy loads by increasing the power to the motors. If you do not have or want encoders then the shield will still work like a standard 4 channel motor controller.
Omni and mecanum wheels
The ComMotion shield has some common configurations pre-loaded. That means that if your robot uses 3 omni wheels at 120° or 4 omni wheels at 90° or 4 mecanum wheels then the ComMotion shield will also do the trigonometry for you. Just give it the desired speed, angle and rotation. The twin processors on the shield will do the math for you. If your chassis does not match these configurations or you just want to control some motors individually then the shield will do that too.
Com in the ComMotion
Most Arduino boards only have 1 serial port which is normally used for software uploading and debuging. As the twin ATmega328P processors gave me an additional two serial ports I broke them out into FTDI compatible, 5V TTL serial ports. The serial port on MCU2 is also connected to an Xbee / WiFly socket with voltage translation circuitry and a dedicated 3.3V regulator rated for 300mA. There are two major advantages of this.With a preconfigured Xbee, bluetooth or WiFly module connected, no Arduino board is needed.Serial devices such as GPS modules and LCD's can be connected without affecting the serial monitor used for debugging.Cramming it all in!
To fit all this robot goodness into such a small PCB we had to go to a 4 layer PCB. This allows us to have big tracks to handle all the current (up to 10A), a decent ground plane to shield the MCU's from the electrical noise of the motors and some reasonable heatsinking built into the PCB for robotic robustness.
The ComMotion is essentially two Arduino boards in one with a shared ISP socket that allows either processor to be programmed via a single ISP header.
The shield has been designed so that an Arduino board such as the SparkFun RedBoard can be used as a programmer.
Just install the ArduinoISP example code and plug in the ComMotion shield.
Short the RST-JP jumper to connect the ComMotions reset circuit to D10 of the Arduino and use the switch to select which processor you want to program.