The Micro-Mark bandsaw’s vacuum port forced me to finish up a long-stalled project: adding a bit of plumbing to simplify connecting the small shop vacuum I use for dust collection.
It turns out that a 45° 3/4 inch Schedule 40 PVC elbow fits snugly into the bandsaw’s rubbery vacuum port and angles the hose in the right general direction:

The elbow OD fits into an adapter with a tapered socket for the vacuum cleaner’s snout:

That solid model doesn’t resemble the picture, because that gracefully thin tapered cylinder around the snout will definitely test PETG’s strength under normal shop usage; fat is where it’s at when it breaks. The interior has a tapered section between the elbow’s OD (at the bottom) and the nozzle taper (at the top) to eliminate the need for a tedious support structure.
The elbow’s OD pretty much matches the nozzle’s ID and leaves the air flow unrestricted. The aperture in the bandsaw frame might be half the pipe’s area, so I’m surely being too fussy.
With that in hand, I built more adapters to mate 1 inch PVC fittings with the two vacuum ports on the belt / disk sander to keep the canister out of my way and make the dust just vanish. A tee plugged into the belt sander side accepts the vacuum nozzle (bottom) and inhales dust from the disk sander (top):

A U made from two 90° elbows aims the disk sander dust into the hose going across the back side of the belt:

Those elbows have a 40 mm length of 1 inch PVC pipe between them; no need to print that!
The hose has a left-hand thread rib which, of course, required throwing the first adapter away into the Show-n-Tell box:

That’s a descendant of the broom handle thread, turned inside-out and backwards.
Building two hose adapters with the proper chirality worked fine:

Although you could lathe-turn adapters that plug PVC fittings into the sander’s vacuum ports starting with a chunk of 1 inch PVC pipe, it’s easier to just print the damn things and get the taper right without any hassle:

The straight bore matches the ID of 1 inch PVC pipe for EZ air flow:

The sleeve barely visible on the bottom leg of the tee looks like 1 inch PVC pipe on the outside and a vacuum port on the inside:

