More Precise BOE Arlo Maneuvers with Encoders

More Precise BOE Arlo Maneuvers with Encoders

As mentioned earlier, the Arlo has encoders that track distance in 144th increments of a full wheel rotation.  These increments are commonly called “counts”, and the Arlo’s encoders send 144 counts per revolution.  The Arlo’s encoders are quadrature, meaning that the two encoder sensors are offset by ¼ of a count.  By monitoring the pattern of low-high-low transitions for both sensors, the DHB-10 can also determine which direction the wheel is turning.  For a given wheel, 144 counts would mean a full forward rotation, and -144 counts would mean a full backward rotation.

The Arlo’s DHB-10 motor controller has a built-in control system that uses the encoder outputs to control motor speed and distance as well as monitor motor position.  To take advantage of this more accurate control system, your program will have to send and receive serial messages instead of servo control pulses.  

NOTE: To find out more about the DHB-10 commands in this document’s example programs, look them up in the DHB-10 Motor Controller Firmware Guide.

 

Serial Distance Control  

This example program uses distance mode commands TRVL and TURN to send the Arlo forward 2 wheel revolutions, left ¼ turn, right ½ turn, left ¼ turn, and back 2 wheel revolutions.  The DHB-10 gets the Arlo’s wheels to the right encoder count; all the program has to do is wait long enough for it complete each command.   

  • Set power like this: MAIN (on), MOTORS (off), BOE (position-2)
  • Run Serial Distance Maneuvers.bs2.
  • Don’t worry about the communication error message because Motors power is off.
  • Turn all power off, unplug programming cable, and take to your Arlo navigation area.
  • Turn MAIN and MOTORS power on.
  • Set the BOE power switch to 2.
  • Verify that the Arlo goes forward, turns left, then right, then left, then backs up to near where it started.
' -----[ Title ]-----------------------------------------------------------
' Arlo - Serial Distance Maneuvers.bs2
' Examples that use serial communication to make the arlo travel in certain
' straight-line and turn-in-place distances.

' {$STAMP BS2}
' {$PBASIC 2.5}

' -----[ I/O Definitions ]-------------------------------------------------

Tx PIN 13
Rx PIN 13

' -----[ Variables ]-------------------------------------------------------

countsL        VAR     Word                  ' L & R distances
countsR        VAR     Word
counts         VAR     countsL               ' Distance & top speed
topSpeed       VAR     countsR
n              VAR     Byte                  ' Stores index of serial exchange

' -----[ Initialization ]-------------------------------------------------

FREQOUT 4, 2000, 3000                        ' Beep -> program starting
DEBUG "Program running...", CR, CR           ' Display program running
GOSUB Set_Ser_Pace                           ' Set serial pace
GOSUB Clear_Encoders                         ' Clear previous distances

' -----[ Main Routine ]----------------------------------------------------

counts = 288 : topSpeed = 200                ' Forward 288 @ 200 counts/sec
GOSUB Travel                                 ' Call Travel subroutine
PAUSE 3000                                   ' 3 s to complete maneuver
GOSUB Get_Distance                           ' Get distances

counts = -93 : topSpeed = 200                ' Left 93 @ 200 counts/sec
GOSUB Turn                                   ' Call Turn subroutine
PAUSE 3000                                   ' 3 s to complete maneuver
GOSUB Get_Distance                           ' Get distances

counts = 186 : topSpeed = 100                ' Right 186 @ 100 counts/sec
GOSUB Turn                                   ' Call Turn subroutine
PAUSE 4000                                   ' 4 s to complete maneuver
GOSUB Get_Distance                           ' Get distances

counts = -93 : topSpeed = 32                 ' Left 93 @ 32 counts/sec
GOSUB Turn                                   ' Call Turn subroutine
PAUSE 5000                                   ' 4 s to complete maneuver
GOSUB Get_Distance                           ' Get distances

counts = -288 : topSpeed = 200               ' Backward 288 @ 200 counts/sec
GOSUB Travel                                 ' Call Travel subroutine
PAUSE 3000                                   ' 3 s to complete maneuver
GOSUB Get_Distance                           ' Get distances

END

' -----[ Subroutine - Set_Ser_Pace ]---------------------------------------

