chiark / gitweb /
lock-inframe-bracket: wip new divide
[reprap-play.git] / lock-inframe-bracket.scad
1 // -*- C -*-
2
3 // use shell thickness 1.50
4 // use fill density 40%
5
6 include <funcs.scad>
7
8 tube_dia = 27.5 + 1.625;
9 lock_w = 42.5 + 0.5;
10 lock_d = 28.0 + 0.5;
11 main_h = 45.0;
12 backflange_d = 12;
13 backflange_hole_dy = -1;
14 lockshaft_dia = 14.35;
15
16 cliprecess_h = 16;
17 total_h = 45;
18
19 back_gap = 12.5;
20 main_th = 3.50;
21 tube_th = 4.00;
22
23 midweb_d = 3;
24 clip_th = 3.5;
25 clip_gap = 2.5;
26 clip_d = 22.0;
27
28 mountscrew_dia = 4 + 0.5;
29 clipbolt_dia = 5 + 0.6;
30
31 mountscrew_washer = 10;
32
33 backflange_th = 4.5;
34
35 $fn=50;
36
37 join_cr = 9;
38
39 tube_rear_extra_th = 1;
40
41 divide_shaft_w = 1.75;
42 divide_shaft_l = 1.5;
43 divide_head_dx = 1.75;
44 divide_head_th = 1.5;
45 divide_gap = 0.50;
46 divide_heads = 2;
47
48 divide_angle = 26;
49 divide_fudge_r = 4.75;
50 divide_around = 3.5;
51
52 backflange_angle = 20;
53
54 // calculated
55
56 lockshaft_r = [1, 1] * lockshaft_dia / 2;
57 front_th = main_th;
58
59 tube_or = tube_dia/2 + tube_th;
60 back_ohw = back_gap/2 + backflange_th;
61 backflange_ymin = tube_dia/2 + backflange_d;
62
63 lock_0y = tube_dia/2 + lock_d/2 + midweb_d;
64 lock_0x = lock_w/2 - lock_d/2;
65 lock_0 = [lock_0x,lock_0y];
66
67 lock_or = [lock_w, lock_d]/2 + [front_th,front_th];
68
69 module oval(sz){ // sz[0] > sz[1]
70   xr = sz[0];
71   yr = sz[1];
72   hull(){
73     for (sx=[-1,+1]) {
74       translate([sx * (xr-yr), 0])
75         circle(r=yr);
76     }
77   }
78 }
79
80 module JoinCircs(jr){
81   // http://mathworld.wolfram.com/Circle-CircleIntersection.html
82   R = tube_or + join_cr;
83   r = lock_or[1] + join_cr;
84   d = dist2d( [0,0], lock_0 );
85   x = (d*d - r*r + R*R) / (2*d);
86   y = sqrt( R*R - x*x );
87
88   echo(lock_0x, lock_0y, R,r, d, x,y);
89
90   for (m=[0,1]) {
91     mirror([m,0]) {
92       rotate(atan2(lock_0y, lock_0x)) {
93         translate([x,-y])
94           circle(r= jr);
95       }
96     }
97   }
98 }
99
100 module DividePlan(xl=10){
101   w = divide_shaft_w;
102   g = divide_gap;
103   l = divide_shaft_l + g;
104   t = divide_head_th + g;
105   dx = divide_head_dx;
106   for (m=[0,1]) mirror([m,0]) {
107     translate([w, 0]) square([xl, g]);
108     for (i=[0:divide_heads-1]) {
109       translate([w, i*(l + t)]) {
110         translate([0, 0]) square([g, l + g]);
111         translate([0, l]) square([divide_head_dx + g, g]);
112         translate([dx, l]) square([g, t + g]);
113         translate([0, l + t])
114           square([divide_head_dx + g, g]);
115       }
116     }
117     translate([-0.1, (l + t) * divide_heads])
118       square([w + g, g]);
119   }
120 }
121
122 module DividePlanInPlace(xl=10){
123   rotate([0,0, -divide_angle])
124     translate([ -tube_dia/2 -tube_th/2 - divide_fudge_r, 0])
125     DividePlan(xl);
126 }
127
128 module DivideHook(){ ////toplevel
129   w = tube_th/2;
130   d = divide_gap;
131
132   translate([-1,0] * (w + d + w)){
133     for (sx=[-1,+1])
134       translate([-(w + w+d) * sx, 0]) circle(r= w);
135     difference(){
136       circle(r = 3*w + d);
137       circle(r =   w + d);
138       translate([-10*w, -10*w]) square([20*w, 10*w]);
139     }
140   }
141 }
142
143 module DivideCut(){
144   w = tube_th/2;
145   d = divide_gap;
146   br = tube_dia/2 + tube_th;
147
148   difference(){
149     offset(r=divide_gap) DivideHook();
150     DivideHook();
151     translate([-2*w,0]) mirror([0,1]) square([4*w, 4*w]);
152   }
153 }
154
155 module DivideCutB(){
156   w = tube_th/2;
157   d = divide_gap;
158   br = tube_dia/2 + tube_th;
159   
160   intersection(){
161     translate([br - tube_th/2,0]) {
162       difference(){
163         circle(r=br + d);
164         circle(r=br);
165       }
166     }
167     translate([-2*w, 0]) mirror([0,1]) square(4*w);
168   }
169 }
170
171 module DivideSurround(){
172   w = tube_th/2;
173   d = divide_gap;
174
175   offset(r= w*2) {
176     hull() {
177       DivideCut();
178       translate([-(4*w + 2*d), 8*w]) circle(r=w);
179     }
180   }
181 }
182
183 module DivideInPlace(){
184   rotate([0,0, -divide_angle])
185     translate([ -tube_dia/2 -tube_th/2, 0])
186     children();
187 }
188
189 module MainPlan(){ ////toplevel
190   difference(){
191     union(){
192       difference(){
193         union(){
194           hull(){
195             for (t=[0, tube_rear_extra_th])
196               translate([0, -t])
197                 circle(r = tube_or);
198           }
199           rotate([0,0, backflange_angle])
200             translate([-back_ohw,0]) mirror([0,1])
201             square([back_ohw*2, backflange_ymin]);
202
203           translate([0, lock_0y]){
204             oval(lock_or);
205           }
206
207           hull(){
208             JoinCircs(0.01);
209             polygon([[0,0], lock_0, [-lock_0[0], lock_0[1]]]);
210           }
211         }
212
213         rotate([0,0, backflange_angle])
214           translate([-back_gap/2,1]) mirror([0,1])
215           square([back_gap, backflange_ymin+2]);
216
217         JoinCircs(join_cr);
218       }
219
220       DivideInPlace() DivideSurround();
221     }
222     translate([0, lock_0y]){
223       oval([lock_w/2, lock_d/2]);
224     }
225
226     circle(r = tube_dia/2);
227
228     DivideInPlace() DivideCut();
229     DivideInPlace() DivideCutB();
230   }
231 }
232
233 lockshaft_or = lockshaft_r + [clip_th,clip_th];
234 cliprecess_ymax = cliprecess_h - lockshaft_r[1];
235 clip_ymin = cliprecess_ymax - total_h;
236 clip_ogap = clip_gap + clip_th*2;
237
238 module ClipElevationPositive(){
239   hull(){
240     oval(lockshaft_or);
241     translate([0, -lockshaft_or[1] * sqrt(2)])
242       square(center=true, 0.5);
243   }
244   translate([-lockshaft_or[0], 0])
245     square([lockshaft_or[0]*2, cliprecess_ymax]);
246   translate([-clip_ogap/2, 0]) mirror([0,1]) square([clip_ogap, -clip_ymin]);
247 }
248
249 module ClipElevationNegative(){
250   hull(){
251     for (y=[0, cliprecess_ymax+1])
252       translate([0, y])
253         oval(lockshaft_r);
254   }
255   translate([-clip_gap/2, 1]) mirror([0,1]) square([clip_gap, 2-clip_ymin]);
256 }
257
258 module ClipElevation(){
259   difference(){
260     ClipElevationPositive(1);
261     ClipElevationNegative(0);
262   }
263 }
264
265 module ExtrudeClipElevation(extra=0){
266   translate([0,
267              lock_0y + lock_d/2 + clip_d + extra,
268              -clip_ymin])
269     rotate([90,0,0])
270     linear_extrude(height= clip_d + extra*2, convexity=100)
271     children(0);
272 }
273
274 module ThroughHole(r, y, z, x=-50) {
275   translate([x, y, z])
276     rotate([0, 90, 0])
277     cylinder(r=r, h=100, $fn=20);
278 }
279
280 module MountingHoleCylinders(r, x=-50){
281   for (z=[ 1/4, 3/4 ]) {
282     rotate([0,0, backflange_angle])
283       ThroughHole( r,
284                    -tube_dia/2 -0.5*backflange_d + backflange_hole_dy,
285                    total_h * z,
286                    x);
287   }
288 }
289
290 module ThroughHoles(){
291   MountingHoleCylinders(mountscrew_dia/2);
292
293   ThroughHole( clipbolt_dia/2,
294                lock_0y + lock_d/2 + clip_d/2 + front_th/2,
295                total_h - cliprecess_h - clip_th - clip_d/2 );
296 }
297
298 module MainPositive(){
299   difference(){
300     union(){
301       linear_extrude(height=total_h, convexity=100) MainPlan();
302       ExtrudeClipElevation() ClipElevationPositive();
303     }
304     ExtrudeClipElevation(1) ClipElevationNegative();
305   }
306 }
307
308 module Bracket(){ ////toplevel
309   difference(){
310     MainPositive();
311     ThroughHoles();
312   }
313 }
314
315 module TestTopEdge(){ ////toplevel
316   intersection(){
317     translate([0,0, -total_h])
318       translate([0,0, 4])
319       Bracket();
320     translate([-200,-200,0])
321       cube([400,400,100]);
322   }
323 }
324
325 module TestClipBoltHole(){ ////toplevel
326   intersection(){
327     union(){
328       translate([0, 0, -5])
329         Bracket();
330       translate([-4, lock_0y + lock_d/2 + 1, 0])
331         cube([8, 4, 1.5]);
332     }
333     translate([-200, lock_0y + lock_d/2 + 0.1])
334       cube([400, 400, total_h-20]);
335   }
336 }
337
338 module Demo(){ ////toplevel
339   Bracket();
340   color("blue") MountingHoleCylinders(mountscrew_dia/2 - 0.1);
341   color("black") MountingHoleCylinders(mountscrew_washer/2,
342                                        back_ohw + 0.25);
343 }
344
345 module DividePlanDemo(){ ////toplevel
346   DividePlan();
347 }
348
349 module DivideDemo(){ ////toplevel
350   color("black") translate([0,0,-2]) MainPlan();
351   color("grey") DivideInPlace() DivideHook();
352   color("blue") translate([0,0,-4]) DivideInPlace() DivideCut();
353 }
354
355 //MainPlan();
356 //ClipElevationPositive();
357 //ClipElevation();
358 //MainPositive();
359 //%ThroughHoles();
360 //TestTopEdge();
361 //TestClipBoltHole();
362
363 //Bracket();
364