Chief Delphi

Chief Delphi (http://www.chiefdelphi.com/forums/index.php)
-   Programming (http://www.chiefdelphi.com/forums/forumdisplay.php?f=51)
-   -   Limit Switchers Logic Problem (http://www.chiefdelphi.com/forums/showthread.php?t=73600)

Pasha 04-02-2009 15:02

Limit Switchers Logic Problem
 
Hi, I'm Paul Boguslavskiy from Team 1403. I have a problem trying to get this limit switcherrs to work. I have 3 buttons of a joystick to control the direction of a lazy susan: left, right stop.

I have 2 limit switchers on each side. When the lazy susan goes too much left the switch should go on and stop the lazy susan. What I did before was say that if left limit goes on, set motor speed to 0 (stopping the motor). However, the limit switch STAYS true, and the motor speed is forever set to 0. I'm not sure what to do now, how can I stop the motors from spinning once, and then be able to continue later.

SIDE NOTE: When I press the button for left once it should continue to spin left forever. I do not want a press and hold to spin the motors.


rogerlsmith 04-02-2009 15:08

Re: Limit Switchers Logic Problem
 
Try this, keep track of which limit switch is tripped (on) and compare that to which direction button is getting pressed. For example, if left limit switch is tripped and you want to rotate left, don't let this happen, but turn the motor on if you want to turn right. Same procedure for the other side.

Hope this helps.

Dave Scheck 04-02-2009 15:10

Re: Limit Switchers Logic Problem
 
I think the problem is that you blindly set the output to 0 when the switch is pressed. I think you want the logic to be something like this
Code:

IF left button is pressed
    IF left limit switch is pressed
        output = 0
    ELSE
        output = MOVE_LEFT_SPEED

You'll need something similar on the right side as well

Pasha 04-02-2009 15:23

Re: Limit Switchers Logic Problem
 
I still run into a problem though. As soon as I set that false state to set motor to 0. I now have to hold the button to go left, and hold the button to go right.

Dave Scheck 04-02-2009 15:51

Re: Limit Switchers Logic Problem
 
The problem that you're describing is more complex and probably shouldn't be done the way your code is laid out. The reason I say this is that you have 3 blocks that are affecting the same output. In order to do what you want the program to do, you'll need to look at the 3 buttons and 2 switches and make a decision on what to do to the output.

I think this is the logic that you want to use. Note that based on the inputs we calculate a state and store it into a persistent variable called state. Then at the end, we look at state and write the output.
Code:

IF left is pressed
    IF left limit switch is pressed
        state = MOVE_STOP
    else
        state = MOVE_LEFT
ELSE IF right is pressed
    IF right limit switch is pressed
        state = MOVE_STOP
    else
        state = MOVE_RIGHT
ELSE IF stop is pressed
    state = MOVE_STOP
ELSE
    // No change to state

IF state is MOVE_LEFT
    output = MOVE_LEFT_SPEED
ELSE IF state is MOVE_RIGHT
    output = MOVE_RIGHT_SPEED
ELSE
    output = 0

I work predominantly in C and C++, so my Labview terminology and logic isn't the best. I'm sure there are people around that can help you with the implementation side of things. I would suggest reading through the logic and understanding what it does. Only then should you try to implement something like that.

Greg McKaskle 04-02-2009 22:34

Re: Limit Switchers Logic Problem
 
Personally, I'd read all the jstick buttons and limit switches. Then look at the jstick buttons to decide what to do with the motor disregarding the limits. You need some logic about multiple buttons being pushed, but you can build a lookup integer from the the three bits or you can do lots of logic.

After you decide what to do with the motor, look at the limits. One limit forces negative numbers to zero, the other forces positive to zero.

Greg McKaskle

DarKCroNo 05-02-2009 02:11

Re: Limit Switchers Logic Problem
 
Your problem is that your not toggling your buttons, we had this problem too in labview. If you look at the wiring, u said that if button 1 is true than such happens (set motor speed) but that action is within the case box, and it only executes if and only when button 1 is true. The only time button 1 is constantly true is if ur holding the button. Try holding ur buttons and see if the motors are moving the way u'd like.
Now if that doesn't work, i don't know if its also the values ur inputting to the motors which are affecting it but... when I was programming it i didn't realize u cud put values -1 -> 1 to indicate full speed rev and full speed forward, and so i used 127 and -127 and i'm not sure if that makes a difference. Because I tried 127 first i don't know if thats the default pwm values for the program to read.

Now about the limit switching, I have just finished a program where for our robot, a gate will be drawn up and down to let balls roll out of our basket. We used limit switches to trigger the stoppingmotion of the gate. I wouldn't mind giving it to u if you want but the problem is I don't understand it much to explain. I spent a whole night doing it and got it working through debugging, but if you were to ask me how each block works i would have no clue haha...
Oh and I can give you a toggling vi as well if you'd like.

If this gives you too much trouble there is another thing you can do which makes it a whole lot simpler. Since your motion is rotating you can use a potentiometer and use a PID control loop to control how it spins... but i guess if you constantly want to spin left u can't since theres a max and min value for a pot. You can also try an encoder, I dunno much so just suggesting.

billbo911 05-02-2009 02:25

Re: Limit Switchers Logic Problem
 
1 Attachment(s)
See if this works for you.
It allows CW rotation when the CCW switch is hit and vise verse.

Pasha 05-02-2009 13:03

Re: Limit Switchers Logic Problem
 
Quote:

Originally Posted by Dave Scheck (Post 814086)
I think the problem is that you blindly set the output to 0 when the switch is pressed. I think you want the logic to be something like this
Code:

IF left button is pressed
    IF left limit switch is pressed
        output = 0
    ELSE
        output = MOVE_LEFT_SPEED

You'll need something similar on the right side as well


That doesn't work because it would just continue to spin left forever and the limit switch would only
be checked when the button is pressed again.

The other logic would work maybe, but I'm not sure if the limit switcher would work. Also, I wish
this was C, I'd be done way sooner. However, I have to write this in LabView.


To Greg: I did set up the buttons to move the motors. That works perfect. When you press
right, it goes right, when it goes left it goes left. When I press stop, it stopped. Only
problem is the limits. Also, once the limit switch is pressed down, I do force the motor to 0.
This way the motor actually does stop. However, the limit stays true once it hits it, and the motor
is constantly forced to 0.

@DarKCroNo: You have a VI that toggles the joystick instead of auto updating?
Such as, you press right to be true, and it toogles to true, instead of auto updating it
back to false? If so, PLEASE GIVE!

@billbo911: I will look right into that as soon as class is over. Thanks!

Thanks for your support and I will keep everything updated on how this goes. This is a very
important task, and I need this working. Thanks for you help again.

Greg McKaskle 05-02-2009 14:37

Re: Limit Switchers Logic Problem
 
I didn't say to set the value to zero when limit was pressed. One limit switch forces positive motor input to zero but leaves negative alone, the other forces negative and leaves positive alone.

To handle the button toggles, I'd add a state variable. The buttons update the state variable, then the state variable selects positive, zero, or negative speed, then the limit switches pin as described above. The state variable obviously needs to be in either a shift register, a local, or something that maintains state data.

Greg McKaskle

Pasha 05-02-2009 15:17

Re: Limit Switchers Logic Problem
 
Quote:

Originally Posted by Greg McKaskle (Post 814761)
I didn't say to set the value to zero when limit was pressed. One limit switch forces positive motor input to zero but leaves negative alone, the other forces negative and leaves positive alone.

To handle the button toggles, I'd add a state variable. The buttons update the state variable, then the state variable selects positive, zero, or negative speed, then the limit switches pin as described above. The state variable obviously needs to be in either a shift register, a local, or something that maintains state data.

Greg McKaskle

But once the limit switch is pushed and it starts to feed positive values. It'll forever continue to force positive values. Even I press another button to go left, it won't because it'll be continuosly fed positive values.

Pasha 05-02-2009 15:38

Re: Limit Switchers Logic Problem
 
Hmm, is there anyway to set something just once. Like let's say the limit switch becoems true, is there a way to set motor speed to 0, ONCE, and not continuously locking up the device.

edit: @DarkOrono, I can't hold it. I need to be able to press and go. I cannot have it have the need to be held.

Bomberofdoom 05-02-2009 15:47

Re: Limit Switchers Logic Problem
 
What you want to do is:

- If no limit switches are pressed, do whatever the joystick says.
- if left limit switch is pressed, two cases:
a.If joystick wants to move lazy susan left, keep motors at 0.
b.If joystick wants to not move or move right(or the "else" case for a.), do as joystick wants.
- if right limit siwthc is pressed, two cases:
a.If joystick wants to move lazy susan right, keep motors at 0.
b.If joystick wants to not move or move left(or the "else" case for a.), do as joystick wants.
- if both limit switches are pressed (:ahh: ), stop motors - sirious error! (or someone is cheating :P )

There's a way where you can put all of these in one big case structe, and in each case ("true" and "false") have another case structre with "true" or "false".

Greg McKaskle 05-02-2009 16:28

Re: Limit Switchers Logic Problem
 
I'll describe it again. One limit switch allows positive, but negatives are disallowed and are forced to zero. This means that once a limit switch goes true, it disallows further movement in one direct, but allows movement to unpress the limit.

Greg McKaskle

billbo911 05-02-2009 16:32

Re: Limit Switchers Logic Problem
 
Quote:

Originally Posted by Bomberofdoom (Post 814825)
What you want to do is:

- If no limit switches are pressed, do whatever the joystick says.
- if left limit switch is pressed, two cases:
a.If joystick wants to move lazy susan left, keep motors at 0.
b.If joystick wants to not move or move right(or the "else" case for a.), do as joystick wants.
- if right limit siwthc is pressed, two cases:
a.If joystick wants to move lazy susan right, keep motors at 0.
b.If joystick wants to not move or move left(or the "else" case for a.), do as joystick wants.
- if both limit switches are pressed (:ahh: ), stop motors - sirious error! (or someone is cheating :P )

There's a way where you can put all of these in one big case structe, and in each case ("true" and "false") have another case structre with "true" or "false".

This is exactly what the vi. I posted earlier in this thread will do. It does not do the button latching he is requesting, that will need to be defined prior to my vi.


All times are GMT -5. The time now is 23:37.

Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Copyright © Chief Delphi