Created
April 29, 2021 05:54
-
-
Save cversek/dac87dff8699daf17e6f5e1ed6ea1e5d to your computer and use it in GitHub Desktop.
3D printable near flight ready model rocket
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Estes 1/4A3-3T model rocket engine | |
ENGINE_DIAMETER = 13; | |
ENGINE_HEIGHT = 45; | |
// how far engines sticks out of bottom | |
ENGINE_OFFSET = 5; | |
// structural wall thickness | |
WALL_T = 1.0; | |
//material curing shrinkage compensation factor | |
SHRINK_COMPENSATION_FACTOR = 1.008; //Formlabs High Temp V2, cure 120 min 80C resign | |
CYLINDER_FN = 50; | |
SPHERE_FN = 50; | |
//------------------------------------------------------------------------------------------- | |
// BASE | |
//engine retaining ring | |
ring_H = 2*WALL_T; | |
ring_T = 2*WALL_T; | |
base_ID = (ENGINE_DIAMETER + 0.1)*SHRINK_COMPENSATION_FACTOR; | |
base_OD = base_ID + 2*WALL_T; | |
base_H = -ENGINE_OFFSET + ENGINE_HEIGHT + ring_H; | |
// flange that joins segments | |
interlock_H = 4*WALL_T; | |
interlock_OD = base_OD - WALL_T; | |
interlock_cavity_ID = (interlock_OD + 0.1)*SHRINK_COMPENSATION_FACTOR; | |
launch_lug_ID = 3.25*SHRINK_COMPENSATION_FACTOR; //fits 3mm or 1/8" launch rod | |
launch_lug_OD = launch_lug_ID + WALL_T; | |
launch_lug_H = 10; | |
launch_lug_Z = base_H/2 - launch_lug_H/2; | |
module base_tube(){ | |
difference (){ | |
union(){ | |
cylinder (h=base_H, r=base_OD/2, $fn=CYLINDER_FN); | |
//the interlock flange is slightly tapered | |
cylinder (h=base_H+interlock_H, r1=base_OD/2, r2=interlock_OD/2, $fn=CYLINDER_FN); | |
} | |
//the cavity fits the engine neatly | |
translate ([0,0, -ENGINE_OFFSET]) | |
cylinder (h=ENGINE_HEIGHT, r=base_ID/2, $fn=CYLINDER_FN); | |
//we form a retaining ring with a narrower diameter | |
translate ([0,0, -ENGINE_OFFSET+ENGINE_HEIGHT-1]) | |
cylinder (h=ring_H+2, r=(base_ID-ring_T)/2, $fn=CYLINDER_FN); | |
//then we carve the interlock cavity using the standard ID | |
translate ([0,0, -ENGINE_OFFSET+ENGINE_HEIGHT+ring_H-1]) | |
cylinder (h=interlock_H+2, r=base_ID/2, $fn=CYLINDER_FN); | |
} | |
} | |
fin_max_H = ENGINE_HEIGHT - ENGINE_OFFSET; | |
fin_min_H = 20/55*fin_max_H; | |
fin_L = 40/55*fin_max_H; //length how far fins stick out | |
fin_T = WALL_T; //thickness of fins | |
module fin(){ | |
linear_extrude(height = fin_T) | |
polygon(points=[ | |
[0,2*ENGINE_OFFSET], | |
[fin_L - 2*ENGINE_OFFSET,0], | |
[fin_L,0], | |
[fin_L, fin_min_H], | |
[0,fin_max_H] | |
], paths=[[0,1,2,3,4]] | |
); | |
} | |
module cambered_fin(){ | |
hull(){ | |
//body | |
fin(); | |
//front/side camber | |
translate([0,0,fin_T/2]) | |
scale([1.1,1.1,0.1]) | |
fin(); | |
//inner camber | |
scale([0.9,0.9,0.1]) | |
fin(); | |
//rear camber | |
translate([0,-0.1*fin_min_H,fin_T/2]) | |
scale([1.0,1.0,0.1]) | |
fin(); | |
} | |
} | |
module stabilizer_fins(){ | |
for(i=[0:3]){ | |
rotate ([0,0,i*90]) | |
translate ([base_OD/2-1 + 0.5*WALL_T, fin_T/2, -2*ENGINE_OFFSET]) | |
rotate ([90,0]) | |
cambered_fin(); | |
} | |
} | |
module lug(ID,OD,H){ | |
translate ([base_OD/2+OD/2 - WALL_T/4,0,H/2]) | |
difference(){ | |
hull(){ | |
cylinder (h=H, r=OD/2, $fn=CYLINDER_FN, center=true); | |
translate([-OD/4,0,0]) | |
cube([0.8*OD,0.8*OD,0.8*H],center=true); | |
} | |
cylinder (h=1.5*H, r=ID/2, $fn=CYLINDER_FN, center=true); | |
} | |
} | |
module base(){ | |
pin_lug_ID = 1*SHRINK_COMPENSATION_FACTOR; | |
pin_lug_OD = pin_lug_ID + WALL_T; | |
pin_lug_H = 10; | |
rotate ([0,0,45]){ | |
base_tube(); | |
stabilizer_fins(); | |
//launch lug | |
rotate ([0,0,45]) | |
translate([0,0,launch_lug_Z]) | |
lug(launch_lug_ID,launch_lug_OD,launch_lug_H); | |
//retaining pin lug | |
rotate ([0,0,225]) | |
lug(pin_lug_ID,pin_lug_OD,pin_lug_H); | |
} | |
} | |
//-------------------------------------------------------------------------------- | |
// MIDDLE | |
middle_H = 80/60*base_H; | |
middle_OD = base_OD; | |
middle_ID = base_ID; | |
//ties down the shock cord | |
shock_cord_eyelet_ID = 2; | |
shock_cord_eyelet_OD = shock_cord_eyelet_ID+WALL_T; | |
shock_cord_eyelet_T = 2*WALL_T; | |
module eyelet(ID,OD,H){ | |
rotate([90,0,0]) | |
translate([OD/2,0,0]) | |
difference(){ | |
hull(){ | |
cylinder (h=H,r=OD/2, $fn=CYLINDER_FN, center=true); | |
translate([-OD/4,0,0]) | |
cube([0.75*OD,0.75*OD,H/2],center=true); | |
} | |
cylinder (h=1.5*H,r=ID/2, $fn=CYLINDER_FN,center=true); | |
} | |
} | |
module middle_body(){ | |
cylinder (h=middle_H,r=middle_OD/2, $fn=CYLINDER_FN); | |
//the interlock flange is slightly tapered | |
cylinder (h=middle_H+interlock_H, r1=middle_OD/2, r2=(middle_ID+WALL_T)/2, $fn=CYLINDER_FN); | |
} | |
module middle_cavity(){ | |
translate ([0,0,-1]) | |
cylinder (h=middle_H+interlock_H + 2, r=middle_OD/2-WALL_T, $fn=CYLINDER_FN); | |
translate ([0,0,-1]) | |
cylinder (h=interlock_H+1, r=interlock_cavity_ID/2, $fn=CYLINDER_FN); | |
} | |
module middle(){ | |
launch_lug_Z2 = 0.75*middle_H - launch_lug_H/2; | |
difference (){ | |
middle_body(); | |
middle_cavity(); | |
} | |
rotate ([0,0,90]) | |
//launch lug | |
translate([0,0,launch_lug_Z2]) | |
lug(launch_lug_ID,launch_lug_OD,launch_lug_H); | |
//ties down the shock cord | |
translate([-middle_ID/2,0,middle_H-shock_cord_eyelet_OD]) | |
eyelet(shock_cord_eyelet_ID,shock_cord_eyelet_OD,shock_cord_eyelet_T); | |
} | |
//------------------------------------------------------------ | |
// NOSE CONE | |
nose_cone_OD = base_OD; | |
nose_cone_H = base_H; | |
nose_cone_base_H = interlock_H + WALL_T; | |
//ties down the shock cord | |
loop_eyelet_ID = 1.5; | |
loop_eyelet_OD = shock_cord_eyelet_ID+0.5*WALL_T; | |
loop_eyelet_T = WALL_T; | |
module cone_body(h1,h2,OD){ | |
translate ([0,0,h1-0.1]) | |
difference(){ | |
scale ([1,1,h2/OD*2]) | |
sphere (r=OD/2, $fn=SPHERE_FN); | |
translate([0,0,-1.5*h2]) | |
cylinder (h=1.5*h2,r=OD, $fn=CYLINDER_FN); | |
} | |
cylinder (h=h1,r=OD/2, $fn=CYLINDER_FN); | |
} | |
module nose_cone(){ | |
difference (){ | |
cone_body(h1=nose_cone_base_H, | |
h2=nose_cone_H, | |
OD=nose_cone_OD); | |
cone_body(h1=nose_cone_base_H-WALL_T, | |
h2=nose_cone_H-WALL_T, | |
OD=nose_cone_OD-2*WALL_T); | |
translate([0,0,-1]) | |
cylinder (h=interlock_H+1,r=interlock_cavity_ID/2, $fn=CYLINDER_FN); | |
} | |
//ties down the loop which links to the shock cord and parachute/streamer | |
translate([-middle_ID/2,0,interlock_H + loop_eyelet_OD/2]) | |
eyelet(loop_eyelet_ID,loop_eyelet_OD,loop_eyelet_T); | |
translate([middle_ID/2,0,interlock_H + loop_eyelet_OD/2]) | |
rotate([0,0,180]) | |
eyelet(loop_eyelet_ID,loop_eyelet_OD,loop_eyelet_T); | |
} | |
//------------------------------------------------------------ | |
// ASSEMBLY | |
base(); | |
translate([0,0,base_H+10]) | |
middle(); | |
translate([0,0,base_H+10+middle_H+10]) | |
nose_cone(); |
Author
cversek
commented
Apr 29, 2021
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment