Skip to content
Parallax Learn

Parallax Learn

  • Welcome
  • Tutorials
        • Tutorial Series head tag

          Tutorial Series
        • Tutorial Series

          The special, classroom-ready series pages are organized collections of tutorials for our most popular hardware and/or languages. The tutorials for each topic are conveniently accessible from a single page, shown in the order it is recommended that they be completed.
        • Robotics Series Head tag

          Robotics Series
        • Robotics Series

          • Artificial Intelligence
          • Cybersecurity: Radio Data tutorialCybersecurity
          • cyber:bot + Python
          • cyber:bot + MakeCode
          • Boe-Bot Tutorial SeriesBoe-Bot
          • Arduino Shield-Bot
          • ActivityBot with C TutorialsActivityBot + C
          • ActivityBot with BlocklyProp Tutorial SeriesActivityBot + BlocklyProp
          • Scribbler 3 Tutorial SeriesScribbler 3
        • Electronics & Programming Series Head tag

          Electronics & Programming Series
          • BS2 Board of Education Tutorial SeriesBS2 Board of Education
          • Propeller C-Language BasicsPropeller C Basics
          • FLiP Try-It Kit C Tutorial SeriesFLiP Try-It Kit + C
          • FLiP Try-It Kit BlocklyProp TutorialsFLiP Try-It Kit + BlocklyProp
          • Badge WX Tutorial SeriesBadge WX
          • Propeller BlocklyProp Basics and ProjectsPropeller BlocklyProp Basics
          • View All Tutorial Series »
        • Browse Tutorials
        • Browse Tutorials

          Individual tutorials sorted by robot or kit, and language.
        • By Robot or Kit
          • ActivityBot
          • SumoBot WX
          • Boe-Bot
          • Shield-Bot
          • cyber:bot
          • Badge WX
          • ELEV-8
          • ARLO
        • By Language
        • By Language

          • Propeller C
          • Arduino
          • BlocklyProp
          • PBASIC
          • Python
          • MakeCode
          • View All Tutorials »
  • Educators
  • Reference
  • Downloads
  • Home
  • All Courses

Robotics with the Board of Education Shield for Arduino

Curriculum

  • 9 Sections
  • 148 Lessons
  • Lifetime
