Back to projects

February 2026

Motorized Monitor Stand

A custom dual-monitor stand I designed and machined to motorize my oversized corner desk — Arduino-driven, with homing, jogging, and saved sit/stand positions.

Mechanical DesignArduinoCADMachiningEmbedded Systems
On this page

I have a corner bench I often work at that's impractically large to turn into a full standing desk. I still wanted the benefits of one, though — so the obvious solution was to build a custom, motorized monitor stand. It carries dual monitors and supports homing, jogging, and two saved positions for sitting and standing.

I did the full mechanical design in Onshape (view the CAD here) and machined all of the custom parts myself.

Exploded view of the assembly — the lead screw, linear rails, and machined carriage and mounts.
Exploded view of the assembly — the lead screw, linear rails, and machined carriage and mounts.
Travel
650 mm
Payload
~40 lb
Drive
TR8×2 lead screw
Motor
NEMA 24 stepper

Sizing the motor

To pick the motor, I sized the lead-screw drive — working out the torque needed to raise the load and checking that the trapezoidal screw won't back-drive (so the stand holds its position). The total torque splits into the torque to hold and raise the load and the torque to accelerate the system:

T=Tload+TaccelerationT = T_\text{load} + T_\text{acceleration}

This analysis ignores friction outside the lead-screw/nut interaction, and leaves out the motor's internal inertia and the small pulley and belt used to drive the screw.

Load torque

The drive uses a TR8x2 single-start trapezoidal lead screw:

ParameterSymbolValue
Pitch / leadll2 mm
Outer diameterDD8 mm
Mean diameterdmd_m7 mm
Half flank angleλ\lambda1515^\circ

The screw is stainless steel running in a bronze nut, which gives a typical greased friction coefficient of μ=0.1\mu = 0.1. From the geometry:

tanα=lπdm=27π=0.0910    α=5.2\tan\alpha = \frac{l}{\pi d_m} = \frac{2}{7\pi} = 0.0910 \;\Rightarrow\; \alpha = 5.2^\circ

The half flank angle inflates the friction into a virtual friction coefficient and angle:

μ=μcosλ=0.1cos15=0.1035tanϕ=μ    ϕ=5.91\mu' = \frac{\mu}{\cos\lambda} = \frac{0.1}{\cos 15^\circ} = 0.1035 \qquad \tan\phi = \mu' \;\Rightarrow\; \phi = 5.91^\circ

which sets the drive efficiency:

η=tanαtan(α+ϕ)=tan5.2tan11.11=0.463\eta = \frac{\tan\alpha}{\tan(\alpha + \phi)} = \frac{\tan 5.2^\circ}{\tan 11.11^\circ} = 0.463

Estimating the two monitors, arms, and carriage at ~40 lb (178N178\,\text{N}), the torque to raise the load is:

Tload=Fdm2tan(α+ϕ)=178N(0.007m)2tan11.11=0.122N⋅mT_\text{load} = \frac{F d_m}{2}\tan(\alpha + \phi) = \frac{178\,\text{N}\,(0.007\,\text{m})}{2}\tan 11.11^\circ = 0.122\,\text{N·m}

Will it back-drive?

A screw holds its position (won't back-drive under load) when the lead angle is smaller than the friction angle, α<ϕ\alpha < \phi. Here 5.2<5.915.2^\circ < 5.91^\circ, so the stand stays put with the motor unpowered — no brake needed.

Acceleration torque

The rest of the torque accelerates the system, T=IαT = I\alpha (here α\alpha is angular acceleration, not the lead angle above). Sizing the motion for the full travel:

QuantitySymbolValue
Total travel650 mm
Full-travel timett60 s
Linear speedss~11 mm/s
Rotational speedω\omega5.5 rev/s = 34.56rad/s34.56\,\text{rad/s}
Time to full speedtt'2 s
Target accelerationα\alphaω/t=17.28rad/s2\omega / t' = 17.28\,\text{rad/s}^2

The inertia is the lead screw's rotational inertia plus the reflected inertia of the linearly moving payload:

Iscrew=12mscrew(dm2)2=12(0.213)(0.0072)2=1.30×106kg⋅m2I_\text{screw} = \frac{1}{2}m_\text{screw}\left(\frac{d_m}{2}\right)^2 = \frac{1}{2}(0.213)\left(\frac{0.007}{2}\right)^2 = 1.30\times10^{-6}\,\text{kg·m}^2 Ipayload=mpayload(l2π)2=18.2(0.0022π)2=1.84×106kg⋅m2I_\text{payload} = m_\text{payload}\left(\frac{l}{2\pi}\right)^2 = 18.2\left(\frac{0.002}{2\pi}\right)^2 = 1.84\times10^{-6}\,\text{kg·m}^2 Itotal=Ipayload+Iscrew=3.14×106kg⋅m2I_\text{total} = I_\text{payload} + I_\text{screw} = 3.14\times10^{-6}\,\text{kg·m}^2 Tacceleration=Itotalα=(3.14×106)(17.28)=5.4×105N⋅mT_\text{acceleration} = I_\text{total}\,\alpha = (3.14\times10^{-6})(17.28) = 5.4\times10^{-5}\,\text{N·m}

That acceleration torque is negligible — about four orders of magnitude below the load torque — and that makes physical sense. The lead screw's 2 mm lead is a huge reduction from rotation to translation, so the payload's mass reflects back to the screw through a (l/2π)2(l/2\pi)^2 factor of order 10710^{-7}. Eighteen kilograms of monitors ends up "feeling" like less than 2×106kg⋅m22\times10^{-6}\,\text{kg·m}^2 of rotational inertia, so almost all of the motor's job is simply holding the load against gravity, not accelerating it. The total requirement stays essentially T0.122N⋅mT \approx 0.122\,\text{N·m}.

The stand is controlled by an Arduino, which takes inputs from a 5-button controller and the limit switches. It's driven by a NEMA 24 stepper motor through a DM556 stepper driver. You can find the code on my GitHub here.