A robot with independent wheel drive is something we’ve been working on in our spare time. Here is the latest iteration of the prototype.
Over the last couple of months we’ve been testing different mechanical systems to control robot wheel position. In addition to position each wheel is to have independent control over the motor speed and direction. This prototype gets us part of the way to what we were shooting for.
Motor control: Currently this robot is using skid steering where the left hand motors are driven by a shared control signal (a single H-bridge), and the right hand motors are driven by a separate signal. This is similar to how a tank or bulldozer is driven. We used a Parallax BASIC Stamp 2 to read radio control signals (1-2ms pulses) and convert them to motor drive commands. The BASIC Stamp converts the pulses to serial commands that are then sent to the Motor Mind C, a dual motor controller. This allows the robot to turn left and right as well as move forward and reverse. The RC channels are “mixed” in the BASIC Stamp 2 which makes control of the robot more intuitive for the operator using an RC transmitter. The next step is to control each motor with its own H-bridge.
Wheel Position: We built a simple lever arm using some brass rectangular tubes. These were bolted onto servo horns on one end and the other end was bolted to the motors. Circular brass tubes were used to create pivot points, and where the brass connections needed to be solid we just brazed it using a heat gun and solder. The mechanism allows close to 90 degrees of movement. In our code we limited the range to about 45 degrees. Each wheel position can be independently controlled, and we used an Arduino Uno to read inputs from our BASIC Stamp 2 and convert those to 4 servo drive signals.
RC Signals: Originally we wanted to use our Firstbot Arduino clone to run this design. We ran into two problems. The first was not having a lot of time for coding and testing. The second was that the Arduino is not very good at doing multiple timing things at the same time. We wanted to read 4 RC channels (measure pulses 1-2ms in duration with a period around 20ms). We also wanted to generate 4 RC signals for servo control (output 1-2ms pulses with a 20ms period). And we need to generate 4 PWM signals to control the motors. There were a variety of problems we ran into when attempting this. Servo control was at times erratic, and even caused one to burn out. PWM control was lost on one of our channels due resource sharing in the Arduino. I’m pretty sure we could get close making this work if we broke away from using Arduino macros and implemented some interrupt based code. But being short on time we decided to through in a BASIC Stamp 2 and Motor Mind C. This offloaded the pulse reading and motor control functions. And Arduino Uno was then used to control the wheel position by generating servo signals.
Servos: We used HiTek HS-645MG servos. The had decent torque and metal gears (about 100 oz-in). Unfortunately they run about $35 each retail. These can operate to 180 degrees if provided with a pulse of 0.6-2.4ms. The 4 servos required close to 2A.
Power: An 8.4V 3000mAh RC battery was used to run the motors and a Castle Creations servo regulator was used to step voltage this down to 5.1V to keep the servos from catching fire.
Motors: 4 12V 200RPM gear head motors were used. These are smallish, have a decent mix of torque and speed, and were in stock.
Next step: We’ve got a couple of ideas to run with on this design. First, a small board that handles the RC signals, servo outputs, and PWM signals would be cool to have. Second, there are 4 brass pieces that were used for each wheel. We want to see if they can be boiled down into a single strut. We could have that laser cut to make the hardware a little more clean. Finally, we never had a chance to try and control each wheel by itself. Another issue is that with only 4 RC channels to control everything you end up with a user interface problem. You really need control channels to control each motor and each servo separately. Not sure how to handle that. Perhaps move to a WiFi / PC interface?