The source code includes a few other doodads that I built, tried out while deciding how to make all this work, and eventually didn’t need.
All the dimensions are completely ad-hoc and probably won’t work with PVC fittings from your local big-box retailer, as the fitting ODs aren’t controlled like the IDs that must fit the pipe. I cleaned things up a bit by putting the ID, OD, and length of the pipe / fittings / adapters into arrays, but each module gets its own copy because, for example, 1 inch 45° elbows have different ODs than 1 inch 90° elbows and you might want one special fitting for that. Ptui!
The OpenSCAD source code for all those adapters as a GitHub Gist:
// Vacuum Hose Fittings | |
// Ed Nisley KE4ZNU July 2016 | |
Layout = "FVacFitting"; // PVCtoHose ExpandRing PipeToPort FVacPipe FVacFitting | |
//- Extrusion parameters must match reality! | |
// Print with 2 shells and 3 solid layers | |
ThreadThick = 0.25; | |
ThreadWidth = 0.40; | |
HoleWindage = 0.2; | |
Protrusion = 0.1; // make holes end cleanly | |
//---------------------- | |
// Dimensions | |
ID = 0; | |
OD = 1; | |
LENGTH = 2; | |
Pipe = [34.0,(41.0 + HoleWindage),16.0]; // 1 inch PVC pipe fitting | |
VacPortSander = [30.0,31.3,25]; // vacuum port on belt sander (taper ID to OD over length) | |
VacNozzle = [30.1,31.8,30.0]; // nozzle on vacuum hose (taper ID to OD over length) | |
MINOR = 0; | |
MAJOR = 1; | |
PITCH = 2; | |
FORM_OD = 3; | |
HoseThread = [32.0,(37.0 + HoleWindage),4.25,(1.8 + 0.20)]; // vacuum tube thread info | |
NumSegments = 64; // .. number of cylinder approximations per turn | |
$fn = NumSegments; | |
ThreadLength = 4 * HoseThread[PITCH]; | |
ScrewOAL = ThreadLength + HoseThread[PITCH]; | |
WallThick = 2.5; | |
echo(str("Pitch dia: ",HoseThread[MAJOR])); | |
echo(str("Root dia: ",HoseThread[MAJOR] - HoseThread[FORM_OD])); | |
echo(str("Crest dia: ",HoseThread[MAJOR] + HoseThread[FORM_OD])); | |
//---------------------- | |
// Wrap cylindrical thread segments around larger plug cylinder | |
module CylinderThread(Pitch,Length,PitchDia,ThreadOD,PerTurn,Chirality = "Right") { | |
CylFudge = 1.02; // force overlap | |
ThreadSides = 6; | |
RotIncr = 1/PerTurn; | |
PitchRad = PitchDia/2; | |
Turns = Length/Pitch; | |
NumCyls = Turns*PerTurn; | |
ZStep = Pitch / PerTurn; | |
HelixAngle = ((Chirality == "Left") ? -1 : 1) * atan(Pitch/(PI*PitchDia)); | |
CylLength = CylFudge * (PI*(PitchDia + ThreadOD) / PerTurn) / cos(HelixAngle); | |
for (i = [0:NumCyls-1]) { | |
Angle = ((Chirality == "Left") ? -1 : 1) * 360*i/PerTurn; | |
translate([PitchRad*cos(Angle),PitchRad*sin(Angle),i*ZStep]) | |
rotate([90+HelixAngle,0,Angle]) rotate(180/ThreadSides) | |
cylinder(r1=ThreadOD/2, | |
r2=ThreadOD/(2*CylFudge), | |
h=CylLength, | |
center=true,$fn=ThreadSides); | |
} | |
} | |
//-- PVC fitting to vacuum hose | |
module PVCtoHose() { | |
Fitting = [34.0,41.0,16.0]; // 1 inch PVC elbow | |
Adapter = [HoseThread[MAJOR],(Fitting[OD] + 2*WallThick + HoleWindage),(ScrewOAL + Fitting[LENGTH])]; // dimensions for entire fitting | |
union() { | |
difference() { | |
cylinder(d=Adapter[OD],h=Adapter[LENGTH]); // overall fitting | |
translate([0,0,-Protrusion]) // remove thread pitch dia | |
cylinder(d=HoseThread[MAJOR],h=(ScrewOAL + 2*Protrusion)); | |
translate([0,0,(ScrewOAL - Protrusion)]) // remove PVC fitting dia | |
cylinder(d=(Fitting[OD] + HoleWindage),h=(Fitting[LENGTH] + 2*Protrusion)); | |
} | |
translate([0,0,HoseThread[PITCH]/2]) // add the thread form | |
CylinderThread(HoseThread[PITCH],ThreadLength,HoseThread[MAJOR],HoseThread[FORM_OD],NumSegments,"Left"); | |
} | |
} | |
//-- Expander ring from small OD to large ID PVC fittings | |
// So a small elbow on the bandsaw fits into the hose adapter, which may not be long-term useful | |
module ExpandRing() { | |
Fitting_L = [34.0,41.0,16.0]; // 1 inch PVC pipe elbow | |
Fitting_S = [26.8,32.8,17]; // 3/4 inch PVC elbow | |
difference() { | |
cylinder(d1=Fitting_L[OD],d2=(Fitting_L[OD] - HoleWindage),h=Fitting_L[LENGTH]); // overall fitting | |
translate([0,0,-Protrusion]) | |
cylinder(d=(Fitting_S[OD] + HoleWindage),h=(Fitting_L[LENGTH] + 2*Protrusion)); | |
} | |
} | |
//-- 1 inch PVC pipe into vacuum port | |
// Stick this in the port, then plug a fitting onto the pipe section | |
module PipeToPort() { | |
Pipe = [26.5,33.5,20.0]; // 1 inch Schedule 40 PVC pipe | |
difference() { | |
union() { | |
cylinder(d=Pipe[OD],h=(Pipe[LENGTH] + Protrusion)); | |
translate([0,0,(Pipe[LENGTH] - Protrusion)]) | |
cylinder(d1=VacNozzle[OD],d2=VacNozzle[ID],h=VacNozzle[LENGTH]); | |
} | |
translate([0,0,-Protrusion]) | |
cylinder(d=Pipe[ID],h=(Pipe[LENGTH] + VacNozzle[LENGTH] + 2*Protrusion)); | |
} | |
} | |
//-- Female Vac outlet inside PVC pipe | |
// Plug this into PVC fitting, then plug hose + nozzle into outlet | |
module FVacPipe() { | |
Pipe = [26.5,33.5,20.0]; // 1 inch Schedule 40 PVC pipe | |
difference() { | |
cylinder(d=Pipe[OD],h=VacPortSander[LENGTH]); | |
translate([0,0,-Protrusion]) | |
cylinder(d1=VacPortSander[ID],d2=VacPortSander[OD],h=(VacPortSander[LENGTH] + 2*Protrusion)); | |
} | |
} | |
//-- Female Vac outlet on 3/4 inch fitting OD | |
// Jam this onto OD of fitting, plug hose + nozzle into outlet | |
module FVacFitting() { | |
Adapter = [26.5,(33.5 + 2*WallThick),17.0]; // overall adapter | |
VacPortSander = [30.0,31.3,25]; // vacuum port on belt sander (taper ID to OD over length) | |
Fitting = [26.8,32.8,17]; // 3/4 inch PVC elbow | |
TaperLength = 5.0; // inner taper to avoid overhang | |
difference() { | |
cylinder(d=Adapter[OD],h=Adapter[LENGTH]); // overall fitting | |
translate([0,0,-Protrusion]) | |
cylinder(d=(Fitting[OD] + HoleWindage),h=(Adapter[LENGTH] + 2*Protrusion)); | |
} | |
translate([0,0,Adapter[LENGTH]]) | |
difference() { | |
cylinder(d=Adapter[OD],h=TaperLength); | |
translate([0,0,-Protrusion]) | |
cylinder(d1=(Fitting[OD] + HoleWindage),d2=VacPortSander[ID],h=(TaperLength + 2*Protrusion)); | |
} | |
translate([0,0,(TaperLength + Adapter[LENGTH])]) // vac fitting | |
difference() { | |
cylinder(d=Adapter[OD],h=VacPortSander[LENGTH]); | |
translate([0,0,-Protrusion]) | |
cylinder(d1=VacPortSander[ID],d2=VacPortSander[OD],h=(VacPortSander[LENGTH] + 2*Protrusion)); | |
} | |
} | |
//---------- | |
// Build things | |
if (Layout == "PVCtoHose") | |
PVCtoHose(); | |
if (Layout == "ExpandRing") { | |
ExpandRing(); | |
} | |
if (Layout == "PipeToPort") { | |
PipeToPort(); | |
} | |
if (Layout == "FVacPipe") { | |
FVacPipe(); | |
} | |
if (Layout == "FVacFitting") { | |
FVacFitting(); | |
} |
Sketches of dimensions and ideas, not all of which worked out:



Yes, it’s a big giant mess and there are no standards where you need them, but PVC fittings are cheap and easy to come by and close enough. This is exactly the sort of thing where 3D printing (and a Show-n-tell box) is an amazingly useful thing to have on hand.
Standards! Standards everywhere!
I actually saw an adapter from some vac hoses to other things: a stepped cone half a foot long and nigh onto ten bucks a pop. Didn’t seem like the right hammer for this particular job.
Does that red silicone tape really stop you from getting a static electricity shock?
No, it prevents snagging the end of the hose clamp on anything important & fleshy… [sigh]
Back when I had the radial arm saw, I ran a fat copper wire from the (grounded) saw frame, along the inside the vacuum tube, into the (grounded) vacuum canister. IIRC, it reduced the dust clinging to the outside of the hose, too, although probably I was just being fussy.
I love how you include your design sketches. These are the best part of many projects, because that’s where you work out the hard parts, just too hard to do in your head. Those are the real parts of a project and the difference between theory and practice. My projects would not materialize if it weren’t for sketches, and I suspect most (all?) makers do them too.
Thank you for sharing!
As crude as those doodles are, they help put all the dimensions in the right places so I can hammer out the OpenSCAD code. That code seems to be write-only, because I can’t visualize the shapes by reading what I wrote only moments ago and the sketch helps me navigate the code.
And, by putting the sketches here, I can toss the paper: I know where to find it again!
Thanks for the good words…