|
- /* [Bolt holes in the corners] */
-
- // Pick the size of the long threaded rods that run through
- // the corners and hold everything together.
- //
- // These are the sizes that are commonly available at
- // Home Depot or Lowes:
- //
- // 1/4 inch: 3.175
- // #12 : 2.778125
- // #10 : 2.38125 (default and recommended)
- //
- // Note: you should pick the same size and fudge factor
- // for the ear parts.
- bolt_size = 2.38125;
-
- // Make the bolt holes this much bigger than the size of the bolt
- // to give a more comfortable fit
- bolt_hole_fudge = 0.2; // [0:0.25:1]
-
-
- /* [Notches and tabs for stacking] */
-
- // You can optionally omit the notches for the frame on the end
- // that joins with an ear with no tabs. For all of the others
- // you should leave this at its default of true.
- notches_enabled = true;
-
- // Make the slot this much taller than the tabs
- // to give a more comfortable fit.
- notch_fudge = 0.3; // [0:0.25:1]
-
-
- /* [Size] */
-
- // The default is to fit 12 units with PoE hats in a standard rack.
- // 12 is a good fit, and it works nicely with many PoE switches, which
- // often come with 12 or 24 ports. You can bump it up to 13 units and
- // they will still fit nicely with PoE hats, or you can go up to 14
- // of you are not using the hats.
- number_to_fit = 12; // [12:Relaxed fit, 13:Using PoE, 14:Without PoE hats]
-
- /* [Hidden] */
- // make the screw holes this much bigger than the
- // actual screw for a more comfortable fit
- // (a bigger number here will make the screws fit looser)
- screw_hole_fudge = 0.15;
-
- height = (450.85 - 20) / number_to_fit;
-
- width = 82;
- length = 90;
-
- // The height of the notches and tabs
- notch_height = 2;
-
- // epsilon is used to slightly overlap pieces to help the previewer
- epsilon = 0.001;
-
- bolt_radius = bolt_size + bolt_hole_fudge;
-
- outer_wall_thickness = 12;
- inner_wall_thickness = 7;
- back_wall_thickness = 5;
- wall_diff = outer_wall_thickness - inner_wall_thickness;
- floor_depth = 3;
- tray_depth = 5;
- tray_slot_depth = 2.5;
- spacer_depth = 3;
-
- sd_window_width = 40;
- sd_window_height = height - (tray_depth + floor_depth)*2;
- near_pillar_width = 15;
- far_pillar_width = 10;
- floor_window_width = sd_window_width;
- floor_window_border = (width - floor_window_width - outer_wall_thickness*2) / 2;
- floor_window_length = length - back_wall_thickness - floor_window_border*2;
- port_window_width = length - near_pillar_width - far_pillar_width;
- port_window_frame_height = floor_depth + tray_depth + spacer_depth - notch_height;
-
- difference() {
- union() {
- // the main block
- cube([width, length, height]);
-
- // the tabs
- translate([ wall_diff,
- near_pillar_width + wall_diff,
- height - epsilon]) {
- cube([ inner_wall_thickness - 2,
- length - near_pillar_width - far_pillar_width - wall_diff*2,
- notch_height + epsilon]);
- }
- translate([ width - outer_wall_thickness + 2,
- near_pillar_width + wall_diff,
- height - epsilon]) {
- cube([ inner_wall_thickness - 2,
- length - near_pillar_width - far_pillar_width - wall_diff*2,
- notch_height + epsilon]);
- }
- }
-
- // carve out the interior
- translate([outer_wall_thickness, -epsilon, floor_depth]) {
- cube( [width - outer_wall_thickness*2,
- length - back_wall_thickness + epsilon,
- height + notch_height - floor_depth + epsilon]);
- }
-
- // punch a hole for the sd card
- translate([ (width - sd_window_width) / 2,
- length - back_wall_thickness - epsilon,
- tray_depth + floor_depth]) {
- cube([ sd_window_width,
- back_wall_thickness + 2*epsilon,
- height - port_window_frame_height - tray_depth - floor_depth + notch_height]);
- }
-
- // punch a hole for side port access
- translate([ -epsilon,
- near_pillar_width,
- port_window_frame_height + notch_height]) {
- cube([ width + 2*epsilon,
- port_window_width,
- height - port_window_frame_height*2]);
- }
-
- // punch a hole in the bottom
- translate([ outer_wall_thickness + floor_window_border,
- floor_window_border,
- -epsilon]) {
- cube([ floor_window_width,
- floor_window_length,
- floor_depth + 2*epsilon]);
- }
-
- // open a groove that the speaker jack can slide through
- translate([ outer_wall_thickness - 2,
- -epsilon,
- port_window_frame_height + notch_height]) {
- cube([ 2 + epsilon,
- near_pillar_width + 2*epsilon,
- 8]);
- }
-
- // soften the leading edge a bit
- translate([ outer_wall_thickness,
- 0,
- floor_depth-0.5]) {
- rotate([25,0,0]) {
- cube([ width - outer_wall_thickness*2,
- 2,
- 2]);
- }
- }
-
- if (notches_enabled) {
- // cut the notches in the bottom
- translate([ -epsilon,
- near_pillar_width + wall_diff,
- -epsilon]) {
- cube([ outer_wall_thickness - 2 + epsilon,
- length - near_pillar_width - far_pillar_width - wall_diff*2,
- notch_height + notch_fudge + epsilon]);
- }
- translate([ width - outer_wall_thickness + 2,
- near_pillar_width + wall_diff,
- -epsilon]) {
- cube([ outer_wall_thickness - 2 + epsilon,
- length - near_pillar_width - far_pillar_width - wall_diff*2,
- notch_height + notch_fudge + epsilon]);
- }
- }
-
- // cut out the sides to make them thinner
- polyhedron(
- points = [
- [ wall_diff, length-far_pillar_width-wall_diff, height+notch_height+epsilon],
- [ wall_diff, near_pillar_width+wall_diff, height+notch_height+epsilon],
- [ wall_diff, length-far_pillar_width-wall_diff, -epsilon],
- [ wall_diff, near_pillar_width+wall_diff, -epsilon],
- [-wall_diff, length-far_pillar_width+wall_diff, height+notch_height+epsilon],
- [-wall_diff, near_pillar_width-wall_diff, height+notch_height+epsilon],
- [-wall_diff, length-far_pillar_width+wall_diff, -epsilon],
- [-wall_diff, near_pillar_width-wall_diff, -epsilon]
- ],
- faces = [
- [1,0,2,3],
- [4,5,7,6],
- [0,4,6,2],
- [6,7,3,2],
- [7,5,1,3],
- [5,4,0,1]
- ],
- convexity = 10);
- polyhedron(
- points = [
- [width-wall_diff, near_pillar_width+wall_diff, height+notch_height+epsilon],
- [width-wall_diff, length-far_pillar_width-wall_diff, height+notch_height+epsilon],
- [width-wall_diff, near_pillar_width+wall_diff, -epsilon],
- [width-wall_diff, length-far_pillar_width-wall_diff, -epsilon],
- [width+wall_diff, near_pillar_width-wall_diff, height+notch_height+epsilon],
- [width+wall_diff, length-far_pillar_width+wall_diff, height+notch_height+epsilon],
- [width+wall_diff, near_pillar_width-wall_diff, -epsilon],
- [width+wall_diff, length-far_pillar_width+wall_diff, -epsilon]
- ],
- faces = [
- [1,0,2,3],
- [4,5,7,6],
- [0,4,6,2],
- [6,7,3,2],
- [7,5,1,3],
- [5,4,0,1]
- ],
- convexity = 10);
-
- // drill the bolt holes
- for (a=[[outer_wall_thickness/2, near_pillar_width/2],
- [outer_wall_thickness/2, length - far_pillar_width/2],
- [width - outer_wall_thickness/2, near_pillar_width/2],
- [width - outer_wall_thickness/2, length - far_pillar_width/2]]) {
- translate([a[0], a[1], -epsilon]) {
- cylinder( h=height + notch_height + 2*epsilon,
- r=bolt_radius,
- center=false,
- $fn=360);
- }
- }
-
- // cut the tray insert slots
- // note: the tray will be slightly narrower to
- // give a more comfortable fit. If it is too loose or too tight,
- // adjust the tray.
- for (a=[ outer_wall_thickness,
- width - outer_wall_thickness]) {
- translate([ a,
- -epsilon,
- floor_depth + tray_depth/2]) {
- intersection() {
- rotate([0, 45, 0]) {
- translate([-tray_depth/sqrt(2)/2, 0, -tray_depth/sqrt(2)/2]) {
- cube([ tray_depth/sqrt(2),
- length - back_wall_thickness + epsilon,
- tray_depth/sqrt(2)]);
- }
- }
- translate([-tray_depth/2+0.5, 0, -tray_depth/2]) {
- cube([ tray_depth-1,
- length - back_wall_thickness + epsilon,
- tray_depth]);
- }
- }
- }
- }
- }
|