Introduction: Linear Actuator Stepper Motor

To convert the rotating motion of the stepper motor into a linear motion, the stepper motor is connected to a thread. On the thread we use a brass nut which is not able to rotate. Every turn of the thread the brass nut is translated in the axial direction of the thread.

See: traveling-nut linear actuator ,

Step 1: Partslist

One of the goals is the use of off-the-shelf material. It keeps costs low, and if a parts breaks it can be easily replaced.

  • M5 brass anchor
  • M5 stainless steel thread
  • M5 Nuts (optional)
  • Earthing connector
  • Ball bearings internal diameter Ø5mm (e.g. MF105 ZZ 5x10x4, F695 ZZ 5x13x4)
  • Stepper motor axle Ø5mm with flat sides (e.g. BYJ-types, 20BYJ46, 24BYJ48, 28BYJ48, 30YJ46, 35BYJ46)
  • Stepper motor driver (e.g. ULN2003, ULN2003 mini)
  • Arduino

Step 2: Parts

Coupling stepper motor - thread

The earthing connector is designed to connect two wires. Both sides are provided with 2 screws to fasten the wire. To connect the stepper motor with the thread the internal diameter of the earthing connector need to be drilled to Ø5mm (remove the small screws before drilling). The smaller stepper motors of the BYJ models have a 6mm flat surface at the axle. The length of the connector is 30mm. When cut in half we have 2 couplings.

One screw of the coupling is screwed to the flat surface of the stepper motor and the second screw is screwed to the threaded rod. This makes it a stiff coupling that transfers the torque of the stepper motor to the threaded rod.

Be aware, because this is a stiff coupling, misalignment of the rod, bearings or nut result in problems in the stepper motor.

Threaded rod

Preferably the thread rod and the thread nut are from different materials. The choice of material for the threaded rod is stainless steel. It’s a stiff material, has a resistance for corroding, rusting and staining. The choice of the material for the nut is brass. The dry surface static/dynamic frictional coefficient is low (static 0.4, dynamic 0.2)

Brass nut

The brass anchor has an internal threaded section and a section which has a coned shape. Of this type anchors the first 10mm is metric thread. This is the section which is used in this project.

The inside coned shape section is unusable. It expands when a threaded rod is inserted and this will destroy the housing of the nut.

Housing nut

To make the nut translate in the axial direction of the threaded rod, rotation of the nut must be avoided. The nut must therefore have a flat surface. An example is the picture with the square wooden block. The nut is glued in the block.

Be aware of misalignment.


To avoid as much friction as possible use ball bearings. These bearings are cheap. Too much precision is not needed. There is some tolerances between threaded rod and bearing, this absorbs some misalignment. The bearing I am using have a flange and are tightly pressed into the wood.

Step 3: Connecting the Stepper Motor to the Arduino

The BYJ-series are unipolar stepper motors. In this project the stepper motor is a 20BYJ46. The driver is a mini-ULN2003.

When shopping for a stepper motor verify the rated voltage. Use a 5V version when using the Arduino power supply. Check the current with the formula: U=IxR. The 5V version of the 20BYJ46 has a resistance of 60ohm. The current is then I=U/R=5/60=0.08A.

The Arduino is not able to supply enough current at the digital pins to power a stepper motor directly. To protect the Arduino a driver is used. A driver reads at the input pins the status of the digital pins of the Arduino and writes to the output pins. When the input pin 1B is “High” the power supplied to the driver is routed to pin VCC(+) and 1C(-).

See picture and table how to wire the Arduino to the stepper driver to the stepper motor (motor and driver are provided with matching socket and plug). If all is wired correctly the Arduino can be powered and the code can be uploaded the Arduino.

See table how to rotate the stepper motor the Arduino must make a digital pin “High”, other pins must be “LOW” when the rotation of the stepper motor is done the Arduino must make the next pin “HIGH”, other pins must be “LOW” and so on. When this is repeated the stepper motor starts to rotate.