]> www.fi.muni.cz Git - things.git/blobdiff - rocket.scad
switch holder.scad
[things.git] / rocket.scad
index 12d0378c026489dca9ab3d28847b19b78103b294..23594977fbc513f9738af15b5e91d9a98ca1fc3b 100644 (file)
@@ -2,22 +2,55 @@
 // The Estes A8-3 and C6-7 motors have diameter of 17.7 mm,
 // length 69.5 mm. The Estes Alpha launch pad has rod diameter 3.4 mm.
 
-motor_diam = 17.7 + 0.5; // add some tolerance
+motor_diam = 17.7 + 1.2; // add some tolerance
 motor_len  = 69.5 + 0.5;
-motor_wall = 2;
 
 segment_overlap = 15;
 
+loose_fit_diam_diff = 1.1; // cylinder with outer diameter d1
+       // will fit loosely into the hole with inner diameter
+       // d1 + loose_fit_diam_diff
+tight_fit_diam_diff = 0.4; // cylinder with outer diameter d1
+       // will fit tightly into the hole with inner diameter
+       // d1 + tight_fit_diam_diff
+
 thin_wall = 1.0; // depends on the print width
-thick_wall = 2.5*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_height = 3.5;
+clip_width = 1.2;
+clip_clearance = 1.0;
+clip_inner_space = motor_diam/2 - 1.5;
 
-clip_spring_angle = 45;
-clip_spring_depth = 20;
+rod_diam = 3.4 + 1;
+rubber_beam_height = 3;
+rubber_beam_width = 1.5;
 
-rod_diam = 4;
+fin_thickness = 1.5;
 
 eps = 0.01;
-infty = 1000;
+infty = 250;
+
+// rod holder
+
+module rod_holder() {
+       // rod hole holder
+       hull() {
+               translate([motor_diam/2 + thick_wall + thin_wall + rod_diam/2, 0, 0])
+                       cylinder(r = rod_diam/2 + thin_wall, h = thick_wall);
+               translate([motor_diam/2 + thick_wall - thin_wall - rod_diam/2, 0, 0])
+                               
+                       cylinder(r = rod_diam/2 + thin_wall, h = 3*thick_wall);
+       }
+}
+
+module rod_hole() {
+       // rod hole
+       translate([motor_diam/2 + thick_wall + thin_wall + eps + rod_diam/2, 0, 0])
+               cylinder(r = rod_diam/2, h = infty);
+}
 
 //----------------- MOTOR MODULE -----------------------------
 
@@ -26,7 +59,7 @@ module fin() {
                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
@@ -38,10 +71,10 @@ module fin() {
 // alternative fin layout
 module fin2() {
        assign(h1 = motor_len/2, // near end height
-               w2 = 18,        // bottom/far end width
-               h_off = 50, // height offset of the far height
+               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
@@ -50,49 +83,32 @@ module fin2() {
        };
 };
 
-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 - thin_wall, 0, 0])
-                               cylinder(r1 = thick_wall-thin_wall/2, r2 = thick_wall, h = segment_overlap/3 + eps);
-                       translate([motor_diam/2 - thin_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])
@@ -101,21 +117,20 @@ module motor_module_solid()
                         fin2();
         };
 
-       // rod hole holder
-       hull() {
-               translate([motor_diam/2 + thick_wall - rod_diam/2 - thin_wall,
-                       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])
-                       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,
-                       0, segment_overlap + 2*rod_hole_side + rod_hole_height])
-                       scale([1, 1.4, 1])
-                       cylinder(r = rod_diam/2 + thin_wall, h = eps);
+       // motor clip
+       for (angle = [120, -120]) rotate([0, 0, angle]) intersection() {
+               translate([clip_inner_space, -infty/2,
+                       motor_len + motor_wall + clip_clearance])
+                       cube([clip_width, 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);
        };
 
+       translate([0, 0, motor_len + motor_wall])
+               scale([1, 1, -1])
+               rod_holder();
 };
        
 module motor_module() {
@@ -139,41 +154,27 @@ module motor_module() {
                                translate([0, 0, motor_len - segment_overlap - 2*thick_wall])
                                        cylinder(r1 = motor_diam/2 + thin_wall, r2 = motor_diam/2, h = thick_wall + eps);
                        };
-                       for (a = [60, 180, 300]) rotate([0, 0, a])
+                       for (a = [0, 120, 240]) rotate([0, 0, a])
                                translate([motor_diam/2 + 2.5, 0, -eps])
                                        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 + thin_wall,
-                               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])
-                       cylinder(r = rod_diam/2, h = infty);
+               rod_hole();
        };
 };
 
 // -------------------- CENTRAL TUBE ---------------------
 
