My self designed awesome 3D printer
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.

xyRepRap.scad 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. // #######################################################
  2. // ################## Config Parameters ##################
  3. // #######################################################
  4. slot = 30; // or 20
  5. slot_off = 1; // distance between adjacent slots
  6. // print area / volume
  7. heatbed_width = 400;
  8. heatbed_length = 400;
  9. heatbed_height = 6;
  10. // distance between heatbed edge and inner t-slot frame edge
  11. frame_off_x = 20;
  12. frame_off_y = 20;
  13. outer_width = heatbed_width + (2 * (slot + frame_off_x));
  14. outer_length = heatbed_length + (2 * (slot + frame_off_y));
  15. // TODO depend on print area height
  16. outer_height = 500;
  17. // display heatbed centered in print volume
  18. bed_draw_height = (outer_height - heatbed_height) / 2;
  19. // #######################################################
  20. // ###################### Libraries ######################
  21. // #######################################################
  22. include <lib/tslot_xy.scad>
  23. include <lib/nema.scad>
  24. include <lib/Belt_Generator.scad>
  25. include <lib/Pulley_T-MXL-XL-HTD-GT2_N-tooth.scad>
  26. include <lib/bearing_idler.scad>
  27. include <lib/rail_mount.scad>
  28. module gt2_belt(length) {
  29. difference() {
  30. belting("straight", "GT2_2mm", belt_length = length);
  31. translate([-5, -5, 6])
  32. cube([length + 10, 10, 10]);
  33. }
  34. }
  35. // #######################################################
  36. // ######################## Frame ########################
  37. // #######################################################
  38. module slot_angle_connector() {
  39. color("gray")
  40. translate([slot, 0, 0])
  41. rotate([0, -90, 0])
  42. difference() {
  43. cube([slot, slot, slot]);
  44. translate([0, -5, 0])
  45. rotate([0, 45, 0])
  46. cube([2 * slot, 2 * slot, 2 * slot]);
  47. }
  48. }
  49. module foot() {
  50. color("yellow")
  51. translate([0, 0, 10])
  52. cylinder(d = 6, h = 20);
  53. color("yellow")
  54. difference() {
  55. sphere(d = 20);
  56. translate([-15, -15, -30])
  57. cube([30, 30, 30]);
  58. }
  59. }
  60. module lower_frame(double) {
  61. // bottom frame
  62. translate([slot + slot_off, 0, 0])
  63. tslot_x(slot, outer_width - (2 * (slot + slot_off)));
  64. if (double) {
  65. translate([slot + slot_off, outer_length - slot, slot])
  66. rotate([-90, 0, 0])
  67. tslot_2_x(slot, outer_width - (2 * (slot + slot_off)));
  68. translate([0, slot + slot_off, 0])
  69. tslot_2_y(slot, outer_width - (2 * (slot + slot_off)));
  70. translate([outer_width - slot, slot + slot_off, 0])
  71. tslot_2_y(slot, outer_width - (2 * (slot + slot_off)));
  72. } else {
  73. translate([slot + slot_off, outer_length - slot, 0])
  74. tslot_x(slot, outer_width - (2 * (slot + slot_off)));
  75. translate([0, slot + slot_off, 0])
  76. tslot_y(slot, outer_width - (2 * (slot + slot_off)));
  77. translate([outer_width - slot, slot + slot_off, 0])
  78. tslot_y(slot, outer_width - (2 * (slot + slot_off)));
  79. }
  80. }
  81. module frame() {
  82. // outer corner pillars
  83. tslot_z(slot, outer_height);
  84. translate([outer_width - slot, 0, 0])
  85. tslot_z(slot, outer_height);
  86. translate([0, outer_length - slot, 0])
  87. tslot_z(slot, outer_height);
  88. translate([outer_width - slot, outer_length - slot, 0])
  89. tslot_z(slot, outer_height);
  90. lower_frame(false);
  91. // top frame
  92. translate([0, 0, outer_height - slot])
  93. lower_frame(true);
  94. // end caps
  95. color("black")
  96. translate([0, 0, outer_height]) {
  97. cube([slot, slot, 2]);
  98. translate([outer_width - slot, 0, 0])
  99. cube([slot, slot, 2]);
  100. translate([0, outer_length - slot, 0])
  101. cube([slot, slot, 2]);
  102. translate([outer_width - slot, outer_length - slot, 0])
  103. cube([slot, slot, 2]);
  104. }
  105. // feet
  106. translate([slot / 2, slot / 2, -30])
  107. foot();
  108. translate([outer_width - slot / 2, slot / 2, -30])
  109. foot();
  110. translate([slot / 2, outer_length - slot / 2, -30])
  111. foot();
  112. translate([outer_width - slot / 2, outer_length - slot / 2, -30])
  113. foot();
  114. // connecting elements
  115. translate([slot + slot_off, 0, slot + slot_off])
  116. slot_angle_connector();
  117. translate([slot + slot_off, outer_length - slot, slot + slot_off])
  118. slot_angle_connector();
  119. translate([slot + slot_off, 0, outer_height - slot - slot_off])
  120. rotate([0, 90, 0])
  121. slot_angle_connector();
  122. translate([slot + slot_off, outer_length - slot, outer_height - slot - slot_off - slot])
  123. rotate([0, 90, 0])
  124. slot_angle_connector();
  125. translate([outer_width - slot - slot_off, 0, slot + slot_off])
  126. rotate([0, -90, 0])
  127. slot_angle_connector();
  128. translate([outer_width - slot - slot_off, outer_length - slot, slot + slot_off])
  129. rotate([0, -90, 0])
  130. slot_angle_connector();
  131. translate([outer_width - slot - slot_off, 0, outer_height - slot - slot_off])
  132. rotate([0, 180, 0])
  133. slot_angle_connector();
  134. translate([outer_width - slot - slot_off, outer_length - slot, outer_height - slot - slot_off - slot])
  135. rotate([0, 180, 0])
  136. slot_angle_connector();
  137. translate([slot, slot + slot_off, slot + slot_off])
  138. rotate([0, 0, 90])
  139. slot_angle_connector();
  140. translate([slot, slot + slot_off, outer_height - slot - slot_off - slot])
  141. rotate([0, 90, 90])
  142. slot_angle_connector();
  143. translate([0, outer_length - slot - slot_off, slot + slot_off])
  144. rotate([0, 0, -90])
  145. slot_angle_connector();
  146. translate([0, outer_length - slot - slot_off, outer_height - slot - slot_off - slot])
  147. rotate([0, 90, -90])
  148. slot_angle_connector();
  149. translate([outer_width, slot + slot_off, slot + slot_off])
  150. rotate([0, 0, 90])
  151. slot_angle_connector();
  152. translate([outer_width, slot + slot_off, outer_height - slot - slot_off - slot])
  153. rotate([0, 90, 90])
  154. slot_angle_connector();
  155. translate([outer_width - slot, outer_length - slot - slot_off, slot + slot_off])
  156. rotate([0, 0, -90])
  157. slot_angle_connector();
  158. translate([outer_width - slot, outer_length - slot - slot_off, outer_height - slot - slot_off - slot])
  159. rotate([0, 90, -90])
  160. slot_angle_connector();
  161. translate([slot + slot_off, slot + slot_off, slot])
  162. rotate([-90, 0, 0])
  163. slot_angle_connector();
  164. translate([outer_width - slot - slot_off, slot + slot_off, slot])
  165. rotate([-90, 0, 90])
  166. slot_angle_connector();
  167. translate([slot + slot_off, outer_length - slot - slot_off, 0])
  168. rotate([90, 0, 0])
  169. slot_angle_connector();
  170. translate([outer_width - slot - slot_off, outer_length - slot - slot_off, 0])
  171. rotate([90, 0, -90])
  172. slot_angle_connector();
  173. /*
  174. translate([slot + slot_off, slot + slot_off, outer_height])
  175. rotate([-90, 0, 0])
  176. slot_angle_connector();
  177. translate([outer_width - slot - slot_off, slot + slot_off, outer_height])
  178. rotate([-90, 0, 90])
  179. slot_angle_connector();
  180. translate([slot + slot_off, outer_length - slot - slot_off, outer_height - slot])
  181. rotate([90, 0, 0])
  182. slot_angle_connector();
  183. translate([outer_width - slot - slot_off, outer_length - slot - slot_off, outer_height - slot])
  184. rotate([90, 0, -90])
  185. slot_angle_connector();
  186. */
  187. }
  188. // #######################################################
  189. // ###################### Mechanics ######################
  190. // #######################################################
  191. rail_mount_dist = 10;
  192. module y_rails() {
  193. // y smooth rail on blue side
  194. color("cyan")
  195. translate([rail_dia / 2 + rail_y_off_1, 18, -30])
  196. rotate([-90, 0, 0])
  197. cylinder(d = rail_dia, h = outer_length - (2 * slot) - nema17_size - rail_mount_dist);
  198. // rail mounts for blue side
  199. color("green")
  200. translate([0, 2 * rail_mount_dist, -2 * slot])
  201. rail_mount(slot);
  202. color("green")
  203. translate([0, outer_length - (2 * slot) - nema17_size - rail_mount_dist + 5, -2 * slot])
  204. rail_mount(slot);
  205. // y smooth rail on red side
  206. color("cyan")
  207. translate([outer_width - (2 * slot) - rail_dia / 2 - rail_y_off_1, 18, -30])
  208. rotate([-90, 0, 0])
  209. cylinder(d = rail_dia, h = outer_length - (2 * slot) - nema17_size - rail_mount_dist);
  210. }
  211. x_rail_dist = 50;
  212. module x_rails() {
  213. translate([30, 200, 15])
  214. rotate([0, 90, 0])
  215. cylinder(d = rail_dia, h = outer_length - (4 * slot));
  216. translate([30, 200 + x_rail_dist, 15])
  217. rotate([0, 90, 0])
  218. cylinder(d = rail_dia, h = outer_length - (4 * slot));
  219. }
  220. module motion_xy() {
  221. translate([slot, slot, outer_height])
  222. y_rails();
  223. //color("cyan")
  224. //translate([slot, slot, outer_height - (1.5 * slot)])
  225. // x_rails();
  226. // left ("blue") motor
  227. translate([slot, outer_length - slot - nema17_size - nema17_mount_wall, outer_height + nema17_mount_wall])
  228. rotate([180, 0, 90]) {
  229. color("blue")
  230. translate([0, 0, -65])
  231. nema17(65);
  232. color("green")
  233. nema17_mount(slot);
  234. // blue motor pulley
  235. color("magenta")
  236. translate([nema17_size / 2, nema17_size / 2, 22.4])
  237. rotate([180, 0, 0])
  238. gt2_pulley();
  239. // blue gt2 belt at motor
  240. color("blue")
  241. translate([nema17_size / 2, nema17_size / 2 + 6.5, nema17_mount_wall + 1])
  242. rotate([0, 0, 180])
  243. gt2_belt(200);
  244. color("blue")
  245. translate([-outer_length + (3 * slot) + 10 + nema17_size / 2, nema17_size / 2 - 6.5, nema17_mount_wall + 1])
  246. gt2_belt(outer_length - (3 * slot) - 10);
  247. }
  248. // right ("red") motor
  249. translate([outer_width - slot - nema17_size, outer_length - slot - nema17_size - nema17_mount_wall, outer_height + nema17_mount_wall])
  250. rotate([180, 0, 90]) {
  251. color("red")
  252. translate([0, 0, -65])
  253. nema17(65);
  254. color("green")
  255. nema17_mount(slot);
  256. // red motor pulley
  257. color("cyan")
  258. translate([nema17_size / 2, nema17_size / 2, 8.2])
  259. gt2_pulley();
  260. // red gt2 belt at motor
  261. color("red")
  262. translate([nema17_size / 2, nema17_size / 2 + 6.5, nema17_mount_wall + 8])
  263. rotate([0, 0, 180])
  264. gt2_belt(outer_length - (3 * slot) - 10);
  265. color("red")
  266. translate([-200 + nema17_size / 2, nema17_size / 2 - 6.5, nema17_mount_wall + 8])
  267. gt2_belt(200);
  268. }
  269. // long back belts
  270. color("blue")
  271. translate([slot + 15, slot + 10, outer_height - 7])
  272. gt2_belt(outer_width - nema17_size - (2 * slot) + 13);
  273. color("red")
  274. translate([slot + 15, slot + 10, outer_height - 14])
  275. gt2_belt(outer_width - nema17_size - (2 * slot) + 13);
  276. // blue belt on red side
  277. color("blue")
  278. translate([outer_width - slot - 15, slot + 10, outer_height - 7])
  279. rotate([0, 0, 90])
  280. gt2_belt(200);
  281. // red belt on blue side
  282. color("red")
  283. translate([slot + 15, slot + 209, outer_height - 14])
  284. rotate([0, 0, -90])
  285. gt2_belt(200);
  286. // idler on blue side
  287. translate([slot + bearing_mount_width + 15, 0, outer_height - slot])
  288. rotate([0, 0, 90])
  289. slot_mount_bracket(slot, true);
  290. // idler on red side
  291. translate([outer_width - slot - 15, 0, outer_height - slot])
  292. rotate([0, 0, 90])
  293. slot_mount_bracket(slot, true);
  294. }
  295. // #######################################################
  296. // ####################### Heatbed #######################
  297. // #######################################################
  298. module heatbed() {
  299. color("yellow")
  300. translate([slot + frame_off_x, slot + frame_off_y, bed_draw_height])
  301. cube([heatbed_width, heatbed_length, heatbed_height]);
  302. }
  303. // ########################################################
  304. // ####################### Assembly #######################
  305. // ########################################################
  306. frame();
  307. motion_xy();
  308. heatbed();