Abstract
Seeker II is an autonomous mini-sumo robot I designed to compete in mini-sumo competitions that are held in various cities in North America. It is low, fast, very aggressive, and has wide tires that provide a lot of traction.

Seeker II’s brain is a Microchip PIC 16F876, programmed in C.
Several of the hardware features of the 16F876 are used, including:
Details
The rest of the electronics in Seeker II are very simple – a 5K pull-up resistor on the MCLR line, a 0.1 uf decoupling capacitor between ground and power on the PIC, a 20 MHz crystal, and a pair of 18 pf capacitors for the crystal. The motors are switched using a Texas Instruments SN754410 quadruple half-h driver chip, which is basically a one-amp version of the popular National LM293D h-bridge. Power to the electronics is provided by a nickel-metal-hydride (NiMh) 9 volt battery, and switched through a National LM2940 5 volt low-dropout regulator. Two capacitors are attached to the voltage regulator as suggested in the data sheet (0.47 uf and 22 uf). Power to the motors is provided from a second NiMh 9 volt battery. Each battery is switched separately using a pair of slide switches accessed from the underside of the chassis.
For sensors, the robot has two range finders and two edge detectors. The range finders are Sharp GP2D12 analog range sensors. They are cheap, simple to interface to, and provide very accurate results without being affected by ambient lighting conditions. The edge detectors are Fairchild QRD-1114 IR sensors. They also filter out most outside light interference, and in general work exceptionally well.
The circuit board is a Radio Shack proto-board, cut to shape, with #28 solid-core wire soldered underneath to form the traces.
The chassis is constructed from a 1/16" aluminum plate, and the front support bar (which has attached to it the circuit board, the sensors, and the power switches) is 1" x ¼" brass bar stock. The motor housing is a piece of 1.5" Delrin rod (Delrin is an acetal resin plastic, good for machining). The rod was cut to shape on my Sherline lathe and milling machine, and is hollow on the inside. The gear-motors are mounted inside the ¾" hole drilled through the center of the motor housing. The motors are Faulhaber 1717 precision coreless motors, with a 76:1 spur gearhead attached. The motor housing, in addition to holding the motors, also has a pair of integrated-resistor LEDs, one (green) as a power indicator, and one (red) as a heartbeat indicator. A momentary push-button switch is mounted at the top of the motor housing, and the two LEDs and the push-button switch are wired into a 4-conductor ribbon cable that plugs into the circuit board (connector J4 on the schematic). The wheels are also machined from Delrin, and the tires are cast from a two-part polyurethane mixture. Each wheel is attached to its corresponding motor with a machined brass adapter, using a pair of set-screws and a couple #4-40 stainless steel bolts. The robot is completed with a thin brass wedge on the front.
The robot’s final dimensions are just under 10cm long, 10cm wide, and about 3.8 cm high, and it weighs 430 grams.
Seeker II has been entered in one competition, a local mini-sumo competition in Burlington, Ontario. It took on all opponents and won the tournament undefeated. The last robot it went up against, Marauder, is the reigning Canadian mini-sumo champion for 2002, and Seeker II defeated Marauder in a very close final battle.
Block Diagram:

Schematic:
Clearer versions of the schematics are avaiable in the full entry. (Download full entry)
Clearer versions of the schematics are avaiable in the full entry. (Download full entry)
Code Snippet
//////////////////////////////////////////////////////////////////////
//
// menuEdgeTest
//
// Do an edge test, to show the values from the bottom IR sensors
void menuEdgeTest () {
int32 endTime;
byte left, right;
printf ("\n\rSeeker II Edge Test\n\r");
printf ("\n\rPush and hold the Start button to return to the menu...\n\r");
do {
endTime = millisecondClockValue + 1000;
set_adc_channel (FRONT_LEFT_CHANNEL);
delay_us (10);
left = read_adc ();
set_adc_channel (FRONT_RIGHT_CHANNEL);
delay_us (10);
right = read_adc ();
printf ("L: %3U R: %3U\n\r", left, right);
do {} while (millisecondClockValue < endTime);}
while (input (PUSHBUTTON_PIN));
}