-central_tube_h = 80;
+central_tube_h = 97;
+
+central_clip_r = 12;
+central_clip_w = 4;
+central_clip_wall = 1.5;
+central_clip_clearance = 2.5;
 
 module central_tube_solid() {
        cylinder(r = motor_diam/2 + thick_wall, h = central_tube_h);
+       rod_holder();
 };
 
 module central_tube() {
@@ -182,12 +183,14 @@ module central_tube() {
                translate([0, 0, -eps])
                        cylinder(r = motor_diam/2 + thick_wall - thin_wall,
                                h = infty);
+               rod_hole();
        };
 };
 
 //------------------------- FRONT CONE -----------------------
 cone_h = 45;
 cone_resolution = 40;
+cone_solid_h = 10;
 
 function bez_i4(t, ctls) =
        (pow(1-t, 3) * ctls[0])
@@ -209,7 +212,7 @@ module front_cone_body() {
        translate([0, 0, segment_overlap])
                bezier_cone([
                        [ 0, motor_diam/2 + thick_wall ], // start
-                       [ cone_h/2, motor_diam/2 + thick_wall ], // cp 1
+                       [ cone_h/4, motor_diam/2 + thick_wall ], // cp 1
                        [ cone_h - motor_diam/2 - thick_wall, motor_diam/2 + thick_wall ], // cp 2
                        [ cone_h, 0 ],
                ], 40);
@@ -225,13 +228,17 @@ module front_cone_body() {
 module front_cone() {
        difference() {
                front_cone_body();
-               translate([0, 0, segment_overlap])
-                       bezier_cone([
-                               [ 0.7*thin_wall, motor_diam/2 + thick_wall - thin_wall ], // start
-                       [ cone_h/2-0.7*thin_wall, motor_diam/2 + thick_wall - thin_wall], // cp 1
-                       [ cone_h - motor_diam/2 - thick_wall + thin_wall - 1.4*thin_wall, motor_diam/2 + thick_wall - thin_wall ], // cp 2
-                       [ cone_h - 1.4*thin_wall, 0 ],
-               ], 40);
+               intersection() {
+                       translate([0, 0, segment_overlap])
+                               bezier_cone([
+                                       [ 0.7*thin_wall, motor_diam/2 + thick_wall - thin_wall ], // start
+                               [ cone_h/4-0.7*thin_wall, motor_diam/2 + thick_wall - thin_wall], // cp 1
+                               [ cone_h - motor_diam/2 - thick_wall + thin_wall - 1.4*thin_wall, motor_diam/2 + thick_wall - thin_wall ], // cp 2
+                               [ cone_h - 1.4*thin_wall, 0 ],
+                       ], 40);
+                       cylinder(r = motor_diam/2 + thick_wall + eps,
+                               h = cone_h + segment_overlap - cone_solid_h);
+               };
 
                translate([0, 0, segment_overlap-thick_wall+1.7*thin_wall])
                        cylinder(r1 = motor_diam/2,
@@ -240,24 +247,24 @@ module front_cone() {
 
                translate([0, 0, -eps])
                        cylinder(r = motor_diam/2, h = segment_overlap + 2*eps);
-
-               // debug
-               // translate([0, 0, -eps]) cube(infty);
        };
 };
 
-module thread_holder() {
-       rotate([0, 90, 0]) {
-               translate([0, 0, -1.5]) difference() {
-                       cylinder(r = 10, h = 3);
-                       translate([0, 0, -eps])
-                               cylinder(r = 8, h = 3 + 2*eps);
-               };
-       };
-}
+debug = 0;
 
-// thread_holder();
+if (debug == 1) {
+// debug
+difference($fn = 16) {
+       front_cone();
+       central_tube();
+       motor_module();
 
+       translate([0, 0, -infty/2]) cube(infty);
+};
+
+} else {
+
+// production
 $fn = 128;
 
 translate([motor_diam + thick_wall, 0, 0])
@@ -271,3 +278,4 @@ rotate([0, 0, 240])
 translate([motor_diam + thick_wall, 0, 0])
        front_cone();
 
+}