pulleys.scad 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  1. //PULLEY LIBRARY v.01
  2. /*pulley values*/
  3. function columnName(ID) =
  4. ID == "width" ? 0:
  5. ID == "height" ? 1:
  6. ID == "angle" ? 2:
  7. -1;
  8. /*pulley table:
  9. width, height, angle*/
  10. function tableRow(ID) =
  11. ID == "2L" ? [1/4, 1/8, 40] :
  12. ID == "3L" ? [3/8, 7/32, 40] :
  13. ID == "4L" ? [1/2, 5/16, 40] :
  14. ID == "5L" ? [21/32, 3/8, 40]:
  15. ID == "A" ? [1/2, 5/16, 40]:
  16. ID == "B" ? [21/32, 13/32, 40]:
  17. ID == "C" ? [7/8, 17/32, 40]:
  18. ID == "D" ? [1+1/4, 3/4, 40]:
  19. ID == "E" ? [1+1/2, 20/32, 40]:
  20. ID == "3V" ? [3/8, 5/16, 30]:
  21. ID == "5V" ? [5/8, 17/32, 30]:
  22. ID == "8V" ? [1, 29/32, 30]:
  23. -1;
  24. function tableEntry (rowName, fieldName) = tableRow(rowName)[columnName(fieldName)];
  25. module pulley(type="4L", definedD, arborD, key=.125, res=60, padding=true, screw=false){
  26. if (tableRow(type) == -1)
  27. echo(str("pulley ERROR: type of '",type,"' is undefined."));
  28. //Pulley dimensions
  29. beltB=tableEntry (type, "width");
  30. beltH=tableEntry (type, "height");
  31. beltangle=tableEntry (type, "angle");
  32. //Pulley diameters
  33. innerD=definedD -(2*beltH);
  34. //belt calculations
  35. theta=(180-beltangle)/2;
  36. x=beltH/(tan(theta)); //also height of pulley wall and padding
  37. beltb=beltB-(2*x);
  38. scale([25.4,25.4,25.4])
  39. difference(){
  40. union(){
  41. translate ([0,0,x/2+beltb/2]) cylinder(h=x, d1=innerD,d2=definedD, $fn=res, center=true);
  42. cylinder(h=beltb, d=innerD, $fn=res, center=true);
  43. mirror ([0,0,1]) translate ([0,0,(x/2+beltb/2)]) cylinder(h=x, d1=innerD,d2=definedD, $fn=res, center=true);
  44. if (padding == true) {
  45. translate ([0,0,3*x/2+beltb/2]) cylinder(h=x,d=definedD, $fn=res, center=true);
  46. translate ([0,0,-(3*x/2+beltb/2)]) cylinder(h=x,d=definedD, $fn=res, center=true);
  47. }
  48. }
  49. cylinder(h=100,d=arborD,$fn=res,center=true);
  50. translate ([0,key,0]) cube([key,arborD,100], center=true);
  51. if (screw==true){
  52. translate([0,definedD/4,0]) rotate([90,0,0]) cylinder(h=definedD/2, d=.8*beltb,$fn=res,center=true);
  53. echo(str("set screw hole size = ", .8*beltb));
  54. }
  55. }
  56. echo ("pulley default values:");
  57. echo (str("pulley " ,type, " | pulley dia " , definedD, " | arbor dia " ,arborD, " | keyhole ",key, " | $fn=",res, " | padding=",padding, " | setscrew ", screw));
  58. echo ("2L, 3L, 4L, 5L, A, B, C, D, E, 3V, 5V, 8V pulley belts available");
  59. }
  60. module custompulley(beltB, beltH, beltangle, definedD, arborD, key=.125, res=60, padding=true, screw=false){
  61. //beltB = belt width
  62. //beltH = belt height
  63. //beltangle = manufacturer supplied angle
  64. //Pulley diameters
  65. innerD=definedD -(2*beltH);
  66. //belt calculations
  67. theta=(180-beltangle)/2;
  68. x=beltH/(tan(theta)); //also height of pulley wall
  69. beltb=beltB-(2*x);
  70. scale([25.4,25.4,25.4])
  71. difference(){
  72. union(){
  73. translate ([0,0,x/2+beltb/2]) cylinder(h=x, d1=innerD,d2=definedD, $fn=res, center=true);
  74. cylinder(h=beltb, d=innerD, $fn=res, center=true);
  75. mirror ([0,0,1]) translate ([0,0,(x/2+beltb/2)]) cylinder(h=x, d1=innerD,d2=definedD, $fn=res, center=true);
  76. if (padding == true) {
  77. translate ([0,0,3*x/2+beltb/2]) cylinder(h=x,d=definedD, $fn=res, center=true);
  78. translate ([0,0,-(3*x/2+beltb/2)]) cylinder(h=x,d=definedD, $fn=res, center=true);
  79. }
  80. }
  81. cylinder(h=100,d=arborD,$fn=res,center=true);
  82. translate ([0,key,0]) cube([key,arborD,100], center=true);
  83. if (screw==true){
  84. translate([0,definedD/4,0]) rotate([90,0,0]) cylinder(h=definedD/2, d=.8*beltb,$fn=res,center=true);
  85. echo(str("set screw hole size = ", .8*beltb));
  86. }
  87. }
  88. echo ("custom pulley values:");
  89. echo (str("belt width " ,beltB, " | belt height " ,beltH, " | belt angle " ,beltangle, " | pulley dia " ,definedD, " | arbor dia " ,arborD, " | keyhole ",key, " | $fn=",res, " | padding=",padding, " | setscrew ", screw));
  90. }
  91. module step2 (type="",dia1,dia2,arborD,key=.125,res=60,padding=true){
  92. beltB=tableEntry (type, "width");
  93. beltH=tableEntry (type, "height");
  94. beltangle=tableEntry (type, "angle");
  95. //belt calculations
  96. theta=(180-beltangle)/2;
  97. x=beltH/(tan(theta)); //also height of pulley wall
  98. beltb=beltB-(2*x);
  99. translate([0,0,1*(beltB+2*x)*25.4]) pulley(type,dia2,arborD,key,res,padding,screw=true);
  100. pulley(type,dia1,arborD,key,res,padding);
  101. if (padding!=true){
  102. translate([0,0,1*(beltB)*25.4]) pulley(type,dia2,arborD,key,res,padding,screw=true);
  103. pulley(type,dia1,arborD,key,res,padding);
  104. }
  105. }
  106. module step3 (type="",dia1,dia2,dia3,arborD,key=.125,res=60,padding=true){
  107. beltB=tableEntry (type, "width");
  108. beltH=tableEntry (type, "height");
  109. beltangle=tableEntry (type, "angle");
  110. //belt calculations
  111. theta=(180-beltangle)/2;
  112. x=beltH/(tan(theta)); //also height of pulley wall
  113. beltb=beltB-(2*x);
  114. translate([0,0,2*(beltB+2*x)*25.4]) pulley(type,dia3,arborD,key,res,padding);
  115. translate([0,0,1*(beltB+2*x)*25.4]) pulley(type,dia2,arborD,key,res,padding,screw=true);
  116. pulley(type,dia1,arborD,key,res,padding);
  117. if (padding!=true){
  118. translate([0,0,2*(beltB)*25.4]) pulley(type,dia3,arborD,key,res,padding);
  119. translate([0,0,1*(beltB)*25.4]) pulley(type,dia2,arborD,key,res,padding,screw=true);
  120. pulley(type,dia1,arborD,key,res,padding);
  121. }
  122. }
  123. module step4 (type="",dia1,dia2,dia3,dia4,arborD,key=.125,res=60,padding=true){
  124. beltB=tableEntry (type, "width");
  125. beltH=tableEntry (type, "height");
  126. beltangle=tableEntry (type, "angle");
  127. //belt calculations
  128. theta=(180-beltangle)/2;
  129. x=beltH/(tan(theta)); //also height of pulley wall
  130. beltb=beltB-(2*x);
  131. translate([0,0,3*(beltB+2*x)*25.4]) pulley(type,dia4,arborD,key,res,padding);
  132. translate([0,0,2*(beltB+2*x)*25.4]) pulley(type,dia3,arborD,key,res,padding);
  133. translate([0,0,1*(beltB+2*x)*25.4]) pulley(type,dia2,arborD,key,res,padding,screw=true);
  134. pulley(type,dia1,arborD,key,res,padding);
  135. if (padding!=true){
  136. translate([0,0,3*(beltB)*25.4]) pulley(type,dia4,arborD,key,res,padding);
  137. translate([0,0,2*(beltB)*25.4]) pulley(type,dia3,arborD,key,res,padding);
  138. translate([0,0,1*(beltB)*25.4]) pulley(type,dia2,arborD,key,res,padding,screw=true);
  139. pulley(type,dia1,arborD,key,res,padding);
  140. }
  141. }
  142. module step5 (type="",dia1,dia2,dia3,dia4,dia5,arborD,key=.125,res=60,padding=true){
  143. beltB=tableEntry (type, "width");
  144. beltH=tableEntry (type, "height");
  145. beltangle=tableEntry (type, "angle");
  146. //belt calculations
  147. theta=(180-beltangle)/2;
  148. x=beltH/(tan(theta)); //also height of pulley wall
  149. beltb=beltB-(2*x);
  150. translate([0,0,4*(beltB+2*x)*25.4]) pulley(type,dia5,arborD,key,res,padding);
  151. translate([0,0,3*(beltB+2*x)*25.4]) pulley(type,dia4,arborD,key,res,padding);
  152. translate([0,0,2*(beltB+2*x)*25.4]) pulley(type,dia3,arborD,key,res,padding);
  153. translate([0,0,1*(beltB+2*x)*25.4]) pulley(type,dia2,arborD,key,res,padding,screw=true);
  154. pulley(type,dia1,arborD,key,res,padding);
  155. if (padding!=true){
  156. translate([0,0,4*(beltB)*25.4]) pulley(type,dia5,arborD,key,res,padding);
  157. translate([0,0,3*(beltB)*25.4]) pulley(type,dia4,arborD,key,res,padding);
  158. translate([0,0,2*(beltB)*25.4]) pulley(type,dia3,arborD,key,res,padding);
  159. translate([0,0,1*(beltB)*25.4]) pulley(type,dia2,arborD,key,res,padding,screw=true);
  160. pulley(type,dia1,arborD,key,res,padding);
  161. }
  162. }
  163. module step6 (type="",dia1,dia2,dia3,dia4,dia5,dia6,arborD,key=.125,res=60,padding=true){
  164. beltB=tableEntry (type, "width");
  165. beltH=tableEntry (type, "height");
  166. beltangle=tableEntry (type, "angle");
  167. //belt calculations
  168. theta=(180-beltangle)/2;
  169. x=beltH/(tan(theta)); //also height of pulley wall
  170. beltb=beltB-(2*x);
  171. translate([0,0,5*(beltB+2*x)*25.4]) pulley(type,dia6,arborD,key,res,padding);
  172. translate([0,0,4*(beltB+2*x)*25.4]) pulley(type,dia5,arborD,key,res,padding);
  173. translate([0,0,3*(beltB+2*x)*25.4]) pulley(type,dia4,arborD,key,res,padding);
  174. translate([0,0,2*(beltB+2*x)*25.4]) pulley(type,dia3,arborD,key,res,padding);
  175. translate([0,0,1*(beltB+2*x)*25.4]) pulley(type,dia2,arborD,key,res,padding,screw=true);
  176. pulley(type,dia1,arborD,key,res,padding);
  177. if (padding!=true){
  178. translate([0,0,5*(beltB)*25.4]) pulley(type,dia6,arborD,key,res,padding);
  179. translate([0,0,4*(beltB)*25.4]) pulley(type,dia5,arborD,key,res,padding);
  180. translate([0,0,3*(beltB)*25.4]) pulley(type,dia4,arborD,key,res,padding);
  181. translate([0,0,2*(beltB)*25.4]) pulley(type,dia3,arborD,key,res,padding);
  182. translate([0,0,1*(beltB)*25.4]) pulley(type,dia2,arborD,key,res,padding,screw=true);
  183. pulley(type,dia1,arborD,key,res,padding);
  184. }
  185. }
  186. module customstep2 (beltB, beltH, beltangle, dia1,dia2, arborD, key=.125, res=60, padding=true){
  187. //beltB = belt width
  188. //beltH = belt height
  189. //beltangle = manufacturer supplied angle
  190. //belt calculations
  191. theta=(180-beltangle)/2;
  192. x=beltH/(tan(theta)); //also height of pulley wall
  193. beltb=beltB-(2*x);
  194. translate([0,0,1*(beltB+2*x)*25.4]) custompulley(beltB, beltH, beltangle,dia2,arborD,key,res,padding,screw=true);
  195. custompulley(beltB, beltH, beltangle,dia1,arborD,key,res,padding);
  196. if (padding!=true){
  197. translate([0,0,1*(beltB)*25.4]) custompulley(beltB, beltH, beltangle,dia2,arborD,key,res,padding,screw=true);
  198. custompulley(beltB, beltH, beltangle,dia1,arborD,key,res,padding);
  199. }
  200. }
  201. module customstep3 (beltB, beltH, beltangle, dia1,dia2,dia3, arborD, key=.125, res=60, padding=true){
  202. //beltB = belt width
  203. //beltH = belt height
  204. //beltangle = manufacturer supplied angle
  205. //belt calculations
  206. theta=(180-beltangle)/2;
  207. x=beltH/(tan(theta)); //also height of pulley wall
  208. beltb=beltB-(2*x);
  209. translate([0,0,2*(beltB+2*x)*25.4]) custompulley(beltB, beltH, beltangle,dia3,arborD,key,res,padding);
  210. translate([0,0,1*(beltB+2*x)*25.4]) custompulley(beltB, beltH, beltangle,dia2,arborD,key,res,padding,screw=true);
  211. custompulley(beltB, beltH, beltangle,dia1,arborD,key,res,padding);
  212. if (padding!=true){
  213. translate([0,0,2*(beltB)*25.4]) custompulley(beltB, beltH, beltangle,dia3,arborD,key,res,padding);
  214. translate([0,0,1*(beltB)*25.4]) custompulley(beltB, beltH, beltangle,dia2,arborD,key,res,padding,screw=true);
  215. custompulley(beltB, beltH, beltangle,dia1,arborD,key,res,padding);
  216. }
  217. }
  218. module customstep4 (beltB, beltH, beltangle, dia1,dia2,dia3,dia4, arborD, key=.125, res=60, padding=true){
  219. //beltB = belt width
  220. //beltH = belt height
  221. //beltangle = manufacturer supplied angle
  222. //belt calculations
  223. theta=(180-beltangle)/2;
  224. x=beltH/(tan(theta)); //also height of pulley wall
  225. beltb=beltB-(2*x);
  226. translate([0,0,3*(beltB+2*x)*25.4]) custompulley(beltB, beltH, beltangle,dia4,arborD,key,res,padding);
  227. translate([0,0,2*(beltB+2*x)*25.4]) custompulley(beltB, beltH, beltangle,dia3,arborD,key,res,padding);
  228. translate([0,0,1*(beltB+2*x)*25.4]) custompulley(beltB, beltH, beltangle,dia2,arborD,key,res,padding,screw=true);
  229. custompulley(beltB, beltH, beltangle,dia1,arborD,key,res,padding);
  230. if (padding!=true){
  231. translate([0,0,3*(beltB)*25.4]) custompulley(beltB, beltH, beltangle,dia4,arborD,key,res,padding);
  232. translate([0,0,2*(beltB)*25.4]) custompulley(beltB, beltH, beltangle,dia3,arborD,key,res,padding);
  233. translate([0,0,1*(beltB)*25.4]) custompulley(beltB, beltH, beltangle,dia2,arborD,key,res,padding,screw=true);
  234. custompulley(beltB, beltH, beltangle,dia1,arborD,key,res,padding);
  235. }
  236. }
  237. module customstep5 (beltB, beltH, beltangle, dia1,dia2,dia3,dia4,dia5, arborD, key=.125, res=60, padding=true){
  238. //beltB = belt width
  239. //beltH = belt height
  240. //beltangle = manufacturer supplied angle
  241. //belt calculations
  242. theta=(180-beltangle)/2;
  243. x=beltH/(tan(theta)); //also height of pulley wall
  244. beltb=beltB-(2*x);
  245. translate([0,0,4*(beltB+2*x)*25.4]) custompulley(beltB, beltH, beltangle,dia5,arborD,key,res,padding);
  246. translate([0,0,3*(beltB+2*x)*25.4]) custompulley(beltB, beltH, beltangle,dia4,arborD,key,res,padding);
  247. translate([0,0,2*(beltB+2*x)*25.4]) custompulley(beltB, beltH, beltangle,dia3,arborD,key,res,padding);
  248. translate([0,0,1*(beltB+2*x)*25.4]) custompulley(beltB, beltH, beltangle,dia2,arborD,key,res,padding,screw=true);
  249. custompulley(beltB, beltH, beltangle,dia1,arborD,key,res,padding);
  250. if (padding!=true){
  251. translate([0,0,4*(beltB)*25.4]) custompulley(beltB, beltH, beltangle,dia5,arborD,key,res,padding);
  252. translate([0,0,3*(beltB)*25.4]) custompulley(beltB, beltH, beltangle,dia4,arborD,key,res,padding);
  253. translate([0,0,2*(beltB)*25.4]) custompulley(beltB, beltH, beltangle,dia3,arborD,key,res,padding);
  254. translate([0,0,1*(beltB)*25.4]) custompulley(beltB, beltH, beltangle,dia2,arborD,key,res,padding,screw=true);
  255. custompulley(beltB, beltH, beltangle,dia1,arborD,key,res,padding);
  256. }
  257. }
  258. module customstep6 (beltB, beltH, beltangle, dia1,dia2,dia3,dia4,dia5,dia6, arborD, key=.125, res=60, padding=true){
  259. //beltB = belt width
  260. //beltH = belt height
  261. //beltangle = manufacturer supplied angle
  262. //belt calculations
  263. theta=(180-beltangle)/2;
  264. x=beltH/(tan(theta)); //also height of pulley wall
  265. beltb=beltB-(2*x);
  266. translate([0,0,5*(beltB+2*x)*25.4]) custompulley(beltB, beltH, beltangle,dia6,arborD,key,res,padding);
  267. translate([0,0,4*(beltB+2*x)*25.4]) custompulley(beltB, beltH, beltangle,dia5,arborD,key,res,padding);
  268. translate([0,0,3*(beltB+2*x)*25.4]) custompulley(beltB, beltH, beltangle,dia4,arborD,key,res,padding);
  269. translate([0,0,2*(beltB+2*x)*25.4]) custompulley(beltB, beltH, beltangle,dia3,arborD,key,res,padding);
  270. translate([0,0,1*(beltB+2*x)*25.4]) custompulley(beltB, beltH, beltangle,dia2,arborD,key,res,padding,screw=true);
  271. custompulley(beltB, beltH, beltangle,dia1,arborD,key,res,padding);
  272. if (padding!=true){
  273. translate([0,0,5*(beltB)*25.4]) custompulley(beltB, beltH, beltangle,dia6,arborD,key,res,padding);
  274. translate([0,0,4*(beltB)*25.4]) custompulley(beltB, beltH, beltangle,dia5,arborD,key,res,padding);
  275. translate([0,0,3*(beltB)*25.4]) custompulley(beltB, beltH, beltangle,dia4,arborD,key,res,padding);
  276. translate([0,0,2*(beltB)*25.4]) custompulley(beltB, beltH, beltangle,dia3,arborD,key,res,padding);
  277. translate([0,0,1*(beltB)*25.4]) custompulley(beltB, beltH, beltangle,dia2,arborD,key,res,padding,screw=true);
  278. custompulley(beltB, beltH, beltangle,dia1,arborD,key,res,padding);
  279. }
  280. }
  281. module pulleyhelp(){
  282. echo ("OpenSCAD Pulley Library v.01 - designed by Machineree");
  283. echo ("Single and Step Pulleys using manufacturer values of belt sizes include:");
  284. echo ("2L, 3L, 4L, 5L, A, B, C, D, E, 3V, 5V, 8V");
  285. echo("");
  286. echo ("Custom modules can be entered in Belt Width, Belt Height, and Belt Angle for complete optimization");
  287. echo("");
  288. echo("Default Pulley Values/Variables:");
  289. echo ("pulley(type=4L, definedD, arborD, key=.125, res=60, padding=true, screw=false)");
  290. echo("custompulley(beltB, beltH, beltangle, definedD, arborD, key=.125, res=60, padding=true, screw=false)");
  291. echo("stepn(type=4L,dia1,dia2,...,dian,arborD,key=.125,res=60,padding=true)");
  292. echo("customstepn(beltB,BeltH,beltangle,dia1,dia2,...,dian,arborD,key=.125,res=60,padding=true)");
  293. echo("Step Pulleys have set screw located on 2nd pulley always");
  294. echo("All pulley dimensions are in inches");
  295. echo("");
  296. echo("Check for updates & more details on machineree.com, GitHub, and Thingiverse!");
  297. }