/* 2016-5-22 Chris Spencer Flat spring generator. Creates a simple flat spring suitable for use as a compression, tension or torsion spring. Updated 2019-08-15 Entity325 -Changed parameter from curve radius to curve count, provides better layout -added functionality to calculate better curve packing, should result in more durability/elasticity -tweaked demo spring layout and parameters for easier testing */ module make_spring_container(width, length, thickness, height=1, angle=0, buffer=1){ difference(){ translate([0,length/2 + (buffer+thickness)/2,0]) cube([width+buffer*2+thickness*2, length+buffer+thickness, height], center=true); translate([0, length/2, 0]) cube([width+buffer*2, length, height*2], center=true); } translate([0, -thickness/2 - 0.5, 0]) cube([width+buffer*2+thickness*2, thickness, height], center=true); } module make_rim(d, thickness, height, $fn=50){ difference() { // outer rim cylinder(d=d+thickness, h=height, center=true, $fn=$fn); // inner rim cylinder(d=d-thickness, h=height*2, center=true, $fn=$fn); // cut rim at angles if(angle>0) { for(i = [-1, 1]) rotate(i*angle, [0,0,1]) translate([d,-i*d/2,0]) cube([d*2, d, d], center=true); } else { for(i = [-1, 1]) rotate(i*angle, [0,0,1]) translate([d,-i*d/2,0]) cube([d*2, d*2, d], center=true); } } } module make_flat_spring(bends=5, spacing=1, thickness=1, height=1, width=10, length=50, $fn=50) { /* Parameters: d := diameter of bend thickness := horizontal thickness of "squiggle" height := vertical thickness width := horizontal width length := horizontal length */ //Calculate bend diameter if(d/2 <= thickness) { thickness=d/2*.9; } dref = 2*(length/bends)-(spacing+thickness); d = dref>width/2 ? width/2 : dref; cspacing = ((2*length/bends)-d)-thickness; //calculate spar length ccdist = sqrt((width-d)*(width-d)+((d+cspacing+thickness)*(d+cspacing+thickness)/4)); sparl = sqrt(((ccdist)*(ccdist))-(d*d)); //calculate the spar angle //find c-c angle, subtract tangent angle ccangle = atan((d+cspacing+thickness)/(2*(width-d))); tanangle = acos(sparl/ccdist); spar_angle = (tanangle-ccangle); for(i=[0:bends]) { translate([0, ((d+cspacing+thickness)/2)*i, 0]) mirror([(i%2), 0, 0]) { translate([(d-width)/2, 0, 0]) make_rim(d=d, thickness=thickness, height=height, angle=spar_angle, $fn=$fn); // cross beam translate([0,(d+cspacing+thickness)/4,0]) rotate([0,0,-spar_angle]) cube([sparl, thickness, height], center=true); } } } module make_contained_flat_spring(bends=5, spacing=1, thickness=1, height=1, width=10, length=50, rim=5, $fn=50){ make_flat_spring(bends=bends, spacing=spacing, width=width-thickness, length=length, thickness=thickness); make_spring_container(width=width, length=length, thickness=rim); } // Generate samples. //1 translate([-35,0,0]) make_contained_flat_spring(bends=9, spacing=0.5, thickness=1, width=20, length=20, rim=5, $fn=50); //2 translate([0,0,0]) make_contained_flat_spring(bends=7, spacing=0.5, thickness=1, width=20, length=20, rim=5, $fn=50); //3 translate([35,0,0]) make_contained_flat_spring(bends=5, spacing=0.5, thickness=1, width=20, length=20, rim=5, $fn=50); //4 translate([-35,-35,0]) make_contained_flat_spring(bends=5, thickness=2, width=20, length=20, rim=5, $fn=50); //5 translate([0,-35,0]) make_contained_flat_spring(bends=4, thickness=2, width=20, length=20, rim=5, $fn=50); //6 translate([35,-35,0]) make_contained_flat_spring(bends=3, thickness=2, width=20, length=20, rim=5, $fn=50);