My self-made 3D-printable designs, mainly in OpenSCAD
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.

hdd-cage.scad 8.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. cage_width = 104.9;
  2. cage_length = 160.0;
  3. cage_wall = 1.3;
  4. cage_hold_large = 12.0;
  5. cage_hold_small = 8.0;
  6. cage_hold_length = 19.7;
  7. cage_hold_off_bot = 13.4;
  8. cage_hold_off_left = 16.6;
  9. cage_hold_off_top = 56.9;
  10. cage_hold_off_right = 49.6;
  11. cage_lip = 9.9 + 2.0;
  12. cage_lip_hole = 3.4;
  13. cage_lip_hole_dist = 37;
  14. cage_lip_hole_off = 29.0;
  15. cage_lip_hole_off_y = 2.0;
  16. lip_wall = 1.6;
  17. lip_width = cage_lip_hole_dist + 10.0;
  18. rail_height = 7.5;
  19. rail_height_front = 13.0;
  20. rail_radius = 7.0;
  21. rail_length = 120;
  22. rail_width = lip_wall + 2;
  23. rail_dist = 27.5 - 8;
  24. rail_off_front = 7.8;
  25. nub_small = 6.6;
  26. nub_small_height = cage_wall + 0.4;
  27. nub_large = cage_hold_large - 1.5;
  28. nub_large_height = 1.5;
  29. stable_cut_height = 15.0;
  30. stable_cut_depth = 20.0;
  31. stable_cut_width = 7.5;
  32. add_after_rail = 6;
  33. $fn = 20;
  34. module cage_hold() {
  35. translate([cage_hold_large / 2, cage_hold_large / 2, 0])
  36. hull() {
  37. cylinder(d = cage_hold_large, h = cage_wall + 2);
  38. translate([0, cage_hold_length - (cage_hold_large / 2) - (cage_hold_small / 2), 0])
  39. cylinder(d = cage_hold_small, h = cage_wall + 2);
  40. }
  41. }
  42. module cage() {
  43. // cage bottom
  44. difference() {
  45. cube([cage_width, cage_length, cage_wall]);
  46. translate([cage_hold_off_left, cage_hold_off_bot, -1])
  47. cage_hold();
  48. translate([cage_hold_off_left + cage_hold_large + cage_hold_off_right, cage_hold_off_bot, -1])
  49. cage_hold();
  50. translate([cage_hold_off_left, cage_hold_off_bot + cage_hold_length + cage_hold_off_top, -1])
  51. cage_hold();
  52. translate([cage_hold_off_left + cage_hold_large + cage_hold_off_right, cage_hold_off_bot + cage_hold_length + cage_hold_off_top, -1])
  53. cage_hold();
  54. }
  55. // cage lip
  56. difference() {
  57. cube([cage_width, cage_wall, cage_lip]);
  58. translate([cage_lip_hole_off, cage_wall + 1, cage_lip / 2 + cage_lip_hole_off_y])
  59. rotate([90, 0, 0])
  60. cylinder(d = cage_lip_hole, h = cage_wall + 2);
  61. translate([cage_lip_hole_off + cage_lip_hole_dist, cage_wall + 1, cage_lip / 2 + cage_lip_hole_off_y])
  62. rotate([90, 0, 0])
  63. cylinder(d = cage_lip_hole, h = cage_wall + 2);
  64. }
  65. }
  66. module rail() {
  67. // main rail
  68. cube([rail_width, rail_length - (rail_height / 2), rail_height]);
  69. // rounded end
  70. translate([0, rail_length - (rail_height / 2), rail_height / 2])
  71. rotate([0, 90, 0])
  72. cylinder(d = rail_height, h = rail_width);
  73. // front hdd insert
  74. difference() {
  75. translate([0, 0, -((rail_height_front - rail_height) / 2)])
  76. cube([rail_width, rail_radius, rail_height_front]);
  77. translate([-1, rail_radius, -rail_radius / 2])
  78. rotate([0, 90, 0])
  79. cylinder(d = rail_radius, h = rail_width + 2);
  80. translate([-1, rail_radius, rail_height + rail_radius / 2])
  81. rotate([0, 90, 0])
  82. cylinder(d = rail_radius, h = rail_width + 2);
  83. }
  84. }
  85. module nub() {
  86. // nub itself
  87. translate([0, 0, nub_small_height + nub_large_height])
  88. cylinder(d = nub_large, h = nub_large_height);
  89. translate([0, 0, nub_large_height])
  90. cylinder(d = nub_small, h = nub_small_height);
  91. cylinder(d = nub_large, h = nub_large_height);
  92. // support pillar up to main plate
  93. translate([0, 0, nub_small_height + (2 * nub_large_height)])
  94. cylinder(d = nub_small, h = cage_lip - nub_large_height);
  95. }
  96. module mount_nubs() {
  97. translate([cage_hold_off_left + (cage_hold_large / 2), cage_hold_off_bot + cage_hold_length - (cage_hold_small / 2), -nub_large_height - ((nub_small_height - cage_wall) / 2)])
  98. nub();
  99. translate([cage_hold_off_left + (cage_hold_large / 2) + cage_hold_off_right + cage_hold_large, cage_hold_off_bot + cage_hold_length - (cage_hold_small / 2), -nub_large_height - ((nub_small_height - cage_wall) / 2)])
  100. nub();
  101. translate([cage_hold_off_left + (cage_hold_large / 2), cage_hold_off_bot + cage_hold_length - (cage_hold_small / 2) + cage_hold_off_top + cage_hold_length, -nub_large_height - ((nub_small_height - cage_wall) / 2)])
  102. nub();
  103. translate([cage_hold_off_left + (cage_hold_large / 2) + cage_hold_off_right + cage_hold_large, cage_hold_off_bot + cage_hold_length - (cage_hold_small / 2) + cage_hold_off_top + cage_hold_length, -nub_large_height - ((nub_small_height - cage_wall) / 2)])
  104. nub();
  105. }
  106. module mount_lip() {
  107. difference() {
  108. translate([cage_lip_hole_off - ((lip_width - cage_lip_hole_dist) / 2), 0, 0])
  109. cube([lip_width, lip_wall, cage_lip]);
  110. translate([cage_lip_hole_off, cage_wall + 1, cage_lip / 2 + cage_lip_hole_off_y])
  111. rotate([90, 0, 0])
  112. cylinder(d = cage_lip_hole, h = cage_wall + 2);
  113. translate([cage_lip_hole_off + cage_lip_hole_dist, cage_wall + 1, cage_lip / 2 + cage_lip_hole_off_y])
  114. rotate([90, 0, 0])
  115. cylinder(d = cage_lip_hole, h = cage_wall + 2);
  116. }
  117. }
  118. module rail_wall() {
  119. difference() {
  120. cube([lip_wall, rail_length + add_after_rail, rail_dist + rail_height + (rail_dist / 3)]);
  121. // bubbles
  122. translate([-1, 10, 10])
  123. for (i = [0 : 15 : (rail_length + add_after_rail - 20)]) {
  124. translate([0, i + 1, 0])
  125. rotate([0, 90, 0])
  126. cylinder(d = 7, h = lip_wall + 2);
  127. //translate([0, i + 8, 10])
  128. // rotate([0, 90, 0])
  129. // cylinder(d = 7, h = lip_wall + 2);
  130. //translate([0, i + 4, 32.5])
  131. // rotate([0, 90, 0])
  132. // cylinder(d = 7, h = lip_wall + 2);
  133. }
  134. }
  135. }
  136. module stabilizer() {
  137. difference() {
  138. translate([-lip_wall, 0, -lip_wall])
  139. cube([stable_cut_width + lip_wall, stable_cut_depth, stable_cut_height + (2 * lip_wall)]);
  140. translate([0, -1, 0])
  141. cube([stable_cut_width + 1, stable_cut_depth + 2, stable_cut_height]);
  142. }
  143. }
  144. module mount() {
  145. // model of the bottom of the cage
  146. %cage();
  147. // nubs fitting 2.5" HDD slots on bottom
  148. mount_nubs();
  149. // screwed-on lip
  150. translate([0, -lip_wall, 0])
  151. mount_lip();
  152. // main horizontal plate
  153. translate([0, -lip_wall, cage_lip])
  154. cube([cage_width, rail_length + add_after_rail, lip_wall]);
  155. // left rail support
  156. difference() {
  157. translate([-lip_wall, -lip_wall, cage_lip])
  158. rail_wall();
  159. translate([-rail_width + 1, -rail_off_front, cage_lip + rail_dist])
  160. rail();
  161. }
  162. // left rail stabilizer
  163. translate([-stable_cut_width - lip_wall, -lip_wall, cage_lip + rail_dist - (stable_cut_height - rail_height) / 2])
  164. stabilizer();
  165. // right rail support
  166. difference() {
  167. translate([cage_width, -lip_wall, cage_lip])
  168. rail_wall();
  169. translate([cage_width - 1, -rail_off_front, cage_lip + rail_dist])
  170. rail();
  171. }
  172. // right rail stabilizer
  173. translate([cage_width + stable_cut_width + lip_wall, -lip_wall, stable_cut_height + cage_lip + rail_dist - (stable_cut_height - rail_height) / 2])
  174. rotate([0, 180, 0])
  175. stabilizer();
  176. // bottom/top horizontal plate
  177. difference() {
  178. translate([-lip_wall, -lip_wall, cage_lip + rail_dist + rail_height + (rail_dist / 3)])
  179. cube([cage_width + (2 * lip_wall), rail_length + add_after_rail, lip_wall]);
  180. translate([0, 0, cage_lip + rail_dist + rail_height + (rail_dist / 3)])
  181. union() {
  182. translate([cage_hold_off_left, cage_hold_off_bot, -1])
  183. cage_hold();
  184. translate([cage_hold_off_left + cage_hold_large + cage_hold_off_right, cage_hold_off_bot, -1])
  185. cage_hold();
  186. translate([cage_hold_off_left, cage_hold_off_bot + cage_hold_length + cage_hold_off_top, -1])
  187. cage_hold();
  188. translate([cage_hold_off_left + cage_hold_large + cage_hold_off_right, cage_hold_off_bot + cage_hold_length + cage_hold_off_top, -1])
  189. cage_hold();
  190. }
  191. }
  192. }
  193. translate([60, 120, 1])
  194. rotate([90, 0, -90])
  195. mount();