OSE CircularKnitic v18.03: Difference between revisions
Jump to navigation
Jump to search
Line 1,868: | Line 1,868: | ||
*https://en.wikipedia.org/wiki/List_of_gear_nomenclature | *https://en.wikipedia.org/wiki/List_of_gear_nomenclature | ||
*https://en.wikipedia.org/wiki/Gear#Nomenclature | *https://en.wikipedia.org/wiki/Gear#Nomenclature | ||
*https://www.wyzant.com/resources/lessons/math/algebra/properties_of_algebra |
Revision as of 22:26, 5 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 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=((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); /* MAX() of distance from mountain and distance from plate spacers bolts */ 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
- 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>; // Copyright 2010 D1plo1d // LGPL 2.1 t2t=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)/t2t)-1; c2dipitch=c2teeth/(c2OD*PI); gear(c2teeth,circular_pitch=false,diametral_pitch=c2dipitch,pressure_angle=87, clearance=0.01); //test_involute_curve(); //test_gears(); //demo_3d_gears(); // Geometry Sources: // http://www.cartertools.com/involute.html // gears.py (inkscape extension: /usr/share/inkscape/extensions/gears.py) // Usage: // Diametral pitch: Number of teeth per unit length. // Circular pitch: Length of the arc from one tooth to the next // Clearance: Radial distance between top of tooth on one gear to bottom of gap on another. module gear(number_of_teeth, circular_pitch=false, diametral_pitch=false, pressure_angle=20, clearance = 0) { 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; // Base Circle base_diameter = pitch_diameter*cos(pressure_angle); base_radius = base_diameter/2; // 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; outer_diameter = outer_radius*2; // 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; root_diameter = root_radius * 2; half_thick_angle = 360 / (4 * number_of_teeth); difference() { union() { rotate(half_thick_angle) circle($fn=number_of_teeth*2, r=root_radius*1.001); for (i= [1:number_of_teeth]) //for (i = [0]) { 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); } } } projection(cut = true) //use projection to create 2D { cylinder(d=c2ID,h=100); } } } module involute_gear_tooth( pitch_radius, root_radius, base_radius, outer_radius, half_thick_angle ) { pitch_to_base_angle = involute_intersect_angle( base_radius, pitch_radius ); outer_to_base_angle = involute_intersect_angle( base_radius, outer_radius ); base1 = 0 - pitch_to_base_angle - half_thick_angle; pitch1 = 0 - half_thick_angle; outer1 = outer_to_base_angle - pitch_to_base_angle - half_thick_angle; b1 = polar_to_cartesian([ base1, base_radius ]); p1 = polar_to_cartesian([ pitch1, pitch_radius ]); o1 = polar_to_cartesian([ outer1, outer_radius ]); b2 = polar_to_cartesian([ -base1, base_radius ]); p2 = polar_to_cartesian([ -pitch1, pitch_radius ]); o2 = polar_to_cartesian([ -outer1, outer_radius ]); // ( root_radius > base_radius variables ) pitch_to_root_angle = pitch_to_base_angle - involute_intersect_angle(base_radius, root_radius ); root1 = pitch1 - pitch_to_root_angle; root2 = -pitch1 + pitch_to_root_angle; r1_t = polar_to_cartesian([ root1, root_radius ]); r2_t = polar_to_cartesian([ -root1, root_radius ]); // ( else ) r1_f = polar_to_cartesian([ base1, root_radius ]); r2_f = polar_to_cartesian([ -base1, root_radius ]); if (root_radius > base_radius) { //echo("true"); polygon( points = [ r1_t,p1,o1,o2,p2,r2_t ], convexity = 3); } else { polygon( points = [ r1_f, b1,p1,o1,o2,p2,b2,r2_f ], convexity = 3); } } // 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); // Polar coord [angle, radius] to cartesian coord [x,y] function polar_to_cartesian(polar) = [ polar[1]*cos(polar[0]), polar[1]*sin(polar[0]) ]; // Test Cases //=============== module test_gears() { gear(number_of_teeth=51,circular_pitch=200); translate([0, 50])gear(number_of_teeth=17,circular_pitch=200); translate([-50,0]) gear(number_of_teeth=17,diametral_pitch=1); } module demo_3d_gears() { //double helical gear translate([50,0]) { linear_extrude(height = 10, center = true, convexity = 10, twist = -45) gear(number_of_teeth=17,diametral_pitch=1); translate([0,0,10]) rotate([0,180,180/17]) linear_extrude(height = 10, center = true, convexity = 10, twist = 45) gear(number_of_teeth=17,diametral_pitch=1); } //spur gear translate([0,-50]) linear_extrude(height = 10, center = true, convexity = 10, twist = 0) gear(number_of_teeth=17,diametral_pitch=1); } module test_involute_curve() { for (i=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]) { translate(polar_to_cartesian([involute_intersect_angle( 0.1,i) , i ])) circle($fn=15, r=0.5); } }
CKc3.sacd
- need to fix ID and OD
- formula from mountain groove OD has a bug?
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
To Do
- upper plate - mountain holder
- plate connector holes
- gear plate tooth calculations
- bearing mount holes
- table plate w/nema etc
- table legs?
- weight holder plate
- create 3D printed electronics box?
- yarn stick holder etc
- tensioner etc
- 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