Bayonet_Lock.scad 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. // Copyright by Alexandre da Silva Xavier
  2. // simple bayonet cylindrical locking mechanism
  3. // ver 1.3 - 05/03/2019 (d/m/y)
  4. // ===========================================
  5. //What to render
  6. part_to_render = "lock"; //pin or lock
  7. // What style of lock to produce, with the pin pointed inward ou outward?
  8. pin_inward = true;
  9. //Render the mechanism with 2 or 4 locks?
  10. four_locks = true;
  11. //Variables
  12. inner_radius = 12;
  13. outer_radius = 18;
  14. //watch the difference between the numbers above, or your model will have holes in it. always remember that the pin size is a function of the diference between inner and outer diameters, as well as a function os the gap, defined below
  15. conn_height = 15;
  16. lip_height = 2;
  17. lock_angle = 36;
  18. gap = 0.4; //only change this if you are confident on the precision of your printer
  19. detail = 48; //48 works better with Freecad
  20. //Don't mess with it
  21. item_height = conn_height + lip_height;
  22. mid_in_radius = (inner_radius + outer_radius)/2 - gap/2;
  23. mid_out_radius = mid_in_radius + gap;
  24. pin_radius = (outer_radius - inner_radius)/4;
  25. shaft_radius = pin_radius + gap/2;
  26. pin_depth = conn_height/2;
  27. $fn = detail;
  28. pi = 3.14159265359;
  29. //Create item
  30. difference(){ //base cylinder
  31. //external cylinder
  32. cylinder(lip_height, outer_radius, outer_radius);
  33. //internal cylinder
  34. translate([0,0, -item_height / 100]) {
  35. cylinder(item_height * 1.02, inner_radius, inner_radius);
  36. }
  37. }
  38. if (part_to_render == "lock"){ //render_lock_part)
  39. if (pin_inward) { //locking turned outside
  40. difference(){
  41. //external cylinder
  42. cylinder(item_height, mid_in_radius, mid_in_radius);
  43. //internal cylinder
  44. translate([0,0, -item_height / 100]) {
  45. cylinder(item_height * 1.02, inner_radius, inner_radius);
  46. }
  47. //vertical shaft 1
  48. translate([mid_in_radius, 0, item_height - pin_depth]){
  49. cylinder(item_height, shaft_radius, shaft_radius);
  50. }
  51. //vertical shaft 2
  52. translate([mid_in_radius*-1, 0, item_height - pin_depth]){
  53. cylinder(item_height, shaft_radius, shaft_radius);
  54. }
  55. //locks
  56. difference(){
  57. translate([0, 0, item_height - pin_depth]){
  58. rotate_extrude(convexity = 10){
  59. translate([mid_in_radius+gap, 0, 0]){
  60. circle(r = shaft_radius);
  61. }
  62. }
  63. }
  64. translate([0,0,item_height - pin_depth - shaft_radius]) {
  65. //4 locks start
  66. if(four_locks){
  67. translate([0,0,shaft_radius*2+gap/2]){
  68. rotate([0,90,-lock_angle]){prism(2*shaft_radius+gap,mid_in_radius, tan((90-lock_angle))*(mid_in_radius));}
  69. rotate([0,90,180-lock_angle]){prism(2*shaft_radius+gap, mid_in_radius, tan((90-lock_angle))*(mid_in_radius));}
  70. rotate([0,90,270-lock_angle]){prism(2*shaft_radius+gap, mid_in_radius, tan((90-lock_angle))*(mid_in_radius));}
  71. rotate([0,90,90-lock_angle]){prism(2*shaft_radius+gap, mid_in_radius, tan((90-lock_angle))*(mid_in_radius));}
  72. }
  73. }else{
  74. //4 locks end
  75. rotate(atan2(0, mid_in_radius)){
  76. cube([mid_in_radius, mid_in_radius, 2 * shaft_radius]);
  77. }
  78. rotate(180-lock_angle - 2 * atan2(mid_in_radius, mid_in_radius)){
  79. cube([mid_in_radius, mid_in_radius, 2 * shaft_radius]);
  80. }
  81. rotate(180 + atan2(0, mid_in_radius)){
  82. cube([mid_in_radius, mid_in_radius, 2 * shaft_radius]);
  83. }
  84. rotate(360 - lock_angle - 2* atan2(mid_in_radius, mid_in_radius)){
  85. cube([mid_in_radius, mid_in_radius, 2 * shaft_radius]);
  86. }
  87. }
  88. }
  89. }
  90. translate([mid_in_radius,0,item_height - pin_depth]){
  91. sphere(shaft_radius);
  92. }
  93. translate([mid_in_radius*-1,0,item_height - pin_depth]){
  94. sphere(shaft_radius);
  95. }
  96. translate([cos(lock_angle)*(mid_in_radius), -sin(lock_angle)*(mid_in_radius), item_height - pin_depth]){
  97. sphere(shaft_radius);
  98. }
  99. translate([-cos(lock_angle)*(mid_in_radius), sin(lock_angle)*(mid_in_radius), item_height - pin_depth]){
  100. sphere(shaft_radius);
  101. }
  102. //4 locks start
  103. //vertical shaft 3
  104. if(four_locks){
  105. translate([0,mid_in_radius, item_height - pin_depth]){
  106. cylinder(item_height, shaft_radius, shaft_radius);
  107. }
  108. //vertical shaft 4
  109. translate([0,mid_in_radius*-1, item_height - pin_depth]){
  110. cylinder(item_height, shaft_radius, shaft_radius);
  111. }
  112. translate([0,mid_in_radius,item_height - pin_depth]){
  113. sphere(shaft_radius);
  114. }
  115. translate([0,mid_in_radius*-1,item_height - pin_depth]){
  116. sphere(shaft_radius);
  117. }
  118. translate([cos(lock_angle+90)*(mid_in_radius), -sin(lock_angle+90)*(mid_in_radius), item_height - pin_depth]){
  119. sphere(shaft_radius);
  120. }
  121. translate([-cos(lock_angle+90)*(mid_in_radius), sin(lock_angle+90)*(mid_in_radius), item_height - pin_depth]){
  122. sphere(shaft_radius);
  123. }
  124. }
  125. //4 locks end
  126. }
  127. translate([cos(lock_angle - atan2((shaft_radius+gap),mid_in_radius))*(mid_in_radius-pin_radius), -sin(lock_angle - atan2((shaft_radius+gap),mid_in_radius))*(mid_in_radius-pin_radius),item_height - pin_depth-shaft_radius]){cylinder(2*shaft_radius, gap, gap);}
  128. translate([-cos(lock_angle - atan2((shaft_radius+gap),mid_in_radius))*(mid_in_radius-pin_radius), sin(lock_angle - atan2((shaft_radius+gap),mid_in_radius))*(mid_in_radius-pin_radius),item_height - pin_depth-shaft_radius]){cylinder(2*shaft_radius, gap, gap);}
  129. //_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-
  130. } else { //pin outward - locking pointed in
  131. //_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-
  132. difference(){
  133. //external cylinder
  134. cylinder(item_height, outer_radius, outer_radius);
  135. //internal cylinder
  136. translate([0,0, -item_height / 100]) {
  137. cylinder(item_height * 1.02, mid_out_radius, mid_out_radius);
  138. }
  139. //vertical shaft 1
  140. translate([mid_out_radius, 0, item_height - pin_depth]){
  141. cylinder(item_height, shaft_radius, shaft_radius);
  142. }
  143. //vertical shaft 2
  144. translate([mid_out_radius*-1, 0, item_height - pin_depth]){
  145. cylinder(item_height, shaft_radius, shaft_radius);
  146. }
  147. //locks
  148. difference(){
  149. translate([0, 0, item_height - pin_depth]){
  150. rotate_extrude(convexity = 10){
  151. translate([mid_out_radius-gap, 0, 0]){
  152. circle(r = shaft_radius);
  153. }
  154. }
  155. }
  156. //4 locks start
  157. if(four_locks){
  158. translate([0,0,item_height - pin_depth + shaft_radius]){
  159. rotate([0,90,-lock_angle]){prism(2*shaft_radius+gap,outer_radius, tan((90-lock_angle))*(mid_out_radius));}
  160. rotate([0,90,180-lock_angle]){prism(2*shaft_radius+gap, outer_radius, tan((90-lock_angle))*(mid_out_radius));}
  161. rotate([0,90,270-lock_angle]){prism(2*shaft_radius+gap, outer_radius, tan((90-lock_angle))*(mid_out_radius));}
  162. rotate([0,90,90-lock_angle]){prism(2*shaft_radius+gap, outer_radius, tan((90-lock_angle))*(mid_out_radius));}
  163. }
  164. }else{
  165. //4 locks end
  166. translate([0,0,item_height - pin_depth - shaft_radius]) {
  167. rotate(atan2(0, mid_out_radius)){
  168. cube([outer_radius, outer_radius, 2 * shaft_radius]);
  169. }
  170. rotate(180-lock_angle - 2 * atan2(mid_out_radius, mid_out_radius)){
  171. cube([outer_radius, outer_radius, 2 * shaft_radius]);
  172. }
  173. rotate(180 + atan2(0, mid_out_radius)){
  174. cube([outer_radius, outer_radius, 2 * shaft_radius]);
  175. }
  176. rotate(360 - lock_angle - 2* atan2(mid_out_radius, mid_out_radius)){
  177. cube([outer_radius, outer_radius, 2 * shaft_radius]);
  178. }
  179. }
  180. }
  181. }
  182. translate([mid_out_radius,0,item_height - pin_depth]){
  183. sphere(shaft_radius);
  184. }
  185. translate([mid_out_radius*-1,0,item_height - pin_depth]){
  186. sphere(shaft_radius);
  187. }
  188. translate([cos(lock_angle)*(mid_out_radius), -sin(lock_angle)*(mid_out_radius), item_height - pin_depth]){
  189. sphere(shaft_radius);
  190. }
  191. translate([-cos(lock_angle)*(mid_out_radius), sin(lock_angle)*(mid_out_radius), item_height - pin_depth]){
  192. sphere(shaft_radius);
  193. }
  194. //4 locks start
  195. //vertical shaft 3
  196. if(four_locks){
  197. translate([0,mid_out_radius, item_height - pin_depth]){
  198. cylinder(item_height, shaft_radius, shaft_radius);
  199. }
  200. //vertical shaft 4
  201. translate([0,mid_out_radius*-1, item_height - pin_depth]){
  202. cylinder(item_height, shaft_radius, shaft_radius);
  203. }
  204. translate([0,mid_out_radius,item_height - pin_depth]){
  205. sphere(shaft_radius);
  206. }
  207. translate([0,mid_out_radius*-1,item_height - pin_depth]){
  208. sphere(shaft_radius);
  209. }
  210. translate([cos(lock_angle+90)*(mid_out_radius), -sin(lock_angle+90)*(mid_out_radius), item_height - pin_depth]){
  211. sphere(shaft_radius);
  212. }
  213. translate([-cos(lock_angle+90)*(mid_out_radius), sin(lock_angle+90)*(mid_out_radius), item_height - pin_depth]){
  214. sphere(shaft_radius);
  215. }
  216. }
  217. //4 locks end
  218. }
  219. translate([cos(lock_angle - atan2((shaft_radius+gap),mid_in_radius))*(mid_out_radius+pin_radius), -sin(lock_angle - atan2((shaft_radius+gap),mid_in_radius))*(mid_out_radius+pin_radius),item_height - pin_depth-shaft_radius]){cylinder(2*shaft_radius, gap, gap);}
  220. translate([-cos(lock_angle - atan2((shaft_radius+gap),mid_in_radius))*(mid_out_radius+pin_radius), sin(lock_angle - atan2((shaft_radius+gap),mid_in_radius))*(mid_out_radius+pin_radius),item_height - pin_depth-shaft_radius]){cylinder(2*shaft_radius, gap, gap);}
  221. }
  222. }
  223. // other part
  224. if (part_to_render == "pin"){ //render_pin_part){
  225. if (pin_inward) { //pin inside
  226. difference(){
  227. //external cylinder
  228. cylinder(item_height, outer_radius, outer_radius);
  229. //internal cylinder
  230. translate([0,0, -item_height / 100]) {
  231. cylinder(item_height + (item_height / 50), mid_out_radius, mid_out_radius);
  232. }
  233. }
  234. //pin 1
  235. translate([mid_out_radius,0,item_height - pin_depth]){
  236. sphere (pin_radius);
  237. }
  238. //pin 2
  239. translate([-mid_out_radius,0,item_height - pin_depth]){
  240. sphere (pin_radius);
  241. }
  242. //4 locks start
  243. if(four_locks){
  244. //pin 3
  245. translate([0,mid_out_radius,item_height - pin_depth]){
  246. sphere (pin_radius);
  247. }
  248. //pin 4
  249. translate([0,-mid_out_radius,item_height - pin_depth]){
  250. sphere (pin_radius);
  251. }
  252. }
  253. // 4 locks end
  254. } else { //pin pointed out
  255. difference(){
  256. //external cylinder
  257. cylinder(item_height, mid_in_radius, mid_in_radius);
  258. //internal cylinder
  259. translate([0,0, -item_height / 100]) {
  260. cylinder(item_height + (item_height / 50), inner_radius, inner_radius);
  261. }
  262. }
  263. //pin 1
  264. translate([mid_in_radius,0,item_height - pin_depth]){
  265. sphere (pin_radius);
  266. }
  267. //pin 2
  268. translate([-mid_in_radius,0,item_height - pin_depth]){
  269. sphere (pin_radius);
  270. }
  271. //4 locks start
  272. if(four_locks){
  273. //pin 3
  274. translate([0,mid_in_radius,item_height - pin_depth]){
  275. sphere (pin_radius);
  276. }
  277. //pin 4
  278. translate([0,-mid_in_radius,item_height - pin_depth]){
  279. sphere (pin_radius);
  280. }
  281. }
  282. // 4 locks end
  283. }
  284. }
  285. module prism(l, w, h){
  286. polyhedron(
  287. points=[[0,0,0], [l,0,0], [l,w,0], [0,w,0], [0,w,h], [l,w,h]],
  288. faces=[[0,1,2,3],[5,4,3,2],[0,4,5,1],[0,3,4],[5,2,1]]
  289. );
  290. }