Expand all sectionsCollapse all sections
  • About This Tutorial
    3
    • 2.0
      About the BOE Shield-Bot
    • 2.1
      Audience and Support
    • 2.2
      Author & Contributors
  • Chapter 1. Your Shield-Bot's Brain
    25
    • 3.1
      Chapter 1. Your Shield-Bot’s Brain
    • 3.2
      Hardware and Software Options
    • 3.3
      Shield-Bot Chassis Parts
    • 3.4
      Shield-Bot Hardware
    • 3.5
      Shield-Bot Electronics Parts
    • 3.6
      Activity 1: Download and Install the Software
    • 3.7
      Activity 2: Write a Simple “Hello!” Sketch
    • 3.8
      Codebender Hello Sketch
    • 3.9
      How the Hello Sketch Code Works
    • 3.10
      Modify the Sketch to Repeat
    • 3.11
      Hello Messages on New Lines
    • 3.12
      Open the Arduino Reference
    • 3.13
      Activity 3: Store and Retrieve Values
    • 3.14
      Global vs.Local Variables
    • 3.15
      Activity 4: Solve Math Problems
    • 3.16
      Try Floating Point Math
    • 3.17
      Activity 5: Make Decisions
    • 3.18
      More Decisions with if… else if
    • 3.19
      Activity 6: Count and Control Repetitions
    • 3.20
      How the for Loop Works
    • 3.21
      Adjust Initialization, Condition, and Increment
    • 3.22
      Activity 7: Constants and Comments
    • 3.23
      Chapter 1 Summary
    • 3.24
      Chapter 1 Challenges
    • 3.25
      Chapter 1 Solutions
  • Chapter 2. Shield, Lights, Servo Motors
    23
    • 4.0
      Chapter 2. Shield, Lights, Servo Motors
    • 4.1
      Activity 1: Board of Education Shield Setup
    • 4.2
      Activity 2: Build and Test LED Indicator Lights
    • 4.3
      Introducing the Resistor
    • 4.4
      Introducing the LED
    • 4.5
      Introducing the Prototyping Area
    • 4.6
      LED Test Circuit
    • 4.7
      How a Sketch Makes the LED Turn On and Off
    • 4.8
      Introducing the Timing Diagram
    • 4.9
      Activity 3: LED Servo Signal Monitors
    • 4.10
      How to Use the Arduino Servo Library
    • 4.11
      Activity 4: Connect Servo Motors and Batteries
    • 4.12
      Connect the Servos to the BOE Shield
    • 4.13
      Connect the Battery Pack to the BOE Shield
    • 4.14
      5-cell Pack Setup
    • 4.15
      4-cell Pack + Boe-Boost Setup
    • 4.16
      Activity 5: Centering the Servos
    • 4.17
      Activity 6: Testing the Servos
    • 4.18
      Controlling Servo Speed and Direction
    • 4.19
      How To Control Servo Run Time
    • 4.20
      Chapter 2 Summary
    • 4.21
      Chapter 2 Challenges
    • 4.22
      Chapter 2 Solutions
  • Chapter 3. Assemble and Test your BOE Shield-Bot
    22
    • 5.0
      Chapter 3. Assemble and Test your BOE Shield-Bot
    • 5.1
      Activity 1: Assembling the BOE-Shield-Bot
    • 5.2
      Mount the Topside Hardware
    • 5.3
      Remove the Servo Horns
    • 5.4
      Mount the Servos on the Chassis
    • 5.5
      Mount the Battery Pack
    • 5.6
      Mount the Wheels
    • 5.7
      Attach the BOE Shield to the Chassis
    • 5.8
      Activity 2: Re-test the Servos
    • 5.9
      Testing the Left and Right Wheels
    • 5.10
      Servo Troubleshooting
    • 5.11
      Activity 3: Start-Reset Indicator
    • 5.12
      Build the Piezospeaker Circuit
    • 5.13
      Programming the Start-Reset Indicator
    • 5.14
      Example Sketch: StartResetIndicator
    • 5.15
      Activity 4: Test Speed Control
    • 5.16
      Example Sketch: Test Servo Speed
    • 5.17
      How TestServoSpeed Works
    • 5.18
      Optional: Record Your Own Transfer Curve Data
    • 5.19
      Chapter 3 Summary
    • 5.20
      Chapter 3 Challenges
    • 5.21
      Chapter 3 Solutions
  • Chapter 4. BOE Shield-Bot Navigation
    19
    • 6.0
      Chapter 4. BOE Shield-Bot Navigation
    • 6.1
      Activity 1: Basic BOE Shield-Bot Maneuvers
    • 6.2
      How ForwardThreeSeconds Works
    • 6.3
      Moving Backward, Rotating, and Pivoting
    • 6.4
      Activity 2: Tuning the Basic Maneuvers
    • 6.5
      Tuning the Turns
    • 6.6
      Activity 3: Calculating Distances
    • 6.7
      Activity 4: Ramping Maneuvers
    • 6.8
      Activity 5: Simplify Navigation with Functions
    • 6.9
      Function Call with Parameters
    • 6.10
      Put Maneuvers Into Functions
    • 6.11
      Activity 6: Custom Maneuver Function
    • 6.12
      Activity 7: Maneuver Sequences with Arrays
    • 6.13
      Using Array Elements
    • 6.14
      Navigation with Arrays
    • 6.15
      Character Arrays and switch-case
    • 6.16
      Chapter 4 Summary
    • 6.17
      Chapter 4 Challenges
    • 6.18
      Chapter 4 Solutions
  • Chapter 5. Tactile Navigation with Whiskers
    13
    • 7.0
      Chapter 5. Tactile Navigation with Whiskers
    • 7.1
      Activity 1: Build and Test the Whiskers
    • 7.2
      How Whisker Switches Work
    • 7.3
      Testing the Whiskers
    • 7.4
      How DisplayWhiskerStates Works
    • 7.5
      Activity 2: Field-Test the Whiskers
    • 7.6
      Activity 3: Navigation with Whiskers
    • 7.7
      How RoamingWithWhiskers Works
    • 7.8
      Activity 4: Artificial Intelligence for Escaping Corners
    • 7.9
      How Escaping Corners Works
    • 7.10
      Chapter 5 Summary
    • 7.11
      Chapter 5 Challenges
    • 7.12
      Chapter 5 Solutions
  • Chapter 6. Light-Sensitive Navigation with Phototransistors
    18
    • 8.0
      Chapter 6. Light-Sensitive Navigation with Phototransistors
    • 8.1
      Introducing the Phototransistor
    • 8.2
      Activity 1: Simple Light to Voltage Sensor
    • 8.3
      Example Sketch: PhototransistorVoltage
    • 8.4
      Halt Under the Bright Light
    • 8.5
      How the Phototransistor Circuit Works
    • 8.6
      Ohm’s Law
    • 8.7
      Activity 2: Measure Light Levels Over a Larger Range
    • 8.8
      Building the Photosensitive Eyes
    • 8.9
      Test the Phototransistor Circuit
    • 8.10
      rcTime and Voltage Decay
    • 8.11
      Activity 3: Light Measurements for Roaming
    • 8.12
      Light Measurement Graphic Display
    • 8.13
      Activity 4: Test a Light-Roaming Routine
    • 8.14
      Activity 5: Shield-Bot Navigating by Light
    • 8.15
      Chapter 6 Summary
    • 8.16
      Chapter 6 Challenges
    • 8.17
      Chapter 6 Solutions
  • Chapter 7. Navigating with Infrared Headlights
    14
    • 9.0
      Chapter 7. Navigating with Infrared Headlights
    • 9.1
      Infrared Light Signals
    • 9.2
      Activity 1: Build and Test the Object Detectors
    • 9.3
      Object Detection Test Code
    • 9.4
      Activity 2: Field Testing
    • 9.5
      Sniffing for IR Interference
    • 9.6
      Activty 3: Detection Range Adjustments
    • 9.7
      Activity 4: Object Detection and Avoidance
    • 9.8
      Activity 5: High-performance IR Navigation
    • 9.9
      Activity 6: Drop-off Detector
    • 9.10
      Example Sketch: AvoidTableEdge
    • 9.11
      Chapter 7 Summary
    • 9.12
      Chapter 7 Challenges
    • 9.13
      Chapter 7 Solutions
  • Chapter 8. Robot Control with Distance Detection
    11
    • 10.0
      Chapter 8. Robot Control with Distance Detection
    • 10.1
      Activity 1: Testing the Frequency Sweep
    • 10.2
      Displaying Both Distances
    • 10.3
      Activity 2: BOE Shield-Bot Shadow Vehicle
    • 10.4
      A Look Inside Proportional Control
    • 10.5
      Example Sketch: FollowingShieldBot
    • 10.6
      Follow the Leader
    • 10.7
      Activity 3: What’s Next?
    • 10.8
      Chapter 8 Summary
    • 10.9
      Chapter 8 Challenges
    • 10.10
      Chapter 8 Solutions

