2 // The Estes A8-3 and C6-7 motors have diameter of 17.7 mm,
3 // length 69.5 mm. The Estes Alpha launch pad has rod diameter 3.4 mm.
5 motor_diam = 17.7 + 0.5; // add some tolerance
6 motor_len = 69.5 + 0.5;
11 thin_wall = 0.9; // depends on the print width
12 thick_wall = 2.2*thin_wall;
14 clip_spring_angle = 45;
15 clip_spring_depth = 20;
18 rubber_beam_height = 3;
23 //----------------- MOTOR MODULE -----------------------------
26 assign(h1 = 2*motor_len/3, // near end height
27 h2 = 20, // far end height
28 h_off = motor_len, // height offset of the far height
29 w = 30, // distance of the far height
31 translate([0, -fin_w/2, -h1])
33 cube([eps, fin_w, h1]); // near end
34 translate([w, 0, h_off]) // far end
35 cube([eps, fin_w, h2]);
39 // alternative fin layout
41 assign(h1 = motor_len/2, // near end height
42 w2 = 23, // bottom/far end width
43 h_off = 60, // height offset of the far height
44 w = 30, // distance of the far height
46 translate([0, -fin_w/2, -h1])
48 cube([eps, fin_w, h1]); // near end
49 translate([w-w2, 0, h_off]) // far end
50 cube([w2, fin_w, eps]);
55 rod_hole_side = 1.5*(rod_diam + thin_wall);
57 module motor_module_solid()
59 // the lowest part is for joining the segments
60 cylinder(r = motor_diam/2 + thin_wall, h = segment_overlap + eps);
62 // conical joint between the two cylinders
63 translate([0, 0, segment_overlap - thick_wall + thin_wall])
64 cylinder(r1 = motor_diam/2 + thin_wall,
65 r2 = motor_diam/2 + thick_wall,
66 h = thick_wall - thin_wall + eps);
68 // protrusions to hold the main tube in place
69 for (a = [60, 180, 300]) {
71 translate([motor_diam/2 + thick_wall - thin_wall/2 - thick_wall, 0, 0])
72 cylinder(r1 = thick_wall-thin_wall/2, r2 = thick_wall, h = segment_overlap/3 + eps);
73 translate([motor_diam/2 + thick_wall - thin_wall/2 - thick_wall, 0, segment_overlap/3])
74 cylinder(r = thick_wall, h = 2*segment_overlap/3 + eps);
78 // the thick cylinder above it
79 translate([0, 0, segment_overlap])
80 cylinder(r = motor_diam/2 + thick_wall,
81 h = motor_len + motor_wall - segment_overlap);
84 translate([0, 0, motor_len + motor_wall])
86 translate([motor_diam/2+6, infty/2, 4])
88 cylinder(r = 8, h = infty);
89 cylinder(r = motor_diam/2 + thick_wall, h = infty);
90 rotate([0, 0, -clip_spring_angle/2+eps])
92 rotate([0, 0, clip_spring_angle/2-eps])
94 cube([infty, infty, 8]);
98 for (a = [60, 180, 300]) {
100 translate([motor_diam/2 + thick_wall-thin_wall, 0, motor_wall + motor_len])
107 translate([motor_diam/2 + thick_wall - rod_diam/2 - thin_wall,
110 cylinder(r = rod_diam/2 + thin_wall, h = eps);
111 translate([motor_diam/2 + thick_wall + rod_diam/2, 0, segment_overlap + rod_hole_side])
113 cylinder(r = rod_diam/2 + thin_wall, h = rod_hole_height);
114 translate([motor_diam/2 + thick_wall - rod_diam/2 - thin_wall,
115 0, segment_overlap + 2*rod_hole_side + rod_hole_height])
117 cylinder(r = rod_diam/2 + thin_wall, h = eps);
122 module motor_module() {
124 motor_module_solid();
126 // top ring to hold the motor inside
127 translate([0, 0, -eps])
128 cylinder(r = motor_diam/2 - motor_wall,
129 h = motor_wall + 2*eps);
132 translate([0, 0, motor_wall - eps])
133 cylinder(r = motor_diam/2, h = motor_len + 2*eps);
135 // three rails inside the motor hole
136 translate([0, 0, segment_overlap + thick_wall]) difference() {
138 cylinder(r = motor_diam/2 + thin_wall,
139 h = motor_len - segment_overlap - 2*thick_wall + eps);
140 translate([0, 0, motor_len - segment_overlap - 2*thick_wall])
141 cylinder(r1 = motor_diam/2 + thin_wall, r2 = motor_diam/2, h = thick_wall + eps);
143 for (a = [0, 120, 240]) rotate([0, 0, a])
144 translate([motor_diam/2 + 2.5, 0, -eps])
145 cylinder(r = 3, h = infty);
149 for (r = [-clip_spring_angle/2, clip_spring_angle/2]) {
151 translate([-thin_wall/2, 0, motor_len + motor_wall - clip_spring_depth])
152 cube([infty, thin_wall, infty]);
154 translate([0, 0, motor_len - eps])
156 cylinder(r = motor_diam/2,
157 h = thick_wall + 2*eps);
158 rotate([0, 0, -clip_spring_angle/2+eps])
160 rotate([0, 0, clip_spring_angle/2-eps])
162 cube([infty, infty, 8]);
167 translate([motor_diam/2 + thick_wall + eps + rod_diam/2, 0, 0])
168 cylinder(r = rod_diam/2, h = infty);
172 // -------------------- CENTRAL TUBE ---------------------
176 module central_tube_solid() {
177 cylinder(r = motor_diam/2 + thick_wall, h = central_tube_h);
180 module central_tube() {
182 central_tube_solid();
183 translate([0, 0, -eps])
184 cylinder(r = motor_diam/2 + thick_wall - thin_wall,
187 // rubber band holder
189 cylinder(r = motor_diam/2 + thick_wall - eps, h = central_tube_h);
190 translate([motor_diam/2-thin_wall, -infty/2,
191 segment_overlap + thick_wall])
192 cube([thin_wall, infty, rubber_beam_height]);
196 //------------------------- FRONT CONE -----------------------
198 cone_resolution = 40;
201 function bez_i4(t, ctls) =
202 (pow(1-t, 3) * ctls[0])
203 + (3 * t * pow(1-t, 2) * ctls[1])
204 + (3 * pow(t, 2) * (1-t) * ctls[2])
205 + (pow(t, 3) * ctls[3]);
207 module bezier_cone(cps, res)
210 translate([0, 0, (bez_i4(t/res, cps))[0]])
211 cylinder(r1 = (bez_i4(t/res, cps))[1],
212 r2 = (bez_i4((t + 1)/res, cps))[1],
213 h = (bez_i4((t + 1)/res, cps))[0]
214 - (bez_i4(t/res, cps))[0] + eps);
217 module front_cone_body() {
218 translate([0, 0, segment_overlap])
220 [ 0, motor_diam/2 + thick_wall ], // start
221 [ cone_h/2, motor_diam/2 + thick_wall ], // cp 1
222 [ cone_h - motor_diam/2 - thick_wall, motor_diam/2 + thick_wall ], // cp 2
226 translate([0, 0, segment_overlap-thick_wall+thin_wall])
227 cylinder(r1 = motor_diam/2+thin_wall,
228 r2 = motor_diam/2 + thick_wall,
229 h = thick_wall - thin_wall + eps);
231 cylinder(r = motor_diam/2+thin_wall, h = segment_overlap + eps);
234 module front_cone() {
238 translate([0, 0, segment_overlap])
240 [ 0.7*thin_wall, motor_diam/2 + thick_wall - thin_wall ], // start
241 [ cone_h/2-0.7*thin_wall, motor_diam/2 + thick_wall - thin_wall], // cp 1
242 [ cone_h - motor_diam/2 - thick_wall + thin_wall - 1.4*thin_wall, motor_diam/2 + thick_wall - thin_wall ], // cp 2
243 [ cone_h - 1.4*thin_wall, 0 ],
245 cylinder(r = motor_diam/2 + thick_wall + eps,
246 h = cone_h + segment_overlap - cone_solid_h);
249 translate([0, 0, segment_overlap-thick_wall+1.7*thin_wall])
250 cylinder(r1 = motor_diam/2,
251 r2 = motor_diam/2 + thick_wall-thin_wall,
252 h = thick_wall-thin_wall + eps);
254 translate([0, 0, -eps])
255 cylinder(r = motor_diam/2, h = segment_overlap + 2*eps);
257 // rubber band holder
259 cylinder(r = motor_diam/2 + thin_wall/2, h = segment_overlap);
260 translate([motor_diam/3-thin_wall/2, -infty/2,
261 segment_overlap/2 - rubber_beam_height/2])
262 cube([thin_wall, infty, rubber_beam_height]);
266 module thread_holder() {
268 translate([0, 0, -1.5]) difference() {
269 cylinder(r = 10, h = 3);
270 translate([0, 0, -eps])
271 cylinder(r = 8, h = 3 + 2*eps);
285 translate([0, 0, -eps]) cube(infty);
292 translate([motor_diam + thick_wall, 0, 0])
296 translate([motor_diam + thick_wall, 0, 0])
300 translate([motor_diam + thick_wall, 0, 0])