123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233 |
- include <MCAD/units.scad>;
-
- use <pd-buddy-openscad/truncated_teardrop.scad>;
- use <pd-buddy-openscad/sink_bracket.scad>;
- use <binding_post.scad>;
- use <dph.scad>;
-
- /*
- * A wedge to keep overhangs reasonable when putting things on walls. The
- * slope is at 45 degrees in the X-Z plane.
- *
- * size: [x, y]
- */
- module wedge(size) {
- difference() {
- translate([0, size[1]/2, 0])
- rotate([0, 45, 0])
- cube([size[0]*2/sqrt(2), size[1], size[0]*2/sqrt(2)], center=true);
-
- translate([-size[0], -epsilon, 0])
- cube([2*size[0], size[1] + 2*epsilon, size[0]]);
-
- translate([-size[0], -epsilon, -size[0]])
- cube([size[0], size[1] + 2*epsilon, size[0] + epsilon]);
- }
- }
-
- /*
- * A side of the housing, with ventillation holes
- */
- module housing_side(case_thickness, height, depth, slot_r=2*mm, slot_count=3) {
- offset = case_thickness + 2*slot_r;
- spacing = slot_r*3;
-
- difference() {
- union() {
- /* Wall */
- cube([case_thickness, height, depth]);
-
- /* Stop for the back */
- translate([case_thickness, case_thickness, depth - case_thickness])
- wedge([2*case_thickness, slot_r]);
-
- /* Nut traps */
- translate([case_thickness, height - case_thickness - 4*mm, case_thickness])
- nut_trap_bot(thickness=4*mm);
- translate([case_thickness, height - case_thickness - 4*mm, depth - case_thickness - 8*mm])
- nut_trap_top(thickness=4*mm);
- }
-
- for (i = [0 : 4 : 4*slot_count - 1]) {
- /* First row of slots */
- hull() {
- translate([-epsilon, offset, depth - offset - i*spacing])
- truncated_teardrop(radius = slot_r, length = case_thickness + 2*epsilon);
-
- translate([-epsilon, offset, depth - offset - (i + 3)*spacing])
- truncated_teardrop(radius = slot_r, length = case_thickness + 2*epsilon);
- }
-
- /* Second row of slots */
- hull() {
- translate([-epsilon, offset + spacing, depth - offset - i*spacing])
- truncated_teardrop(radius = slot_r, length = case_thickness + 2*epsilon);
-
- translate([-epsilon, offset + spacing, depth - offset - (i + 3)*spacing])
- truncated_teardrop(radius = slot_r, length = case_thickness + 2*epsilon);
- }
- }
- }
- }
-
- /*
- * A nut trap for the bottom pair of nuts
- */
- module nut_trap_bot(thickness, nut_tolerance=0.05*mm, nut_depth=4*mm,
- bolt_tolerance=0.3*mm) {
- difference() {
- /* Body */
- translate([0, -2*thickness, 0])
- cube([2*thickness, 2*thickness, 2*thickness]);
-
- /* Nut trap */
- translate([thickness, -2*thickness - epsilon, thickness])
- rotate([0, 90, 90])
- rotate([0, 0, 30])
- cylinder(r=6.4*mm / 2 + nut_tolerance, h=nut_depth + epsilon, $fn=6);
-
- /* Bolt hole */
- translate([thickness, -2*thickness - epsilon, thickness])
- rotate([0, 0, 90])
- truncated_teardrop(radius=(3*mm + bolt_tolerance)/2,
- length=2*thickness + 2*epsilon);
- }
- }
-
- /*
- * A nut trap for the top pair of nuts
- */
- module nut_trap_top(thickness, nut_tolerance=0.05*mm, nut_depth=4*mm,
- bolt_tolerance=0.3*mm) {
- translate([0, -2*thickness, 0])
- wedge([2*thickness, 2*thickness]);
-
- nut_trap_bot(thickness, nut_tolerance, nut_depth, bolt_tolerance);
- }
-
- /*
- * An M3 bolt hole
- */
- module bolt_hole(h=7*mm, bolt_tolerance=0.3*mm, layer_thickness=0.25*mm) {
- /* Bolt hole */
- translate([0, 0, 4*mm + layer_thickness])
- polyhole(d=3*mm + bolt_tolerance, h=h + 2*epsilon);
-
- /* Cap hole */
- translate([0, 0, -epsilon])
- polyhole(d=5.5*mm + bolt_tolerance, h=4*mm + epsilon);
- }
-
- /*
- * The front, top, and sides of the housing
- */
- module housing_fts(size, case_thickness) {
- /* Front panel */
- difference() {
- cube([size[0], size[2], case_thickness]);
-
- /* DPH3205 panel cutout */
- translate([size[0]/2, 39*mm/2 + case_thickness + 2*mm, 0]) {
- dph_panel_hole();
-
- /* DPH3205 bezel, for reference */
- translate([0, 0, -1*mm])
- color([0.5, 0.5, 0.5, 0.25])
- %cube([79*mm, 43*mm, 1*mm], center=true);
- }
-
- /* Binding post cutouts */
- translate([size[0]/2, size[2] - 25*mm, -epsilon]) {
- translate([3/8*inch, 0, 0])
- rotate([0, 0, 90])
- binding_post(h=case_thickness + 2*epsilon);
-
- translate([-3/8*inch, 0, 0])
- rotate([0, 0, 90])
- binding_post(h=case_thickness + 2*epsilon);
- }
- }
-
- /* Top */
- cube([size[0], case_thickness, size[1]]);
-
- /* Left */
- housing_side(case_thickness, size[2], size[1]);
-
- /* Right */
- translate([size[0], 0, 0])
- mirror([1, 0, 0])
- housing_side(case_thickness, size[2], size[1]);
- }
-
- /* The bottom and back of the housing */
- module housing_bb(size, case_thickness) {
- in_size = [size[0] - 2*case_thickness, size[1] - case_thickness, size[2] - case_thickness];
-
- sink_offset = 10*mm;
- dph_offset = 14*mm;
-
- /* Bottom */
- difference() {
- union() {
- cube([in_size[0], in_size[1], case_thickness]);
-
- /* Boxes for DPH3205 mounting holes */
- translate([in_size[0]/2 - 93*mm/2 + dph_offset, in_size[1] - case_thickness - 71*mm, case_thickness])
- dph_mounting_boxes(h=4*mm);
-
- /* Boxes for mounting holes */
- for (x = [0, in_size[0] - 8*mm])
- for (y = [0, in_size[1] - 8*mm - case_thickness])
- translate([x, y, case_thickness])
- cube([8*mm, 8*mm, 4*mm]);
- }
-
- /* DPH3205 mounting holes */
- translate([in_size[0]/2 - 93*mm/2 + dph_offset, in_size[1] - case_thickness - 71*mm, 0])
- dph_mounting_holes(h=case_thickness + 4*mm);
-
- /* Hole for accessing the PD Buddy Sink */
- translate([sink_offset, in_size[1] - case_thickness, -epsilon])
- rotate([0, 0, -90])
- cube([8*mm, 26*mm, case_thickness + epsilon]);
-
- /* Holes for case bolts */
- for (x = [4*mm, in_size[0] - 4*mm])
- for (y = [4*mm, in_size[1] - 4*mm - case_thickness])
- translate([x, y, 0])
- bolt_hole();
- }
-
- /* Back */
- difference() {
- translate([0, in_size[1] - case_thickness, 0])
- cube([in_size[0], case_thickness, in_size[2]]);
-
- /* DPH3205 fan hole */
- translate([in_size[0]/2 + dph_offset, in_size[1] - case_thickness - epsilon, case_thickness + 4*mm + 42*mm - 15*mm])
- rotate([0, 0, 90])
- truncated_teardrop(radius=15*mm, length=case_thickness + 2*epsilon);
-
- /* PD Buddy Sink hole */
- translate([sink_offset + 8*mm, in_size[1] - case_thickness - epsilon, 8*mm])
- cube([10*mm, case_thickness + 2*epsilon, 5*mm]);
- translate([sink_offset + 8*mm - 2*mm, in_size[1] - case_thickness + 1*mm, 8*mm - 2*mm])
- cube([14*mm, case_thickness + 2*epsilon, 9*mm]);
- }
-
- /* PD Buddy Sink mount */
- translate([sink_offset, in_size[1] - case_thickness, 0])
- rotate([0, 0, -90])
- sink_mount();
- }
-
- case_thickness = 3*mm;
- size = [150*mm, 90*mm, 80*mm];
-
- housing_fts(size, case_thickness);
-
- translate([0, 100*mm, 0])
- //#translate([case_thickness, -20*mm, case_thickness])
- //rotate([90, 0, 0])
- housing_bb(size, case_thickness);
|