Potential causes of Boe-Bot reset (other than brownout)

A program I'm running on my BASIC Stamp seems to be causing my Boe-Bot to repeatedly reset. I don't think it's brownout because it doesn't have this problem with any other program, and I replaced the batteries with fresh ones (twice). But I mostly copied this code out of the sourcebook I'm using, Robotics with the Boe-Bot by Andy Lindsay, and I don't see my error. Would someone be willing to take a look at my code and let me know if they see any errors?

I am fairly new to the robotics and CS communities, but it seems to be a done thing to post code for people to look at, so here it is:
' {$STAMP BS2}
' {$PBASIC 2.5}

' EscapingCorners.bs2
' Boe-Bot navigates out of corners by detecting whisker presses

DEBUG "Program running!"

pulseCount     VAR         Byte                 ' FOR...NEXT loop counter.
counter        VAR         Nib                  ' Counts alternate contacts.
old7           VAR         Bit                  ' Stores previous IN7.
old5           VAR         Bit                  ' Stores previous IN5.

FREQOUT 4, 2000, 3000
counter = 1                                     ' Start alternate corner count.
old7 = 0
old5 = 1

FOR pulseCount = 0 TO 100
  GOSUB Forward_Pulse
  NEXT
  RETURN

DO

  IF (IN7 <> IN5) THEN                          ' 1 (but not other) is pressed.
    IF (old7 <> IN7) AND (old5 <> IN5) THEN     ' Different from previous.
      counter = counter + 1
      old7 = IN7                                ' Updating old7 - record this whisker press for future comparison.
      old5 = IN5
      IF (counter > 4) THEN                     ' If alternate whisker count = 4 (since counter = 1 + alternate whisker count),
        counter = 1                             ' reset whisker count
        GOSUB Back_Up                           ' and execute a U-turn.
        GOSUB Turn_Left
        GOSUB Turn_LEFT
      ENDIF                                     ' Of (counter > 4).
    ELSE                                        ' ELSE (old7 = IN7) or (old5 = IN5)
      counter = 1                               ' Therefore not alternate. Reset counter.
    ENDIF                                       ' Of (IN7 <> IN5).
  IF (IN5 = 0) AND (IN7 = 0) THEN               ' Both whiskers detect obstacle
    GOSUB Back_UP                               ' Back up & U-turn (left twice)
    GOSUB Turn_Left
    GOSUB Turn_Left
  ELSEIF (IN5 = 0) THEN                         ' Only left whisker contacts
    GOSUB Back_Up
    GOSUB Turn_Right
  ELSEIF (IN7 = 0) THEN                         ' Only right whisker contacts
    GOSUB Back_Up
    GOSUB Turn_Left
  ELSE                                          ' No problems (both whiskers 1)
    GOSUB Forward_Pulse                         ' Full steam ahead!
  ENDIF
  ENDIF

LOOP                                            ' Now we check again.

Forward_Pulse:                                  ' Send 1 forward pulse
  PULSOUT 13, 850
  PULSOUT 12, 660                               ' Right wheel is slow.
  PAUSE 20
  RETURN

Turn_Left:                                      ' About a 90deg left turn
  FOR pulseCount = 0 TO 20
    PULSOUT 13, 650
    PULSOUT 12, 675             
    PAUSE 20
  NEXT
  RETURN

Turn_Right:                                     ' About 90deg right
  FOR pulseCount = 0 TO 20
    PULSOUT 13, 850
    PULSOUT 12, 810                             ' When turning, Boe-Bot swings faster right than left - how is this possible if right wheel is slow? May have misunderstood.
    PAUSE 20
  NEXT
  RETURN

Back_Up:
  FOR pulseCount = 0 TO 40
    PULSOUT 13, 650
    PULSOUT 12, 840                        
    PAUSE 20
  NEXT
  RETURN

Comments

  • Here's your problem:
    FOR pulseCount = 0 TO 100
      GOSUB Forward_Pulse
      NEXT
      RETURN
    

    This is written like a subroutine with a RETURN, but it's part of the main program. The RETURN without a GOSUB will cause the system to reset.

    -Phil
    “Perfection is achieved not when there is nothing more to add, but when there is nothing left to take away. -Antoine de Saint-Exupery
Sign In or Register to comment.