chiark / gitweb /
topeak-mtx-tortec-expeditionrack-adapter: wip
[reprap-play.git] / topeak-mtx-tortec-expeditionrack-adapter.scad
1 // -*- C -*-
2
3 // brk_*: "bracket", the Topeak MTX bracket
4 // rack_*: the Tortec rack
5 // adapt_*: the adapter, ie this file
6
7 include <utils.scad>
8
9 // strength factor, set to 1 for real prints
10 //$strf = 0.25;
11 $strf = 1;
12
13 brk_recess_actual = 5.20;
14
15 rack_rail_dia = 10.40 + 0.50;
16 rack_width_inner = 115.86 + 1.0; // between insides of rails
17
18 rear_elevation_nominal = 10.04;
19 // ^ top of rack to bottom of bracket, at rear bolt hold
20 rear_to_front_distance = 230;
21 rear_to_cross_rail = 19.65; // bolt centre to rail centre, rail to rear
22
23 general_gap_y = 1.0;
24
25 strap_w = 8.0 + 1.0;
26 strap_th = 2.5;
27 strap_barrel_dia = 14;
28 strap_guide_sz = 1;
29
30 brk_block_xw = 68.5;
31 brk_block_z = 14.55 - 0.75;
32
33 brk_bolt_dia = 4.0 + 0.5;
34 brk_nearbolt_recess_dia = 8.86 + 1.5;
35 brk_nearbolt_recess_depth = 1.09 + 0.25;
36
37 brk_bolt_eff_len = 11.78 - 1.0; // inside of recess, to end of bolt
38 brk_bolt_len_slop = 2.0;;
39 brk_bolt_nut_th = 3.89;
40 brk_bolt_nut_across_flats = 7.86 + 0.50;
41
42 brk_overall_w = 90.07;
43
44 fit_slope_len = 5;
45
46 foreaftmaint_r_slop = 0.75;
47
48 main_sz_y = $strf * 20;
49 grasp_sz = $strf * 6;
50 beside_strap_sz = $strf * 8;
51
52 $fa=10;
53 $fs=1;
54
55 // calculated
56
57 main_sz_z = beside_strap_sz*2 + strap_w;
58 main_sz_x_fam = main_sz_y;
59
60 brk_bottom_y = -brk_recess_actual;
61 adapt_main_top_y = brk_bottom_y + general_gap_y;
62
63 // on LHS, so -ve
64 rack_rail_x = -(rack_width_inner/2 + rack_rail_dia/2);
65 rack_rail_outer_x = -(rack_width_inner/2 + rack_rail_dia);
66
67 grasp_large_r = (rack_rail_dia + grasp_sz)/2;
68 grasp_large_x = rack_rail_outer_x + grasp_large_r;
69
70 block_x = grasp_large_x + grasp_large_r;
71 block_y_min = adapt_main_top_y - main_sz_y;
72
73 strap_barrel_x = rack_width_inner/2 + strap_barrel_dia/2;
74
75 rack_shear_ratio = rear_elevation_nominal / rear_to_front_distance;
76
77 brk_bolt_nut_top_y = -brk_nearbolt_recess_depth
78   - brk_bolt_eff_len + brk_bolt_nut_th + brk_bolt_len_slop;
79                        
80 brk_bolt_nut_r = brk_bolt_nut_across_flats/2 / cos(360/12);
81
82 module GraspElevation(){
83   hull(){
84     translate([ grasp_large_x, adapt_main_top_y - grasp_large_r ])
85       circle(grasp_large_r);
86
87     translate([ grasp_large_x, $rack_rail_y - rack_rail_dia/2 ])
88       circle(grasp_large_r);
89
90     translate([ grasp_large_x + grasp_large_r/2,
91                 $rack_rail_y - rack_rail_dia/2 ])
92       circle(grasp_large_r);
93
94     translate([ grasp_large_x, $rack_rail_y + rack_rail_dia/2 ])
95       circle(grasp_large_r);
96
97     translate([ grasp_large_x + grasp_large_r/2, $rack_rail_y + rack_rail_dia/2 ])
98       circle(grasp_large_r);
99   }
100 }
101
102 module BlockElevation(){
103   hull(){
104     rectfromto([ +block_x, adapt_main_top_y ],
105                [ -block_x, block_y_min ]);
106     rectfromto([ -grasp_large_x, adapt_main_top_y ],
107                [ +grasp_large_x, adapt_main_top_y - 0.1 ]);
108   }
109 }
110
111 module MainExtrude(){
112   linextr(0, main_sz_z)
113     children();
114 }
115 module RackShear(){
116   s = rack_shear_ratio;
117   multmatrix([ [ 1, 0,  0, 0 ],
118                [ 0, 1, s , 0 ],
119                [ 0, 0,  1, 0 ],
120                [ 0, 0,  0, 1 ] ])
121     children();
122 }
123
124 module GraspFixingElevation(){
125   intersection(){
126     union(){
127       mirror([1,0]) GraspElevation();
128       translate([ strap_barrel_x, $strap_barrel_y ])
129         circle(strap_barrel_dia/2 + strap_guide_sz);
130     }
131     union(){
132       rectfromto([0, $rack_rail_y],
133                  [rack_width_inner, 50]);
134       intersection(){
135         translate([ rack_rail_x, $rack_rail_y ])
136           circle(r = rack_width_inner/2 - rack_rail_x);
137         polygon([ [ 0, 0 ],
138                   [ rack_width_inner/2, 0 ],
139                   $rail_fixing_fit_corner,
140                   $rail_fixing_fit_corner + [-1,-1] * fit_slope_len,
141                   [ -grasp_large_x - grasp_large_r*2, block_y_min ],
142                   [ 0, block_y_min ]]);
143       }
144     }
145   }
146 }
147
148 module StrapBarrelElevation(){
149   translate([ strap_barrel_x, $strap_barrel_y ])
150     circle(strap_barrel_dia/2);
151 }
152
153 // Bracket support block, goes up inside bracket
154 // Z origin is bolt hole
155 module BrkBlock(){
156   linextr( -brk_block_z/2,
157            +brk_block_z/2 ) {
158     rectfromto([ -brk_block_xw/2, adapt_main_top_y - 0.1 ],
159                [ +brk_block_xw/2, 0 ]);
160   }
161 }
162
163 // Z origin is bolt hole
164 module BoltHole(){
165   linextr_y_xz( -100, 10 )
166     circle(brk_bolt_dia/2);
167
168   linextr_y_xz( -brk_nearbolt_recess_depth, 10)
169     circle(brk_nearbolt_recess_dia/2);
170
171   linextr_y_xz( -100, brk_bolt_nut_top_y ) {
172     circle( r= brk_bolt_nut_r, $fn = 6 );
173     translate([ 0, brk_bolt_nut_across_flats/2 ])
174       circle( r=brk_bolt_nut_r/2, $fn = 4);
175   }
176 }
177
178 module AsForeAftMaint(){
179   if ($foreaftmaint_dz) {
180     children();
181   }
182 }
183
184 module Principal(){
185   // calculated
186   $rack_rail_y = brk_bottom_y - $elevation_nominal
187     - general_gap_y  - rack_rail_dia/2;
188
189   $strap_barrel_y = $rack_rail_y + rack_rail_dia/2 + strap_barrel_dia/2;
190
191   $rail_fixing_fit_corner = [
192     rack_width_inner/2,
193     $rack_rail_y - rack_rail_dia/2
194   ];
195
196   $foreaftmaint_rail_z = brk_block_z/2 + $foreaftmaint_dz;
197   $foreaftmaint_rail_y = $rack_rail_y
198     + $foreaftmaint_rail_z * rack_shear_ratio;
199
200   difference(){
201     union(){
202       MainExtrude(){
203         GraspElevation();
204       }
205       RackShear() MainExtrude(){
206         StrapBarrelElevation();
207       }
208       translate([ 0,0, brk_block_z/2]) {
209         BrkBlock();
210       }
211
212       difference(){
213         union(){
214           MainExtrude(){
215             BlockElevation();
216           }
217           RackShear() MainExtrude(){
218             GraspFixingElevation();
219           }
220         }
221
222         translate([0,0, main_sz_z/2]) linextr(-strap_w/2, +strap_w/2) {
223           translate([ rack_width_inner/2 - strap_th, 0 ])
224             rectfromto([ 0, -50 ], [ 50, 50 ]);
225         }
226       }
227
228       AsForeAftMaint(){
229         linextr_x_yz(-main_sz_x_fam/2,
230                      +main_sz_x_fam/2){
231           rotate(-90)
232           difference(){
233             hull(){
234               for (y = [
235                         $foreaftmaint_rail_y - rack_rail_dia/2 + grasp_large_r,
236                         adapt_main_top_y - grasp_large_r
237                         ])
238                 for (dx= [-1,+1] * rack_rail_dia/2)
239                   translate([ -$foreaftmaint_rail_z + dx, y ])
240                     circle(r= grasp_large_r);
241             }
242             translate([0, adapt_main_top_y])
243                rectfromto([-500, 0], [500, 500]);
244           }
245         }
246       }
247     }
248
249     RackShear() linextr(-10, main_sz_z+10) {
250       for (mx=[0,1]) {
251         mirror([mx,0]) {
252           translate([ rack_rail_x, $rack_rail_y ]){
253             hull(){
254               for (dx = [-rack_rail_dia, 0])
255                 translate([dx, 0])
256                   circle(r= rack_rail_dia/2);
257             }
258           }
259         }
260       }
261     }
262
263     // Distance from bolt hole, in backwards direction
264     AsForeAftMaint(){
265       translate([ 0, $foreaftmaint_rail_y, $foreaftmaint_rail_z ])
266         linextr_x_yz(+rack_rail_x,
267                      -rack_rail_x) {
268         hull(){
269           for (dy=[0,50]) {
270             translate([-dy,0])
271               circle(r= rack_rail_dia/2 + foreaftmaint_r_slop);
272           }
273         }
274       }
275     }
276
277     translate([ 0,0, brk_block_z/2]) BoltHole();
278   }
279 }
280
281 module Front(){ ////toplevel
282   // xxx elevation is wrong
283   Principal($elevation_nominal=0, $foreaftmaint_dz=0);
284 }
285
286 module Rear(){ ////toplevel
287   Principal($elevation_nominal=rear_elevation_nominal,
288             $foreaftmaint_dz= rear_to_cross_rail);
289 }
290
291 module Demo(){ ////toplevel
292   rotate([90, 0, 0]){
293
294     Front();
295
296     color("blue")
297       translate([ 0, -2, -4 ])
298       square(center=true, [ brk_overall_w, 1 ]);
299
300   }
301 }