motor_diam = 17.7 + 0.5; // add some tolerance
motor_len = 69.5 + 0.5;
-motor_wall = 2;
segment_overlap = 15;
+loose_fit_diam_diff = 0.5; // cylinder with outer diameter d1
+ // will fit loosely into the hole with inner diameter
+ // d1 + loose_fit_diam_diff
+tight_fit_diam_diff = 0.25; // cylinder with outer diameter d1
+ // will fit tightly into the hole with inner diameter
+ // d1 + tight_fit_diam_diff
+
thin_wall = 0.9; // depends on the print width
-thick_wall = 2.2*thin_wall;
+thick_wall = 2*thin_wall + loose_fit_diam_diff/2;
+ // motor_diam + 2*thick_wall is the outer diameter of the rocket
+motor_wall = thick_wall; // above the motor
-clip_spring_angle = 45;
-clip_spring_depth = 20;
+clip_height = 3.5;
+clip_clearance = segment_overlap/4;
+clip_inner_space = motor_diam/2 - 1.5;
rod_diam = 3.4 + 1;
rubber_beam_height = 3;
+fin_thickness = 1;
+
eps = 0.01;
infty = 1000;
h2 = 20, // far end height
h_off = motor_len, // height offset of the far height
w = 30, // distance of the far height
- fin_w = thin_wall)
+ fin_w = fin_thickness)
translate([0, -fin_w/2, -h1])
hull() {
cube([eps, fin_w, h1]); // near end
w2 = 23, // bottom/far end width
h_off = 60, // height offset of the far height
w = 30, // distance of the far height
- fin_w = thin_wall)
+ fin_w = fin_thickness)
translate([0, -fin_w/2, -h1])
hull() {
cube([eps, fin_w, h1]); // near end
};
};
-rod_hole_height = 15;
+rod_hole_height = 20;
rod_hole_side = 1.5*(rod_diam + thin_wall);
module motor_module_solid()
{
- // the lowest part is for joining the segments
- cylinder(r = motor_diam/2 + thin_wall, h = segment_overlap + eps);
+ // cone from loose_fit to tight fit, 1/3 of segment overlap
+ cylinder(r1 = motor_diam/2 + thin_wall,
+ r2 = motor_diam/2 + thick_wall - thin_wall - tight_fit_diam_diff/2,
+ h = segment_overlap/3 + eps);
+
+ // tight fit cylinder, 2/3 of segment overlap
+ translate([0, 0, segment_overlap/3])
+ cylinder(r = motor_diam/2 + thick_wall - thin_wall - tight_fit_diam_diff/2,
+ h = 2*segment_overlap/3 + eps);
// conical joint between the two cylinders
translate([0, 0, segment_overlap - thick_wall + thin_wall])
- cylinder(r1 = motor_diam/2 + thin_wall,
+ cylinder(r1 = motor_diam/2 + thick_wall - thin_wall - tight_fit_diam_diff/2,
r2 = motor_diam/2 + thick_wall,
h = thick_wall - thin_wall + eps);
- // protrusions to hold the main tube in place
- for (a = [60, 180, 300]) {
- rotate([0, 0, a]) {
- translate([motor_diam/2 + thick_wall - thin_wall/2 - thick_wall, 0, 0])
- cylinder(r1 = thick_wall-thin_wall/2, r2 = thick_wall, h = segment_overlap/3 + eps);
- translate([motor_diam/2 + thick_wall - thin_wall/2 - thick_wall, 0, segment_overlap/3])
- cylinder(r = thick_wall, h = 2*segment_overlap/3 + eps);
- };
- };
-
// the thick cylinder above it
translate([0, 0, segment_overlap])
cylinder(r = motor_diam/2 + thick_wall,
h = motor_len + motor_wall - segment_overlap);
- // clip spring
- translate([0, 0, motor_len + motor_wall])
- intersection() {
- translate([motor_diam/2+6, infty/2, 4])
- rotate([90, 0, 0])
- cylinder(r = 8, h = infty);
- cylinder(r = motor_diam/2 + thick_wall, h = infty);
- rotate([0, 0, -clip_spring_angle/2+eps])
- cube(infty);
- rotate([0, 0, clip_spring_angle/2-eps])
- scale([1, -1, 1])
- cube([infty, infty, 8]);
- };
-
// fins
for (a = [60, 180, 300]) {
rotate([0, 0, a])
0, segment_overlap])
scale([1, 1.4, 1])
cylinder(r = rod_diam/2 + thin_wall, h = eps);
- translate([motor_diam/2 + thick_wall + rod_diam/2, 0, segment_overlap + rod_hole_side])
+ translate([motor_diam/2 + thick_wall + thin_wall + rod_diam/2, 0, segment_overlap + rod_hole_side])
scale([1, 1.1, 1])
cylinder(r = rod_diam/2 + thin_wall, h = rod_hole_height);
translate([motor_diam/2 + thick_wall - rod_diam/2 - thin_wall,
cylinder(r = rod_diam/2 + thin_wall, h = eps);
};
+ // motor clip
+ rotate([0, 0, 120]) intersection() {
+ translate([clip_inner_space, -infty/2,
+ motor_len + motor_wall + clip_clearance])
+ cube([thin_wall, infty, clip_height]);
+ rotate([0, 0, -60])
+ translate([-infty/2, 0, 0]) cube(infty);
+ rotate([0, 0, -120])
+ translate([-infty/2, 0, 0]) cube(infty);
+ };
};
module motor_module() {
cylinder(r = 3, h = infty);
};
- // clip spring
- for (r = [-clip_spring_angle/2, clip_spring_angle/2]) {
- rotate([0, 0, r])
- translate([-thin_wall/2, 0, motor_len + motor_wall - clip_spring_depth])
- cube([infty, thin_wall, infty]);
- };
- translate([0, 0, motor_len - eps])
- intersection() {
- cylinder(r = motor_diam/2,
- h = thick_wall + 2*eps);
- rotate([0, 0, -clip_spring_angle/2+eps])
- cube(infty);
- rotate([0, 0, clip_spring_angle/2-eps])
- scale([1, -1, 1])
- cube([infty, infty, 8]);
- };
-
-
// rod hole
- translate([motor_diam/2 + thick_wall + eps + rod_diam/2, 0, 0])
+ translate([motor_diam/2 + thick_wall + thin_wall + eps + rod_diam/2, 0, 0])
cylinder(r = rod_diam/2, h = infty);
};
};
central_tube_h = 85;
+central_clip_r = 12;
+central_clip_w = 4;
+central_clip_clearance = 1.5;
+
module central_tube_solid() {
cylinder(r = motor_diam/2 + thick_wall, h = central_tube_h);
};
// rubber band holder
intersection() {
cylinder(r = motor_diam/2 + thick_wall - eps, h = central_tube_h);
+/*
translate([motor_diam/2 - thick_wall, -infty/2,
segment_overlap + thick_wall])
cube([thin_wall, infty, rubber_beam_height]);
+*/
+ translate([-central_clip_w/2,
+ central_clip_r + motor_diam/2 + thick_wall - 2*thin_wall - central_clip_clearance,
+ central_tube_h/3]) rotate([0, 90, 0]) difference() {
+ cylinder(r = central_clip_r, h = central_clip_w);
+ translate([0, 0, -eps])
+ cylinder(r = central_clip_r - thin_wall, h = central_clip_w + 2*eps);
+ }
};
};
intersection() {
cylinder(r = motor_diam/2 + thin_wall/2, h = segment_overlap);
translate([motor_diam/3-thin_wall/2, -infty/2,
- segment_overlap/2 - rubber_beam_height/2])
+ segment_overlap - rubber_beam_height/2 - eps])
cube([thin_wall, infty, rubber_beam_height]);
};
};