// PARAMETERS // space above hdd available for air flow cooling_height = 10; // thickness of the support bar bar_thickness = 10; // diameter of thread rod used for support rod_diameter = 4; // dimensions of HDDs; not model-specific; current values are fake hdd_width = 80; hdd_height = 30; hdd_length = 100; // dimensions of the L-shaped rail between front and back rail_width = 15; rail_height = rail_width; rail_thickness = 1; // dimension of a single hdd tray (hdd + space around) tray_height = hdd_height + cooling_height + rail_thickness; tray_width = hdd_width + bar_thickness; pla_epsilon = 0.1; // CONSTRUCTION module nipple(e = 0) { rotate([0, 180, 0]) cylinder(h = bar_thickness / 4 + e, r1 = bar_thickness / 4 + e, r2 = 0, $fs=0.1); } module half() difference() { union() { // upper horizontal bar translate([0, 0, tray_height - bar_thickness]) cube([tray_width / 2, bar_thickness, bar_thickness]); // vertical bar cube([bar_thickness/2, bar_thickness, tray_height]); // lower horizontal bar cube([bar_thickness/2 + rail_width + pla_epsilon, bar_thickness, bar_thickness]); // vertical thread bold receiver translate([0, bar_thickness, tray_height-bar_thickness]) cube([bar_thickness/2, bar_thickness, bar_thickness]); translate([tray_width/2 - bar_thickness, bar_thickness, tray_height-bar_thickness]) cube([bar_thickness, bar_thickness, bar_thickness]); // male downward positioning nippel translate([rail_width, bar_thickness / 2, 0]) nipple(); } // receiver for rail translate([bar_thickness/2 - rail_thickness, 0, bar_thickness - rail_thickness]) { cube([rail_thickness, bar_thickness, rail_height]); cube([rail_width, bar_thickness, rail_thickness]); } // holes for thread rods (horizontal, vertical) translate([0, bar_thickness / 2, 0]) cylinder(h = tray_height, r = (rod_diameter + pla_epsilon) / 2, $fs=0.1); translate([0, bar_thickness * 1.5, tray_height - bar_thickness / 2]) rotate([0, 90, 0]) cylinder(h = tray_width / 2, r = (rod_diameter + pla_epsilon) / 2, $fs=0.1); // female downward positioning nippel translate([rail_width, bar_thickness / 2, tray_height]) nipple(pla_epsilon); } difference() { union() { half(); mirror() half(); } // female leftward positioning nippel # translate([-tray_width/2, bar_thickness / 2, tray_height - bar_thickness / 2]) rotate([0, 270, 0]) nipple(pla_epsilon); } // male rightward positioning nippel translate([tray_width / 2, bar_thickness / 2, tray_height - bar_thickness / 2]) rotate([0, 270, 0]) nipple();