Shop OBEX P1 Docs P2 Docs Learn Events
Program (if then) (do loop) (timer) problem urgent!!!! — Parallax Forums

Program (if then) (do loop) (timer) problem urgent!!!!

philip88822philip88822 Posts: 11
edited 2009-05-21 02:31 in Learn with BlocklyProp
Hi everyone
I'm now makeing a car which can detect infrared and move toward to it.
And i am now writting my program
There are two sensors of my car which using PORTD
IF THE LEFT ONE DETECT INFRARED SIGNAL THEN IT WILL TURN LEFT
IF THE RIGHT ONE DETECT INFRARED SIGNAL THEN IT WILL TURN LEFT
IF BOTH DETECT INFRARED SIGNEL THEN IT WILL MOVE TOWARD
IF NO SIGNAL DETECT, IT WILL TURN AROUND UNTILL·IT FIND THE SIGNAL··AND AFTER 30 SECONDS, IT WILL STOP

THE PROBLEM IS THAT I SET THAT IF NOT SIGNAL DETECT, IT WILL MOVE AROUND
BUT WHEN IT RUN,IT WILL NON STOP TURN AROUND.
SO HOW CAN I FIX IT?
ALSO,HOW CAN I SET THAT AFTER 30 SECONDS IT WILL STOP?

Program:
IF IN12=0 AND IN14=0 THEN<
BOTH SENSOR DETECT SIGNAL
OUTC=15
PAUSE 500
OUTC=0
PAUSE 200
ELSEIF IN12=0 AND IN14=1 THEN<
LEFT SENSOR DETECT SIGNAL
OUTC=12
PAUSE 500
OUTC=0
PAUSE 200
ELSEIF IN12=1 AND IN14=0 THEN<
RIGHT SENSOR DETECT SIGNAL
OUTC=12
PAUSE 500
OUTC=0
PAUSE 200
ELSEIF IN12=1 AND IN14=1 THEN<
BOTH SENSOR NO SIGNAL
OUTC=12
PAUSE 500
ENDIF

MILLION THANKS

Post Edited (philip88822) : 5/20/2009 7:42:40 PM GMT