Example Sketch: FollowingShieldBot

The FollowingShieldBot sketch repeats the proportional control loops just discussed at a rate of about 25 times per second.  So, all the proportional control calculations and servo speed updates happen 25 times each second.  The result is a BOE Shield-Bot that will follow your hand, a book, or another robot. 

  • Enter, save, and upload FollowingShieldBot.
  • Point the BOE Shield-Bot at an 8 ½ x 11” sheet of paper held in front of it as though it’s a wall-obstacle.  The BOE Shield-Bot should maintain a fixed distance between itself and the sheet of paper.  (It will dance around a little because of the sensor noise mentioned earlier.)
  • Rotate the sheet of paper slightly; the BOE Shield-Bot should rotate with it.
  • Try using the sheet of paper to lead the BOE Shield-Bot around.  The BOE Shield-Bot should follow it.
  • Move the sheet of paper too close to the BOE Shield-Bot, and it should back up, away from the paper.
/*
 * Robotics with the BOE Shield - FollowingShieldBot
 * Use proportional control to maintain a fixed distance between
 * BOE Shield-Bot and object in front of it.
 */

#include <Servo.h>                           // Include servo library
 
Servo servoLeft;                             // Declare left and right servos
Servo servoRight;

const int setpoint = 2;                      // Target distances
const int kpl = -50;                         // Proportional control constants
const int kpr = -50;
 
