OSE CircularKnitic v18.03: Difference between revisions
Jump to navigation
Jump to search
Line 230: | Line 230: | ||
echo((pMgroove*2)+CKpMID); | echo((pMgroove*2)+CKpMID); | ||
//c2 geared plate | //c2 geared plate - clean up below, not used to generate gear | ||
c2H=bottom_surface_motor_gearsH; | |||
c2t2t=6.858; | c2t2t=6.858; | ||
c2width=50; | c2width=50; | ||
Line 238: | Line 239: | ||
c2teeth=((c2OD*PI)/c2t2t); | c2teeth=((c2OD*PI)/c2t2t); | ||
c2dipitch=c2teeth/(c2OD*PI); | c2dipitch=c2teeth/(c2OD*PI); | ||
//c1 | //c1 | ||
Line 398: | Line 400: | ||
//c3 - redo with extra mountian tab/shelf distance | //c3 - redo with extra mountian tab/shelf distance | ||
c3OD=((pow((pow(((((c2ID+(pMgroove*2)+(pMwallT*2))/2)*cos(90-(pMd1e-pMd0)))+pMshelfX),2)+pow((((c2ID+(pMgroove*2)+(pMwallT*2))/2)),2)),1/2))*2)+(p7mountL*2) | c3OD= | ||
/* | max( | ||
MAX() of distance from mountain and distance from plate spacers bolts | ((pow((pow(((((c2ID+(pMgroove*2)+(pMwallT*2))/2)*cos(90-(pMd1e-pMd0)))+pMshelfX),2)+pow((((c2ID+(pMgroove*2)+(pMwallT*2))/2)),2)),1/2))*2)+(p7mountL*2) | ||
, | |||
(((pMID/2)+(pMgroove)+1+(p8baseL/2)+(p8holeC2C/2)+(p8holeD*1.25)+(p7mountL))*2) | |||
); | |||
//MAX() of distance from mountain, and distance from plate spacers bolts | |||
//need to consider tooth size on plate c2 ?? | |||
echo("X", ((((c2ID+(pMgroove*2)+(pMwallT*2))/2)*cos(90-(pMd1e-pMd0)))+pMshelfX)); | echo("X", ((((c2ID+(pMgroove*2)+(pMwallT*2))/2)*cos(90-(pMd1e-pMd0)))+pMshelfX)); | ||
Line 418: | Line 425: | ||
echo("OD of c1:", c2OD+(c1width-c2width)); | echo("OD of c1:", c2OD+(c1width-c2width)); | ||
Revision as of 00:24, 6 January 2019
Overview
- OSE's Fork of CircularKnitic, the open source circulate knitting machine
- Code available on GitHub https://github.com/OpenSourceEcology/circular_knitic
Goals
Needle Accomidation
- Long tails
- Bent back tails
- Test 3D printed needles
Fabric Spool
- Apply constant tension on fabric
- Roll onto spool for easy handling and storage
Part Code
CKvars.scad
- Variables to be defined for all aspects of the specific machine to be built
- These variables should be set the same for each part that is rendered
- need to define nominal distance between top of needle to top of CKp4.
- need to increase number of p3 and p4 parts.
- calculate printer footprint for each part.
////MAIN SETTINGS//// //select needle size file that will be used include <CKneedleVars-KH260.scad>; //number of "p2" parts around circle p2number=12; //12 //36 //number of needles mounted on each "p2" part p2needles=5; //5 //10 //number of "p3" parts around circle p3number=4; //4 //18 //number of "p4" parts around circle p4number=4; //4 //18 //distance from the inside face of one needle to the next needle2needle=14.35615; //default=14.35615 //try 8.414 //calculated diameter from inside edge of needles p2needlegrooveID=((needle2needle*p2number*p2needles)/PI); //number of sets of bearings mounted to geared plated c2bmounts=p3number; //number of plate connectors c2connectors=c2bmounts*3; //nnumber of Z bearing mounts c1zmounts=p3number; ////MATERIALS//// upper_surfaceH=5; //thickness of upper rotating plate ///5 bottom_surface_motor_gearsH=6; //thickness of geared rotating plate table_surface=5; //thickness of plate of main table ////PART SETTINGS//// //plate pPspace1=12; //? space from main table top to first plate pPplate1=bottom_surface_motor_gearsH; //thickness of geared plated pPspace2=12; //space between geared plate and mountain plate //12 pPplate2=upper_surfaceH; //"connector0912" connects upper_surface plate to bottom_surface geared plate connector0912H=12; connector0912L=25; connector0912W=8; connector0912HoleOD=3; //hole diameter connector0912HoleC2C=17; //center of hole to center of other hole //p5 BearringSmall1312_x_4.stl bearingholderSmallB2C=5.5; //from base of bearing holder to center of bearing bearingholderSmallBOD=10; //Outside Diameter of bearing bearingholderSmallBID=4.9; //Inside Diameter of bore hole of bearing bearingholderSmallBW=4; //Width of bearing //BearringZ bearingholderZBOD=10; //Outside Diameter of bearing bearingholderZBID=4.9; //Inside Diameter of bore hole of bearing bearingholderZBW=4; //Width of bearing bearingholderZB2C=(bearingholderZBOD/2)+upper_surfaceH+connector0912H+bottom_surface_motor_gearsH+bearingholderSmallB2C+(bearingholderSmallBOD/2); //from base of bearing holder to center of bearing //p2 needleWidthslop=0.4; //exta thickness needleWidth=nX+needleWidthslop; p2needlegroovefromID=2.0; p2ID=p2needlegrooveID-(p2needlegroovefromID*2); p2needlegrooveDepthslop=0.4; //exta thickness p2needlegrooveDepth=nY+p2needlegrooveDepthslop; //p2H calculated below; p2W=p2needlegroovefromID+p2needlegrooveDepth; p2OD=p2ID+(p2W*2); //p2holeH calculated below p2holeD=2; p2holeCSD=4.01726; p2holeCSL=1.5; p2clear=0.5; //distance above top of p4 from flipper in down position //p3 p3wiggle=0.1; p3baseH=3; p3wallW=(nH-nY)/2; //half of needle butt p3baseholeD=3; p3baseholeScrewHeadD=5.68; p3baseholefromODID=p3baseholeScrewHeadD/2; p3baseholenumber=4; p3ridgeW1=3; p3ridgeW2=5; p3ridgeH=5; p3wallholefromtop=5; p3wallchamfW=2; p3wallchamfH=3; //p3wallH in calculations below //p3grooveH1 in calculations below //p3grooveH2 in calculations below p3grooveWslop=0.8; //extra Width in needle groove p3grooveW=nX+p3grooveWslop; p3clear=5; //distance from top of p3 to needle flipper in down position p3baseID=p2ID-(p3wiggle*2)-(p3ridgeW2*2)-(p3baseholeScrewHeadD*2); p3baseOD=p2OD+(p3wiggle*2)+(p3wallW*2)+(p3wallchamfW*2)+(p3baseholeScrewHeadD*2); centerlineD=p2ID+(p2W+(p3wiggle*2)); p3wallOD=centerlineD+(p3wallW*2)+((p2W+(p3wiggle*2)/2)); p3wallID=centerlineD+((p2W+(p3wiggle*2)/2)); //p4 p4rampH=14.57; p4rampfromID=2.5; p4rampoverhangH=4; p4rampfromOD=1.34; p4rampC1=10; p4rampC2=40; p4rampC2transX=10; p4rampC2transZ=3.82; p4baseH=11; p4basegapH=8; p4baseW=11.2; p4basegapW=p2W+0.2; //5.09 p4clawW=min((needle2needle-(nX*2)),9); p4holesnumber=3; p4holeH=5; p4rampW=max(min(p4clawW-3,4),2.5); echo("rampW", p4rampW); //p5 small bearing holder p5wingW=7; p5wingL=27; p5wingH=3; p5bodyW=16; p5bodyL=25; p5bodyH=9.5; p5wiggleL=0.4; p5wiggleW=0.25; p5bearingfromwall=4.25; p5mountholeOD=3; p5mounthole2front=7; p5mounthole2back=5; //p6 big bearing holder p6wingW=30; p6wingL=25; p6wingH=3; p6bodyW=16; p6bodyL=25; p6bodyH=9.5; p6wiggleL=0.4; p6wiggleW=0.6; p6bearingfromwall=4.25; p6mountholeOD=3; p6mounthole2front=8; p6mounthole2side=3; //p7 Z bearing holder - need to tweak more for different size bearings p7baseW=bearingholderZBOD+6; //16 p7baseL=23; p7baseH=4; p7wallW=3; p7braceW=3; p7mountH=8; p7mountL=13; p7mountholeOD=3; p7mounthole2edge=3.5; p7bearingfromfront=3; p7wiggleL=0.4; p7wiggleW=0.25; //p8 plate connector p8baseW=8; p8baseL=25; p8holeD=3; p8holeend2C=4; p8holeC2C=p8baseL-(p8holeend2C*2); //p9 outer connector p9thickness=4; p9H=10; //mountain pMwallT=9; //min thickness from groove to back wall //7.5 //10 pMgroove=nH-nY-p3wallW+1; //depth of groove pMgrooveAngle=45; pMgrooveC1=pPspace2; //top of groove at position 1 "entrance" pPspace2 /////////// pMgrooveC2=nC+2; //top of groove at position 2 "push down" nC+2 //////////// pMgrooveC3=44.25; //top of groove at position 3 "top center" pMgrooveSlop=2; pMwallHextra=5.75; //extra height above groove at heighest point CKpMID=p2OD+2; //inside diameter of main wall pMH=pMwallHextra+pMgrooveC3; //total height of mountain pMshelfH=4; //thickness of shelf resting on top of c3 pMshelfchamfR=6; //radius of chamfer at join shelf/wall pMshelfBoltD=3; echo((pMgroove*2)+CKpMID); //c2 geared plate - clean up below, not used to generate gear c2H=bottom_surface_motor_gearsH; c2t2t=6.858; c2width=50; c2gap=2; c2OD=(c2width*2)+(c2gap*2)+p2OD+(p3wiggle*2)+(p3wallW*2); c2ID=(c2gap*2)+p2OD+(p3wiggle*2)+(p3wallW*2); c2teeth=((c2OD*PI)/c2t2t); c2dipitch=c2teeth/(c2OD*PI); //c1 c1H=table_surface; c1width=c2width+91.36; c1OD=c2OD+(c1width-c2width); cWiggle=0.1; //extra height on mountaint cutout for c3 to sit in //calculated settings rez=p2number*p2needles*2; centerlineD=p2ID+(p2W+(p3wiggle*2)); p3grooveH1=bottom_surface_motor_gearsH+bearingholderSmallB2C+(bearingholderSmallBOD/2)+(pMgrooveSlop/2); p3grooveH2=p3grooveH1+pMgrooveC3+(pMgrooveSlop/2); p4baseOD=centerlineD+p4baseW; p4baseID=centerlineD-p4baseW; p4basegapOD=centerlineD+p4basegapW; p4basegapID=centerlineD-p4basegapW; //firstcenter=(((((360/p2number/p2needles/2)/360*(p2OD*PI))-(needleWidth/2))/((360/p2number/p2needles/2)/360*(p2OD*PI)))*(360/p2number/p2needles/2))/2; //doesnt work on narrow needle arrangement, moved to second gap p2H=bottom_surface_motor_gearsH+bearingholderSmallB2C+(bearingholderSmallBOD/2)+pMgrooveC3+nA-nB-nC-nF-p3baseH-(p4rampH+p4baseH-p4basegapH)-p2clear;; p3wallH=bottom_surface_motor_gearsH+bearingholderSmallB2C+(bearingholderSmallBOD/2)+pMgrooveC2+nA-nB-nC-nF-p3clear; p2holeH=p3grooveH2+((p3wallH-p3grooveH2)/2); //c3 c3ID=c2ID; c3H=upper_surfaceH; pMID=c2ID; pMODwall=c2ID+(pMgroove*2)+(pMwallT*2); ///////////////////////////////// pMgrooveOR=pMgroove+(pMID/2); //center to OD of groove // is this supposed to be the radius? ///////////////////////////////// //////////////////////// // MOUNTAIN VARIABLES // //////////////////////// mult=20; //rough multiplier 5-30 grez=rez*mult; //number of sides of groove path main circle gdeg=360/grez; //standard fraction of a degree per groove rez glen=(pMID*PI)/grez; //length of arc of each rez's fraction of a degree glnd=glen/gdeg; //length of standard fraction of a degree gcho=2*(pMID/2)*sin(gdeg/2); //chord length of glnd garc=gdeg*(pMID/2); //arc length... too close to get to smaller digits that are diff? echo("rez", rez); echo("grez", grez); echo("gdeg", gdeg); echo("glen", glen); echo("glnd", glnd); echo("pMgrooveC3", pMgrooveC3); pMgrooveturnR=14; //radius of upper curved path in groove 15 pMgrooveturnR2=7; //radius of lower curved path in groove 7 pMgrooveD=nC+pMgrooveSlop; //Y plane diamter of groove cut pMp3X=3; //length of flat area of section 3 pMcutRez=2; //cuts per degree pMcutcylRez=36; //number of sides on groove cutting clylinder pMcutA=45; //angle of cut path //7 pMp7X=3; //half of length of plateu of groove. preferably whole number pMd7=pMp7X/glnd; //number of degrees for entire groove7 pMd7s=0; //degree turn to center of groove pMd7e=pMd7; //highest degree turn for section 7 pMh7s=pMgrooveC3-(pMgrooveD/2); //height of center of groove pMh7e=pMgrooveC3-(pMgrooveD/2); //6 pMp6X=cos(90-pMcutA)*pMgrooveturnR; pMd6=pMp6X/glnd; pMd6s=pMd7e; pMd6e=pMd7e+pMd6; function func6(i) = (pMgrooveturnR*cos(asin(((i-pMd6s)*(pMp6X/pMd6))/pMgrooveturnR))-pMgrooveturnR); pMh6s=pMh7e; pMh6e=pMh7e+func6(pMd6e); //5 pMh5s=pMh6e; pMh5e=0; pMp5X=(pMh5s-pMh5e)*tan(90-pMcutA); pMd5=pMp5X/glnd; pMd5s=pMd6e; pMd5e=pMd6e+pMd5; //4 pMh4e=pMgrooveC2-(pMgrooveD/2); pMp55X=(pMgrooveturnR2*tan(90-pMcutA))-(pMgrooveturnR2*sin(90-pMcutA))+(pMh4e/tan(90-pMcutA)); pMd55=pMp55X/glnd; pMp4X=cos(90-pMcutA)*pMgrooveturnR2; /////////problem with non-45 angles, p55X? pMd4=pMp4X/glnd; pMd4s=pMd5e-pMd55; pMd4e=pMd5e-pMd55+pMd4; function func4(i) = -(pMgrooveturnR2*cos(asin(((pMd4e-i)*(pMp4X/pMd4))/pMgrooveturnR2))-pMgrooveturnR2); pMh4s=func4(pMd4s); //3 pMp3X=2.5; //length of lower plateu of groove 2.5 pMd3=pMp3X/glnd; //number of degrees for groove section 3 pMd3s=pMd4e; //degree turn to center of groove pMd3e=pMd4e+pMd3; //highest degree turn for section 7 pMh3s=pMh4e; //height of center of groove pMh3e=pMh4e; //2 pMp2X=cos(pMcutA)*pMgrooveturnR2; pMd2=pMp2X/glnd; pMd2s=pMd3e; pMd2e=pMd3e+pMd2; function func2(i) = -(pMgrooveturnR2*cos(asin(((i-pMd2s)*(pMp2X/pMd2))/pMgrooveturnR2))-pMgrooveturnR2); pMh2e=pMh3e+func2(pMd2s); pMh2s=pMh3e; //1 pMh1s=pMh2e; pMh1e=pMgrooveC1-(pMgrooveD/2); //-(pMgrooveD/2) pMp1X=(pMh1e-pMh1s)*tan(90-pMcutA); pMd1=pMp1X/glnd; pMd1s=pMd2e; pMd1e=pMd2e+pMd1; //0 pMp0X=pMgrooveD/2; //pMgrooveD pMd0=pMp0X/glnd; //pMgrooveD/glnd; //define later //mounting shelf and holes settings pMshelfX=pMshelfBoltD*3; //length of shelf in mm pMshelfd=pMshelfX/glnd; //number of degrees of shelf pMshelfHole1X=pMshelfchamfR+(pMshelfBoltD*1.5); //distance to hole center from main body pMshelfHole1d=(pMshelfHole1X/glen)*gdeg; //number of degrees from edge to hole center pMshelfHole2X=pMshelfX-(pMshelfBoltD*1.5); //distance to hole center from main body pMshelfHole2d=(pMshelfHole2X/glen)*gdeg; //number of degrees from edge to hole center pMextman=0.0002; //increase size of filler piece to make part manifold correctly //END MOUNTAIN VARS /////////////////////// //c3 - redo with extra mountian tab/shelf distance c3OD= max( ((pow((pow(((((c2ID+(pMgroove*2)+(pMwallT*2))/2)*cos(90-(pMd1e-pMd0)))+pMshelfX),2)+pow((((c2ID+(pMgroove*2)+(pMwallT*2))/2)),2)),1/2))*2)+(p7mountL*2) , (((pMID/2)+(pMgroove)+1+(p8baseL/2)+(p8holeC2C/2)+(p8holeD*1.25)+(p7mountL))*2) ); //MAX() of distance from mountain, and distance from plate spacers bolts //need to consider tooth size on plate c2 ?? echo("X", ((((c2ID+(pMgroove*2)+(pMwallT*2))/2)*cos(90-(pMd1e-pMd0)))+pMshelfX)); echo("Y", ((c2ID+(pMgroove*2)+(pMwallT*2))/2)); echo("c3OD=", c3OD); pMODshelf=c3OD; ////SETTINGS OUTPUT ECHOS/// echo("Total Needles:", p2number*p2needles); echo("Millimeters Between Needles:", PI*p2needlegrooveID/(p2number*p2needles)); echo("OD of p3:", p3baseOD); echo("OD of c1:", c2OD+(c1width-c2width));
Needles
CKneedleVars-KH260.scad
- purchased here: http://shop.sckmcl.com.hk/product_info.php?products_id=136
//NEEDLE for Brother KH260 //measurements by dorkmo nX=1.4; //typical thickness from side to side nY=2.44; //typical thickness from front to back nA=157.9; //total length of needle nB=53; //distance from bottom of needle to bottom of bent tab. nC=4.82; //thickness of bent tab. top to bottom. nD=5.48; //hook front to back nE=4.10; //from top of loop to bottom of hook nF=22.0; //from top of loop to bottom of flipper in down position nG=1.10; //minimum thickness of hook. front to back. nH=17.03; //max distance from front to back nT=0; //0=straight tail 1=bent tail aka folded back. Y of tail = C if T=1.
CKneedleVars-SK120.scad
- difficult to find these exact needles for sale
//NEEDLE for SK120 //measured by original CircularKnitic team nX=1.4; //typical thickness from side to side nY=2.44; //typical thickness from front to back nA=97.73; //total length of needle nB=7.72; //distance from bottom of needle to bottom of bent tab. nC=4.92; //thickness of bent tab. top to bottom. nD=5.09; //hook front to back nE=4.62; //from top top loop to bottom of hook nF=19.94; //top to bottom of flipper in down position nG=1.04; //minimum thickness of hook. front to back. nH=16.4; //max distance from front to back nT=0; //0=straight tail 1=bent tail aka folded back. Y of tail = C of T=1.
3D Prints
- Parts to be printed on the 3D printer
CKp2.scad "inner"
include <CKvars.scad>; CKp2(); module CKp2(){ rez=p2number*p2needles*2; $fn=rez; //defines resolution of circles. translate([p2OD/2,0,0]){ difference(){ cylinder(h=p2H,d=p2OD); cylinder(h=p2H,d=p2ID); translate([-p2OD/2,-p2OD/2,0]){ cube([p2OD,p2OD/2,p2H]); } rotate([0,0,-360/p2number]){ translate([-p2OD/2,0,0]) cube([p2OD,p2OD/2,p2H]); } for(i=[1:p2needles]){ rotate([0,0,(360/p2number/p2needles/2)-(360/p2number/p2needles*i)]){ translate([-p2OD/2-0.2,-needleWidth/2,0]) cube([p2needlegrooveDepth+0.2,needleWidth,p2H]); } } rotate([0,0,-360/p2number/p2needles]){ translate([-p2OD/2-0.2,0,p2holeH]) rotate([0,90,0]){ union(){ cylinder(h=p2OD-p2ID+0.2, d=p2holeD); translate([0,0,((p2OD-p2ID)/2)-p2holeCSL]){ cylinder(h=p2holeCSL+2, d=p2holeCSD); } } //end union } } rotate([0,0,-360/p2number/p2needles*(p2needles-1)]){ translate([-p2OD/2-0.2,0,p2holeH]) rotate([0,90,0]){ union(){ cylinder(h=p2OD-p2ID+0.2, d=p2holeD); translate([0,0,((p2OD-p2ID)/2)-p2holeCSL]){ cylinder(h=p2holeCSL+2, d=p2holeCSD); } } //end union } } echo(((((360/p2number/p2needles/2)/360*(p2OD*PI))-(needleWidth/2))/((360/p2number/p2needles/2)/360*(p2OD*PI)))*(360/p2number/p2needles/2)); //firstcenter=(((((360/p2number/p2needles/2)/360*(p2OD*PI))-(needleWidth/2))/((360/p2number/p2needles/2)/360*(p2OD*PI)))*(360/p2number/p2needles/2))/2; not using // 2nd hole rotate([0,0,-(360/p2number/p2needles)*2]){ translate([-p2OD/2-0.2,0,p2holeH]) rotate([0,90,0]){ union(){ cylinder(h=p2OD-p2ID+0.2, d=p2holeD); translate([0,0,((p2OD-p2ID)/2)-p2holeCSL]){ cylinder(h=p2holeCSL+2, d=p2holeCSD); } } //end union } } //3rd hole rotate([0,0,-360/p2number+((360/p2number/p2needles)*2)]){ translate([-p2OD/2-0.2,0,p2holeH]) rotate([0,90,0]){ union(){ cylinder(h=p2OD-p2ID+0.2, d=p2holeD); translate([0,0,((p2OD-p2ID)/2)-p2holeCSL]){ cylinder(h=p2holeCSL+2, d=p2holeCSD); } } //end union } } //end rotate //end hole //p4 mount holes // 1st p4 mount hole rotate([0,0,-(360/p2number/p2needles)*2]){ translate([-p2OD/2-0.2,0,p2H-(p4basegapH-p4holeH)]) rotate([0,90,0]){ cylinder(h=p2OD-p2ID+0.2, d=p2holeD); } } //2nd p4 mount hole // 2nd hole rotate([0,0,-(360/p2number/p2needles)*3]){ translate([-p2OD/2-0.2,0,p2H-(p4basegapH-p4holeH)]) rotate([0,90,0]){ cylinder(h=p2OD-p2ID+0.2, d=p2holeD); } } //end p4 mount holes } } } //end module
CKp3.scad "outer"
- Added holes in base for long tails
- does this need to be bigger to allow for some slop?
- what to do if needle has bent back tail?
include <CKvars.scad>; CKp3(); module CKp3(){ rez=p2number*p2needles*2; //p2number*p2needles*2 //p2number*2*2; $fn=rez; //defines resolution of circles. centerlineD=p2ID+(p2W+(p3wiggle*2)); echo(centerlineD); translate([p3baseOD/2,0,0]){ difference(){ union(){ cylinder(h=p3baseH,d=p3baseOD); difference(){ cylinder(h=p3ridgeH+p3baseH,d=centerlineD-((p2W+(p3wiggle*2)/2))); translate([0,0,p3baseH]) cylinder(h=p3ridgeH,d1=centerlineD-(p3ridgeW2*2)-((p2W+(p3wiggle*2)/2)),d2=centerlineD-(p3ridgeW1*2)-((p2W+(p3wiggle*2)/2))); } difference(){ translate([0,0,p3baseH]) cylinder(h=p3wallchamfH,d1=centerlineD+((p3wallchamfW+p3wallW)*2)+((p2W+(p3wiggle*2)/2)),d2=centerlineD+(p3wallW*2)+((p2W+(p3wiggle*2)/2))); cylinder(h=p3wallchamfH+p3baseH,d=centerlineD+((p2W+(p3wiggle*2)/2))); } difference(){ cylinder(h=p3wallH,d=centerlineD+(p3wallW*2)+((p2W+(p3wiggle*2)/2))); cylinder(h=p3wallH,d=centerlineD+((p2W+(p3wiggle*2)/2))); } } //end main union cylinder(h=p3wallH,d=p3baseID); translate([-p3baseOD/2,-p3baseOD/2,0]){ cube([p3baseOD,p3baseOD/2,p3wallH]); } rotate([0,0,-360/p3number]){ translate([-p3baseOD/2,0,0]) cube([p3baseOD,p3baseOD/2,p3wallH]); } //slots for(i=[1:p2needles*(p2number/p3number)]){ rotate([0,0,(360/p2number/p2needles/2)-(360/p2number/p2needles*i)]){ translate([((-centerlineD-(p3wallW*2)-((p2W+(p3wiggle*2)/2)))/2)-0.1,-p3grooveW/2,p3grooveH1]) cube([p3wallW+0.2,p3grooveW,p3grooveH2-p3grooveH1]); } } //base needle holes for(i=[1:p2needles*(p2number/p3number)]){ rotate([0,0,(360/p2number/p2needles/2)-(360/p2number/p2needles*i)]){ translate([-p2OD/2,-needleWidth/2,-0.01]) cube([p2needlegrooveDepth,needleWidth,p3wallH+0.02]); } } //base mounting holes for(i=[1:p3baseholenumber]){ rotate([0,0,(((360/p3number/p3baseholenumber))/2)-((360/p3number/p3baseholenumber)*i)]){ translate([-(p3baseID/2)-p3baseholefromODID,0,0]) cylinder(h=p3baseH,d=p3baseholeD,$fn=18); } } for(i=[1:p3baseholenumber]){ rotate([0,0,(((360/p3number/p3baseholenumber))/2)-((360/p3number/p3baseholenumber)*i)]){ translate([-(p3baseOD/2)+p3baseholefromODID,0,0]) cylinder(h=p3baseH,d=p3baseholeD,$fn=18); } } //first and last holes rotate([0,0,-(360/p2number/p2needles)*2]){ translate([((-centerlineD-(p3wallW*2)-((p2W+(p3wiggle*2)/2)))/2)-0.1,0,p2holeH+p3baseH]) rotate([0,90,0]){ cylinder(h=p2OD-p2ID+0.2, d=p2holeD, $fn=18); } } rotate([0,0,-(360/(p3number))+((360/p2number/p2needles)*2)]){ translate([((-centerlineD-(p3wallW*2)-((p2W+(p3wiggle*2)/2)))/2)-0.1,0,p2holeH+p3baseH]) rotate([0,90,0]){ #cylinder(h=p2OD-p2ID+0.2, d=p2holeD, $fn=18); } } //middle holes for(i=[0:(p2number/p3number)-1]){ rotate([0,0,(-360/p2number/p2needles)+(i*-360/p2number)]){ translate([((-centerlineD-(p3wallW*2)-((p2W+(p3wiggle*2)/2)))/2)-0.1,0,p2holeH+p3baseH]) rotate([0,90,0]){ cylinder(h=p2OD-p2ID+0.2, d=p2holeD,$fn=18); } } } //end for for(i=[0:(p2number/p3number)-1]){ rotate([0,0,(-360/p2number/p2needles*(p2needles-1))+(i*-360/p2number)]){ translate([((-centerlineD-(p3wallW*2)-((p2W+(p3wiggle*2)/2)))/2)-0.1,0,p2holeH+p3baseH]) rotate([0,90,0]){ cylinder(h=p2OD-p2ID+0.2, d=p2holeD, $fn=18); } } }//end for //end middle holes } } } //end module
CKp4.scad "yard holder"
include <CKvars.scad>; CKp4(); module CKp4(){ rez=p2number*p2needles*2; $fn=rez; //defines resolution of circles. translate([p4baseOD/2,0,0]){ difference(){ union(){ cylinder(h=p4baseH,d=p4baseOD-(p4basegapW*2)-((p4baseW-p4basegapW)/2*2)); //ramps for(i=[1:p2needles*(p2number/p4number)]){ rotate([0,0,(360/p2number/p2needles)-(360/p2number/p2needles*i)-(((360/p2number/p2needles))/2)]){ difference(){ union(){ translate([-p4baseOD/2+p4rampfromOD,p4rampW/2,p4rampH+p4baseH-(p4rampC1/2)]) rotate([90,0,0]) cylinder(h=p4rampW,d=p4rampC1); intersection(){ translate([-10,0,3.82]) translate([-p4baseOD/2+p4rampfromOD,p4rampW/2,p4rampH+p4baseH-(p4rampC2/2)]) rotate([90,0,0]) cylinder(h=p4rampW,d=p4rampC2); translate([-7,0,-2.86/2]) translate([-p4baseOD/2+p4rampfromOD,p4rampW/2,p4rampH+p4baseH-(p4rampC2/2)]) cube([p4rampC2,p4rampC2,p4rampC2],center=true); } }//end union translate([-p4rampC2/2,0,0]) translate([-p4baseOD/2+p4rampfromOD,p4rampW/2,p4rampH+p4baseH-(p4rampC2/2)]) cube([p4rampC2,p4rampC2,p4rampC2],center=true); translate([0,0,0]) translate([-p4baseOD/2+p4rampfromOD,p4rampW/2,p4baseH-(p4rampC2/2)-0.1]) cube([p4rampC2,p4rampC2,p4rampC2],center=true); translate([0,-p4clawW/2,0]) translate([-(p4baseID/2)-p4rampfromID,0,p4baseH]) cube([(p4baseID/2)+p4rampfromID,p4clawW,p4rampoverhangH]); translate([-7,0,0]) translate([-p4baseOD/2+p4rampfromOD,(p4rampW/2)+(p4rampC2/2)-0.01,p4rampH+p4baseH-(p4rampC2/2)]) cube([p4rampC2,p4rampC2,p4rampC2],center=true); translate([-7,0,0]) translate([-p4baseOD/2+p4rampfromOD,-(p4rampW/2)-(p4rampC2/2)+0.01,p4rampH+p4baseH-(p4rampC2/2)]) cube([p4rampC2,p4rampC2,p4rampC2],center=true); }//end ramps difference } //end for rotate }//end for //claws for(i=[1:p2needles*(p2number/p4number)]){ rotate([0,0,(360/p2number/p2needles)-(360/p2number/p2needles*i)-(((360/p2number/p2needles))/2)]){ translate([-p4baseOD/2,-p4clawW/2,0]) cube([(p4baseOD-p4baseID)/2,p4clawW,p4baseH]); } }//end for } //end main union cylinder(h=p4baseH,d=p4baseID); translate([-p4baseOD/2,-p4baseOD/2,0]){ cube([p4baseOD,p4baseOD/2,p4baseH]); } rotate([0,0,-360/p4number]){ translate([-p4baseOD/2,0,0]) cube([p4baseOD,p4baseOD/2,p4baseH]); } difference(){ cylinder(h=p4basegapH,d=p4basegapOD); cylinder(h=p4basegapH,d=p4basegapID); } //holes //middle holes for(i=[0:(p2number/p4number)-1]){ rotate([0,0,(-360/p2number/p2needles*0.5)+(i*-360/p2number)]){ translate([-p4baseOD/2-0.2,0,p4holeH]) rotate([0,90,0]){ union(){ cylinder(h=p4baseOD-p4baseID+0.2, d=p2holeD); translate([0,0,((p4baseOD-p4baseID)/2)-p2holeCSL]){ cylinder(h=p2holeCSL+2, d=p2holeCSD); } //end translate } //end union } //end rotate } // end rotate } //end for //second set for(i=[0:(p2number/p3number)-1]){ rotate([0,0,-(360/p2number/p2needles*0.5)+(360/p2number/p2needles)+(i*-360/p2number)+(-360/p2number)]){ translate([-p4baseOD/2-0.2,0,p4holeH]) rotate([0,90,0]){ union(){ cylinder(h=p4baseOD-p4baseID+0.2, d=p2holeD); translate([0,0,((p4baseOD-p4baseID)/2)-p2holeCSL]){ cylinder(h=p2holeCSL+2, d=p2holeCSD); } //end translate } //end union } //end rotate } // end rotate } //end for //end middle holes } //end main difference } //end main translate } //end module
CKp5.scad "small bearing holder"
include <CKvars.scad>; CKp5(); //small bearing holder module CKp5(){ translate([-(p5wingW+p5bodyW+p5wingW)/2,0,0]){ //wing left difference(){ cube([p5wingW,p5wingL,p5wingH]); //wing right holes translate([p5wingW/2,p5mounthole2front,0]) cylinder(d=p5mountholeOD,h=p5wingH+0.1,$fn=36); translate([p5wingW/2,p5wingL-p5mounthole2back,0]) cylinder(d=p5mountholeOD,h=p5wingH+0.1,$fn=36); } //end wing left difference //body translate([p5wingW,0,0]){ difference(){ cube([p5bodyW,p5bodyL,p5bodyH]); // bearing cutout 1 translate([((p5bodyW)/2)-((bearingholderZBOD+p5wiggleW)/2),p5bearingfromwall,0]) cube([bearingholderZBOD+p5wiggleW,bearingholderSmallBW+p5wiggleL,p5bodyH+0.1]); // bearing cutout 2 translate([((p5bodyW)/2)-((bearingholderZBOD+p5wiggleW)/2),p5bodyL-p5bearingfromwall-(bearingholderSmallBW+p5wiggleL),0]) cube([bearingholderZBOD+p5wiggleW,bearingholderSmallBW+p5wiggleL,p5bodyH+0.1]); // bore hole cutout translate([(p5bodyW)/2,-0.1,bearingholderSmallB2C]) rotate([270,0,0]) cylinder(d=bearingholderSmallBID,h=p5bodyL+0.2,$fn=36); } //end body difference } //end body translate //wing right translate([p5wingW+p5bodyW,0,0]){ difference(){ cube([p5wingW,p5wingL,p5wingH]); //wing right holes translate([p5wingW/2,p5mounthole2front,0]) cylinder(d=p5mountholeOD,h=p5wingH+0.1,$fn=36); translate([p5wingW/2,p5wingL-p5mounthole2back,0]) cylinder(d=p5mountholeOD,h=p5wingH+0.1,$fn=36); } //end wing right difference } //end wing right translate } //end main translate } //end main module
CKp6.scad "big bearing holder"
include <CKvars.scad>; CKp6(); //small bearing holder module CKp6(){ translate([-(p6wingW+p6bodyW+p6wingW)/2,0,0]){ //wing left difference(){ cube([p6wingW,p6wingL,p6wingH]); //wing right holes translate([p6mounthole2side,p6mounthole2front,0]) cylinder(d=p6mountholeOD,h=p6wingH+0.1,$fn=36); } //end wing left difference //body translate([p6wingW,0,0]){ difference(){ cube([p6bodyW,p6bodyL,p6bodyH]); // bearing cutout 1 translate([((p6bodyW)/2)-((bearingholderSmallBOD+p6wiggleW)/2),p6bearingfromwall,0]) cube([bearingholderSmallBOD+p6wiggleW,bearingholderSmallBW+p6wiggleL,p6bodyH+0.1]); // bearing cutout 2 translate([((p6bodyW)/2)-((bearingholderSmallBOD+p6wiggleW)/2),p6bodyL-p6bearingfromwall-(bearingholderSmallBW+p6wiggleL),0]) cube([bearingholderSmallBOD+p6wiggleW,bearingholderSmallBW+p6wiggleL,p6bodyH+0.1]); // bore hole cutout translate([(p6bodyW)/2,-0.1,bearingholderSmallB2C]) rotate([270,0,0]) cylinder(d=bearingholderSmallBID,h=p6bodyL+0.2,$fn=36); } //end body difference } //end body translate //wing right translate([p6wingW+p6bodyW,0,0]){ difference(){ cube([p6wingW,p6wingL,p6wingH]); //wing right holes translate([p6wingW-p6mounthole2side,p6mounthole2front,0]) cylinder(d=p6mountholeOD,h=p6wingH+0.1,$fn=36); } //end wing right difference } //end wing right translate } //end main translate } //end main module
CKp7.scad "Z bearing holder"
- should a horizontal bearing be added to help keep plates aligned?
include <CKvars.scad>; CKp7(); //small bearing holder module CKp7(){ translate([-p7baseW/2,0,0]){ difference(){ union(){ cube([p7baseW,p7baseL,p7baseH]); translate([0,(p7baseL/2)-(p7wallW/2),0]) cube([p7baseW,p7wallW,bearingholderZB2C+(p7mountH/2)]); translate([0,(p7baseL/2)+(p7wallW/2)-p7mountL,bearingholderZB2C-(p7mountH/2)]) cube([p7baseW,p7mountL,p7mountH]); //diagnal brace translate([(p7baseW/2)-(p7braceW/2),((p7baseL-p7wallW)/2)+p7wallW,p7baseH]){ difference(){ cube([p7braceW,(p7baseL-p7wallW)/2,bearingholderZB2C*2/3]); translate([0,(p7baseL-p7wallW)/2,0]) rotate([1/tan(((bearingholderZB2C*2/3))/((p7baseL-p7wallW)/2)),0,0]) cube([p7braceW,bearingholderZB2C*2,bearingholderZB2C*2]); } //end brace translate } //end brace difference } //end main union //bore hole translate([(p7baseW)/2,((p7baseL/2)+(p7wallW/2)-p7mountL)-0.1,bearingholderZB2C]) rotate([270,0,0]) cylinder(d=bearingholderZBID,h=p7mountL+0.2,$fn=36); //bearing cutout translate([((p7baseW)/2)-((bearingholderZBOD+p7wiggleW)/2),p7bearingfromfront,bearingholderZB2C-(p7mountH/2)-0.1]) cube([bearingholderZBOD+p7wiggleW,bearingholderZBW+p7wiggleL,p7mountH+0.2]); // hole 1 translate([p7mounthole2edge,p7mounthole2edge,0]) cylinder(d=p7mountholeOD,h=p7baseH+0.1,$fn=36); // hole 2 translate([p7baseW-p7mounthole2edge,p7mounthole2edge,0]) cylinder(d=p7mountholeOD,h=p7baseH+0.1,$fn=36); // hole 3 translate([p7mounthole2edge,p7baseL-p7mounthole2edge,0]) cylinder(d=p7mountholeOD,h=p7baseH+0.1,$fn=36); // hole 4 translate([p7baseW-p7mounthole2edge,p7baseL-p7mounthole2edge,0]) cylinder(d=p7mountholeOD,h=p7baseH+0.1,$fn=36); } //end main difference } //end main translate } //end main module
CKp8.scad "plate connector"
include <CKvars.scad>; CKp8(); //small bearing holder module CKp8(){ translate([-p8baseW/2,0,0]){ difference(){ cube([p8baseW,p8baseL,pPspace2]); translate([p8baseW/2,p8holeend2C,-0.1]) cylinder(d=p8holeD,h=pPspace2+0.2,$fn=36); translate([p8baseW/2,p8baseL-p8holeend2C,-0.1]) cylinder(d=p8holeD,h=pPspace2+0.2,$fn=36); } //end main difference } //end translate } //end main module
CKp9.scad "outer connector"
include <CKvars.scad>; CKp9(); //small bearing holder module CKp9(){ rez=p2number*p2needles*2; $fn=rez; translate([-p3wallOD/2,0,0]){ difference(){ cylinder(h=p9H,d=p3wallOD+p9thickness); cylinder(h=p9H,d=p3wallOD); //first and last holes rotate([0,0,-(360/p2number/p2needles)*2]){ translate([(p3wallOD/2)-0.1,0,p9H/2]) rotate([0,90,0]){ #cylinder(h=p9thickness+0.2, d=p2holeD, $fn=18); } } rotate([0,0,((360/p2number/p2needles)*2)]){ translate([(p3wallOD/2)-0.1,0,p9H/2]) rotate([0,90,0]){ cylinder(h=p9thickness+0.2, d=p2holeD, $fn=18); } } //end first and last holes //outer holes rotate([0,0,(-360/p2number/p2needles)]){ translate([(p3wallOD/2)-0.1,0,p9H/2]) rotate([0,90,0]){ cylinder(h=p9thickness+0.2, d=p2holeD, $fn=18); } } rotate([0,0,(360/p2number/p2needles)]){ translate([(p3wallOD/2)-0.1,0,p9H/2]) rotate([0,90,0]){ cylinder(h=p9thickness+0.2, d=p2holeD, $fn=18); } } //end outer holes // cut off ends rotate([0,0,-((-360/p2number/p2needles)+(1.4*-360/p2number/p2needles))]){ cube([(p3wallOD+p9thickness)*2,(p3wallOD+p9thickness)*2,(p3wallOD+p9thickness)*2]); } rotate([0,0,((-360/p2number/p2needles)+(1.4*-360/p2number/p2needles))]){ translate([0,-((p3wallOD+p9thickness)*2),0]) cube([(p3wallOD+p9thickness)*2,(p3wallOD+p9thickness)*2,(p3wallOD+p9thickness)*2]); } translate([-((p3wallOD+p9thickness)*2),-((p3wallOD+p9thickness)*2)/2,0]) #cube([(p3wallOD+p9thickness)*2,(p3wallOD+p9thickness)*2,(p3wallOD+p9thickness)*2]); } //end main difference } //end translate } //end main module
CKpM.scad "mountain"
- takes a long time to render, have to be patient
- need to set a minimum thickness of the mountain based on distance between bolt holes
- add center inlay groove for middle plate to sit in. hold mountain in place.
Rework in progress
include <CKvars.scad>; //TO DO// //*add integrated yarn feeder based on needle height //*function func6 not right? working with 45 angle but not others //*pMd4 not placing groove properly when not at 45 degrees /////// CKpM(1); //render mountain 1=w/ grove 0=w/o groove module CKpM(G){ translate([0,-p3wallOD/2,0]){ //main translate union(){ difference(){ translate([0,0,pMH/2]) //main cube translate([0,(c2ID+(pMgroove*2)+(pMwallT*2))/4,0]) cube([c2ID+(pMgroove*2)+(pMwallT*2),(c2ID+(pMgroove*2)+(pMwallT*2))/2,pMH], center=true); //main ID cut cylinder(d=pMID,h=pMH+1,$fn=rez); ////// //angled cut ends rotate([0,0,atan((((((c2ID+(pMgroove*2)+(pMwallT*2))/2)*cos(90-(pMd1e-pMd0)))+(pMshelfX/2)))/((cos(pMd1e-pMd0)*((pMID/2)+(pMshelfBoltD)+pMgroove))))]) ///////////// translate([-((pMshelfX)/2),0,0]) mirror([1,0,0]) cube([pMID*4,pMID*4,pMH]); mirror([1,0,0]) rotate([0,0,atan((((((c2ID+(pMgroove*2)+(pMwallT*2))/2)*cos(90-(pMd1e-pMd0)))+(pMshelfX/2)))/((cos(pMd1e-pMd0)*((pMID/2)+(pMshelfBoltD)+pMgroove))))]) translate([-((pMshelfX)/2),0,0]) mirror([1,0,0]) cube([pMID*4,pMID*4,pMH]); // ////// ////// //ends' angled cut with shelf rotate([0,0,(pMd1e-pMd0)]) mirror([1,0,0]) cube([pMID*4,pMID*4,pPspace2+pPplate2]); mirror([1,0,0]) rotate([0,0,(pMd1e-pMd0)]) mirror([1,0,0]) cube([pMID*4,pMID*4,pPspace2+pPplate2]); // ////// ////// //shelf cuts translate([((c2ID+(pMgroove*2)+(pMwallT*2))/2)*cos(90-(pMd1e-pMd0)),0,0]) cube([pMID*4,pMID*4,pPspace2+pPplate2]); //below shelf mirror([1,0,0]) translate([((c2ID+(pMgroove*2)+(pMwallT*2))/2)*cos(90-(pMd1e-pMd0)),0,0]) cube([pMID*4,pMID*4,pPspace2+pPplate2]); //below shelf translate([(((c2ID+(pMgroove*2)+(pMwallT*2))/2)*cos(90-(pMd1e-pMd0)))+pMshelfX,0,pPspace2+pPplate2]) cube([pMID*4,pMID*4,pMH]); //of shelf mirror([1,0,0]) translate([(((c2ID+(pMgroove*2)+(pMwallT*2))/2)*cos(90-(pMd1e-pMd0)))+pMshelfX,0,pPspace2+pPplate2]) cube([pMID*4,pMID*4,pMH]); //of shelf //chamfered cut mirror([1,0,0]) translate([(((c2ID+(pMgroove*2)+(pMwallT*2))/2)*cos(90-(pMd1e-pMd0)))-pMshelfchamfR,0,pPspace2+pPplate2+pMshelfH]) minkowski(){ translate([pMshelfchamfR,0,pMshelfchamfR]) cube([pMID*4,pMID*4,pMH]); sphere(r=pMshelfchamfR,$fn=100); } //end minkowski //chamfered cut mirror([0,0,0]) translate([(((c2ID+(pMgroove*2)+(pMwallT*2))/2)*cos(90-(pMd1e-pMd0)))-pMshelfchamfR,0,pPspace2+pPplate2+pMshelfH]) minkowski(){ translate([pMshelfchamfR,0,pMshelfchamfR]) cube([pMID*4,pMID*4,pMH]); sphere(r=pMshelfchamfR,$fn=100); } //end minkowski translate([-(cos(45)*((pMshelfX)/2)),sin(45)*((pMshelfX)/2),0]) translate([0,(cos(pMd1e-pMd0)*((pMID/2)+(pMshelfBoltD)+pMgroove)),0]) translate([-((((c2ID+(pMgroove*2)+(pMwallT*2))/2)*cos(90-(pMd1e-pMd0)))+(pMshelfX/2)),0,0]) translate([0,(((((c2ID+(pMgroove*2)+(pMwallT*2))/2)/cos(pMd1e-pMd0))-((pMID/2)+(pMshelfBoltD)+pMgroove))/1.5),0]) rotate([0,0,-45]) translate([-pMID/2,0,0]) cube([pMID,pMID,pMH],center=true); mirror([1,0,0]) translate([-(cos(45)*((pMshelfX)/2)),sin(45)*((pMshelfX)/2),0]) translate([0,(cos(pMd1e-pMd0)*((pMID/2)+(pMshelfBoltD)+pMgroove)),0]) translate([-((((c2ID+(pMgroove*2)+(pMwallT*2))/2)*cos(90-(pMd1e-pMd0)))+(pMshelfX/2)),0,0]) translate([0,(((((c2ID+(pMgroove*2)+(pMwallT*2))/2)/cos(pMd1e-pMd0))-((pMID/2)+(pMshelfBoltD)+pMgroove))/1.5),0]) rotate([0,0,-45]) translate([-pMID/2,0,0]) cube([pMID,pMID,pMH],center=true); //shelf cuts /////// ////// //mounting bolt holes //1 translate([0,(cos(pMd1e-pMd0)*((pMID/2)+(pMshelfBoltD)+pMgroove)),0]) translate([-((((c2ID+(pMgroove*2)+(pMwallT*2))/2)*cos(90-(pMd1e-pMd0)))+(pMshelfX/2)),0,0]) cylinder(d=pMshelfBoltD, h=pMH, $fn=36); //2 translate([0,(cos(pMd1e-pMd0)*((pMID/2)+(pMshelfBoltD)+pMgroove)),0]) translate([-((((c2ID+(pMgroove*2)+(pMwallT*2))/2)*cos(90-(pMd1e-pMd0)))+(pMshelfX/2)),0,0]) translate([0,(((((c2ID+(pMgroove*2)+(pMwallT*2))/2)/cos(pMd1e-pMd0))-((pMID/2)+(pMshelfBoltD)+pMgroove))/1.5),0]) cylinder(d=pMshelfBoltD, h=pMH, $fn=36); mirror([1,0,0]){ //1 translate([0,(cos(pMd1e-pMd0)*((pMID/2)+(pMshelfBoltD)+pMgroove)),0]) translate([-((((c2ID+(pMgroove*2)+(pMwallT*2))/2)*cos(90-(pMd1e-pMd0)))+(pMshelfX/2)),0,0]) cylinder(d=pMshelfBoltD, h=pMH, $fn=36); //2 translate([0,(cos(pMd1e-pMd0)*((pMID/2)+(pMshelfBoltD)+pMgroove)),0]) translate([-((((c2ID+(pMgroove*2)+(pMwallT*2))/2)*cos(90-(pMd1e-pMd0)))+(pMshelfX/2)),0,0]) translate([0,(((((c2ID+(pMgroove*2)+(pMwallT*2))/2)/cos(pMd1e-pMd0))-((pMID/2)+(pMshelfBoltD)+pMgroove))/1.5),0]) cylinder(d=pMshelfBoltD, h=pMH, $fn=36); } //end mirror //end of bolt holes ////////////// ///////////////////GROOVE PATH///////// if(G==1){ //left needle path cut needlepathLEFT(); //right needle path cut mirror([1,0,0]) needlepathLEFT(); } } //end main body diffference //////extra piece to square up shape translate([0,0,pPspace2]){ difference(){ translate([0,(c2ID+(pMgroove*2)+(pMwallT*2))/4,((pPplate2+pMextman)/2)]) cube([c2ID+(pMgroove*2)+(pMwallT*2),(c2ID+(pMgroove*2)+(pMwallT*2))/2,pPplate2+pMextman], center=true); cylinder(d=pMID,h=pMH,$fn=rez); //90 degree cut translate([((c2ID+(pMgroove*2)+(pMwallT*2))/2)*cos(90-(pMd1e-pMd0)),0,0]) cube([pMID*4,pMID*4,pPplate2+pMextman]); //below shelf mirror([1,0,0]) translate([((c2ID+(pMgroove*2)+(pMwallT*2))/2)*cos(90-(pMd1e-pMd0)),0,0]) cube([pMID*4,pMID*4,pPplate2+pMextman]); //below shelf //cut to end of groove difference(){ rotate([0,0,(pMd1e-pMd0)-pMextman]) mirror([0,0,0]) cube([pMID*4,pMID*4,pPplate2+pMextman]); cube([pMID*4,pMID*4,pPplate2+pMextman]); } difference(){ mirror([1,0,0]) rotate([0,0,(pMd1e-pMd0)-pMextman]) mirror([0,0,0]) cube([pMID*4,pMID*4,pPplate2+pMextman]); mirror([1,0,0]) cube([pMID*4,pMID*4,pPplate2+pMextman]); } }//end diff } //end translate ////////end extra piece } //end main union } //end main translate } //end CKpM module module needlepathLEFT(){ /////START GROOVE CUTS///// //7 for(i=[pMd7s:gdeg:pMd7e]){ translate([0,0,pMh7s]) rotate([270,0,i]) cylinder($fn=pMcutcylRez,d=pMgrooveD,h=pMgrooveOR); }//end 7 for //6 for(i=[pMd6s:gdeg:pMd6e]){ translate([0,0,pMh7s+func6(i)]) rotate([270,0,i]) cylinder($fn=pMcutcylRez,d=pMgrooveD,h=pMgrooveOR); }//end 6 for //5 for(i=[pMd5s:gdeg:pMd5e]){ translate([0,0,pMh7s+func6(pMd6e)-(tan(pMcutA)*(i-pMd5s)*glnd)]) /////needs work rotate([270,0,i]) cylinder($fn=pMcutcylRez,d=pMgrooveD,h=pMgrooveOR); }//end 5 for //4 for(i=[pMd4s:gdeg:pMd4e]){ hull(){ translate([0,0,func4(i)+pMh4e]) rotate([270,0,i]) cylinder($fn=pMcutcylRez,d=pMgrooveD,h=pMgrooveOR); if(i<=pMd5e){ translate([0,0,pMh7s+func6(pMd6e)-(tan(pMcutA)*(i-pMd5s)*glnd)]) rotate([270,0,i]) cylinder($fn=pMcutcylRez,d=pMgrooveD,h=pMgrooveOR); } else{ translate([0,0,0]) rotate([270,0,i]) cylinder($fn=pMcutcylRez,d=pMgrooveD,h=pMgrooveOR); } } //end hull }//end 4 for //3 for(i=[pMd3s:gdeg:pMd3e]){ hull(){ translate([0,0,pMh4e]) rotate([270,0,i]) cylinder($fn=pMcutcylRez,d=pMgrooveD,h=pMgrooveOR); if(i<=pMd5e){ translate([0,0,pMh7s+func6(pMd6e)-(tan(pMcutA)*(i-pMd5s)*glnd)]) rotate([270,0,i]) cylinder($fn=pMcutcylRez,d=pMgrooveD,h=pMgrooveOR); } else{ translate([0,0,0]) rotate([270,0,i]) cylinder($fn=pMcutcylRez,d=pMgrooveD,h=pMgrooveOR); } } //end hull }//end 3 for //2 for(i=[pMd2s:gdeg:pMd2e]){ hull(){ translate([0,0,func2(i)+pMh2s]) rotate([270,0,i]) cylinder($fn=pMcutcylRez,d=pMgrooveD,h=pMgrooveOR); if(i<=pMd5e){ translate([0,0,pMh7s+func6(pMd6e)-(tan(pMcutA)*(i-pMd5s)*glnd)]) rotate([270,0,i]) cylinder($fn=pMcutcylRez,d=pMgrooveD,h=pMgrooveOR); } //end if else{ translate([0,0,0]) rotate([270,0,i]) cylinder($fn=pMcutcylRez,d=pMgrooveD,h=pMgrooveOR); } //end else } //end hull }//end 2 for //1 for(i=[pMd1s:gdeg:pMd1e]){ hull(){ translate([0,0,pMh2s+func2(pMd2e)+(tan(pMcutA)*(i-pMd1s)*glnd)]) /////needs work rotate([270,0,i]) cylinder($fn=pMcutcylRez,d=pMgrooveD,h=pMgrooveOR); if(i<=pMd5e){ translate([0,0,pMh7s+func6(pMd6e)-(tan(pMcutA)*(i-pMd5s)*glnd)]) rotate([270,0,i]) cylinder($fn=pMcutcylRez,d=pMgrooveD,h=pMgrooveOR); } //end if else{ translate([0,0,0]) rotate([270,0,i]) cylinder($fn=pMcutcylRez,d=pMgrooveD,h=pMgrooveOR); } //end else }//end hull }//end 1 for } //end left needle groove module
2D Cuts
- Parts to be cut out using a CNC machine
CKc1.scad
- need to add Nema motor mount
- would idlers help keep cenetered?
include <CKvars.scad>; CKc1(); module CKc1(){ rez=p2number*p2needles*2; //calculate desired rezolution $fn=rez; //defines resolution of circles. translate([c1OD/2,0,0]){ difference(){ union(){ cylinder(h=c1H,d=c1OD); } //end main union cylinder(h=c1H+2,d=p3baseID); // donut hole //base needle holes ////should these be circles instead? easier to cut? slot with rounded ends? for(i=[1:p2needles*p2number]){ rotate([0,0,(360/p2number/p2needles/2)-(360/p2number/p2needles*i)]){ translate([-p2OD/2,-needleWidth/2,-0.01]) cube([p2needlegrooveDepth,needleWidth,p3wallH+0.02]); } //end rotate } //end for //base mounting holes //inner holes for(i=[1:p3baseholenumber*p3number]){ rotate([0,0,(((360/p3number/p3baseholenumber))/2)-((360/p3number/p3baseholenumber)*i)]){ translate([-(p3baseID/2)-p3baseholefromODID,0,0]) cylinder(h=c1H+2,d=p3baseholeD,$fn=18); } //end rotate } //end inner hole set for //outer holes for(i=[1:p3baseholenumber*p3number]){ rotate([0,0,(((360/p3number/p3baseholenumber))/2)-((360/p3number/p3baseholenumber)*i)]){ translate([-(p3baseOD/2)+p3baseholefromODID,0,0]) cylinder(h=c1H+2,d=p3baseholeD,$fn=18); } //end rotate } //end outer hole set for } //end main difference } //end main translate } //end CKc1 module
CKc2.scad "geared plate"
- rotating plate with gears
- need to calculate teeth per distance around outer diameter
- Need to update depricated commands:
- DEPRECATED: child() will be removed in future releases. Use children() instead.
- DEPRECATED: The assign() module will be removed in future releases. Use a regular assignment instead.
Number of Teeth = Floor( ((-2*OutsideDiameter)/(PitchDiameter-OutsideDiameter)) -2 )
Circular Pitch = 180 * PitchDiameter / Number of Teether
include <CKvars.scad>; use <CKc3--topplate.scad> rez=p2number*p2needles*2; //calculate desired rezolution $fn=rez; //defines resolution of circles. pi=3.1415926535897932384626433832795; //solve for # of teeth and circ_pitch that gives proper tooth whole depth Td=5; //tooth depth-ish? - used to calculate # teeth large gear and pitch Tn=floor(((-2*c3OD)/((c3OD-Td)-c3OD))-2); //number of teeth? - for big gear pCir=180*(c3OD-(Td))/Tn; //circular pitch - use for both big and small gear echo("c3OD",c3OD); echo("Tn",Tn); echo("pitch",180*(c3OD-(Td))/Tn); echo("pCir",pCir); //c3 for review //translate([0,0,10]) //CKc3(); CKc2(); module CKc2(){ translate([0,-c3OD/2,0]){ difference(){ gear (circular_pitch=pCir, gear_thickness = c2H, rim_thickness = c2H, hub_thickness = c2H, circles=0); cylinder(h=c3H+2,d=c3ID); // donut hole //plate connector holes for(i=[1:c2connectors]){ rotate([0,0,((360/c2connectors)*i)]){ translate([0,(pMID/2)+(pMgroove)+1+(p8baseL/2),0]){ translate([0,p8holeC2C/2,-0.1]) cylinder(d=p8holeD,h=c2H+0.2,$fn=36); translate([0,-(p8holeC2C/2),-0.1]) cylinder(d=p8holeD,h=c2H+0.2,$fn=36); } //end translate to ring } //end rotate i } //end for for(i=[1:c2bmounts]){ rotate([0,0,((360/c2connectors)/2)+((360/c2bmounts)*i)]){ translate([0,(pMID/2)+(pMgroove)+1,0]){ //close enough? //smallbearingholder holes translate([-(p5wingW+p5bodyW+p5wingW)/2,0,0]){ translate([p5wingW+p5bodyW,0,0]){ //wing right holes translate([p5wingW/2,p5mounthole2front,0]) cylinder(d=p5mountholeOD,h=c2H+0.1,$fn=36); translate([p5wingW/2,p5wingL-p5mounthole2back,0]) cylinder(d=p5mountholeOD,h=c2H+0.1,$fn=36); } //end wing right translate //wing left holes translate([p5wingW/2,p5mounthole2front,0]) cylinder(d=p5mountholeOD,h=c2H+0.1,$fn=36); translate([p5wingW/2,p5wingL-p5mounthole2back,0]) cylinder(d=p5mountholeOD,h=c2H+0.1,$fn=36); }//end translate - center X of holes }//end translate to ring }//end for rotate }//end for }//end difference }//end main translate }//end module // Parametric Involute Bevel and Spur Gears by GregFrost // It is licensed under the Creative Commons - GNU LGPL 2.1 license. // © 2010 by GregFrost, thingiverse.com/Amp // http://www.thingiverse.com/thing:3575 and http://www.thingiverse.com/thing:3752 //================================================== // Bevel Gears: // Two gears with the same cone distance, circular pitch (measured at the cone distance) // and pressure angle will mesh. module gear ( number_of_teeth=Tn, circular_pitch=false, diametral_pitch=false, pressure_angle=28, clearance = 0.2, gear_thickness=5, rim_thickness=8, rim_width=5, hub_thickness=10, hub_diameter=15, bore_diameter=5, circles=0, backlash=0, twist=0, involute_facets=0, flat=false) { if (circular_pitch==false && diametral_pitch==false) echo("MCAD ERROR: gear module needs either a diametral_pitch or circular_pitch"); //Convert diametrial pitch to our native circular pitch circular_pitch = (circular_pitch!=false?circular_pitch:180/diametral_pitch); // Pitch diameter: Diameter of pitch circle. pitch_diameter = number_of_teeth * circular_pitch / 180; pitch_radius = pitch_diameter/2; echo ("Teeth:", number_of_teeth, " Pitch radius:", pitch_radius); // Base Circle base_radius = pitch_radius*cos(pressure_angle); // Diametrial pitch: Number of teeth per unit length. pitch_diametrial = number_of_teeth / pitch_diameter; // Addendum: Radial distance from pitch circle to outside circle. addendum = 1/pitch_diametrial; //Outer Circle outer_radius = pitch_radius+addendum; //Use if statement and mix/max to select tooth count and circular pitch that creates a radius that is smaller than the OD of the CKp3 //circular pitch defined bt ckp3OD. number of teeth calculated for target addendum. echo("radius",outer_radius); // Dedendum: Radial distance from pitch circle to root diameter dedendum = addendum + clearance; // Root diameter: Diameter of bottom of tooth spaces. root_radius = pitch_radius-dedendum; backlash_angle = backlash / pitch_radius * 180 / pi; half_thick_angle = (360 / number_of_teeth - backlash_angle) / 4; // Variables controlling the rim. rim_radius = root_radius - rim_width; // Variables controlling the circular holes in the gear. circle_orbit_diameter=hub_diameter/2+rim_radius; circle_orbit_curcumference=pi*circle_orbit_diameter; // Limit the circle size to 90% of the gear face. circle_diameter= min ( 0.70*circle_orbit_curcumference/circles, (rim_radius-hub_diameter/2)*0.9); difference() { union () { difference () { linear_exturde_flat_option(flat=flat, height=rim_thickness, convexity=10, twist=twist) gear_shape ( number_of_teeth, pitch_radius = pitch_radius, root_radius = root_radius, base_radius = base_radius, outer_radius = outer_radius, half_thick_angle = half_thick_angle, involute_facets=involute_facets); if (gear_thickness < rim_thickness) translate ([0,0,gear_thickness]) cylinder (r=rim_radius,h=rim_thickness-gear_thickness+1); } if (gear_thickness > rim_thickness) linear_exturde_flat_option(flat=flat, height=gear_thickness) circle (r=rim_radius); if (flat == false && hub_thickness > gear_thickness) translate ([0,0,gear_thickness]) linear_exturde_flat_option(flat=flat, height=hub_thickness-gear_thickness) circle (r=hub_diameter/2); } translate ([0,0,-1]) linear_exturde_flat_option(flat =flat, height=2+max(rim_thickness,hub_thickness,gear_thickness)) circle (r=bore_diameter/2); if (circles>0) { for(i=[0:circles-1]) rotate([0,0,i*360/circles]) translate([circle_orbit_diameter/2,0,-1]) linear_exturde_flat_option(flat =flat, height=max(gear_thickness,rim_thickness)+3) circle(r=circle_diameter/2); } } } module linear_exturde_flat_option(flat =false, height = 10, center = false, convexity = 2, twist = 0) { if(flat==false) { linear_extrude(height = height, center = center, convexity = convexity, twist= twist) child(0); } else { child(0); } } module gear_shape ( number_of_teeth, pitch_radius, root_radius, base_radius, outer_radius, half_thick_angle, involute_facets) { union() { rotate (half_thick_angle) circle ($fn=number_of_teeth*2, r=root_radius); for (i = [1:number_of_teeth]) { rotate ([0,0,i*360/number_of_teeth]) { involute_gear_tooth ( pitch_radius = pitch_radius, root_radius = root_radius, base_radius = base_radius, outer_radius = outer_radius, half_thick_angle = half_thick_angle, involute_facets=involute_facets); } } } } module involute_gear_tooth ( pitch_radius, root_radius, base_radius, outer_radius, half_thick_angle, involute_facets) { min_radius = max (base_radius,root_radius); pitch_point = involute (base_radius, involute_intersect_angle (base_radius, pitch_radius)); pitch_angle = atan2 (pitch_point[1], pitch_point[0]); centre_angle = pitch_angle + half_thick_angle; start_angle = involute_intersect_angle (base_radius, min_radius); stop_angle = involute_intersect_angle (base_radius, outer_radius); res=(involute_facets!=0)?involute_facets:($fn==0)?5:$fn/4; union () { for (i=[1:res]) assign ( point1=involute (base_radius,start_angle+(stop_angle - start_angle)*(i-1)/res), point2=involute (base_radius,start_angle+(stop_angle - start_angle)*i/res)) { assign ( side1_point1=rotate_point (centre_angle, point1), side1_point2=rotate_point (centre_angle, point2), side2_point1=mirror_point (rotate_point (centre_angle, point1)), side2_point2=mirror_point (rotate_point (centre_angle, point2))) { polygon ( points=[[0,0],side1_point1,side1_point2,side2_point2,side2_point1], paths=[[0,1,2,3,4,0]]); } } } } // Mathematical Functions //=============== // Finds the angle of the involute about the base radius at the given distance (radius) from it's center. //source: http://www.mathhelpforum.com/math-help/geometry/136011-circle-involute-solving-y-any-given-x.html function involute_intersect_angle (base_radius, radius) = sqrt (pow (radius/base_radius, 2) - 1) * 180 / pi; // Calculate the involute position for a given base radius and involute angle. function rotated_involute (rotate, base_radius, involute_angle) = [ cos (rotate) * involute (base_radius, involute_angle)[0] + sin (rotate) * involute (base_radius, involute_angle)[1], cos (rotate) * involute (base_radius, involute_angle)[1] - sin (rotate) * involute (base_radius, involute_angle)[0] ]; function mirror_point (coord) = [ coord[0], -coord[1] ]; function rotate_point (rotate, coord) = [ cos (rotate) * coord[0] + sin (rotate) * coord[1], cos (rotate) * coord[1] - sin (rotate) * coord[0] ]; function involute (base_radius, involute_angle) = [ base_radius*(cos (involute_angle) + involute_angle*pi/180*sin (involute_angle)), base_radius*(sin (involute_angle) - involute_angle*pi/180*cos (involute_angle)) ];
CKc3.scad
- todo - remove spacer mounting holes under mountain
include <CKvars.scad>; use <CKp8--plateconnector.scad> use <CKpM--mountain.scad> ////// //TODO // //*spacer mount holes should be further out from ID //*mounting holes for mountain tabs //*test place mountain for fit //*openbeam holes // ////// CKc3(); translate([c3OD/2,0,0]) translate([-p3wallOD/2,0,-12]) rotate([0,0,90]) CKpM(0); //translate([0,0,c3H]) //rotate([0,0,-90]) //CKp8(); echo((c3OD-c3ID)/2); module CKc3(){ rez=p2number*p2needles*2; //calculate desired rezolution $fn=rez; //defines resolution of circles. translate([c3OD/2,0,0]){ //[c3OD/2,0,0] difference(){ union(){ cylinder(h=c3H,d=c3OD); } //end main union cylinder(h=c3H+2,d=c3ID); // donut hole //plate connector holes for(i=[1:c2connectors]){ rotate([0,0,((360/c2connectors)*i)]){ translate([0,(pMID/2)+(pMgroove)+1+(p8baseL/2),0]){ translate([0,p8holeC2C/2,-0.1]) cylinder(d=p8holeD,h=pPspace2+0.2,$fn=36); translate([0,-(p8holeC2C/2),-0.1]) cylinder(d=p8holeD,h=pPspace2+0.2,$fn=36); } //end translate to ring } //end rotate i } //end for //mountain cutout rotate([0,0,90]) translate([-(((c2ID+(pMgroove*2)+(pMwallT*2))/2)*cos(90-(pMd1e-pMd0))),0,0]) cube([((((c2ID+(pMgroove*2)+(pMwallT*2))/2)*cos(90-(pMd1e-pMd0)))*2),((c2ID+(pMgroove*2)+(pMwallT*2))/2),c3H]); ////// //mounting bolt holes rotate([0,0,90]){ //1 translate([0,(cos(pMd1e-pMd0)*((pMID/2)+(pMshelfBoltD)+pMgroove)),0]) translate([-((((c2ID+(pMgroove*2)+(pMwallT*2))/2)*cos(90-(pMd1e-pMd0)))+(pMshelfX/2)),0,0]) cylinder(d=pMshelfBoltD, h=pMH, $fn=36); //2 translate([0,(cos(pMd1e-pMd0)*((pMID/2)+(pMshelfBoltD)+pMgroove)),0]) translate([-((((c2ID+(pMgroove*2)+(pMwallT*2))/2)*cos(90-(pMd1e-pMd0)))+(pMshelfX/2)),0,0]) translate([0,(((((c2ID+(pMgroove*2)+(pMwallT*2))/2)/cos(pMd1e-pMd0))-((pMID/2)+(pMshelfBoltD)+pMgroove))/1.5),0]) cylinder(d=pMshelfBoltD, h=pMH, $fn=36); mirror([1,0,0]){ //1 translate([0,(cos(pMd1e-pMd0)*((pMID/2)+(pMshelfBoltD)+pMgroove)),0]) translate([-((((c2ID+(pMgroove*2)+(pMwallT*2))/2)*cos(90-(pMd1e-pMd0)))+(pMshelfX/2)),0,0]) cylinder(d=pMshelfBoltD, h=pMH, $fn=36); //2 translate([0,(cos(pMd1e-pMd0)*((pMID/2)+(pMshelfBoltD)+pMgroove)),0]) translate([-((((c2ID+(pMgroove*2)+(pMwallT*2))/2)*cos(90-(pMd1e-pMd0)))+(pMshelfX/2)),0,0]) translate([0,(((((c2ID+(pMgroove*2)+(pMwallT*2))/2)/cos(pMd1e-pMd0))-((pMID/2)+(pMshelfBoltD)+pMgroove))/1.5),0]) cylinder(d=pMshelfBoltD, h=pMH, $fn=36); } //end mirror } //end rotate //end of bolt holes ////////////// //makerbeam holes } //end main difference } //end main translate } //end CKc3 module
CKc4.scad "spur gear"
- would this be better to print or cut?
include <CKvars.scad>; use <CKc3--topplate.scad> NEMAshaftOD=5; NEMAshaftCut=1; spurgearTn=16; rez=p2number*p2needles*2; //calculate desired rezolution $fn=rez; //defines resolution of circles. pi=3.1415926535897932384626433832795; //solve for # of teeth and circ_pitch that gives proper tooth whole depth Td=5; //tooth depth-ish? - used to calculate # teeth large gear and pitch Tn=floor(((-2*c3OD)/((c3OD-Td)-c3OD))-2); //number of teeth? - for big gear pCir=180*(c3OD-(Td))/Tn; //circular pitch - use for both big and small gear echo("c3OD",c3OD); echo("Tn",Tn); echo("pitch",180*(c3OD-(Td))/Tn); echo("pCir",pCir); CKc2(); module CKc2(){ union(){ difference(){ gear (circular_pitch=pCir, gear_thickness = c2H, rim_thickness = c2H, hub_thickness = c2H, circles=0); cylinder(h=c2H+2,d=NEMAshaftOD); // donut hole }//end difference translate([(NEMAshaftOD/2)-NEMAshaftCut,-NEMAshaftOD/2,0]) cube([NEMAshaftOD,NEMAshaftOD,c2H]); }//end union }//end module // Parametric Involute Bevel and Spur Gears by GregFrost // It is licensed under the Creative Commons - GNU LGPL 2.1 license. // © 2010 by GregFrost, thingiverse.com/Amp // http://www.thingiverse.com/thing:3575 and http://www.thingiverse.com/thing:3752 //================================================== // Bevel Gears: // Two gears with the same cone distance, circular pitch (measured at the cone distance) // and pressure angle will mesh. module gear ( number_of_teeth=spurgearTn, circular_pitch=false, diametral_pitch=false, pressure_angle=28, clearance = 0.2, gear_thickness=5, rim_thickness=8, rim_width=5, hub_thickness=10, hub_diameter=15, bore_diameter=5, circles=0, backlash=0, twist=0, involute_facets=0, flat=false) { if (circular_pitch==false && diametral_pitch==false) echo("MCAD ERROR: gear module needs either a diametral_pitch or circular_pitch"); //Convert diametrial pitch to our native circular pitch circular_pitch = (circular_pitch!=false?circular_pitch:180/diametral_pitch); // Pitch diameter: Diameter of pitch circle. pitch_diameter = number_of_teeth * circular_pitch / 180; pitch_radius = pitch_diameter/2; echo ("Teeth:", number_of_teeth, " Pitch radius:", pitch_radius); // Base Circle base_radius = pitch_radius*cos(pressure_angle); // Diametrial pitch: Number of teeth per unit length. pitch_diametrial = number_of_teeth / pitch_diameter; // Addendum: Radial distance from pitch circle to outside circle. addendum = 1/pitch_diametrial; //Outer Circle outer_radius = pitch_radius+addendum; //Use if statement and mix/max to select tooth count and circular pitch that creates a radius that is smaller than the OD of the CKp3 //circular pitch defined bt ckp3OD. number of teeth calculated for target addendum. echo("radius",outer_radius); // Dedendum: Radial distance from pitch circle to root diameter dedendum = addendum + clearance; // Root diameter: Diameter of bottom of tooth spaces. root_radius = pitch_radius-dedendum; backlash_angle = backlash / pitch_radius * 180 / pi; half_thick_angle = (360 / number_of_teeth - backlash_angle) / 4; // Variables controlling the rim. rim_radius = root_radius - rim_width; // Variables controlling the circular holes in the gear. circle_orbit_diameter=hub_diameter/2+rim_radius; circle_orbit_curcumference=pi*circle_orbit_diameter; // Limit the circle size to 90% of the gear face. circle_diameter= min ( 0.70*circle_orbit_curcumference/circles, (rim_radius-hub_diameter/2)*0.9); difference() { union () { difference () { linear_exturde_flat_option(flat=flat, height=rim_thickness, convexity=10, twist=twist) gear_shape ( number_of_teeth, pitch_radius = pitch_radius, root_radius = root_radius, base_radius = base_radius, outer_radius = outer_radius, half_thick_angle = half_thick_angle, involute_facets=involute_facets); if (gear_thickness < rim_thickness) translate ([0,0,gear_thickness]) cylinder (r=rim_radius,h=rim_thickness-gear_thickness+1); } if (gear_thickness > rim_thickness) linear_exturde_flat_option(flat=flat, height=gear_thickness) circle (r=rim_radius); if (flat == false && hub_thickness > gear_thickness) translate ([0,0,gear_thickness]) linear_exturde_flat_option(flat=flat, height=hub_thickness-gear_thickness) circle (r=hub_diameter/2); } translate ([0,0,-1]) linear_exturde_flat_option(flat =flat, height=2+max(rim_thickness,hub_thickness,gear_thickness)) circle (r=bore_diameter/2); if (circles>0) { for(i=[0:circles-1]) rotate([0,0,i*360/circles]) translate([circle_orbit_diameter/2,0,-1]) linear_exturde_flat_option(flat =flat, height=max(gear_thickness,rim_thickness)+3) circle(r=circle_diameter/2); } } } module linear_exturde_flat_option(flat =false, height = 10, center = false, convexity = 2, twist = 0) { if(flat==false) { linear_extrude(height = height, center = center, convexity = convexity, twist= twist) child(0); } else { child(0); } } module gear_shape ( number_of_teeth, pitch_radius, root_radius, base_radius, outer_radius, half_thick_angle, involute_facets) { union() { rotate (half_thick_angle) circle ($fn=number_of_teeth*2, r=root_radius); for (i = [1:number_of_teeth]) { rotate ([0,0,i*360/number_of_teeth]) { involute_gear_tooth ( pitch_radius = pitch_radius, root_radius = root_radius, base_radius = base_radius, outer_radius = outer_radius, half_thick_angle = half_thick_angle, involute_facets=involute_facets); } } } } module involute_gear_tooth ( pitch_radius, root_radius, base_radius, outer_radius, half_thick_angle, involute_facets) { min_radius = max (base_radius,root_radius); pitch_point = involute (base_radius, involute_intersect_angle (base_radius, pitch_radius)); pitch_angle = atan2 (pitch_point[1], pitch_point[0]); centre_angle = pitch_angle + half_thick_angle; start_angle = involute_intersect_angle (base_radius, min_radius); stop_angle = involute_intersect_angle (base_radius, outer_radius); res=(involute_facets!=0)?involute_facets:($fn==0)?5:$fn/4; union () { for (i=[1:res]) assign ( point1=involute (base_radius,start_angle+(stop_angle - start_angle)*(i-1)/res), point2=involute (base_radius,start_angle+(stop_angle - start_angle)*i/res)) { assign ( side1_point1=rotate_point (centre_angle, point1), side1_point2=rotate_point (centre_angle, point2), side2_point1=mirror_point (rotate_point (centre_angle, point1)), side2_point2=mirror_point (rotate_point (centre_angle, point2))) { polygon ( points=[[0,0],side1_point1,side1_point2,side2_point2,side2_point1], paths=[[0,1,2,3,4,0]]); } } } } // Mathematical Functions //=============== // Finds the angle of the involute about the base radius at the given distance (radius) from it's center. //source: http://www.mathhelpforum.com/math-help/geometry/136011-circle-involute-solving-y-any-given-x.html function involute_intersect_angle (base_radius, radius) = sqrt (pow (radius/base_radius, 2) - 1) * 180 / pi; // Calculate the involute position for a given base radius and involute angle. function rotated_involute (rotate, base_radius, involute_angle) = [ cos (rotate) * involute (base_radius, involute_angle)[0] + sin (rotate) * involute (base_radius, involute_angle)[1], cos (rotate) * involute (base_radius, involute_angle)[1] - sin (rotate) * involute (base_radius, involute_angle)[0] ]; function mirror_point (coord) = [ coord[0], -coord[1] ]; function rotate_point (rotate, coord) = [ cos (rotate) * coord[0] + sin (rotate) * coord[1], cos (rotate) * coord[1] - sin (rotate) * coord[0] ]; function involute (base_radius, involute_angle) = [ base_radius*(cos (involute_angle) + involute_angle*pi/180*sin (involute_angle)), base_radius*(sin (involute_angle) - involute_angle*pi/180*cos (involute_angle)) ];
To Do
- plate connector holes - need to tweak length/size of spacer?
- spur gear - use pitch from c2, calculate distance from c2
- large bearing mount holes - need to redraw large bearing holder for new mountain?
- table plate w/nema etc
- table legs?
- weight holder plate
- create 3D printed electronics box?
- yarn stick holder etc
- tensioner etc
Future Work
- create design so that mountains are stationary and needles rotate
- add multiple mountains, yarn can remain stationary
- output fabric spool must rotate too
- RotoKnitic v19.01
See Also
- Open Source Textile Construction Set
- Open Source Circular Knitting Machine
- CircularKnitic Parametric