Skip to content

Instantly share code, notes, and snippets.

@cversek
Created April 29, 2021 05:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cversek/dac87dff8699daf17e6f5e1ed6ea1e5d to your computer and use it in GitHub Desktop.
Save cversek/dac87dff8699daf17e6f5e1ed6ea1e5d to your computer and use it in GitHub Desktop.
3D printable near flight ready model rocket
// 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();
@cversek
Copy link
Author

cversek commented Apr 29, 2021

image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment