# stepper or servo torque in one direction only

What I want to achieve is this. I have a rod, which I want to move only in the direction of its axis, but move it (ideally) without resistance, meaning that If i pull the rod, I want it to follow (possibly aided by a stepper?) and if I push the rod, I want it to move back (retract) without resistance. But I want to be able dynamically to push it or pull it up to a point and be able to lock it after that. Example: I want to push the rod for 12.5cm but after that I want it to prevent me from pushing more.

So, I would be able to push for max 12.5cm and not after that, but also be able to pull it freely (up to some points let's say 30 cm). Maybe a stepper could do that? Hold torque in one direction (once it reaches 12.5cm) but rotate freely in the other direction (pulling). I'm not even sure a torque sensor would help, since I'm not applying torque, or that even a stepper is the right thing to use.

What I mean by dynamically, is that those distances are not fixed and can change programmatically (arduino/PI doesn't matter). It's not an absolute requirement that the rod follows automatically aided by a motor (=no resistance), but would be ideal. The most important is that I want it to lock once it has reaches certain distances either while I pull or I push it (mechanically with my hand).

• yes, use a wrap spring clutch Nov 29, 2021 at 16:13
• I mean I want this to be programmable and dynamic. Nov 29, 2021 at 17:34
• Somehow it is hard to understand your requirement. Is this a good summary? (1) A rod slides axially between some guides. It can be pushed or pulled by hand, moving freely over small distances. (2) When the rod is pushed to a certain (programmable) point, a mechanism locks it in place, so you that you can no longer move it by pushing OR pulling. (3) The question is how to make a programmable detection point, and how to lock the rod. Dec 23, 2021 at 4:55
• @r-bryan the rod is held by a guide(motor?) on one side only. the other side of the rod I pull or push with my hand at will (axially). once it reaches a programmable point, the mechanism locks it in place for the continuation of the movement in the same direction, but if I want to move it back, I am able to. For example, if i have pulled it 20cm (programmable-dynamic), it locks and I can't pull it any more, but I can push it back. If i push let's say more than 30cm (programmable-dynamic), I can't push it more, but I can pull it back. Yes, about (3) Dec 24, 2021 at 10:34

The sketch shows the basics of a simple design. The rod, sketched in red, can slide left and right. It is kept axial by sliding through holes in the black guides. A washer, purple, is fixed to the rod.

The rod also passes through a hole in a movable stop, blue. Controlled by a microcontroller, the stepper motor turns the lead screw, which moves the nut left and right, which adjusts the position of the stop.

The rod can be pushed freely to the right, until the washer hits the stop. When it's at the stop, the rod can still be pulled to the left.

If it is required to be able to pull out the rod entirely, just change the geometry. Instead of the current guide-washer-stop-guide, you could get rid of the washer and have the end of the rod hit the stop, as guide-guide-stop.

• Very interesting solution and thank you for your effort and time r-bryan. Something I probably omitted or possibly did not explain correctly is that: I would also need a second "Nut" on the left side, as there is also a dynamic point, up to which I can pull the rod. Would this be possible? Also, is it possible to "aid" the pulling or pushing so that I don't have to feel the weight/friction of the rod (it sits vertically) Dec 25, 2021 at 18:36
• Yes indeed. You would have two lead screws, parallel but not coaxial, with separate motors, moving the two stops. Dec 25, 2021 at 18:39
• Thank you so much. Is it possible to "aid" the pulling or pushing so that I don't have to feel the weight/friction of the rod (it sits vertically) Dec 25, 2021 at 18:43
• (1) Use zero-G rod, except there are supply chain problems because of restrictions on unobtanium. (2) Accept some amount of friction, just enough to keep the rod from falling. (3) Balance the rod weight with a "constant force" spring. (4) Fancy technology like Ben has already answered. (5) Other fancy technology like robotics.stackexchange.com/questions/22904/… Dec 26, 2021 at 3:42
• thank you, love your sarcasm <3 Dec 28, 2021 at 13:43

Your question is a little vague. So I will try to cover all the bases.

The simplest way to achieve non-backdriveability is mechanically. Using a worm gear will make it such that only the motor will be able to actuate the joint. But any external forces will not be able to move the joint. Of course, there are many other types of gearing that will accomplish the same thing.

If you only want your joint to move in one direction, a ratcheting mechanism is easy to accomplish mechanically. But this will apply to both actuation from the robot's motors as well as external forces.

If you want the robot (arm I assume) to hold its position on its own, but move freely when there is an external force on it, the only way to accomplish this is with some form of sensing. The simplest and most direct would be some type of force/torque sensor on the end-effector. This is pretty easy to implement. When the sensor detects a force, simply move the end-effector in the direction of the force. Of course the downside is that pushing elsewhere on the arm has no effect.

If you want to be able to push on the arm anywhere not just on the sensor, you need sensing in each joint. Adding some series elastic actuation will allow you to detect forces in the direction of the joint. This can be as simple as a spring and displacement sensor (or metal beam and strain gauge).

The fanciest method is probably the most difficult to achieve. This involves sensing the motor currents of the motors, and using that to determine if there is an external force. See also gravity compensation. This is tricky for a number of reasons:

• large amounts of gearing decreases the forces seen by the motor
• it requires a bunch of external circuitry that needs to be high enough resolution.
• it requires a very good model of the motor. (both electrically and thermally)
• the small rise in motor currents due to external forces are usually orders of magnitude smaller than the the currents required just to move the arm around on its own
• hysteresis is a big problem. detecting forces in the direction of motion are quite different than forces opposing motion.
• Thank you. Indeed I was a little vague, so I didn't ask the right thing. What I want to achieve is this. I have a rod, which I want to move only in the direction of its axis, but move it (ideally) without resistance, meaning that If i pull the rod, I want it to follow (possibly aided by a stepper) and if I push the rod, I want it to move back (retract) without resistance. But I want to be able dynamically to push it or pull it up to a point and be able to lock it after that. Example I want to push the rod for 12.5cm but after that I want it to prevent me from pushing more. Dec 1, 2021 at 7:55
• So, I would be able to push for max 12.5cm and not after that, but be able to pull it freely (up to some points let's say 30 cm). I had in mind that a stepper could do that, so that's why I asked for holding torque in one direction (once it reaches 12.5cm) but rotate freely in the other direction (pulling). I'm not even sure a torque sensor would help, since I'm not applying torque, or that even a stepper is the right thing to use. Dec 1, 2021 at 7:57
• What I mean by dynamically, is that those distances are not fixed and can change programmatically (arduino/PI doesn't matter). it's not an absolute requirement that the rod follows automatically (=no resistance), but would be ideal. The most important is that I want it to lock once it has reached certain distance while i pull or push it (mechanically with my hand). Dec 1, 2021 at 8:03