Help Hold Arm in up position - RobotMesh Python Cortex

We are using the old cortex electronics in my 6th grade robotics class. With v5, we can easily add a hold to the arm motor to have it hold in the position when not being moved up or down.

With the old cortexes, I can’t figure out the command to get it to work.

In short, everything works fine but when I change the last command, everything stops working.

Only the arm commands:

if joystick.b5up():
elif joystick.b5down():

That last line I think goes like this:

When I add that line, the entire program fails to move the robot.

cortex motors did not have that capability


Oh, that explains everything then. My kids are going to be frustrated when they find that out because my example was a v5 robot and it does have that capability.

For an arm you can try blindly commanding something like 15 power. If you have a sensor on the arm you can do something smarter but people have done the “dumb” fixed value to hold the arm.


Cortex motors are much, much simpler than V5 motors. V5 motors can sophisticated electronics, encoders, and voltage regulation inside of them that allow them to put placed into a brake mode and hold their own position. Cortex motors on the other hand do not have these (aside from the optional IME module for an encoder), and are simply just a set of wires directly connected to a motor which spins the output. You can either use PID control to maintain the arm at a particular position (complicated), or you can take the simpler route that many VRC teams of the era did for gravity-affected mechanisms such as arms - just apply a small upward power. For example, for lift arms with 393 motors, I would usually apply a small power of about 8-15 control value (out of [-127,127]) to counteract gravity and that worked fine enough for driver control. You should also consider using rubber bands or other mechanical methods to counteract gravity and give the arm a more neutral buoyancy.


With Cortex you can use Optical Shaft Encoders (or a Potentiometer) to create a hold control.

I had to dig through some old files but I think the following is pretty close.

void max(int value, int maxValue){
	return maxValue > value ? maxValue : value;
void min(int value, int minValue){
	return minValue < value ? minValue : value;

int armTarget = 0;
long armPos = 0;


	  //Move Up
	  motor[leftArm] = motor[rightArm] = 60;
	  armTarget = SensorValue[armEncoder];
	else if(vexRT[Btn6D]){
	  //Move Down
	  motor[leftArm] = motor[rightArm] = -60;
	  armTarget = SensorValue[armEncoder];
	} else 
	//Hold Position
	  armPos = SensorValue[armEncoder];
	  if(abs(armTarget-armPos)> 10)
		//Apply power to motor to move back to position  
		motor[leftArm] = motor[rightArm] = max(min(armTarget-armPos, 20),120);
		armMoving = true;
		motor[leftArm] = motor[rightArm]= 0;
		armMoving = false;

Thank you both for great suggestions!

Very well thought out responses that help me immensely. Thank you thank you thank you!