Housing for a bench power supply made from a PD Buddy Sink and a DPH3205. https://hackaday.io/project/21278-usb-pd-bench-power-supply
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

power_supply_housing.scad 6.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. include <MCAD/units.scad>;
  2. use <pd-buddy-openscad/truncated_teardrop.scad>;
  3. use <pd-buddy-openscad/sink_bracket.scad>;
  4. use <binding_post.scad>;
  5. use <dph.scad>;
  6. /*
  7. * A wedge to keep overhangs reasonable when putting things on walls. The
  8. * slope is at 45 degrees in the X-Z plane.
  9. *
  10. * size: [x, y]
  11. */
  12. module wedge(size) {
  13. difference() {
  14. translate([0, size[1]/2, 0])
  15. rotate([0, 45, 0])
  16. cube([size[0]*2/sqrt(2), size[1], size[0]*2/sqrt(2)], center=true);
  17. translate([-size[0], -epsilon, 0])
  18. cube([2*size[0], size[1] + 2*epsilon, size[0]]);
  19. translate([-size[0], -epsilon, -size[0]])
  20. cube([size[0], size[1] + 2*epsilon, size[0] + epsilon]);
  21. }
  22. }
  23. /*
  24. * A side of the housing, with ventillation holes
  25. */
  26. module housing_side(case_thickness, height, depth, slot_r=2*mm, slot_count=3) {
  27. offset = case_thickness + 2*slot_r;
  28. spacing = slot_r*3;
  29. difference() {
  30. union() {
  31. /* Wall */
  32. cube([case_thickness, height, depth]);
  33. /* Stop for the back */
  34. translate([case_thickness, case_thickness, depth - case_thickness])
  35. wedge([2*case_thickness, slot_r]);
  36. /* Nut traps */
  37. translate([case_thickness, height - case_thickness - 4*mm, case_thickness])
  38. nut_trap_bot(thickness=4*mm);
  39. translate([case_thickness, height - case_thickness - 4*mm, depth - case_thickness - 8*mm])
  40. nut_trap_top(thickness=4*mm);
  41. }
  42. for (i = [0 : 4 : 4*slot_count - 1]) {
  43. /* First row of slots */
  44. hull() {
  45. translate([-epsilon, offset, depth - offset - i*spacing])
  46. truncated_teardrop(radius = slot_r, length = case_thickness + 2*epsilon);
  47. translate([-epsilon, offset, depth - offset - (i + 3)*spacing])
  48. truncated_teardrop(radius = slot_r, length = case_thickness + 2*epsilon);
  49. }
  50. /* Second row of slots */
  51. hull() {
  52. translate([-epsilon, offset + spacing, depth - offset - i*spacing])
  53. truncated_teardrop(radius = slot_r, length = case_thickness + 2*epsilon);
  54. translate([-epsilon, offset + spacing, depth - offset - (i + 3)*spacing])
  55. truncated_teardrop(radius = slot_r, length = case_thickness + 2*epsilon);
  56. }
  57. }
  58. }
  59. }
  60. /*
  61. * A nut trap for the bottom pair of nuts
  62. */
  63. module nut_trap_bot(thickness, nut_tolerance=0.05*mm, nut_depth=4*mm,
  64. bolt_tolerance=0.3*mm) {
  65. difference() {
  66. /* Body */
  67. translate([0, -2*thickness, 0])
  68. cube([2*thickness, 2*thickness, 2*thickness]);
  69. /* Nut trap */
  70. translate([thickness, -2*thickness - epsilon, thickness])
  71. rotate([0, 90, 90])
  72. rotate([0, 0, 30])
  73. cylinder(r=6.4*mm / 2 + nut_tolerance, h=nut_depth + epsilon, $fn=6);
  74. /* Bolt hole */
  75. translate([thickness, -2*thickness - epsilon, thickness])
  76. rotate([0, 0, 90])
  77. truncated_teardrop(radius=(3*mm + bolt_tolerance)/2,
  78. length=2*thickness + 2*epsilon);
  79. }
  80. }
  81. /*
  82. * A nut trap for the top pair of nuts
  83. */
  84. module nut_trap_top(thickness, nut_tolerance=0.05*mm, nut_depth=4*mm,
  85. bolt_tolerance=0.3*mm) {
  86. translate([0, -2*thickness, 0])
  87. wedge([2*thickness, 2*thickness]);
  88. nut_trap_bot(thickness, nut_tolerance, nut_depth, bolt_tolerance);
  89. }
  90. /*
  91. * An M3 bolt hole
  92. */
  93. module bolt_hole(h=7*mm, bolt_tolerance=0.3*mm, layer_thickness=0.25*mm) {
  94. /* Bolt hole */
  95. translate([0, 0, 4*mm + layer_thickness])
  96. polyhole(d=3*mm + bolt_tolerance, h=h + 2*epsilon);
  97. /* Cap hole */
  98. translate([0, 0, -epsilon])
  99. polyhole(d=5.5*mm + bolt_tolerance, h=4*mm + epsilon);
  100. }
  101. /*
  102. * The front, top, and sides of the housing
  103. */
  104. module housing_fts(size, case_thickness) {
  105. /* Front panel */
  106. difference() {
  107. cube([size[0], size[2], case_thickness]);
  108. /* DPH3205 panel cutout */
  109. translate([size[0]/2, 39*mm/2 + case_thickness + 2*mm, 0]) {
  110. dph_panel_hole();
  111. /* DPH3205 bezel, for reference */
  112. translate([0, 0, -1*mm])
  113. color([0.5, 0.5, 0.5, 0.25])
  114. %cube([79*mm, 43*mm, 1*mm], center=true);
  115. }
  116. /* Binding post cutouts */
  117. translate([size[0]/2, size[2] - 25*mm, -epsilon]) {
  118. translate([3/8*inch, 0, 0])
  119. rotate([0, 0, 90])
  120. binding_post(h=case_thickness + 2*epsilon);
  121. translate([-3/8*inch, 0, 0])
  122. rotate([0, 0, 90])
  123. binding_post(h=case_thickness + 2*epsilon);
  124. }
  125. }
  126. /* Top */
  127. cube([size[0], case_thickness, size[1]]);
  128. /* Left */
  129. housing_side(case_thickness, size[2], size[1]);
  130. /* Right */
  131. translate([size[0], 0, 0])
  132. mirror([1, 0, 0])
  133. housing_side(case_thickness, size[2], size[1]);
  134. }
  135. /* The bottom and back of the housing */
  136. module housing_bb(size, case_thickness) {
  137. in_size = [size[0] - 2*case_thickness, size[1] - case_thickness, size[2] - case_thickness];
  138. sink_offset = 10*mm;
  139. dph_offset = 14*mm;
  140. /* Bottom */
  141. difference() {
  142. union() {
  143. cube([in_size[0], in_size[1], case_thickness]);
  144. /* Boxes for DPH3205 mounting holes */
  145. translate([in_size[0]/2 - 93*mm/2 + dph_offset, in_size[1] - case_thickness - 71*mm, case_thickness])
  146. dph_mounting_boxes(h=4*mm);
  147. /* Boxes for mounting holes */
  148. for (x = [0, in_size[0] - 8*mm])
  149. for (y = [0, in_size[1] - 8*mm - case_thickness])
  150. translate([x, y, case_thickness])
  151. cube([8*mm, 8*mm, 4*mm]);
  152. }
  153. /* DPH3205 mounting holes */
  154. translate([in_size[0]/2 - 93*mm/2 + dph_offset, in_size[1] - case_thickness - 71*mm, 0])
  155. dph_mounting_holes(h=case_thickness + 4*mm);
  156. /* Hole for accessing the PD Buddy Sink */
  157. translate([sink_offset, in_size[1] - case_thickness, -epsilon])
  158. rotate([0, 0, -90])
  159. cube([8*mm, 26*mm, case_thickness + epsilon]);
  160. /* Holes for case bolts */
  161. for (x = [4*mm, in_size[0] - 4*mm])
  162. for (y = [4*mm, in_size[1] - 4*mm - case_thickness])
  163. translate([x, y, 0])
  164. bolt_hole();
  165. }
  166. /* Back */
  167. difference() {
  168. translate([0, in_size[1] - case_thickness, 0])
  169. cube([in_size[0], case_thickness, in_size[2]]);
  170. /* DPH3205 fan hole */
  171. translate([in_size[0]/2 + dph_offset, in_size[1] - case_thickness - epsilon, case_thickness + 4*mm + 42*mm - 15*mm])
  172. rotate([0, 0, 90])
  173. truncated_teardrop(radius=15*mm, length=case_thickness + 2*epsilon);
  174. /* PD Buddy Sink hole */
  175. translate([sink_offset + 8*mm, in_size[1] - case_thickness - epsilon, 8*mm])
  176. cube([10*mm, case_thickness + 2*epsilon, 5*mm]);
  177. translate([sink_offset + 8*mm - 2*mm, in_size[1] - case_thickness + 1*mm, 8*mm - 2*mm])
  178. cube([14*mm, case_thickness + 2*epsilon, 9*mm]);
  179. }
  180. /* PD Buddy Sink mount */
  181. translate([sink_offset, in_size[1] - case_thickness, 0])
  182. rotate([0, 0, -90])
  183. sink_mount();
  184. }
  185. case_thickness = 3*mm;
  186. size = [150*mm, 90*mm, 80*mm];
  187. housing_fts(size, case_thickness);
  188. translate([0, 100*mm, 0])
  189. //#translate([case_thickness, -20*mm, case_thickness])
  190. //rotate([90, 0, 0])
  191. housing_bb(size, case_thickness);