Shop OBEX P1 Docs P2 Docs Learn Events
Sumobot is not working is this suppose to happen or not please help — Parallax Forums

Sumobot is not working is this suppose to happen or not please help

paddowpaddow Posts: 4
edited 2013-07-04 18:08 in Robotics
so i was just using the basic competition program and i put it on the bot and the light blinks it makes the beeping but then it jerks suddenly then the light blinks really fast and the beeping speeds up and then it stops I don't know what to do

Comments

  • ercoerco Posts: 20,255
    edited 2013-02-09 20:05
    Always start any troubleshooting with brand new batteries. That solves half the problems.

    I cause the other half of the problems. :)
  • paddowpaddow Posts: 4
    edited 2013-02-10 09:11
    Yeah the batteries are brand new i can get it to work and do the motor tests but as soon as i put this program on in does not work:
    ' SumoBot-5.1-Basic-Competition-Program.BS2
    ' {$STAMP BS2}
    ' {$PBASIC 2.5}
    
    
    ' -----[ I/O Definitions ]-------------------------------------------------
    
    
    LMotor       PIN        13                      ' left servo motor
    RMotor       PIN        12                      ' right servo motor
    
    
    LLinePwr     PIN        10                      ' left line sensor power
    LLineIn      PIN        9                       ' left line sensor input
    RLinePwr     PIN        7                       ' right line sensor power
    RLineIn      PIN        8                       ' right line sensor input
    
    
    LfIrOut      PIN        4                       ' left IR LED output
    LfIrIn       PIN        11                      ' left IR sensor input
    RtIrOut      PIN        15                      ' right IR LED output
    RtIrIn       PIN        14                      ' right IR sensor input
    
    
    Speaker      PIN        1                       ' piezo speaker
    StartLED     PIN        0                       ' display start delay
    
    
    ' -----[ Constants ]-------------------------------------------------------
    
    
    LFwdFast     CON        1000                    ' left motor fwd; fast
    LFwdSlow     CON        800                     ' left motor fwd; slow
    LStop        CON        750                     ' left motor stop
    LRevSlow     CON        700                     ' left motor rev; slow
    LRevFast     CON        500                     ' left motor rev; fast
    
    
    RFwdFast     CON        500                     ' right motor fwd; fast
    RFwdSlow     CON        700                     ' right motor fwd; slow
    RStop        CON        750                     ' right motor stop
    RRevSlow     CON        800                     ' right motor rev; slow
    RRevFast     CON        1000                    ' right motor rev; fast
    
    
    ' -----[ Variables ]-------------------------------------------------------
    
    
    lLine        VAR        Word                    ' left sensor raw reading
    rLine        VAR        Word                    ' right sensor raw reading
    blackThresh  VAR        Word                    ' QTI black threshold
    lineBits     VAR        Nib                     ' decoded sensors value
    lbLeft       VAR        lineBits.BIT1
    lbRight      VAR        lineBits.BIT0
    
    
    irBits       VAR        Nib                     ' IR readings (l & r)
    irLeft       VAR        irBits.BIT1
    irRight      VAR        irBits.BIT0
    lastIr       VAR        Nib                     ' info from last reading
    
    
    pulses       VAR        Byte                    ' counter for motor control
    temp         VAR        Byte
    
    
    ' -----[ EEPROM Data ]-----------------------------------------------------
    
    
    RunStatus    DATA       $00                     ' run status
    
    
    ' -----[ Initialization ]--------------------------------------------------
    
    
    Reset:
      READ RunStatus, temp                          ' read current status
      temp = ~temp                                  ' invert status
      WRITE RunStatus, temp                         ' save for next reset
      IF (temp > 0) THEN END                        ' okay to run?
    
    
    ' Sets black threshold to 1/4 the average of the two sensor readings.
    ' SumoBot must be placed over black playing surface before this code runs.
    
    
    Set_Threshold:                                  ' set QTI black threshold
      GOSUB Read_Line_Sensors
      blackThresh = (lLine / 10) + (rLine / 10)
    
    
      LOW LMotor                                    ' make more pins outputs
      LOW RMotor
    
    
    Start_Delay:                                    ' five second delay
      FOR temp = 1 TO 5
        HIGH StartLED                               ' show active
        PAUSE 900
        INPUT StartLED                              ' blink each second
        FREQOUT Speaker, 100, 2500, 3000            ' beep each second
      NEXT
    
    
      GOTO Lunge                                    ' start aggressive!
    
    
    ' -----[ Program Code ]----------------------------------------------------
    
    
    Main:
      GOSUB Read_Line_Sensors
    
    
      ' If not on the Shikiri line (border), continue to look for opponent,
      ' otherwise, spin back toward center and resume search
    
    
      BRANCH lineBits, [Search_For_Opponent, Spin_Left, Spin_Right, About_Face]
    
    
    ' --[ Border Avoidance ]--
    
    
    Spin_Left:                                      ' right sensor was active
      FOR pulses = 1 TO 20
        PULSOUT LMotor, LRevFast
        PULSOUT RMotor, RFwdFast
        PAUSE 20
      NEXT
      lastIr =                                   ' clear scan direction
      GOTO Lunge
    
    
    Spin_Right:                                     ' left sensor was active
      FOR pulses = 1 TO 20
        PULSOUT LMotor, LFwdFast
        PULSOUT RMotor, RRevFast
        PAUSE 20
      NEXT
      lastIr = 
      GOTO Lunge
    
    
    About_Face:                                     ' both sensors on Shikiri
      FOR pulses = 1 TO 10                          ' back up from edge
        PULSOUT LMotor, LRevFast
        PULSOUT RMotor, RRevFast
        PAUSE 20
      NEXT
      FOR pulses = 1 TO 30                          ' turn around
        PULSOUT LMotor, LFwdFast
        PULSOUT RMotor, RRevFast
        PAUSE 20
      NEXT
      lastIr = 
      GOTO Lunge
    
    
    ' --[ IR Processing ]--
    
    
    Search_For_Opponent:
      GOSUB Read_IR_Sensors
    
    
      ' If opponent is not in view, scan last known direction. Turn toward
      ' opponent if seen by one "eye" -- if both, lunge forward
    
    
    BRANCH irBits, [Scan, Follow_Right, Follow_Left, Lunge]
    
    
    Scan:
      BRANCH lastIR, [Move_Fwd, Scan_Right, Scan_Left]
    
    
    Move_Fwd:
      GOSUB Creep_Forward
      GOTO Main
    
    
    Scan_Right:                                     ' spin right, slow
      FOR pulses = 1 TO 5
        PULSOUT LMotor, LFwdSlow
        PULSOUT RMotor, RRevSlow
        PAUSE 20
      NEXT
      GOSUB Creep_Forward                           ' keep moving
      GOTO Main
    
    
    Scan_Left:                                      ' spin left, slow
      FOR pulses = 1 TO 5
        PULSOUT LMotor, LRevSlow
        PULSOUT RMotor, RFwdSlow
        PAUSE 20
      NEXT
      GOSUB Creep_Forward
      GOTO Main
    
    
    Follow_Right:                                   ' spin right, fast
      PULSOUT LMotor, LFwdFast
      PULSOUT RMotor, RRevSlow
      lastIR = irBits                               ' save last direction found
      GOTO Main
    
    
    Follow_Left:                                    ' spin left, fast
      PULSOUT LMotor, LRevSlow
      PULSOUT RMotor, RFwdFast
      lastIR = irBits
      GOTO Main
    
    
    Lunge:                                          ' locked on -- go get him!
      FOR pulses = 1 TO 25
        PULSOUT LMotor, LFwdFast
        PULSOUT RMotor, RFwdFast
        GOSUB Read_Line_Sensors
        IF (lineBits = ) THEN Match_Over         ' in sight, we're on the line
      NEXT
      GOTO Main
    
    
    ' If SumoBot can see the opponent with both "eyes" and both QTIs are
    ' detecting the border, we must have pushed the opponent out.
    
    
    Match_Over:
      FOR pulses = 1 TO 10                          ' stop motors
        PULSOUT LMotor, LStop
        PULSOUT RMotor, RStop
        PAUSE 20
      NEXT
      INPUT LMotor
      INPUT RMotor
    
    
      FOR temp = 1 TO 10                            ' make some noise
        HIGH StartLED
        FREQOUT Speaker, 100, 2500, 3000            ' beep
        INPUT StartLED                              ' blink LED
        PAUSE 100
      NEXT
    
    
      DIRS = $0000                                  ' disable all outputs
      GOTO Reset                                    ' reset for next round
    
    
    ' -----[ Subroutines ]-----------------------------------------------------
    
    
    Read_Line_Sensors:
      HIGH LLinePwr                                 ' activate sensors
      HIGH RLinePwr
      HIGH LLineIn                                  ' discharge caps
      HIGH RLineIn
      PAUSE 1
      RCTIME LLineIn, 1, lLine                      ' read left sensor
      RCTIME RLineIn, 1, rLine                      ' read right sensor
      LOW LLinePwr                                  ' deactivate sensors
      LOW RLinePwr
    
    
      ' convert readings to bits
      LOOKDOWN lLine, >=[1000, 0], lbLeft           ' 0 = black, 1 = line
      LOOKDOWN rLine, >=[1000, 0], lbRight
      RETURN
    
    
    Read_IR_Sensors:
      FREQOUT LfIrOut, 1, 38500                     ' modulate left IR LED
      irLeft = ~LfIrIn                              ' read input (1 = target)
      FREQOUT RtIrOut, 1, 38500                     ' modulate right IR LED
      irRight = ~RtIrIn                             ' read input (1 = target)
      RETURN
    
    
    Creep_Forward:
      FOR pulses = 1 TO 20
        PULSOUT LMotor, LFwdSlow
        PULSOUT RMotor, RFwdSlow
        PAUSE 20
      NEXT
      RETURN
    
  • ercoerco Posts: 20,255
    edited 2013-02-10 09:23
    SumoBot must be placed over black playing surface before this code runs.

    Didja?
  • paddowpaddow Posts: 4
    edited 2013-02-10 11:23
    Yeah I did but here is the thing it only works when i am holding it in the air and everytime it touches the black surface the red lights flashes and turns off it does that when i start it on the surface and when i place it on the black surface after it turns on
  • Chris SavageChris Savage Parallax Engineering Posts: 14,406
    edited 2013-04-16 16:18
    It sounds like the ring sensors may be falsely triggering resulting in the Sumo-Bot thinking the match is over. The surface may look black, but may still reflect IR light. This is especially a possibility if the black ring was printed from a photo printer or any device that uses, metallic ink.
  • Kevin CookKevin Cook Posts: 159
    edited 2013-04-18 15:11
    Another thing to look at adjusting is the FREQOUT to another frequency (increments +/- 500) to see if that improves the performance of the QTI.
  • KeithEKeithE Posts: 957
    edited 2013-07-04 18:08
    I was just looking into this as well. I'm wondering if the sensors changed down the line, and that's why nobody found this bug.

    The code goes to the trouble of calculating blackThresh, but then uses a hardcoded 1000 threshold here:
      ' convert readings to bits
      LOOKDOWN lLine, >=[1000, 0], lbLeft           ' 0 = black, 1 = line
      LOOKDOWN rLine, >=[1000, 0], lbRight
      RETURN
    

    If you replace the 1000 with blackThresh it should behave better, but I believe there are plenty of other adjustments to make.

    Edited to add:

    I don't have access to the robots right now, but looking through the code I see this:
    ' Sets black threshold to 1/4 the average of the two sensor readings.
    ' SumoBot must be placed over black playing surface before this code runs.
    
    Set_Threshold:                                  ' set QTI black threshold
      GOSUB Read_Line_Sensors
      blackThresh = (lLine / 10) + (rLine / 10)
    

    The comment doesn't match the code. I think this threshold just needs to be tuned by each individual user.

    Also some more things.
    Reset:
    ...
    
      GOTO Lunge                                    ' start aggressive!
    ...
    Lunge:                                          ' locked on -- go get him!
      FOR pulses = 1 TO 25
        PULSOUT LMotor, LFwdFast
        PULSOUT RMotor, RFwdFast
        GOSUB Read_Line_Sensors
        IF (lineBits = %11) THEN Match_Over         ' in sight, we're on the line
    

    If you start the robots such that the initial Lunge gets a robot right to the edge, it will halt thinking that it has won the match.

    When debugging some of these things and suspecting bad sensors I noticed that FREQOUT for 38.5 kHz as in:
    Read_IR_Sensors:
      FREQOUT LfIrOut, 1, 38500
    

    Generates a waveform with a ton of jitter. I guess it's just a limitation of the basic stamp, or of the particular model used on the sumobots. I didn't save a scope shot, but can capture one later.
Sign In or Register to comment.