Activity 6: Custom Maneuver Function

The last sketch, MovementsWithSimpleFunctions, was kind of long and clunky. And, the four functions it uses to drive the robot are almost the same. The TestManeuverFunction sketch takes advantage of those function's similarities and streamlines the code.

TestManeuverFunction has a single function for motion named maneuver that accepts three parameters: speedLeft, speedRight, and msTime:

void maneuver(int speedLeft, int speedRight, int msTime)

The rules for speedLeft and speedRight, listed below, are easy to remember. Best of all, with this maneuver function you don’t have to think about clockwise and counterclockwise rotation anymore.

  • positive values for moving the robot forward
  • negative values for moving the robot backward
  • 200 for full speed forward
  • –200 for full speed backward
  • 0 for stop
  • 100 to –100 range for linear speed control

The rules for msTime are:

  • Positive values for the number of ms to execute the maneuver
  • –1 to disable the servo signal

Here is what calls to this function will look like for the familiar forward-backward-left-right-stop sequence:

maneuver(200, 200, 2000);           // Forward 2 seconds
maneuver(-200, 200, 600);           // Left 0.6 seconds
maneuver(200, -200, 600);           // Right 0.6 seconds
maneuver(-200, -200, 2000);         // Backward 2 seconds
maneuver(0, 0, -1);                 // Disable servos

Example Sketch - TestManeuverFunction

  • Enter, save, and upload TestManeuverFunction.
  • Verify that it completes the forward, left, right, backward, stop sequence.
// Robotics with the BOE Shield - TestManeuverFunction
// Move forward, left, right, then backward with maneuver function.

#include <Servo.h>                           // Include servo library
 
Servo servoLeft;                             // Declare left and right servos
Servo servoRight;
 
void setup()                                 // Built-in initialization block
{
  tone(4, 3000, 1000);                       // Play tone for 1 second
  delay(1000);                               // Delay to finish tone

  servoLeft.attach(13);                      // Attach left signal to pin 13
  servoRight.attach(12);                     // Attach right signal to pin 12
 
  maneuver(200, 200, 2000);                  // Forward 2 seconds
  maneuver(-200, 200, 600);                  // Left 0.6 seconds
  maneuver(200, -200, 600);                  // Right 0.6 seconds
  maneuver(-200, -200, 2000);                // Backward 2 seconds
  maneuver(0, 0, -1);                        // Disable servos
}  
 
void loop()                                  // Main loop auto-repeats
{                                            // Empty, nothing needs repeating
}

void maneuver(int speedLeft, int speedRight, int msTime)
{
  // speedLeft, speedRight ranges: Backward  Linear  Stop  Linear   Forward
  //                               -200      -100......0......100       200
  servoLeft.writeMicroseconds(1500 + speedLeft);   // Set Left servo speed
  servoRight.writeMicroseconds(1500 - speedRight); // Set right servo speed
  if(msTime==-1)                                   // if msTime = -1
  {                                  
    servoLeft.detach();                            // Stop servo signals
    servoRight.detach();   
  }
  delay(msTime);                                   // Delay for msTime
}

Your Turn – Customize Speed and Duration Control

With the maneuver function, 0 is stop, 100 to –100 is the speed control range, and 200 and –200 are overkill to keep the servos running as fast as they possibly can.

The TestManeuverFunction sketch makes it easy to define custom  maneuvers quickly. Just pass new parameters for each wheel rotation and maneuver duration to each call of the maneuver function.  For example, let’s make the left wheel move at half speed while the right wheel moves at full speed to draw an arc for 3 seconds.  Here is what that function call would look like:

  maneuver(50, 100, 3000);

Here is another example that keeps the left wheel still and moves the right wheel forward for a left pivot turn:  

  maneuver(0, 200, 1200);
  • Try adding both of the example maneuver calls to your sketch.
  • Try adding the other three wheel-pivot turns to the sequence: forward-right, backward-right, and backward-left.