Vacuum cleaner dust brushes, separated by millimeters and decades:

The bulky one on the left came with our new Kenmore Progressive vacuum cleaner. It’s fine for dust on a flat horizontal or vertical surface and totally useless for dust on actual objects. It’s supposed to snap around the handle at the end of the cleaner’s flexy hose, where it helps make the entire assembly too large and too clumsy, or on the end of the “wand”, where it’s at the wrong angle. The bonus outer shell slides around the stubby bristles in the unlikely event they’re too long for the flat surface at hand.
The brush on the right emerged from the Box o’ Electrolux Parts that Came With The House™, must be half a century old, and consists of a cast aluminum lump with various holes milled into it, adorned with luxuriously long and flexible horsehair. Suffice it to say they don’t make ’em like that any more. Heck, they probably don’t make horses with hair like that any more, either.
The blue plastic adapter atop the aluminum ball looks like you’d expect by now:

The short snout fits neatly into the space available inside the ball. The abrupt ledge at the top of the snout, of course, didn’t work well; I rushed the design for a show-n-tell.
The OpenSCAD source code (as a Github gist) bevels that ledge and tweaks the interior air channel a bit:
// Kenmore vacuum cleaner nozzle adapters | |
// Ed Nisley KE4ZNU December 2015 | |
// Layout options | |
Layout = "LuxBrush"; // MaleFitting CoilWand FloorBrush CreviceTool ScrubbyTool LuxBrush | |
//- Extrusion parameters must match reality! | |
// Print with +1 shells and 3 solid layers | |
ThreadThick = 0.25; | |
ThreadWidth = 0.40; | |
HoleWindage = 0.2; | |
function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit); | |
Protrusion = 0.1; // make holes end cleanly | |
//---------------------- | |
// Dimensions | |
ID1 = 0; // for tapered tubes | |
ID2 = 1; | |
OD1 = 2; | |
OD2 = 3; | |
LENGTH = 4; | |
OEMTube = [35.0,35.0,41.7,40.5,30.0]; // main fitting tube | |
EndStop = [OEMTube[ID1],OEMTube[ID2],47.5,47.5,6.5]; // flange at end of main tube | |
FittingOAL = OEMTube[LENGTH] + EndStop[LENGTH]; | |
$fn = 12*4; | |
//---------------------- | |
// Useful routines | |
module PolyCyl(Dia,Height,ForceSides=0) { // based on nophead's polyholes | |
Sides = (ForceSides != 0) ? ForceSides : (ceil(Dia) + 2); | |
FixDia = Dia / cos(180/Sides); | |
cylinder(r=(FixDia + HoleWindage)/2, | |
h=Height, | |
$fn=Sides); | |
} | |
//------------------- | |
// Male fitting on end of Kenmore tools | |
// This slides into the end of the handle or wand and latches firmly in place | |
module MaleFitting() { | |
Latch = [40,11.5,5.0]; // rectangle latch opening | |
EntryAngle = 45; // latch entry ramp | |
EntrySides = 16; | |
EntryHeight = 15.0; // lower edge on *inside* of fitting | |
KeyRadius = 1.0; | |
translate([0,0,6.5]) | |
difference() { | |
union() { | |
cylinder(d1=OEMTube[OD1],d2=OEMTube[OD2],h=OEMTube[LENGTH]); // main tube | |
hull() // insertion guide | |
for (i=[-(6.0/2 - KeyRadius),(6.0/2 - KeyRadius)], | |
j=[-(28.0/2 - KeyRadius),(28.0/2 - KeyRadius)], | |
k=[-(26.0/2 - KeyRadius),(26.0/2 - KeyRadius)]) | |
translate([(i - (OEMTube[ID1]/2 + OEMTube[OD1]/2)/2 + 6.0/2),j,(k + 26.0/2 - 1.0)]) | |
sphere(r=KeyRadius,$fn=8); | |
translate([0,0,-EndStop[LENGTH]]) // wand tube butts against this | |
cylinder(d=EndStop[OD1],h=EndStop[LENGTH] + Protrusion); | |
} | |
translate([0,0,-OEMTube[LENGTH]]) // main bore | |
cylinder(d=OEMTube[ID1],h=2*OEMTube[LENGTH] + 2*Protrusion); | |
translate([0,-11.5/2,23.0 - 5.0]) // latch opening | |
cube(Latch); | |
translate([OEMTube[ID1]/2 + EntryHeight/tan(90-EntryAngle),0,0]) // latch ramp | |
translate([(Latch[1]/cos(180/EntrySides))*cos(EntryAngle)/2,0,(Latch[1]/cos(180/EntrySides))*sin(EntryAngle)/2]) | |
rotate([0,-EntryAngle,0]) | |
intersection() { | |
rotate(180/EntrySides) | |
PolyCyl(Latch[1],Latch[0],EntrySides); | |
translate([-(2*Latch[0])/2,0,-Protrusion]) | |
cube(2*Latch[0],center=true); | |
} | |
} | |
} | |
//------------------- | |
// Refrigerator evaporator coil wand | |
module CoilWand() { | |
union() { | |
translate([0,0,50.0]) | |
rotate([180,0,0]) | |
difference() { | |
cylinder(d1=EndStop[OD1],d2=42.0,h=50.0); | |
translate([0,0,-Protrusion]) | |
cylinder(d1=35.0,d2=35.8,h=100); | |
} | |
translate([0,0,50.0 - Protrusion]) | |
MaleFitting(); | |
} | |
} | |
//------------------- | |
// Refrigerator evaporator coil wand | |
module FloorBrush() { | |
union() { | |
translate([0,0,60.0]) | |
rotate([180,0,0]) | |
difference() { | |
union() { | |
cylinder(d1=EndStop[OD1],d2=32.4,h=10.0); | |
translate([0,0,10.0 - Protrusion]) | |
cylinder(d1=32.4,d2=30.7,h=50.0 + Protrusion); | |
} | |
translate([0,0,-Protrusion]) | |
cylinder(d1=28.0,d2=24.0,h=100); | |
} | |
translate([0,0,60.0 - Protrusion]) | |
MaleFitting(); | |
} | |
} | |
//------------------- | |
// Crevice tool | |
module CreviceTool() { | |
union() { | |
translate([0,0,60.0]) | |
rotate([180,0,0]) | |
difference() { | |
union() { | |
cylinder(d1=EndStop[OD1],d2=32.0,h=10.0); | |
translate([0,0,10.0 - Protrusion]) | |
cylinder(d1=32.0,d2=30.4,h=50.0 + Protrusion); | |
} | |
translate([0,0,-Protrusion]) | |
cylinder(d1=28.0,d2=24.0,h=100); | |
} | |
translate([0,0,60.0 - Protrusion]) | |
MaleFitting(); | |
} | |
} | |
//------------------- | |
// Mystery brush | |
module ScrubbyTool() { | |
union() { | |
translate([0,0,60.0]) | |
rotate([180,0,0]) | |
difference() { | |
union() { | |
cylinder(d1=EndStop[OD1],d2=31.8,h=10.0); | |
translate([0,0,10.0 - Protrusion]) | |
cylinder(d1=31.8,d2=31.0,h=50.0 + Protrusion); | |
} | |
translate([0,0,-Protrusion]) | |
cylinder(d1=26.0,d2=24.0,h=100); | |
} | |
translate([0,0,60.0 - Protrusion]) | |
MaleFitting(); | |
} | |
} | |
//------------------- | |
// Electrolux brush ball | |
module LuxBrush() { | |
union() { | |
translate([0,0,30.0]) | |
rotate([180,0,0]) | |
difference() { | |
union() { | |
cylinder(d1=EndStop[OD1],d2=30.8,h=10.0); | |
translate([0,0,10.0 - Protrusion]) | |
cylinder(d1=30.8,d2=30.0,h=20.0 + Protrusion); | |
} | |
translate([0,0,-Protrusion]) | |
cylinder(d1=25.0,d2=23.0,h=30 + 2*Protrusion); | |
} | |
translate([0,0,30.0 - Protrusion]) | |
MaleFitting(); | |
} | |
} | |
//---------------------- | |
// Build it! | |
if (Layout == "MaleFitting") | |
MaleFitting(); | |
if (Layout == "CoilWand") | |
CoilWand(); | |
if (Layout == "FloorBrush") | |
FloorBrush(); | |
if (Layout == "CreviceTool") | |
CreviceTool(); | |
if (Layout == "ScrubbyTool") | |
ScrubbyTool(); | |
if (Layout == "LuxBrush") | |
LuxBrush(); |
That’s supposed to prevent the WordPress post editors from destroying the formatting…
Guys like you gonna put a dent in the Duct Tape business!
So far I’ve built adapters for five old-style tools: there’s no reason to hunt for an adapter!
I loves me some good duct tape action, but there’s nothing like a custom hunk o’ plastic that fits exactly right… [ahem]