// To render the DXF file from the command line: // openscad -x example017.dxf -D'mode="parts"' example017.scad // Todo: // Check position of brightness control & make cut-out // Check hole positions & sizes for DC-DC convs // Check size of switch hole // Check size of rotary encoder hole (7mm curr) (6.5 would work) // 6.5 - same - for 10k pot // current brightness thing 8mm (To be added!) // Check size of slot cut-outs for nut/bolt mode = "parts"; //mode = "assembled"; thickness = 3; s_width=35.1; s_height=29; s_overage_h=1; s_overage_w=0.5; s_len=115; inner_x = 117; inner_y = 54; inner_z = 130; shelf_width = 100; shelf_x = -5; hanger_h = 44; hanger_centre_offset = 2.5; hole_dia = 17; // screw slot params screw_width = 3; screw_length = 10-thickness; nut_width = 5; // check nut_thickness = 2; // check // tab/slot params tab_size = 15; // Kerf correction; half the kerf? -- check kerf = 0.1/2; // Feathering edges feather_width = 20; // PCB positions, relative to XY plane origin pi_x = 10; pi_y = 5; dcdcl_x = -33; dcdcl_y = 0; dcdcl_h = 15; dcdcl_w = 45; dcdcs_x = 0; dcdcs_y = -18; dcdcs_h = 10; dcdcs_w = 15; // Relative positions of parts when assembled: // Hangers, in X/Z from origin: x_hanger_crta = -47.5; x_hanger_crtb = 34.5; z_hanger = inner_z/2 - hanger_h/2; // Shelf 1, in Z from origin: z_shelf1 = -inner_z/2 + 40; // Shelf 2, in Z from origin: z_shelf2 = -inner_z/2 + 15; module draw_crt() { translate([-s_len/2, 0, 0]) rotate([90, 0, 90]) linear_extrude(height = 40, convexity=4, scale=0.5, slices=10) square([s_width, s_height], center = true); translate([0, 0, 0]) rotate([0, 90, 0]) cylinder(h=s_len, r=13/2, center=true); } module draw_pcbA() { translate([0, 0, -26/2+5]) cube([110, 49, 10], center=true); translate([35, -10, 0]) cube([30, 25, 26], center=true); } module draw_pcbB() { cube([81, 52, 20], center=true); translate([30, -52/2, 0]) rotate([90,0,0]) cylinder(11, r=3); } module draw_pi() { cube([65, 30, 5], center=true); } module draw_dcdc_small() { cube([dcdcs_w, dcdcs_h, 5], center=true); } module draw_dcdc_big() { cube([dcdcl_w, dcdcl_h, 6], center=true); translate([5, 15/2-5, -3]) cube([10, 5, 10]); } //////////////////////////////////////////////////////////// // Origin is center of outside end module screw_slot() { union() { translate([0, screw_length/2]) square([screw_width, screw_length], center=true); translate([0, screw_length - 2]) square([nut_width, nut_thickness], center=true); } } module screw_hole() { circle(screw_width/2, center=true, $fn=16); } // Origin is center of *inside* end (i.e. side of shape // that this is attached to) module shape_tab() { translate([0, thickness/2]) square([tab_size, thickness], center=true); } // Origin is centre of slot; runs horizontal. module slot_tab() { square([tab_size - kerf, thickness - kerf], center=true); } // 2D. Origin is center of feathering, which is 'thickness' wide. // Runs in X axis. module shape_feathering(odd=0) { // TODO: kerf for (i = [-50:50]) translate([(i * feather_width * 2) + (odd * feather_width), 0]) square([feather_width, thickness], center=true); } module shape_hanger() { difference() { union() { square([inner_y, hanger_h], center=true); translate([inner_y/2, 0]) rotate(-90) shape_tab(); translate([-inner_y/2, 0]) rotate(90) shape_tab(); } // Screw slots: translate([inner_y/2, hanger_h/2 - 5]) rotate(90) screw_slot(); translate([-inner_y/2, hanger_h/2 - 5]) rotate(-90) screw_slot(); } } module shape_shelf() { difference () { union() { square([shelf_width, inner_y], center=true); translate([shelf_width/2 - tab_size/2 - 5, -inner_y/2]) rotate(180) shape_tab(); translate([-shelf_width/2 + tab_size/2 + 5, -inner_y/2]) rotate(180) shape_tab(); translate([shelf_width/2 - tab_size/2 - 5, inner_y/2]) shape_tab(); translate([-shelf_width/2 + tab_size/2 + 5, inner_y/2]) shape_tab(); } // Screw slots: translate([shelf_width/4, inner_y/2]) rotate(180) screw_slot(); translate([-shelf_width/4, inner_y/2]) rotate(180) screw_slot(); translate([shelf_width/4, -inner_y/2]) screw_slot(); translate([-shelf_width/4, -inner_y/2]) screw_slot(); // Curved edges: translate([-shelf_width/2 - 22, 0]) circle(inner_y/1.9, center=true, $fn=32); translate([shelf_width/2 + 22, 0]) circle(inner_y/1.9, center=true, $fn=32); translate([0, inner_y/1.5]) circle(inner_y/2.7, center=true, $fn=32); translate([0, -inner_y/1.5]) circle(inner_y/2.7, center=true, $fn=32); } } module shape_featheredges(h_odd, v_odd, width, height) { echo("featheredges ho=", h_odd, " vo=", v_odd, " w=", width, " h=", height); translate([0, height/2+thickness/2]) shape_feathering(h_odd); translate([0, -height/2-thickness/2]) shape_feathering(h_odd); translate([width/2 + thickness/2, 0]) rotate(90) shape_feathering(v_odd); translate([-width/2 - thickness/2, 0]) rotate(90) shape_feathering(v_odd); } /////////////////////////////////////////////////////// // Final shapes: module shape_crt_a() { difference() { shape_hanger(); translate([0, -hanger_centre_offset]) square([s_width + s_overage_w, s_height + s_overage_h], center=true); } } module shape_crt_b() { difference() { shape_hanger(); // Standard horizontal position translate([0, -hanger_centre_offset]) circle(hole_dia/2, center=true); // Alternate 'dipped' position translate([0, -hanger_centre_offset - 7.5]) circle(hole_dia/2, center=true); } } module shape_crt_b_spacer() { difference() { circle(hole_dia/2, center=true); translate([0, -7.5]) circle(hole_dia/2, center=true); } } module shape_shelf_1() { difference() { shape_shelf(); // Wire slot hull() { translate([50/2,10/2]) circle(5, center=true); translate([-50/2,10/2]) circle(5, center=true); translate([-50/2,-10/2]) circle(5, center=true); translate([50/2,-10/2]) circle(5, center=true); } // Mounting holes translate([-shelf_width/2 + 10, -inner_y/2 + 10]) screw_hole(); translate([-shelf_width/2 + 10, 0]) screw_hole(); translate([-shelf_width/2 + 10, inner_y/2 - 10]) screw_hole(); translate([shelf_width/2 - 10, -inner_y/2 + 10]) screw_hole(); translate([shelf_width/2 - 10, 0]) screw_hole(); translate([shelf_width/2 - 10, inner_y/2 - 10]) screw_hole(); } } module shape_shelf_2() { difference() { shape_shelf(); circle(8, center=true); // Pi mounting holes: translate([pi_x - 58/2, pi_y + 23/2]) screw_hole(); translate([pi_x + 58/2, pi_y + 23/2]) screw_hole(); translate([pi_x - 58/2, pi_y - 23/2]) screw_hole(); translate([pi_x + 58/2, pi_y - 23/2]) screw_hole(); // DC-DC converter (x2) holes; 2 ea for ziptie: translate([dcdcl_x, dcdcl_y]) rotate(90) { translate([0, dcdcl_h/2]) screw_hole(); translate([0, -dcdcl_h/2]) screw_hole(); } translate([dcdcs_x, dcdcs_y]) rotate(0) { translate([0, dcdcs_h/2]) screw_hole(); translate([0, -dcdcs_h/2]) screw_hole(); } } } module shape_top() { difference() { square([inner_x + thickness*2, inner_y + thickness*2], center=true); shape_featheredges(0, 0, inner_x, inner_y); } } module shape_bottom() { difference() { square([inner_x + thickness*2, inner_y + thickness*2], center=true); shape_featheredges(0, 0, inner_x, inner_y); } } module shape_front() { difference() { square([inner_z + thickness*2, inner_y + thickness*2], center=true); shape_featheredges(0, 1, inner_z, inner_y); } } module shape_back() { difference() { square([inner_z + thickness*2, inner_y + thickness*2], center=true); shape_featheredges(0, 1, inner_z, inner_y); // Power jack translate([-inner_z/2 + 10, 0]) //square([10.9, 8.9], center=true); circle(8/2, center=true, $fn=32); // Switch translate([-inner_z/2 + 27, inner_y/4]) circle(6/2, center=true, $fn=32); // Rotary encoder translate([-inner_z/2 + 27, -inner_y/4]) circle(7/2, center=true, $fn=32); } } module shape_side() { difference() { square([inner_x + thickness*2, inner_z + thickness*2], center=true); shape_featheredges(1, 1, inner_x, inner_z); // Slots for A hanger: translate([x_hanger_crta, z_hanger]) { rotate(90) slot_tab(); translate([0, hanger_h/2 - 5]) screw_hole(); } // For B hanger: translate([x_hanger_crtb, z_hanger]) { rotate(90) slot_tab(); translate([0, hanger_h/2 - 5]) screw_hole(); } // For shelf1: translate([shelf_x + (shelf_width/2 - tab_size/2 - 5), z_shelf1]) slot_tab(); translate([shelf_x - (shelf_width/2 - tab_size/2 - 5), z_shelf1]) slot_tab(); // Holes for shelf1: translate([shelf_x + (shelf_width/4), z_shelf1]) screw_hole(); translate([shelf_x - (shelf_width/4), z_shelf1]) screw_hole(); // For shelf2: translate([shelf_x + (shelf_width/2 - tab_size/2 - 5), z_shelf2]) slot_tab(); translate([shelf_x - (shelf_width/2 - tab_size/2 - 5), z_shelf2]) slot_tab(); // Holes for shelf2: translate([shelf_x + (shelf_width/4), z_shelf2]) screw_hole(); translate([shelf_x - (shelf_width/4), z_shelf2]) screw_hole(); } } module shape_lhs() { shape_side(); // FIXME, add brightness hole? } module shape_rhs() { scale([-1, 1]) shape_side(); } /////////////////////////////////////////////////////// module parts() { translate([0, 200]) shape_crt_a(); translate([0, 230]) shape_crt_b_spacer(); translate([65, 245]) shape_crt_b(); translate([0, 23]) rotate([0,0,90]) shape_shelf_1(); translate([0, 125]) rotate([0,0,90]) shape_shelf_2(); translate([65, 35]) rotate([0,0,90]) shape_top(); translate([65, 160]) rotate([0,0,90]) shape_bottom(); translate([130, 40]) rotate([0,0,90]) shape_front(); translate([130, 180]) rotate([0,0,90]) shape_back(); translate([225, 40]) shape_lhs(); translate([225, 180]) shape_rhs(); } module assembled() { // Draw anciliary/context. CRT: color([0.5, 0.5, 0.5], alpha=0.1) translate([0, 0, z_hanger - (2.5)]) draw_crt(); // PCBs: color([0.8, 0.8, 0.1], alpha=0.2) { // Note - centred in X, *not* tied to shelf_x translate([0, 0, z_shelf1 + 2 + 26/2]) draw_pcbA(); translate([shelf_x, 0, z_shelf1 - 2 - 20/2]) draw_pcbB(); translate([shelf_x + pi_x, pi_y, z_shelf2 - 2 - 5/2]) draw_pi(); translate([shelf_x + dcdcl_x, dcdcl_y, z_shelf2 - 2 - 5/2]) rotate([180, 0, 90]) draw_dcdc_big(); translate([shelf_x + dcdcs_x, dcdcs_y, z_shelf2 - 2 - 5/2]) draw_dcdc_small(); } // Acrylic parts: color([0.2, 0.5, 1.0], alpha=0.2) { translate([x_hanger_crta, 0, z_hanger]) rotate([90, 0, -90]) linear_extrude(height = thickness, convexity = 4, center = true) shape_crt_a(); translate([x_hanger_crtb, 0, z_hanger]) rotate([90, 0, -90]) linear_extrude(height = thickness, convexity = 4, center = true) shape_crt_b(); translate([shelf_x, 0, z_shelf1]) linear_extrude(height = thickness, convexity = 4, center = true) shape_shelf_1(); translate([shelf_x, 0, z_shelf2]) linear_extrude(height = thickness, convexity = 4, center = true) shape_shelf_2(); // Casing translate([-inner_x/2 - thickness/2, 0, 0]) rotate([0, 90, 0]) linear_extrude(height = thickness, convexity = 4, center = true) shape_front(); translate([inner_x/2 + thickness/2, 0, 0]) rotate([0, -90, 0]) linear_extrude(height = thickness, convexity = 4, center = true) shape_back(); translate([0, 0, inner_z/2 + thickness/2]) linear_extrude(height = thickness, convexity = 4, center = true) shape_top(); translate([0, 0, -inner_z/2 - thickness/2]) linear_extrude(height = thickness, convexity = 4, center = true) shape_bottom(); translate([0, inner_y/2 + thickness/2, 0]) rotate([90, 0, 180]) linear_extrude(height = thickness, convexity = 4, center = true) shape_rhs(); translate([0, -inner_y/2 - thickness/2, 0]) rotate([90, 0, 0]) linear_extrude(height = thickness, convexity = 4, center = true) shape_lhs(); } } if (mode == "parts") parts(); if (mode == "assembled") assembled();