Nothing but Net Thrower

Our Nothing But Net bot has a single vertical 5" wheel for the thrower with a chain conveyor delivering the balls up to it. We are using 4 Vex 393 motors geared for High Speed 160 RPM at the motor. we have a transmission on each side driven by 2 motors on each. 84 tooth gear driving a 12 tooth X 36 tooth gear driving a 12 tooth ( 1:7 ratio X 1:3 ratio =1:21 ratio)
Our 1:21 transmissions with input motors @ 160 RPM are giving us a theoretical 3360 rpm at the thrower. I know load and friction reduce this greatly. We are getting a full court shot out of the bot, but we have already stripped the internal gearing of 2 Vex 393 motors. Is there any way to avoid shredding internal gears?
We have looked at re-gearing to high torque on the motors and changing the transmissions, but to get the output of around 3500 RPM we need a gear ratio of 1:35.
Should we change the cluster to 84/12 tooth X 60/12 with a high torque motor @100 RPM?

Picture of current config attached.


Try and slowly ramp up to your full shooter speed (perhaps in two to three seconds). Telling the motors to go straight to full power will break internal gears. Hopefully this answered your question.

we’ve been stripping gears for weeks now, we just stopped worrying, we have plenty of extra gears from old motors, so we just replace them.

That is terrible.

This is most likely due to whenever you fire a ball the flywheel suddenly decelerates, putting a large amount of sudden strain on the gears (internal motor gears and external gears). Essentially, you want to keep the speed of the flywheel up after each shot, which will also help with your firing rate, and one way to do this would be to add more wheels, increasing their momentum.

Consider the 35:3 gear ratio with turbo motors that 8059a uses, 3360 RPM’s is too high for shooting full court, aim for 2800. Check the friction involved in the setup, disconnect the motors and spin the flywheel, it should spin for about 7 seconds. Interesting fact: when powering a shaft at 2800 RPM, it is spinning the shaft at the same speed of the axle of a car going 200 MPH. You see why it is good to get rid of friction.

g_sawchuk
How do yo write the code to slowly ramp up the speed?

This is our code so far
we want the shooter to ramp up rather than apply full power to the shooter flywheel all at once.

#pragma config(Motor, port2, Left, tmotorVex393_MC29, openLoop)
#pragma config(Motor, port3, Right, tmotorVex393_MC29, openLoop, reversed)
#pragma config(Motor, port4, BallPickup, tmotorVex393_MC29, openLoop)
#pragma config(Motor, port5, Shooter, tmotorVex393_MC29, openLoop)
#pragma config(Motor, port6, Shooterb, tmotorVex393_MC29, openLoop)
#pragma config(Motor, port7, Shooterc, tmotorVex393_MC29, openLoop)
#pragma config(Motor, port8, Shooterd, tmotorVex393_MC29, openLoop, reversed)
//!!Code automatically generated by ‘ROBOTC’ configuration wizard !!//

//const int MAX_SPEED=127;//Max speed of all motors

task main(){

//loop forever
while(1){
// Intake & Conveyor Control
if(vexRT[Btn5U]){//if button is on, then do code below
//Ball pickup Conveyor

		motor[BallPickup]=127;//Conveyor at full speed
	}
	else if(vexRT[Btn6U]){//if button is on, then do code below

		motor[BallPickup]=-80;//Conveyor at full speed
	}
	else{

		motor[BallPickup]=0;
	}

//Shooter Control
if(vexRT[Btn6D]){ //if lower button on right is pressed, do code below
motor[Shooter]=-127; //Set Shooter motor to full BLAST
motor[Shooterb]=127; //Set Shooter motor to full BLAST
motor[Shooterc]=127; //Set Shooter motor to full BLAST
motor[Shooterd]=127; //Set Shooter motor to full BLAST
}
else{//Set Motor to zero
motor[Shooter]=0;
motor[Shooterb]=0;
motor[Shooterc]=0;
motor[Shooterd]=0;
}
//ARCADE DRIVE:: Do NOT TAMPER!!! :
motor[Left] = vexRT[Ch3] - vexRT[Ch4];
motor[Right] = vexRT[Ch3] + vexRT[Ch4];
wait1Msec(10);
}
}
we want the shooter to ramp up rather than apply full power to the shooter flywheel all at once.

I would highly suggest writing your own code in order to learn from it.
One option is to put it into a for loop that stays in said for loop until a certain motor power is hit (gradually adding motor power). Upon release of the button/when the button isn’t being pressed, you tell the motors to slow down to 0 ( a ramp down so a sudden stop isn’t in place) as long as the motor power isn’t at 0.
The only downside to this is that it disables you from running other functions while in this loop. You can change this for loop to a nested if loop, but it is slightly more complicated. I would advise that you start simple, and work up from there.
Let me know if you have any other questions.