' Pace setting not required if Test BOE and DHB-10 Communication.bs2 has
' already been run (successfully).  Adds 1 ms delay before serial reply
' and with each space so BS2 can set up SDEC inputs at 19200.
Set_Ser_Pace:
  n = n + 1                                   ' Increment message index
  DEBUG "PACE 1", CR                          ' Set serial pace for BS2
  SEROUT 13, 32800, ["PACE 1", CR]            ' Set serial pace for BS2
  SERIN  13, 32800, 50, ERR, [WAIT(CR)]       ' Get DHB-10's confirmation
RETURN

' -----[ Subroutine - Clear_Encoders ]-------------------------------------

Clear_Encoders:
  n = n + 1                                  ' Increment message index
  DEBUG "RST", CR                            ' Display message to DHB-10
  SEROUT Tx, 32800, ["RST", CR]              ' Send reset encoders message
  SERIN  Rx, 32800, 50, ERR, [WAIT(CR)]      ' Get DHB-10's reply
RETURN

' -----[ Subroutine - Travel ]---------------------------------------------

Travel:
  n = n + 1                                  ' Increment message index
  DEBUG "TRVL ", SDEC counts, " ",           ' Display message to DHB-10
                 SDEC topSpeed, CR
  SEROUT Tx, 32800, ["TRVL ", SDEC counts,   ' Travel command with arguments
                     " ", SDEC topSpeed, CR]
  SERIN  Rx, 32800, 50, ERR, [WAIT(CR)]      ' Get DHB-10's reply
RETURN

' -----[ Subroutine - Turn ]-----------------------------------------------

Turn:
  n = n + 1                                  ' Increment message index
  DEBUG "TURN ", SDEC counts,                ' Display message to DHB-10
            " ", SDEC topSpeed, CR
  SEROUT Tx, 32800, ["TURN", " ",            ' Turn command with arguments
                     SDEC counts,
                " ", SDEC topSpeed, CR]
  SERIN  Rx, 32800, 50, ERR, [WAIT(CR)]      ' Get DHB-10's reply
RETURN

' -----[ Subroutine - Get_Distance ]---------------------------------------

Get_Distance:
  countsL = 0                                ' Clear counts variables
  countsR = 0
  n = n + 1                                  ' Increment message index
  DEBUG "DIST ", CR                          ' Display message to DHB-10
  SEROUT Tx, 32800, ["DIST", CR]             ' Distance command
  SERIN  Rx, 32800, 100, ERR, [SDEC countsL, ' Get DHB-10's reply
                               SDEC countsR]
  DEBUG "countsL = ", SDEC countsL, " countsR = ", SDEC countsR, CR
RETURN

' -----[ Routine - ERR ]---------------------------------------------------

ERR:                                         ' Error routine
  DEBUG "ERROR, no reply from DHB-10.", CR   ' Error message
  DEBUG "n = ", DEC n                        ' Index of exchange that failed
  STOP                                       ' End program

 

Serial Speed Control

If your robot is using sensors to navigate, maybe you just want your program to make the Arlo go forward until it finds an obstacle.  Instead of specifying a particular distance and setting aside a certain amount of time, your program can set each wheel speed and go until the sensors have detected a condition your program is looking for.    

This next example program just goes forward at a certain speed for 2 seconds, then backward at that same speed for 2 seconds.  Note that the left and right values are positive for forward and negative for backward.  Keep in mind that the values don’t have to match.  For example, you could change the left and right values to 150 and 50 to make it draw an arc, or even -150 and -50 to reverse the direction of the arc.

  • Set power like this: MAIN (on), MOTORS (off), BOE (position-2)
  • Run Serial Speed Maneuvers.bs2.
  • Disregard the communication error message.
  • Turn all power off, unplug programming cable, and take to your Arlo navigation area.
  • Turn MAIN and MOTORS power on.
  • Set the BOE power switch to 2.
  • Verify that the Arlo goes forward, and then backwards.
  • Try changing the left = 144  : right = 144      to     left = 144  : right = 44.
  • Change the         left = -144 : right = -144    to     left = -144 : right = -44.
