Monday, 31 December 2018

Well that sucks: 3D printing a mounting bracket to stow a third party turbo head on a Miele S2130 vacuum

So, my mum's got the Thermomix bug. So much so, she's even bought the German mob's vacuum cleaner. Her old Dyson has been relegated to the shed where Dad uses it around his workbench, and I picked up her old Miele.

Now, at some point, she'd gotten a third party turbo head for the Miele. The first one didn't work so well, but the second one does. It's a bit noisy, but functional. That said, because it's a third party head, it doesn't have the usual hook the Miele heads have. This means that when you are inbetween vacuuming things, you can't stand the wand up in the back of the vacuum, and instead have to rest it up against the wall, or drop it on the floor.

Having recently bought the Aldi Cocoon Create Model Maker, and only printed little models and puzzles to date, I had an idea about something practical. What if I could design a hook that would strap to the third party turbo head, allowing it to hook into the back of the vacuum?


I already had Ultimaker Cura installed (it's the suggested slicing program for my printer, and comes bundled with it, that said I have downloaded the Linux version from Ultimaker rather than use the supplied Windows version, and I use the "Wanhao Duplicator i3 Mini" profile, rather than the Cocoon Create one)... but I didn't have something to build a fresh 3D model with.

I'd been doing a lot of reading about 3D printing and my partner's talked about learning Blender, but I'm not exactly the best at drawing things with a mouse. I'd also read about OpenSCAD and how folks have built parametric models where you can set some variables and the models will adapt to your specifications... this sounded more my speed.

Downloading OpenSCAD is confusing - the latest release at last check was from 2015... but it is still under active development, so I opted to go for one of the nightly build options. I followed the "getting started" tutorial which introduced me to the shape primitives, seeing how I could add and subtract shapes from one another to come up with more complex shapes.

I started out by measuring the hook on the original first party head for the vacuum cleaner with a set of calipers - and then set these as variables.

// Hook dimensions in mm
// Hook - Width of hook rail
hookw = 3.75;
// Hook - Height of hook rail
hookh = 3.55;
// Hook - Length of hook rail
hookl = 37;
// Hook - Total height
hookth = 15.5;
// Hook - Total width
hooktw = 12.1;
// Base - Total width
basetw = 9.5;
// Head pipe diameter
headd = 36;
// Clamp thickness
clampt = 2;
// Cable tie width
cabletiew = 8;
// Cable tie height
cabletieh = 2;

I'm a big believer in avoiding "magic" numbers and single letter variables in the middle of code. Forget other people understanding the code, I have to worry about remembering myself what I was doing when I look back! :) ... and if I need to tweak the size for some reason, I just adjust the numbers!

Hindsight is 20/20... In retrospect, I could have done everything except for the cable tie slots in 2D first, and then just extruded before I put the slots in, but that's not how my mind was working at first :)...

First I started with the right hand side hook. To me - the hook looked like a cylinder quarter, extruded. I started with a solid "cube", and then overlaid the circle, such that where there was something present for both objects (AND / intersection), I'd keep it, and where there wasn't, it'd be discarded.

// Right side of hook
module hookR() intersection() {
    cube([hookw,hookh,hookl]);
    linear_extrude(height = hookl, center = false, twist = 0)
    scale([1/100,1/100,1/100]) circle(r=(hookh*100));
}

... if you're wondering, I build the circle big, then scale it back, to increase its resolution. I then made the left hook, exactly the same as the right hook, just mirrored:

// Left side of hook
module hookL() mirror([1,0,0]) hookR();

I then needed to space the hooks out from one another, taking into account how wide they are, and what the total measured width was:

// Both hooks in position
module hooks() {
// Position right hook to right edge
color ([0,1,0]) translate([hooktw/2 - hookw,0,0]) hookR();
// Position left hook to left edge
color ([0,0,1]) translate([-(hooktw/2 - hookw),0,0]) hookL();
}

Then the hooks needed to be mounted on what I'd call a rail.

// Hook rail
module hookrail() {
    color([1,0,0])
        translate([-(basetw/2),-(hookth-hookh),0])
            cube([basetw,hookth-hookh,hookl]);
}

... and cut out a notch below the hooks in the rail, so they could flex in a bit ...

module hookrailnotch() {
    color([1,1,0])
        translate([-hooktw/2 + hookw,-hookh,0])
            cube([hooktw - (2*hookw),hookh, hookl]);
}

... put the rails together with the cutout to get the hook mount ...

module hookmount() {
    difference() {
        hookrail();
        hookrailnotch();
    }
}

Then I described the actual tube of the turbo head - this is what I needed to clamp around...

module headtube() {
    color([1,0,1])
        translate([0,-(headd/2+hookth-hookh)])
            linear_extrude(height = hookl, center = false, twist = 0)
                scale ([1/100,1/100,1/100])
                    circle(d=headd*100);
}

The actual clamp needed to be bigger than this - with a thickness I'd define up above in my variables...

module headclampouter() {
    color([0,1,1])
        translate([0,-(headd/2+hookth-hookh)])
            linear_extrude(height = hookl, center = false, twist = 0)
                scale ([1/100,1/100,1/100])
                    circle(d=(headd+clampt)*100);
}

Then, I subtracted the tube from the outer clamp:

module headclamp() {
    difference() {
        headclampouter();
        headtube();
    }
}

I measured the largest cable ties I was going to use, and added 0.5mm to the dimensions in case of printing problems.. modelling a channel through which they'd pass:

module cabletiechannel() {
color ([1,1,1])
        cube([basetw,cabletieh,cabletiew]);
}    

I then put it all together - the hooks, and the full circle clamp. From the hookmount, I subtracted the space for the cable ties. Two cable ties = two channels.

module fullcircle() {
    hooks();
    headclamp();
    difference() {
        hookmount();
        translate([-(basetw/2),-(hookth-hookh)+(clampt*2),(clampt*2)]) cabletiechannel();
        translate([-(basetw/2),-(hookth-hookh)+(clampt*2),hookl - (clampt*2) - cabletiew]) cabletiechannel();  
    }
}

I didn't want the clamp to go all the way around the head - for one, there are flanges on the head's connecting tube which mean I can't just slide it on, so I'd need a break. I figured with cable ties, it didn't need to go all the way around anyway - the ties would do that.. so I took the bottom half off.

difference() {
    fullcircle();
    translate([-(headd+clampt)/2,hookh-hookth-(headd+clampt)]) cube([headd+clampt,headd/2,hookl]);
}

Hey presto:

I exported this as an STL, and then imported it into Cura...

... I accidentally selected "spiralise" which meant it printed with no fill - and a continuous wall - but in the end, this turned out to give it enough strength and flex at the same time. After about an hour or so of printing...

... and a couple of cable ties:

Who would have thunk it.. a useful printed doodad!

No comments:

Post a Comment