In my system, i just use a sort of 2 stage ramp up to prevent this. Basically if the flywheel is below 50% run at 50% and if it’s above, just run the usual (full power)

we use velocity control which accelerates the fw to full velocity and keeps our fire rate up.

I wondered about this, too. Haven’t some teams also incorporated some sort of ratchet systems that allow the flywheels to freewheel when the motors aren’t pumping energy into them?

Also, if you want to run a loop that ramps up or ramps down the wheel velocity, can’t you start a separate task to perform that (so you don’t necessarily “lock up” your joystick while the program waits for the motors to achieve speed)? I’m thinking in RobotC.

You can also use an if statement inside of the driver control while loop. You will increment motor power once per iteration, but the code exits the while loop, then reenters it in the next iteration, so you can still control the rest of the robot. Here’s an example.


task userop() {
	//Make these local variables so you don't screw with them in another task
	int	flyPwrWant = 0,
		flyPwrNow = 0;
	const int flyPwrIncrement = 5;
	
	while(true) {
		//rest of driver controls here
		//intake, drive, etc.
		
		/*If the flywheel motor power is
			less than what you want, add the increment to it*/
		if(flyPwrNow < flyPwrWant) {
			flyPwrNow += flyPwrIncrement;
		}
		
		/*Collar the flywheel motor power so that if it
			exceeds the power you want due to the
			incrementation, it is set to the power you want
			in the next iteration*/
		else if(flyPwrNow > flyPwrWant) {
			flyPwrNow = flyPwrWant;
		}
		/*Release CPU so the Cortex can do other tasks
			Motors and joystick only update every 20 milliseconds
			anyway, so it can't hurt response time*/
		wait1Msec(20);
	}
}

Note: my comments normally stay on one line, but I wanted to document this well, and Vex Forum, unlike RobotC & Notepad++, only allows so many characters per line.

I apologize for this comment because I am not trying to sound insulting. Have you used grease on the gears to reduce friction? That might help quite a bit.

Also, this may help with slowly ramping up your speed. We used it and it worked.

/*
int desiredspeed = 100;
int launchspeed = 0;
int reversedesiredspeed = -100;
/
task usercontrol()
{
// User control code here, inside the loop
while (true)
{/

motor[left_bttm] = launchspeed;
motor[left_mid] = launchspeed;
motor[left_top] = launchspeed;
motor[right_bttm] = launchspeed;
motor[right_mid] = launchspeed;
motor[right_top] = launchspeed;

	if(vexRT[Btn6U] == 1 && desiredspeed !=launchspeed)
	{
		launchspeed += 10;
		wait1Msec(150);

	}
	else if(vexRT[Btn6D] == 1 && reversedesiredspeed !=launchspeed)
	{
		launchspeed += -10;
		wait1Msec(150);
	}
	else
	{
	launchspeed = 0;
	}

First, define the launching motors as a variable. In this situation our max speed was 100 and -100. Then, it is telling it to increase by 10 every 0.15 seconds and this can reduce burnout. Hope that helps! :slight_smile:

In my experience, ratcheting flywheels by themselves don’t protect against sudden speed changes when balls are fired. An extreme example: if you were to spin up the flywheels on our robot to full speed, then jam a screwdriver into the spokes (note: please, PLEASE never do this), the flywheels would stop quickly, but the motors would still be trying to push them, and it would be bad [citation needed]. Our flywheels only freewheel when we shut the motors off, such as between auton and driver control or at the end of a match.

Some teams with flywheel ratchets are shutting the motors off just before firing a ball so that the wheels are free-spinning at the instant a ball is fired. This is not something we’ve found necessary, but I think 1727B was doing this a while back (I remember watching a video); I’d be interested to know if they still are.

Ratchets allow the flywheel to spin faster than the rest of the gear train, but not slower. They only slip in one direction, and if they let the motors spin faster than the flywheel, the flywheel would not accelerate, the ratchet would just slip.
Edit: I realized this little factoid was a) somewhat obvious, b) somewhat irrelevant, and c) really useless on its own. So here’s why it’s not useless. A ratchet lets the flywheel free spin, so it’s not back driving the motors. I’m not actually sure if back driving motors causes damage if you’re not pumping current in the opposite direction, but it might. Anyway, that, and conserving flywheel speed between autonomous and driver control (if it’s a short interval), as well as any other time the flywheel motors are off, are why ratchets might be useful.