' -----[ Title ]-----------------------------------------------------------
' Arlo - Serial Speed Maneuvers.bs2
' Examples that use serial communication to make the arlo travel in certain
' straight-line and turn-in-place distances.

' {$STAMP BS2}
' {$PBASIC 2.5}

' -----[ I/O Definitions ]-------------------------------------------------

Tx PIN 13
Rx PIN 13

' -----[ Variables ]-------------------------------------------------------

left           VAR     Word                  ' L & R speeds & distances
right          VAR     Word
n              VAR     Byte                  ' Stores index of serial exchange

' -----[ Initialization ]-------------------------------------------------

FREQOUT 4, 2000, 3000                        ' Beep -> program starting
DEBUG "Program running...", CR, CR           ' Display program running
GOSUB Set_Ser_Pace                           ' Set serial pace
GOSUB Clear_Encoders                         ' Clear previous distances

' -----[ Main Routine ]----------------------------------------------------

left = 144 : right = 144                     ' Left & right 144 counts/sec
GOSUB Go_Speed                               ' Call Go_Speed subroutine
PAUSE 3000                                   ' Go for 3 seconds

left = 0 : right = 0                         ' Left & right 0 counts/sec
GOSUB Go_Speed                               ' Call Go_Speed subroutine
PAUSE 1500                                   ' Time to stop
GOSUB Get_Distance                           ' Get distances

left = -144 : right = -144                   ' Left & right -144 counts/sec
GOSUB Go_Speed                               ' Call Go_Speed subroutine
PAUSE 3000                                   ' Go for 3 seconds

left = 0 : right = 0                         ' Left & right 0 counts/sec
GOSUB Go_Speed                               ' Call Go_Speed subroutine
PAUSE 1500                                   ' Time to stop
GOSUB Get_Distance                           ' Get distances

END

' -----[ Subroutine - Set_Ser_Pace ]---------------------------------------

' Pace setting not required if Test BOE and DHB-10 Communication.bs2 has
' already been run (successfully).  Adds 1 ms delay before serial reply
' and with each space so BS2 can set up SDEC inputs at 19200.
Set_Ser_Pace:
  n = n + 1                                   ' Increment message index
  DEBUG "PACE 1", CR                          ' Set serial pace for BS2
  SEROUT 13, 32800, ["PACE 1", CR]            ' Set serial pace for BS2
  SERIN  13, 32800, 50, ERR, [WAIT(CR)]       ' Get DHB-10's confirmation
RETURN

' -----[ Subroutine - Clear_Encoders ]-------------------------------------

Clear_Encoders:
  n = n + 1                                  ' Increment message index
  DEBUG "RST", CR                            ' Display message to DHB-10
  SEROUT Tx, 32800, ["RST", CR]              ' Send reset encoders message
  SERIN  Rx, 32800, 50, ERR, [WAIT(CR)]      ' Get DHB-10's reply
RETURN

' -----[ Subroutine - Go_Speed ]-------------------------------------------

Go_Speed:
  n = n + 1                                  ' Increment message index
  DEBUG "GOSPD ", SDEC left,                 ' Display message to DHB-10
             " ", SDEC right, CR
  SEROUT Tx, 32800, ["GOSPD", " ",           ' GOSPD command with arguments
                     SDEC left,
                " ", SDEC right, CR]
  SERIN  Rx, 32800, 50, ERR, [WAIT(CR)]      ' Get DHB-10's reply
RETURN

' -----[ Subroutine - Get_Distance ]---------------------------------------

Get_Distance:
  n = n + 1                                  ' Increment message index
  left = 0                                   ' Clear counts variables
  right = 0
  DEBUG "DIST ", CR                          ' Display message to DHB-10
  SEROUT Tx, 32800, ["DIST", CR]             ' Distance command
  SERIN  Rx, 32800, 100, ERR, [SDEC left,    ' Get DHB-10's reply
                               SDEC right]
  DEBUG "left = ", SDEC left,                ' Display distances
        " right = ", SDEC right, CR
RETURN

' -----[ Routine - ERR ]---------------------------------------------------

ERR:                                         ' Error routine
  DEBUG "ERROR, no reply from DHB-10.", CR   ' Error message
  DEBUG "n = ", DEC n                        ' Index of exchange that failed
  STOP                                       ' End program