Comments

  • Chris SavageChris Savage Parallax Engineering Posts: 14,406
    edited 2009-05-20 18:04
    Hello,

    As per the forum guidelines it is recommended that you use a descriptive subject line for your message. This will allow others who may be able to help you to know what your message is about. Currently the subject line does not convey anything useful to those that may be able to help you. You can edit your message/subject using the pencil icon to the top right of the message.

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    Chris Savage
    Parallax Engineering
  • Jessica UelmenJessica Uelmen Posts: 490
    edited 2009-05-20 19:14
    Hi Phillip,

    Do you have your IF...THEN statements in a DO...LOOP? If not, your program is probably just running through the IF...THEN statements once and will never check the sensors again. So when you tell your bot to rotate if nothing is detected until something is detected, then if you never tell it to check the sensors again, it will keep rotating because those values will remain the same indefinitely.

    Hope that helps!

    Jessica

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    Jessica Uelmen
    Education Department
    Parallax, Inc.
  • philip88822philip88822 Posts: 11
    edited 2009-05-20 19:33
    Jessica Uelmen (Parallax) said...
    Hi Phillip,

    Do you have your IF...THEN statements in a DO...LOOP? If not, your program is probably just running through the IF...THEN statements once and will never check the sensors again. So when you tell your bot to rotate if nothing is detected until something is detected, then if you never tell it to check the sensors again, it will keep rotating because those values will remain the same indefinitely.

    Hope that helps!

    Jessica

    THX JESSICA
    I'VE TRY DO LOOP ALSO
    BUT THE PROBLEM IS SAME
    I DUNNO WHAT'S THE PROBLEM

    MAIN:
    DO WHILE IN12=0 AND· IN14=0
    OUTC=15
    PAUSE 500
    OUTC=0
    PAUSE 200
    LOOP

    DO WHILE IN14=0 AND IN12=1
    OUTC=12
    PAUSE 500
    OUTC=0
    PAUSE 200
    LOOP

    DO WHILE IN14=1 AND IN12=0
    OUTC=3
    PAUSE 500
    OUTC=0
    PAUSE 200
    LOOP

    DO
    IF IN12=1 AND IN14=1 THEN
    OUTC=12
    PAUSE 200
    OUTC=0
    PAUSE 200
    OUTC=3
    PAUSE 200
    OUTC=0
    PAUSE 200
    ENDIF
    LOOP UNTIL IN12<>1 OR IN14<>1
    GOTO MAIN

    THE OTHER PARTS ARE ALL FINE
    BUT THE NO SIGNAL PART IS STILL NON-STOP
    PLEASE HELP!!!

    Post Edited (philip88822) : 5/20/2009 7:41:47 PM GMT
  • Jessica UelmenJessica Uelmen Posts: 490
    edited 2009-05-20 22:19
    Hi Phillip,

    Try putting the whole code in a DO...LOOP.· In the loops you just listed, you'll run into the same problem of the loops only executing once.· Here's some psuedocode:

    DO
      IF IR Reading THEN
        Statements
      ELSEIF Another IR Reading THEN
        Statements
      ENDIF
    LOOP
    


    Hope this helps!

    Jessica


    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    Jessica Uelmen
    Education Department
    Parallax, Inc.
  • philip88822philip88822 Posts: 11
    edited 2009-05-21 00:30
    Jessica Uelmen (Parallax) said...

    Hi Phillip,

    Try putting the whole code in a DO...LOOP.· In the loops you just listed, you'll run into the same problem of the loops only executing once.· Here's some psuedocode:

    DO
      IF IR Reading THEN
        Statements
      ELSEIF Another IR Reading THEN
        Statements
      ENDIF
    LOOP
    


    Hope this helps!

    Jessica
    Jessica
    It's work now.
    Thanks a lot

    But there are some little problem,
    can i set if 5 seconds cannot detect signal then it will turn around
    cause the code have some time problem

    About the 30 seconds stop
    Do you have any information about this??
  • sam_sam_samsam_sam_sam Posts: 2,286
    edited 2009-05-21 01:31
    This is a free be

    There a few way to this , this is just one of them

    The order of red routine being first or the blue routine being First is up to you in how you want to work


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


    laps··· VAR·· Byte

    MAIN:

    laps = 00


    DO

    laps = laps + 1····························
    IF IN12=0 AND· IN14=0 THEN
    IF laps = 20 THEN EXIT················ ' Set LAPS for ever long you want this routine to run
    OUTC=15······························· ' "LONG = how many time you want the routine to repeat it self
    PAUSE 500
    OUTC=0
    PAUSE 200
    ENDIF

    LOOP


    '=================================================================================
    DO
    IF IN12=1 OR IN14=1 THEN EXIT··········· ' This is a DO Nothing Loop Until one of the IR see something
    LOOP

    laps = 00

    DO

    laps = laps + 1···································· ·' Or you loop this so many time then exit and go to something else
    IF IN12=1 OR IN14=1 OR laps =·5 THEN EXIT·······················
    PAUSE 1000

    ·

    ·LOOP

    '=================================================================================

    ·

    ··························································· DO

    DO WHILE IN14=0 AND IN12=1·····················IF IN14=0 AND IN12=1·THEN
    OUTC=12·················································GOSUB· SubRoutine1
    PAUSE 500··············································· ELSE
    OUTC=0·················································· IF IN14=1 AND IN12=0 THEM
    PAUSE 200··············································· GOSUB SubRoutine2
    LOOP························································ELSE
    ·······························································IN12=1 AND IN14=1 THEN
    DO WHILE IN14=1 AND IN12=0······················ GOSUB· SubRoutine3
    OUTC=3···················································· ENDIF
    PAUSE 500················································· ENDIF
    OUTC=0····················································· ·ENDIF
    PAUSE 200·················································· LOOP
    LOOP
    ································································· SubRoutine1:
    ································································ DO
    DO····························································· OUTC=12
    IF IN12=1 AND IN14=1 THEN·····························PAUSE 500·········
    OUTC=12····················································· OUTC=0
    PAUSE 200···················································· PAUSE 200···············································
    OUTC=0······················································· LOOP UNTIL IN4 = 1 AND 12 = 0
    PAUSE 200··················································· RETURN
    OUTC=3
    PAUSE 200··················································· SubRoutine2:
    ·································································· DO
    OUTC=0······················································ OUTC=3
    PAUSE 200····················································PAUSE 500
    ENDIF························································· OUTC=0
    LOOP UNTIL IN12<>1 OR IN14<>1···················· PAUSE 200
    GOTO MAIN·················································· LOOP UNTIL IN4 =·0 AND 12 = 1
    ··································································RETURN

    '===========================================================================

    can i set if 5 seconds

    laps = 00

    DO

    laps = laps + 1··················· ·' This is a Counting Routine
    IF laps =·5 THEN EXIT···········
    PAUSE 1000

    ·

    ·LOOP




    can i set if 5 seconds cannot detect signal then it will turn around

    laps = 00

    DO

    laps = laps + 1····················
    IF IN12=0 AND· IN14=0 THEN
    IF laps =·5 THEN EXIT·········· ' Just change how many laps you want to do
    PAUSE 1000
    ·LOOP

    ·Turn Around Routine here···········



    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    ··Thanks for any·idea.gif·that you may have and all of your time finding them

    ·
    ·
    ·
    ·
    Sam

    Post Edited (sam_sam_sam) : 5/21/2009 2:45:14 AM GMT
  • $WMc%$WMc% Posts: 1,884
    edited 2009-05-21 02:31
    philip

    This is some more pseudo or generic code. I wasn't sure what Stamp You where using, But I think You get the idea.CON values
    vary from one Stamp to another so You may have to adjust the values Accordingly

    Time1 CON 5000 ' 5 sec delay This method lets You change All the PAUSE times in 1 place for "Time1"
    Time2 CON 2000 ' 2 sec delay Instead Of every place PAUSE 5000 is used. same for the other 2 PAUSE Times
    Time3 CON 1000 ' 1 sec delay
    X VAR NIB ' can be NIB, BYTE, or WORD
    X=1

    Main:
    DO
    INPUT 12 'input left IR sensor
    INPUT 14 'input right IR
    X=X+1 'X starts off with a value of 1 (see above),Then adds 1 to it on every LOOP. This is Your counter

    IF IN12=0 AND IN14=1 THEN GOSUB LefTurn
    IF IN12=1 AND IN14=0 THEN GOSUB RiTurn
    IF IN12=0 AND IN14=0 THEN GOSUB Forward
    IF X=30 THEN GOTO Stop 'If the DO-LOOP,loops 30 times with out meeting any of the IF statements We END the program
    PAUSE Time3 'Time3 is 1 sec. So 30 passes = 30 sec
    LOOP
    GOTO Main

    Forward:
    OUTC = 15
    PAUSE Time1
    OUTC = 0
    PAUSE Time2
    X=1 'reset counter because You got a Signal from Left and right IR sensor
    RETURN

    LefTurn:
    OUTC = 12
    PAUSE Time1 ' time1 set to 5 Seconds in above CON
    OUTC = 0
    PAUSE Time2
    X=1 'reset counter because You got a Signal from LeftTurn IR sensor
    RETURN

    RiTurn:
    OUTC = 12
    PAUSE Time1
    OUTC = 0
    PAUSE Time2
    X=1
    RETURN

    Stop: 'Instead of END, Some human interface could be used here to help get the Car back on track
    OUTC = 0
    END 'This will stop the program-You'll have to reset most Stamps to start the program up again after END "hit RESET button" or cycle power.

    Hope This helps with out being to confusing.

    _________$WMc%_______

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    The Truth is out there············································ BoogerWoods, FL. USA
Sign In or Register to comment.