So in the below picture, I want to make the Restraint Solenoid to retract when I press Button 3(I’ll use a Select block). I want the Winch motor to then run a for a set amount after the Restraint is retracted. I assume I need one more frame in the Flat sequence and a Wait command for a few seconds, but I don’t know where to go from here. Pictures to go with explanations would be appreciated. Thank you guys.
I wouldn’t put the sequence you describe into Teleop.
It’d be easier on you to put a sequence like you describe into Periodic Tasks.
So, your sequence can be thought of as these discrete frames:
- Retract solenoid; Wait 500ms (half a second to give the retraction time to complete)
- Set Winch motor to speed (1.0); Wait 3000ms (or however long it takes the winch to do it’s work)
- Set Winch Motor to 0 speed
- When does the solenoid get extended to complete the cycle?
Here’s an example of something similar:
http://team358.org/files/programming/ControlSystem2009-/LabVIEW/TimedTask.png
I plan for the solenoid to re-extend after the winch brings the catapult back down.
Initially, the solenoid is holding back a catapult. When it retracts(the button is pressed), the catapult will launch. Then, the winch will start after the catapult launches, to pull the catapult back to starting position. Once it is back to the starting position, the solenoid will re-extend to hold back the catapult again until the driver hits the fire button again.
Why wouldn’t it work in TeleOp?
Teleop is called by Robot Main each time the Driver Station sends a packet of data, 50 times per second. It’s supposed to quickly do its job and be done. If it doesn’t run to completion before the next DS packet arrives, it’ll start tripping the system communication watchdog and your ability to control the robot will suffer.
Using a long-running loop, or waiting for an event to occur, should not be done in Teleop.
Teleop MUST execute and complete/exit in less than 20ms, otherwise you will lose driver control.
It has to do this to keep up with the driver commands flooding in from your drivers.
If you call a sub vi that delays or add a delay of any kind into Teleop that is more than that 20 ms limit, then your driver’s will begin to lose control as their command packets start to get dropped while the robot continues to do what Teleop was last told what to do.
For small time skips the drivers will start to notice slow or jerky robot reaction.
If you use the default Safety Config on the drive motors, then your robot will jerk to a halt after only a tenth of a second. Manipulators that are in motion will continue in motion and not be able to be stopped until your delay in Teleop finishes and Teleop is allowed to process the driver control commands again.
If you delay for really significant amount of time (seconds) and the Safety Config is not used, then the robot will continue driving on it’s own according to what it last heard before you hit the button that started the sequence.
With no driver control that probably means crashing into a wall or your alliance partners.
Does the periodic in java need to execute in 20ms. If so is there a Periodic tasks in Java?
oh ok. thank you guys!
So the command will still execute correctly in Periodic Tasks, right?
Yes.
You just need to enclose your code in a While loop that runs forever (and a little delay to keep from hogging the CPU).
You can pretty much do anything that you’d do in Teleop.
There is an entire Forum for FRC Java here on CD! Better to post there as you will get some good answers from FRC Java veterans!
Yes, the telopPeriodic method in java in the IterativeRobot template must execute within 20ms.
There are a few things you can do to work around this.
- Use the Simple Robot template
- Use a state machine.
2a) Switch to the command framework (which uses a state machine). See http://wpilib.screenstepslive.com/s/3120/m/7952/l/100420-converting-a-simple-autonomous-program-to-a-command-based-autonomous-program - Run the code in a new Task. This would be equivalent to Periodic Tasks in LabVIEW.
If I put this in my code (adjusting for time and the parts i want to call) would it work?
That will work as is in Periodic Tasks.
Just drop it by itself onto the Block Diagram.
Sweet. I added solenoids in with the motor. In Begin, the solenoid starts in Forward, then in Periodic, the solenoid is retracted when Button 1 is pressed, then 1 sec later, the motor starts, then after X seconds, the motor stops and then the solenoid goes back to Forward. Does that describe the pic I have?
Looks good.
The only change I’d make is to the very first 2 sec. timer directly under “Button 1”
I’d change that to “20”
That’s just because new driver commands arrive every 20ms and you really don’t want the driver to have to wait 2 seconds to find out if he/she pushed the button correctly. That might annoy the drivers a little.
Ohhhk. So that’s what that’s for. Thank you guys!