I'm working on a project using steper motor which turn a threaded shaft (long screw) in order to open or close a water valve (high flow, high pressure).

My fear is that, after a long time of use, the grease on the threaded shaft will dissapear and it can became hard for the stepper motor to rotate correctly the threaded shaft.

In order to tell the user to add grease, I have to know when the stepper needs more effort than before to rotate the threaded shaft. So, would it be possible to detect the "effort" made by the stepper in order to get this information on the Arduino?

Any ideas are welcomed!

  • 3
    I'm voting to close this question as off-topic because it is about electromechanical systems, not about Arduino. Nov 25, 2017 at 16:44
  • @ChrisStratton is tecnically right, but I think that the solution will depend heavily on the hardware at hand, and I want to know how to solve it with an Arduino (I see this same problem ahead of me).
    – user31481
    Nov 25, 2017 at 22:00

4 Answers 4


I suggest that if the answer involves the Arduino, the question might be appropriate to this forum.

If you can mount your stepper motor in such a manner as to apply pressure to a force sensor, you may have a method to resolve your goal.

As the motor rotates, under normal conditions, pressure on the sensor will give you a baseline on which you can base your program for consideration of the amount of force involved.

Picture the motor mounted in the center of a circle, with cut-outs appropriate for the mounting bolts. On the outside of the circle, you would have suitable bearing surfaces to reduce rotational friction. From the motor circle platform, a lever pressing against a fixed point on the outside of the circle provides the contact points for the pressure sensor.

If you will be rotating the motor in both directions, perhaps a pair of sensors mounted to encase the lever would be suitable.

When the screw is new, clean and lubricated, you can collect pressure readings and establish a safe and comfortable range. Those numbers would be fixed into your code and measured during motor activity.

If the activity results in force outside the range, you can either stop or reverse the motor and have the same checks apply.

The logic and code is beyond my capability, but you'd have very few parameters to examine during operation.

  • Nice idea. As I'm going to have more than one system, with this idea I can also make some statistic, in order to know the limit. Thanks!
    – Peter
    Nov 25, 2017 at 21:10

After fred_dot_u answer I have made other research. Not sure this can help us (Look Alterno and me), but some post are talking about "can I detect the over intensity".

Here is a very interresting post (in French, but Google Translate can help). The guy use and Arduino to control a step motor using to open a fence. And he wants to detect when the motor need more effort:


Here the text from this site, I translated:


Hello everyone, I have a DC motor powered at 30 V. In normal operation, it consumes 2.5A (the power supply is OK, no problem on that side). It is an electric gate motor (sliding gate). I want to control it with an arduino. So far, not too much trouble, I go through a MOSFET (for the moment, I do not run the engine in one direction, later, I will make a bridge in H to go both ways). All this works well but I would also be able to detect when the engine forces (to stop it). When the motor forces, it consumes more, so more intensity in the circuit. The problem is that an Arduino can not read an intensity, I can only read a voltage between 0 and + 5V. So I was thinking of putting a resistor in series with the motor and measuring the voltage across the resistor with the arduino. If I take a max intensity not to exceed 5 A, Ohm's law gives me a resistance of 1 Ohm to have a voltage of + 5V (I'm good?) The problem is that a resistance of 1 Ohm at 5A will dissipate 25W (R x I x I, I'm always good?). How to solve this power dissipation problem? the big resistors I have at the moment are 3/4 W, they will not take long

My problem is the following: if I take a smaller resistance to have a smaller power (like 0.1 Ohm or less), the voltage has its limits will be too low to be read by my arduino,

How to do ? Does anyone have an idea?

Thank you in advance for your answers.


ANSWER 1 Just amplify the signal: rail-to-rail operational amplifier (to power it with a single positive voltage), a non-inverting device with a gain of 10 for example.

ANSWER 2 Indeed, it's an idea. So I was thinking of putting a resistor in series with the motor and measuring the voltage across the resistor with the arduino. . The risk of this type of assembly is: - the maximum voltage overshoot (5V) at the input of the uC (ARDUINO) at the change of direction (see ground point). - the maximum voltage surge (5V) at the input of the uC (ARDUINO) in the event of a break in the resistance. Explanations: The ARDUINO board must have a common point (Ground) and an Ax input, therefore when changing polarity (change of direction of the motor) the DDP is no longer 0V-> 5V but 0V-> 30V and there it smokes, ditto in case of rupture of this resistance. The good solution in my opinion would be a system like http://www.gotronic.fr/cat-courant-1125.htm Regards

The answer 2 give link to products like the i-Snail-VC: Current Transducer with 0-5VDC Output. Can be linked directly to the PIN of an Arduino.

  • 1
    Link-only answers are prohibited. To be a valid answer, sufficient technical information must be contained in the answer posting itself that it will still be usable even if the off-site link ceases to function. Nov 26, 2017 at 4:55

Yes, most certainly. Use an ammeter to detect the "effort" required to actuate the motor. Both hall-effect and series measurements are acceptable here. Make sure to sample and average because motors can cause huge current spike (both positive and negative) which confuse naive readings. If your averages are climbing, as they eventually should, you know that it's getting harder to do the work. The hard part is deciding how hard is "too hard", and that depends on a lot of factors you're in the best position of judging.

  • I think deciding how hard is "too hard" can be made only by testing and set a "range" on the Arduino. In some case, reachin the "too hard" point will need to reverse motor. In my case I can have a range and say "Its not TOO hard,but it start to be not as easy as before so you must add some grease".
    – Peter
    Nov 27, 2017 at 20:16

A few ways, assuming that it is a DC motor.

  1. Measure the current through the motor: current is proportional to torque, everything else being equal.

  2. Put a strain gauge on the axle.

  3. Put a frictional plate on the axle.


Or to completely abandon the idea and control the movement via a position sensor.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.