Cycloidal Drive
What is a cycloidal drive?
A cycloidal drive is a compact, high‑ratio gear mechanism that uses a cycloid‑shaped disc and rolling pins to transmit motion smoothly. Its advantages include exceptional torque density, low backlash, and high durability, making it ideal for robotics and precision machinery.
I will be using NEMA 17 motors for the actuators, which themselves will be mostly 3d printed, save for a few bearings. But most of the load will be put on the 3d printed parts, which will possibly lead to future headache.
For testing, I wired an A4988 motor driver with a NEMA 17 stepper motor with a potentiometer to control speed. I opened Copilot and asked it to generate me a script for the STEP/DIR pins and the potentiometer pins I was using.
// Pin assignments
const int stepPin = 3;
const int dirPin = 4;
const int potPin = A0;
// Tuning parameters
const int deadZonePercent = 10; // 10% dead zone
const int maxDelay = 2000; // slowest speed (µs per step)
const int minDelay = 200; // fastest speed (µs per step)
void setup() {
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
}
void loop() {
int potValue = analogRead(potPin); // 0–1023
// Convert dead zone percent to analog range
int deadZone = (1023 * deadZonePercent) / 100;
int centerLow = (1023 / 2) - (deadZone / 2);
int centerHigh = (1023 / 2) + (deadZone / 2);
// Check if inside dead zone
if (potValue >= centerLow && potValue <= centerHigh) {
return; // Do nothing (motor stopped)
}
// Determine direction
if (potValue < centerLow) {
digitalWrite(dirPin, LOW); // Reverse
potValue = map(potValue, 0, centerLow, 1023, 0);
} else {
digitalWrite(dirPin, HIGH); // Forward
potValue = map(potValue, centerHigh, 1023, 0, 1023);
}
// Convert pot position to step delay
int stepDelay = map(potValue, 0, 1023, maxDelay, minDelay);
// Step pulse
digitalWrite(stepPin, HIGH);
delayMicroseconds(stepDelay);
digitalWrite(stepPin, LOW);
delayMicroseconds(stepDelay);
}
And here is the test stand on a breadboard:
And this is it running the stepper:
Building the Drive
Designing everything in fusion was pretty straighforward, although time-consuming due to the quantity of parts. Firstly, I went to this website to generate cycloid profile. Then I imported the DXF into fusion, and built the gearbox around it.
Modeling it was not very dificult, just a matter of knowing which circles to extrude and how far. If I have left anything out that you would like, contact me at maxwell.negrin@gmail.com .
Assembling the Drive
After printing everything out on my home 3D printer (bambu A1), I started the assembly. I used M3 screws for this project, and THESE BEARINGS LINK THEM LATER.
The first step is to screw the base piece to the stepper:
Next, take your 30X42 bearing and place it around the base. You may need a mallet to help it sit.

Then, slide the rotating housing over the base bearing.
Next, you have to align your cycloidal disks. First, make sure that they are aligned and that each hole is aligned, and then you may make a mark on both discs to record their position. I used sharpie, but this step is also optional.
Then, you must rotate one of the discs 180 (aka flip it over) while keeping the same alignment.
Then you can carefully place the discs through the shaft and into the housing:
You can see that the offset is the same for each output hole.
At this step, we can take a closer look at how the drive works, and how other drives work. Firstly, we have my drive type. In this clip, I am holding the discs and preventing them from rotating, causing the housing the rotate:
And in this clip is the standard cycloidal drive, where the cycloids rotate and the housing is rigid to the base:
Next, you have to put the bushings in each hole:
And finally screw in the 25mm screws all the way. I left one out a little for the sake of showing the distance the screws need to go.
And now we have our final drive:
In the future I will add the housing with the arm, but for now this is good for demonstration purposes. This is also not the final design, and I will be making other iterations.
3/3/2026: Modifying the base-
On the initial design, I forgot to account for the stepper's lip around the output shaft. I simply googled the dimensions, and learned that it was 23mm in diameter. Wanting somewhat tight tolerances, the hole in the base has a .2mm clearance, which is not enough, as when I screwed it down it experienced significant warping:
To fix it, I increased the hole to 25mm and increased the depth of the hole by 2mm (previously 2mm, after 4mm):
And printed it on my home printer.
As you can see, it fits way better:







