Hi guys. This should be a relatively simple problem to solve, but it’s been a while since I’ve used coding syntax/logic other than the basic if statements, so I’m rusty.
All I want to do is write a program so that if I hold down a button, the motor speed increases, and if I hold down another, the motor speed decreases.
Here’s my thinking:
An integer variable, v, is initially equal to 0.
When button L1 is pressed, the motor spins at 10 RPM.
Then the variable, v, is increased by 1.
The system waits 20 milliseconds and then checks again for any button presses, for which it’ll increase/decrease v by 1 and do everything again.
I get no errors when compiling (using VCS) but it doesn’t work on the robot.
Any help is very much appreciated. Thank you!
while (true){
int v = 0;
if (Controller1.ButtonL1.pressing()){
Flywheel1.setVelocity((10+v),velocityUnits::rpm);
Flywheel2.setVelocity((10+v),velocityUnits::rpm);
v++;
}
else if (Controller1.ButtonL2.pressing()){
Flywheel1.setVelocity((10-v),velocityUnits::rpm);
Flywheel2.setVelocity((10-v),velocityUnits::rpm);
v--;
}
task::sleep(20);
}
outside of the while loop. Right now set it to 0, then you might or might not change it to -1 or +1. Then you reset it to 0. And this repeats. So you’re never going to really make any progress.
Second, and just as importantly, motor.setVelocity() doesn’t do what you think. Use motor.spin() instead. motor.setVelocity() sets a velocity value for later use, but it does not actually make the motor spin at that velocity. Another command will be needed to get the motor to actually use that value.
Finally, reconsider what you’re doing with that (10-v). My worry is that your buttons get reversed if you hit L2 first. That’s because v will be negative, and adding/subtracting that negative will work the other way around. Of course, that’s a relatively small issue. It just means you don’t know which button will speed up or slow down the flywheel until you’ve made your initial button press; and later on, if you return v to 0, you’ll get to the same point again. For example, I would rather start v at 10 and increase or decrease it with those buttons, always spinning the motor at v, though you would want to make sure v doesn’t drop below 0.
int v = 0;
int valueAdd = 10;//Increase or Decrease this Value Here
while (true){
if (Controller1.ButtonL1.pressing())
v += valueAdd;
else if (Controller1.ButtonL1.pressing())
v -= valueAdd;
Flywheel1.setVelocity((v),velocityUnits::rpm);
Flywheel2.setVelocity((v),velocityUnits::rpm);
task::sleep(20);
}
Are what we’re doing a number stacking program? I used one of those to code a CR servo in FTC to act as a motor. It was pretty cool, but still might’ve worked better with just a motor
Oh, also, it’s good to cap v. Otherwise you might hold down much longer than needed to reach full speed and then find it seemingly not responding to slowing down for a while.
Ahh, my apologies. I haven’t used VCS C++ in a while so I forgot a little bit about the velocity, speed, etc.
Is this correct?
int v = 0;
int valueAdd = 10;//Increase or Decrease this Value Here
int rpmCap = 600;//The max RPM the motor can reach
while (true){
//Assign adding and subtracting of speed
if (Controller1.ButtonL1.pressing())
v += valueAdd;
else if (Controller1.ButtonL2.pressing())
v -= valueAdd;
//Min and Max RPM Cap
if(v < 0) v = 0;
if(v > rpmCap) v = rpmCap;
//Apply v to the motors
Flywheel1.spin(directionType::fwd, (v), velocityUnits::rpm);
Flywheel2.spin(directionType::fwd, (v), velocityUnits::rpm);
task::sleep(20);
}
So I took the code and improved it a bit to work better with my robot. I added a 200ms sleep after assigning the new v to the buttons, because otherwise it would instantly go to max speed, and moved the motor.spin functions inside of the while(true) loop to it would actually run
I also added some code to report the launch speed to the brain screen, taking into consideration the gear reduction.
It looks like this now:
#include "robot-config.h"
int main() {
int v = 0;
int valueAdd = 10; //Abs value of each speed increment/decrement
int rpmCap = 201; //Abs value of the max speed the motor reaches
int reduction = (84/36)^3; //Gear reduction of flywheels
while (true){
//Assign addition or subtraction of RPM to buttons, which occurs every 200ms
if (Controller1.ButtonL1.pressing()){
v += valueAdd;
task::sleep(200);
}
else if (Controller1.ButtonL2.pressing()){
v -= valueAdd;
task::sleep(200);
}
//Apply speed caps
if (v < 0) v = 0;
if (v > rpmCap) v = rpmCap;
//Apply v to motor speed
Flywheel1.spin(directionType::fwd, v, velocityUnits::rpm);
Flywheel2.spin(directionType::fwd, v, velocityUnits::rpm);
//Report actual launching speed to brain screen
Brain.Screen.setPenColor(color::white);
Brain.Screen.setFont(fontType::prop60);
Brain.Screen.setOrigin(1,80);
Brain.Screen.print("Launch speed = %3d RPM", v*reduction);
Brain.Screen.clearLine();
}
task::sleep(20);
}
Hopefully this can help other people trying to do the same thing. Thanks for the help again.
valueAdd should be the value that you modify to change how quick the flywheel speed goes up. I would suggest not telling it to sleep for 200 miliseconds because you will have latency issues which is no bueno. Instead modify the valueAdd variable from 10 to a value less. Don’t do negative valueAdd or it wouldn’t work, instead call valueAdd and v a double and use decimals:
#include "robot-config.h"
int main() {
double v = 0;
double valueAdd = 0.1; //Double value of each speed increment/decrement
int rpmCap = 201; //Abs value of the max speed the motor reaches
int reduction = (84/36)^3; //Gear reduction of flywheels
while (true){
//Assign addition or subtraction of RPM to buttons, which occurs every 200ms
if (Controller1.ButtonL1.pressing()){
v += valueAdd;
}
else if (Controller1.ButtonL2.pressing()){
v -= valueAdd;
}
//Apply speed caps
if (v < 0) v = 0;
if (v > rpmCap) v = rpmCap;
//Apply v to motor speed
Flywheel1.spin(directionType::fwd, v, velocityUnits::rpm);
Flywheel2.spin(directionType::fwd, v, velocityUnits::rpm);
//Report actual launching speed to brain screen
Brain.Screen.setPenColor(color::white);
Brain.Screen.setFont(fontType::prop60);
Brain.Screen.setOrigin(1,80);
Brain.Screen.print("Launch speed = %3d RPM", v*reduction);
Brain.Screen.clearLine();
}
task::sleep(20);
}