Sunday, October 20, 2013

MOAB - Mother of All Fan Brackets

    Cooling fan brackets are a must in any in-progress DIY 3D printer and while there are plenty designs on the internet they often lack functionality, compatibility and/or strength, so a couple months ago I set to create my own, initially I designed this specific and simple bracket for a 60mm fan for RAMPS in OpenSCAD.

v1: hardcoded 60mm fan 60mm PCB
After some use I started finding limitations:
  • hard to slide along the board because the PCB clips were too large
  • it did not have clearance for the reset button, not a fun experience during prints
  • not tall enough to clear the thermal fuses on RAMPS
  • someone wanted to use it for an 80mm fan

    So there was obvious need for a revision, and since I wanted to addressing those limitations I figured I should go fully parametric and add some extras in the process, this is how v2 or the MOAB script came to be:

v2 with two instances: a 50mm fan (orange) and a 40mm (pink) fan on RAMPs
 
Some of the parameters of the script:
  • PCB width
  • Fan size/diameter
  • Height: how far from the PCB the fan is
  • Thickness: how strong the bracket is 
  • Length: how wide the bracket is
The basic principle of the bracket is shown below:
A fan is held by two thin brackets
   Below you can see a more detailed rendering of the bracket showing the basic parts: the legs (blue), PCB clips (dark green), fan cut-out and nut slots (yellow light green) and the cross-brace (orage) which gives this bracket strength:
OpenSCAD rendering



From left to right: 80mm, 60mm, 50mm and 40mm fans


    Here is what happens where the fan is larger than the PCB, the top part is wider and the rest of the bracket retains physical dimensions:
80mm fan bracket
Full bracket (left), normal thin bracket (top right) and 120mm bracket (bottom right)

    In the last picture above to the left and below you can also see a variant of the bracket that is generated for the full size of the fan instead of the usual thin bracket - the choice between the two is a simple parameter.
Full bracket rendering

Some additional views
40mm fan, view from the bottom
50mm fan

From left to right: 50mm, 60mm and 40mm fans


    A few days ago I posted this as a Customizer script on Thingiverse and it got 50 likes and more than 500 downloads in the first couple days. This is way more than any of my other designs usually get in weeks or months.
    You can download the OpenSCAD from below (bugs and all) or from Thingiverse (where you can also find some STL instances).


  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
// MOAB - MOther of All fan Brackets
// Design by Marius Gheorghescu, October 2013.

// Typical values 40, 50, 60, 80
fan_size = 50;

// Distance between two fan holes. Typical values: 32.00 for 40mm fan, 40.00 for 50mm fan, 50.00 for 60mm fan, 71.50 for 80mm fan, 105.00 for 120mm fan
fan_hole_spacing = 40;

// Use 3.25mm for M3, 4.25mm for M4 and so on
screw_diameter = 3.25;

// how wide is the PCB, common values: 60mm for RAMPS, 53.5mm for Arduino
pcb_width = 60;

// distance from bottom of the fan to PCB. Recommended value for RAMPS fuse clearance: 35mm
bracket_height = 35;

// how long the bracket needs to be, typically 10mm for mini brackets, or close to fan size for full brackets
bracket_length = 10;

// typically 2-4mm
bracket_thickness = 3.0;

/* [Hidden] */

// how much to go over the PCB
lip_size = 1.75;

// effective width of the bracket at the top
bracket_width = max(pcb_width, fan_size - 4);

// how tall is the extra strength bracket needs to be (if too tall it will interfere with components)
cross_bracket = bracket_thickness*2;

module legs()
{

