View Single Post
  #20   Spotlight this post!  
Unread 05-02-2015, 07:52
Jon Stratis's Avatar
Jon Stratis Jon Stratis is offline
Electrical/Programming Mentor
FRC #2177 (The Robettes)
Team Role: Mentor
 
Join Date: Feb 2007
Rookie Year: 2006
Location: Minnesota
Posts: 3,738
Jon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond repute
Re: Limit Swtich Help

Good catch mmaunu... I can only blame Sleep deprivation from the build season

Curtis, that looks correct for dealing with two limit switches, good job!

If you want to control the victors with axis instead of buttons, you need to pay attention to what the return types are. A button returns a Boolean, true or false, as it only has two states (pressed or not pressed). An axis from a joystick, however, returns a number between -1 and 1, indicating how far it is moved from the center. Treating that number like a Boolean in an if statement won't do what you want. Instead, you have three options:

Option 1 - turn the number into a Boolean value by using a comparison. You can say something like "if(axis > 0)" to indicate that you want to do something if the value of the axis is positive. Other handy comparisons are less than (<), equals (previously discussed, ==), and not equals (!=).

Option 2 - use the axis to give you variable speed control over the motor. By passing the axis directly into the motor, something like "victor1.set(axis)", the motor will go at a speed proportional to how far you move the joy stick, and it'll go both up and done with that one command! Also, if you let go of the joystick, it'll stop

Option 3 - this is kind of a combination of options 1 and 2 by using something called a ternary operator. A ternary operator is kind of like doing an if statement in a single line. An example would be "axis>0?1:0;". You can read this as " if the axis is greater than 0, then use the value 1, otherwise use the value 0". Everything before the question mark is your conditional. Everything between the question mark and the colon is what happens if true, and everything after the colon is what happens when false. So, if we always want the elevator moving at full speed, we could do something like "victor1.set(axis>0?1:axis<0?-1:0);". Here I strung two ternary operators together - if the axis is greater than 0, return 1, otherwise if the axis is less than 0 return -1, otherwise return 0. Many people find ternary operators confusing and non-intuitive, so don't feel bad about going with a more straightforward option!

Finally, a word of warning. Often when you let go of a joystick, it will return to something very close to 0, but not quite there. In all the examples above, I used an absolute 0 value for comparisons, which won't work unless the joystick returns to be perfectly centered! It's a lot better to use a "deadband" around 0 - go up if it's greater than 0.05, go down if less than -0.05, otherwise stop. That way if the joystick is close to center you'll stop.
__________________
2007 - Present: Mentor, 2177 The Robettes
LRI: North Star 2012-2016; Lake Superior 2013-2014; MN State Tournament 2013-2014, 2016; Galileo 2016; Iowa 2017
2015: North Star Regional Volunteer of the Year
2016: Lake Superior WFFA
Reply With Quote