A simple open source XY motorized stage


Table of contents


I will explain how to make a simple but effective motorized micrometer stage.

As I write it, the total cost should be around 100$ without the control board + drivers.

This is the last iteration of my automated stage. All my panoramas are made with it, and I’m able to image up to 1000x magnification.

8086 CPU Z80 CPU 6522 VIA FC1001 W538T808
200x 200x 200x 500x ROIs 1000x ROIs


Although it’s probably possible without one, a 3D printer is highly recommended for building this project.

You’ll also need some basic tools and knowledge.

Before making one, be sure you have enough vertical space on your microscope when removing the builtin stage (about 50mm).

Important note: This motorized stage will work only for reflected light microscopy, but you can probably adapt the coupling to a different translation stage.

Translation stage


The most important part of this build is a micrometric linear XY translation stage.

I use a SEMY60-AC with the following specs:

Table size: 60 x 60mm
Load resistance: 44.1N
Stroke: ± 6.5 mm
Accuracy: 0.01mm
Parallelism: 30μm
Parallelism in motion: 20μm
True Straightness: 3μm

Equivalent stages can be found on aliexpress.
Just make sure to get the ‘-C’ version, not the ‘-L’ or ‘-R’ ones.

If your microscope is an Olympus BH2, you can use this adapter to replace the original stage by the SEMY60.

STL - blend



The magic sauce is a RC drive shaft combining two universal joints and a spline (the red part).

You can find a pair of them for about 15€ on aliexpress.
I use the 2PCS 113-165mm 91-125mm one.

To connect the screw to the drive shaft, 3d print this piece.

Motor mount

Where to mount the motors?

Actually, anywhere, as long as it’s more or less in front of and at the height of the stage.

You can 3d print this Nema 17 holder and fix your motor on anything.

STL - blend

At first, I simply stuck them to a heavy box with double-sided tape, and that worked just fine.

A major advantage of this system is that when the microscope is no longer in use, the motors can simply be removed.


For the control board I use a cheap RAMPS mounted on an Arduino Mega. This setup was very common in the 3d printing scene some years ago.

I strongly recommend the use of trinamic drivers instead of the common A4988 or DRV8825 drivers to avoid vibrations. I got 5x TMC2208 with heatsinks for about 25€ some years ago.

Note: don’t use the TMC drivers without any heatsink. A fan is also recommended.


I made a very simple firmware to control only one motor at the same time so we can use a small power supply.

You don’t have to use that one specifically.

You can download it’s source code here.

Custom protocol

SX: Start motor X
SY: Start motor Y
SZ: Start motor Z

EX: Turn off motor X
EY: Turn off motor Y
EZ: Turn off motor Z

MX pos [speed]: Relative movement in X
MY pos [speed]: Relative movement in Y
MZ pos [speed]: Relative movement in Z

PX pos [speed]: Absolute positioning in X
PY pos [speed]: Absolute positioning in Y
PZ pos [speed]: Absolute positioning in Z

POS: Get the current position

HOME: Move to the origin
SPD speed: Set the speed of movement

FAN speed: Set the fan speed
FAND: Reset fan speed to default
FANS speed: Set default speed of the fan

Note: The firmware has safeguards to prevent you from moving outside the defined area. This is especially useful for the Z axis.


Please note that I have not tested the parts listed in the 2023 list.
Use at your own risk.

BoM updated for 2023:

Material Price Shop Required
Translation stage 40-60€ Aliexpress LGY60-C
RC drive shafts 16€ Aliexpress 2PCS 113-165 91-125mm
Mega2560-CH340 10-15€ Aliexpress
RAMPS 1.5 5€ Aliexpress
Nema 17 10-15€ Aliexpress 2PCS

Prices on aliexpress vary widely. Use pricearchive to compare prices.

Original BoM for reference:

Material Price Date Shop
SEMY60-AC 30€ 12/06/2021 Amazon
RC drive shafts 8€/pcs 10/04/2023 Aliexpress
Mega2560-CH340 6€ 02/05/2019 Aliexpress
RAMPS 1.5 3€ 21/05/2019 Aliexpress
Nema 17 8€/pcs 02/05/2019 Aliexpress
TMC2208 v3 UART 5€/pcs 18/08/2021 Amazon


  • The BoM don’t include the required screws.
  • I recovered the motors from my old Anet A8 3d printer.
    I use a StepperOnline 17HS19-2004S1 for my Z axis, and you can use them for other projects because they have a lot of torque.

For reference, the specs of the XY motors I use:

Stepper Motor 42SHDC3025-24B
Rated Power 14W
Rated Voltage   3.96V
Rated Current   0.9A
Rated Speed 1000rpm
Rated Torque    0.34NM
Holding Torque  0.4N.M
Step Angle  1.8°
Step Angle Accuracy ±5%
Phase   2
Resistance  4.4Ω±10%
Temperature Rise    80K Max
Ambient Temperature -20℃~+50℃
Ambient Humidity    90% Max
Insulation Resistance   100 MΩ Min. ,500VDC
Size    42*42*40(mm)
Weight  280g



The RC drive shaft has some backlash that you will have to correct when doing the captures.

Always use scanlines in the same direction to get the best precision.

Scan with backlash compensation

When you return to the first column, move to the previous column instead to correct the backlash (blue arrow).

Travel distance

If you check the translation stage specifications, it is theorically limited to
± 6.5 mm, or a total distance of 13mm.

From what I’ve observed, it seems the total distance is more than this, but it’s a constraint to keep in mind.

If you have to scan a very large die, you still can add a wedge between the stage and the screw when you reach the limit.

It may also be possible to change the micrometer screws, but I haven’t tried.


Accuracy is good, but not sufficient to stitch a panorama without having to calculate the error between consecutive images.

You’ll have to rely on a software like ImageJ/Fiji to make your panoramas.


If you use this page to make your own stage, please credit me.

Avatar This project required a lot of time and iterations to arrive at a result that was both simple to build and met various constraints, such as accuracy, precision and reliability.

Eventually send me a photo of the result so that I can publish it here as reference for others.