OpenSCAD render of the vacuum spare wheel: a crowned wheel with two stepped axle stubs

Spare wheel for the vacuum cleaner

A friend's Siemens vacuum had a broken wheel — only available as an expensive assembly. So: measure the old wheel with a caliper, rebuild it in OpenSCAD, print it. In service for years.

Article complete (.zip)

“Article complete” gives you the OpenSCAD source as ready .scad files plus a printable copy — a CARECOM.united member benefit. Membership is free and non-binding. About membership →

OpenSCAD render of the vacuum spare wheel

A dear friend's Siemens vacuum cleaner had a broken wheel. His frustration: the wheel wasn't available on its own — only as a complete assembly, and that cost more than a new vacuum. So he sent me the old, broken wheel. I measured every step with a digital caliper, rebuilt it in OpenSCAD and printed it — and it's been in service at his place for years.

This is exactly where 3D printing pays off: rebuild a small part and save a whole appliance. Hardly anyone needs this exact wheel — what carries over is the approach.

Measured, then rebuilt from cylinders

With the caliper, every diameter and width was taken off and written as a named variable at the top of the file — so the model is exact, and a mis-measurement costs only one corrected number. The wheel is a stack of three cylinders (cone–middle–cone); because the middle (ci) is a touch fatter than the outside (co), it gets a gently crowned running surface. The axle stubs are stepped cylinders whose narrow spot (amin/emin) forms the retention groove for the clips in the housing — exact to the millimetre, or the wheel won't hold. (The commented-out rotate([90,0,0]) at the top tips the wheel into a different print position if needed.)

// vacuum cleaner / spare wheel

// --- axle left
// diameter (axle left)
a = 6.6;

// min. diameter (axle left)
amin = 5.26;

// length (axle left)
b = 9.5;

// length till min diameter (axle left)
b1=1.82;

// length with min diameter (axle left)
b2=2.56;

// length till max diameter (axle left)
b3=1;

// --- wheel
// diameter (wheel) middle
ci = 25.63;


// diameter (wheel) outside
co = 24.7;

// width (wheel)
d = 12;

// part of width (wheel) with middle diameter
di = 5;

// --- axle right
// diameter (axle right)
e = 6.6;

// min. diameter (axle right)
emin = 5.26;

// length (axle right)
f = 9.5;


// length till min diameter (axle right)
f1=1.82;

// length with min diameter (axle right)
f2=2.56;

// length till max diameter (axle right)
f3=1;


// quality
$fn=100;


//rotate([90,0,0]) {
    wheel();
    axleLeft();
    axleRight();
//}

// wheel
module wheel() {
    translate([0,0,(d/2+di/2) / 2])
    cylinder(d1=ci, d2=co, h=d/2-di/2, center=true);

    cylinder(d=ci, h=di, center=true);

    translate([0,0,-(d/2+di/2)/2])
    cylinder(d1=co, d2=ci, h=d/2-di/2, center=true);
}


// axle left
module axleLeft() {
    // in wheel
    translate([0,0, -d/2])
    cylinder(d=a, h=d/2);

    translate([0,0, -d/2-b1])
    cylinder(d1=amin, d2=a, h=b1);

    translate([0,0, -d/2-b1-b2])
    cylinder(d=amin, h=b2);

    translate([0,0, -d/2-b1-b2-b3])
    cylinder(d1=a, d2=amin, h=b3);

    translate([0,0, -d/2-b1-b2-b3-(b-b1-b2-b3)])
    cylinder(d=a, h=b-b1-b2-b3);
}

// axle right
module axleRight() {
        // in wheel
    translate([0,0, 0])
    cylinder(d=a, h=d/2);

    translate([0,0, d/2])
    cylinder(d1=a, d2=emin, h=f1);

    translate([0,0, d/2+f1])
    cylinder(d=emin, h=f2);

    translate([0,0, d/2+f1+f2])
    cylinder(d1=emin, d2=a, h=f3);

    translate([0,0, d/2+f1+f2+f3])
    cylinder(d=a, h=f-f1-f2-f3);

}
An unhandled error has occurred. Reload 🗙

Rejoining the server…

Rejoin failed… trying again in seconds.

Failed to rejoin.
Please retry or reload the page.

The session has been paused by the server.

Failed to resume the session.
Please retry or reload the page.