Bumbley - the Little Servo Robot

by jscottb in Circuits > Robots

2559 Views, 39 Favorites, 0 Comments

Bumbley - the Little Servo Robot

IMG_0346.JPG
IMG_0345.JPG

Meet Bumbley, a little lost bot from the planet Teekmar'd - a small world that orbits Wolf 359. Bumbley likes to find good hiding places and avoid human contact at all cost! He can only see in infrared, so needs your help. So please help him find a good hiding place!!! :-)

Bumbley is a servo driven bot, made of 2 Actobotics channels and 1 mounting hub. It has two continuous 360deg servos, two 4 inch wheels (@100mm), one rear uni-direction rear ball caster, an Arduino Uno clone with a V5 sensor shield and 2 infrared (IR) sensors for object detection. It's powered by two battery packs - one to power the Uno and the other to run the servos and sensors.

Little Bumbley is a very basic object avoidance rover that uses IR to find anything in it's path. The chassis itself, is made to be maneuverable, expandable and easy to assemble with a minimum amount of parts, but a good solid platform to build upon.

Parts Needed

IMG_0329.JPG
IMG_0333.JPG
IMG_0334.JPG
IMG_0316.JPG
IMG_0332.JPG
IMG_0360.JPG

Bumbley is made from these parts:

  • Arduino Uno or clone with sensor shield x1 each
  • 3.75" or 4.50" Actobotics channel (for the rear of the chassis) x1
  • 6" Actobotics channel (for the front of the chassis) x1
  • 90deg hub mount x1
  • Standard Servo Plate B x2
  • Lightweight servo hub horn x2
  • Continuous rotation servos x2
  • IR sensor x2
  • 4" (100mm) wheels x2 (one pair)
  • Arduino Channel Snap Mount
  • 5/8” Roller Ball from ServoCity, Harbor Freight or other supplier of your choice
  • 2” 6/32 pan-head screws with 3 washers and 3 nuts per screw. From a local hardware store - x2 sets
  • 6/32 3/16" or 1/4" pan or socket head screws x25
  • 4 rechargeable 'AA' batteries (to power the servos and sensors)
  • 1 9v alkaline or rechargeable battery (to power the Uno ONLY!)
  • Battery holder with wire or wire clip holder 4 'AA' batteries
  • 1x wire clip for 9v and 1x for 'AA' if you get the wire clip holder
  • Female to Female Dupont jumper wires
  • Voltage meter (optional, but good to monitor the bots motor voltage)
  • Small zip-ties and double sided tape
  • Googly eyes (optional :)
  • Tools: 7/64 Hex key, small Phillips and flat-head screw drivers

You can source many of the parts from eBay or other suppliers directly. Structural parts can be gotten from Sparkfun, RobotShop and ServoCity. Continuous rotation servos can be found at various sellers on eBay, ServoCity, Parallax etc.. Or you can modify them yourself for 360deg rotation, but I will not cover that in this Instructable.

The Software Needed

arduino-blink-program.jpg

Things you will need to download:

  • The Arduino IDE
  • The Robot code below or the attached .zip

Assembly - the Chassis - 1

IMG_0328.JPG
IMG_0334.JPG
FullSizeRender.jpg
IMG_0356.JPG
IMG_0361.JPG
IMG_0362.JPG
IMG_0311.JPG
  1. Mount the 90° Quad Hub Mount to one end of the 3.75" or 4.5" channel as pictured.
  2. Using the 90° Quad Hub Mount, connect the 3.75" or 4.5" channel together with the 6" channel as shown in Figure 1 (See pics) Use the 7/64 hex key to lightly tighten down all the screws.
  3. Next, mount the servos in the servo brackets (see picture)
  4. Now place the mounted servos in the ends of the 6" channel as pictured

Assembly - the Chassis - 2

IMG_0323.JPG
IMG_0338.JPG
IMG_0318.JPG
IMG_0317.JPG

Once the Chassis is all made-up, you can attach the rear ball caster to the end of the 3.75" or 4.50".

Take the 5/8" ball caster the two (2) 6/32 2" bolts, six (6) washers and six (6) nuts. Place a washer on the first screw then slide it in the caster with the ball facing down and the bolt pointing up. Now place another washer on the screw then a nut and thread it all the way to the bottom of the screw. Then take the second (2nd) nut and thread it down around 1/4" then add a washer, place the screw in the underside of the top beam on the chassis and add the last washer and nut. Hand tighten only. Do the same for the second screw on the caster and then adjust the nuts at the top and underside to level the chassis out. Tighten all the nuts on the caster assembly now.

See pictures for more details.

Assembly - the Chassis - 2

IMG_0315.JPG
IMG_0316.JPG
IMG_0327.JPG

Next attach the lightweight servo hub to the wheels as pictured. Now remove the paper (optional) and place the rubber tire on the wheel. Afterwards, place the completed wheels on the servos already on the chassis.

Adding the Arduino and Shield to the Chassis

IMG_0337.JPG

Now connect the Arduino holder onto the 3.75" or 4.5" channel. Then place the Uno and sensor shield into it as pictured.

The IR Sensors

IMG_0319.JPG
IMG_0340.JPG

Place the IR sensors on both ends of the 6" channel as pictured. You may need to use double sided tape to keep any connections from shorting on the chassis. Tie them down with zip ties or if you have standoffs, you can use those as well.

Connecting the Components Up!

IMG_0325.JPG
IMG_0324.JPG
IMG_0320.JPG
IMG_0336.JPG
IMG_0321.JPG
  1. Connect the left servo motor to the pin 6 connector on the sensor shield. The Left servo motor is the to the left side with the bot facing AWAY from you. The signal wire of the servo is usually a white or orange wire.
  2. Connect the right servo motor to the pin 7 connector on the sensor shield. The Right servo motor is the to the right side with the bot facing AWAY from you. The signal wire of the servo is usually a white or orange wire.

  3. Connect the left IR sensor signal to the pin 5 connector on the sensor shield and the GND and vcc to the same Pin set. The Left sensor is the to the left side with the bot facing AWAY from you.

  4. Connect the right IR sensor signal to the pin 4 connector on the sensor shield and the GND and vcc to the same Pin set. The Right sensor is the to the right side with the bot facing AWAY from you.

  5. If you choose to use a Volt meter for the bot, place the GND wire of the meter to the GND wire of the sensor shield. Place the POS (vcc) wire of the meter to VCC of the shield.

It's Time to Load the Code!

With the wiring checked and rechecked, It's time to load the code. Follow the instructions on the Arduino site on how to install the Arduino IDE. After the IDE is installed, copy the below program and past it into the Arduino IDE. Connect your PC and Arduino up with the USB cable. Now choose the board from the Tools->Board menu in the IDE, Uno for this project (choose the board you have if different from Uno) Now from Tools->Port menu, pick your com port. After this is done, click the upload button. If all went well, the code was loaded, if not see here for help on the IDE and related issues.

/*
Bumbley the Arduino obstacle avoider.

Goal in life... Bumblels around trying to stay out of your way :-)

Written by Scott Beasley - 2015 Free to use or modify. Enjoy. */

*/ Uses the Arduino Servo library. */

#include <Servo.h>

// Turn based on clear direction or left if both are blocked #define turn(dir) (dir >= 2) ? go_left () : go_right ()

// Change these defines if you use differnt pins #define LEFT_IR 5 // Digital pin 2. #define RIGHT_IR 4 // Digital pin 5 #define LEFT_SERVO 6 // Pin used for the left servo #define RIGHT_SERVO 7 // Pin used for the right servo

// Speed defines #define MAXFORWARDSPEED 120 // Max speed we want moving forward #define MAXBACKWARDSPEED 60 // Max reverse speed #define STOP 90

// Various time delays used for driving and servo #define TURNDELAY 450 #define BACKUPDELAY 300

/* Globals area. Try to keep them to a minimum :-) */

// Create the servo objects with use to interface with Servo motor_left; // Create Left servo motor object Servo motor_right; // Create Right servo motor object