void setup()                                 // Built-in initialization block
{
  pinMode(10, INPUT);  pinMode(9, OUTPUT);   // Left IR LED & Receiver
  pinMode(3, INPUT);  pinMode(2, OUTPUT);    // Right IR LED & Receiver

  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
}  
 
void loop()                                  // Main loop auto-repeats
{
  int irLeft = irDistance(9, 10);            // Measure left distance
  int irRight = irDistance(2, 3);            // Measure right distance
 
  // Left and right proportional control calculations
  int driveLeft = (setpoint - irLeft) * kpl;     
  int driveRight = (setpoint - irRight) * kpr;
 
  maneuver(driveLeft, driveRight, 20);       // Drive levels set speeds
}

// IR distance measurement function

int irDistance(int irLedPin, int irReceivePin)
{  
  int distance = 0;
  for(long f = 38000; f <= 42000; f += 1000) {
    distance += irDetect(irLedPin, irReceivePin, f);
  }
  return distance;
}

// IR Detection function

int irDetect(int irLedPin, int irReceiverPin, long frequency)
{
  tone(irLedPin, frequency, 8);              // IRLED 38 kHz for at least 1 ms
  delay(1);                                  // Wait 1 ms
  int ir = digitalRead(irReceiverPin);       // IR receiver -> ir variable
  delay(1);                                  // Down time before recheck
  return ir;                                 // Return 1 no detect, 0 detect
}     

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
}

How FollowingShieldBot Works

FollowingShieldBot declares three global constants: setpoint, kpl, and kpr.  Everywhere you see setpoint, it’s actually the number 2 (a constant).  Likewise, everywhere you see kpl, it’s actually the number -50.  Likewise with kpr.

const int setpoint = 2;                      // Target distances
const int kpl = -50;                         // Proportional control constants
const int kpr = -50;

The convenient thing about declaring constants for these values is that you can change them in one place, at the beginning of the sketch.  The changes you make at the beginning of the sketch will be reflected everywhere these constants are used.  For example, by changing the declaration for kpl from -50 to -45, every instance of kpl in the entire sketch changes from ‑50 to -45.  This is exceedingly useful for experimenting with and tuning the right and left proportional control loops.

The first thing the loop function does is call the irDistance function for current distance measurements and copies the results to the irLeft and irRight variables.

void loop()                                  // Main loop auto-repeats
{
  int irLeft = irDistance(9, 10);            // Measure left distance
  int irRight = irDistance(2, 3);            // Measure right distance

Remember the simple control loop calculation?

Output for maneuver   = (Distance set point – Measured distance) x Kp

The next two lines of code perform those calculations for the right and left control loops, and store the output-for-maneuver results to variables named driveLeft and driveRight.  

  // Left and right proportional control calculations
  int driveLeft = (setpoint - irLeft) * kpl;     
  int driveRight = (setpoint - irRight) * kpr;

Now, driveLeft and driveRight are ready to be passed to the maneuver function to set the servo speeds.

  maneuver(driveLeft, driveRight, 20);       // Drive levels set speeds
}

Since each call to maneuver lasts for 20 ms, it delays the loop function from repeating for 20 ms.  The IR distance detection takes another 20 ms, so the loop repetition time is about 40 ms.  In terms of sampling rate, that translates to 25 samples per second.

Sampling Rate vs. Sample Interval
The sample interval is the time between one sample and the next.  The sampling rate is the frequency at which the samples are taken.  If you know one term, you can always figure out the other:
sampling rate = 1 ÷ sample interval

 


Printer-friendly version
A Look Inside Proportional Control
Prev
Follow the Leader
Next

DISCUSSION FORUMS | PARALLAX INC. STORE

About | Terms of Use | Feedback: learn@parallax.com | Copyright©Parallax Inc. 2024

© 2026 Parallax Learn • Built with GeneratePress