    difference() {
        union() {

            // left clip
            color([0,0,.5])
            translate([-pcb_width/2 + .5, -bracket_height + 2, 0])
                rotate([0, 0, 180]) 
                    cylinder(r=2.5, h=bracket_length, $fn=6, center=true);

            // left leg
            color([0,0,1])
            translate([-pcb_width/2 - bracket_thickness, -bracket_height + bracket_thickness/2, -bracket_length/2])
                cube([bracket_thickness, bracket_height, bracket_length]);


            // right clip
            color([0,0,.5])
            translate([pcb_width/2 - .5, -bracket_height + 2, 0])
                 rotate([0, 0, 180]) 
                     cylinder(r=2.5, h=bracket_length, $fn=6, center=true);

            // right leg
            color([0,0,1])
           translate([pcb_width/2 , -bracket_height + bracket_thickness/2, -bracket_length/2])
                cube([bracket_thickness, bracket_height, bracket_length]);

        }

        // left cutout
       translate([-pcb_width/2 + .5, -bracket_height + 2, 0])
            rotate([0, 0, 180]) 
                cylinder(r=1, h=bracket_length + 0.1, $fn=6, center=true);

        // right cutout
       translate([pcb_width/2 - .5, -bracket_height + 2, 0])
            cylinder(r=1, h=bracket_length + 0.1, $fn=6, center=true);

        // PCB lips clearance
        translate([0, -bracket_height + bracket_thickness + -.5,0])
            cube([pcb_width - 2*lip_size, 12, bracket_length + 0.1], center=true);

        // PCB
        translate([0, -bracket_height + 2, 0])
            cube([pcb_width - 1, 1.75, 2*fan_size], center=true);
    }

}

module fan_mask()
{
    // M3 screw
    translate([-fan_hole_spacing/2, -fan_hole_spacing/2, 0])
        cylinder(r=screw_diameter/2, h=bracket_height, $fn=20, center=true);
    translate([fan_hole_spacing/2, -fan_hole_spacing/2, 0])
        cylinder(r=screw_diameter/2, h=bracket_height, $fn=20, center=true);
    translate([-fan_hole_spacing/2, fan_hole_spacing/2, 0])
        cylinder(r=screw_diameter/2, h=bracket_height, $fn=20, center=true);
    translate([fan_hole_spacing/2, fan_hole_spacing/2, 0])
        cylinder(r=screw_diameter/2, h=bracket_height, $fn=20, center=true);

    // M3 nuts
    translate([-fan_hole_spacing/2, -fan_hole_spacing/2, 0])
        cylinder(r=3.3, h=4, $fn=6, center=true);
    translate([fan_hole_spacing/2, -fan_hole_spacing/2, 0])
        cylinder(r=3.3, h=4, $fn=6, center=true);
    translate([-fan_hole_spacing/2, fan_hole_spacing/2, 0])
        cylinder(r=3.3, h=4, $fn=6, center=true);
    translate([fan_hole_spacing/2, fan_hole_spacing/2, 0])
        cylinder(r=3.3, h=4, $fn=6, center=true);

    // fan blade clearance
    difference() {
        cylinder(r=fan_size/2, h=bracket_height, $fn=120, center=true);

        // $TODO - add support around the screws if they are too close to the blades
        // also need to add support if the bracket is not wide (tall) enough 
    }
}


module bracket()
{
    difference() {
        union() {

            // fan base
            translate([0, 0, 0])
                cube([bracket_width + 2*bracket_thickness, bracket_thickness, bracket_length], center=true);

            // extra strength 
            color([1,.5,0])
            translate([0, -bracket_thickness, -bracket_length/2 + bracket_thickness/4])
                cube([pcb_width + 1, cross_bracket, bracket_thickness/2], center=true);

            legs();
        }


        translate([0, -bracket_thickness, -bracket_length/2 + fan_size/2 + bracket_thickness/2])
        rotate([90,0,0])
            fan_mask();

        }
}


module assembly() 
{
    color([1,0,0])
    translate([0, 0, -fan_size/2])
        bracket();

    color([1,0,0])
    //translate([0, 0, fan_size/2])
    rotate([0,180,0])
        bracket();

    color([0,.5,0])
    translate([0, -bracket_height + 2, 0])
        cube([pcb_width - 1, 1.75, fan_size*1.5], center=true);

}

//assembly();
bracket();
//fan_mask();

No comments:

Post a Comment