void setup ( ) { // Un-comment if you want or need to debug //Serial.begin (9600); // Set Serial monitor at 9600 baud //Serial.println ("My Servo SHR bot is starting up!");

motor_left.attach (LEFT_SERVO); // Attach the servo to the digital pin motor_left.write (STOP); // Set the servo to the middle (neutral) pos motor_right.attach (RIGHT_SERVO); // Attach the servo to the digital pin motor_right.write (STOP); // Set the servo to the middle (neutral) pos

// Set modes for proximity sensor pins pinMode (LEFT_IR, INPUT); pinMode (RIGHT_IR, INPUT);

// Delay to give user time to make adjustments. Remove after done. //delay (30000); }

void loop ( ) { byte direction;

// Get a reading from the current sensor direction direction = read_ir_sensors ( ); //Serial.print ("IR sensors reading: "); //Serial.println (direction);

// Go forward while nothing is in the sensors read area if (direction == 3) // Forward, march! { go_forward ( ); } else // There is something in the sensors read area { halt ( ); // Stop! go_backward ( ); // Back up a bit delay (BACKUPDELAY); halt ( ); // Stop!

turn (direction); // Turn toward the clearest path delay (TURNDELAY); halt ( ); } }

// Read the sensor after we find something in the way. This helps find a new // path byte read_ir_sensors ( ) { byte lt_sens = -1, rt_sens = -1, direction;

lt_sens = digitalRead (LEFT_IR); rt_sens = digitalRead (RIGHT_IR);

if (lt_sens && rt_sens) // Left and right are both blocked, turn left direction = 0; else if (lt_sens) // Left is blocked, turn right direction = 1; else if (rt_sens) // Right is blocked, turn left direction = 2; else if (!lt_sens && !rt_sens) // All clear on both direction = 3;

return (direction); }

void go_forward ( ) { //Serial.println ("Going forward..."); motor_left.write (MAXFORWARDSPEED); motor_right.write (MAXBACKWARDSPEED); }

void go_backward ( ) { //Serial.println ("Going backward..."); motor_left.write (MAXBACKWARDSPEED); motor_right.write (MAXFORWARDSPEED); }

void go_left ( ) { //Serial.println ("Going left..."); motor_left.write (MAXFORWARDSPEED); motor_right.write (MAXFORWARDSPEED); }

void go_right ( ) { //Serial.println ("Going right..."); motor_left.write (MAXBACKWARDSPEED); motor_right.write (MAXBACKWARDSPEED); }

void halt ( ) { //Serial.println ("Halt!"); motor_left.write (STOP); motor_right.write (STOP); }

Downloads

Adding Power!

IMG_0332.JPG
IMG_0337.JPG
IMG_0323.JPG
IMG_0326.JPG
IMG_0339.JPG

Find a convenient place to put the 4x AA pack, the place in the picture works nicely. You can secure it with velcro, a strap, a zip-tie (a reusable one works best) or mount like this.

For the 9v battery, you can slide it under the Arduino in the channel easily.

Once done, you can connect the 4 AA packs GND to the GND terminal of the sensor shield and the POS (vcc) of the same pack to the vcc terminal. Then connect the 9v power to the Uno.

Bumbley in Action!

Bumbley - A little lost servo bot!
IMG_0322.JPG
Simple servo chassis with Actobotics (Take two)

Servo Setup

par2.jpg

If you notice your servos drifting a bit one way or another, you can use a small screw driver to set the neutral position of the motor. Use the code below to help with that by loading it into your bots controller. After loading this code, power the bot and turn the POT on the servos until they stop moving. If the servo you have does not have an adjustment pot, you will have to find the proper value to get the halt function working by adjusting the constant define STOP value the code uses. By default it's set to 90.

#include <Servo.h>
Servo lf_servo, rt_servo; 

void setup ( ) 
{ 
   lf_servo.attach (6); 
   rt_servo.attach (7);
} 
 
void loop ( ) 
{ 
   lf_servo.write(90); // sets the servo position to neutral
   rt_servo.write(90);
   delay(15);                          
}