CircularKnitic Parametric
Contents
Basics
Goal: Replicate CircularKnitic's designs with OpenScad to allow for larger machines to be built
Note: Design changes for OSE's fork found here: OSE CircularKnitic v18.03
Code
CKvars.scad
- need to overhaul to pull in needle variables
- bearingholder-small is 5.5 from base to center of bearing. with total heigh of 10.5 with bearing mounted.
- need tweak so that it is only 10. or lower bottom of needle groove in part p3 by 0.5.
- can lower p3's needle groove's max height to 60.5.
include <CKneedleVars-SK120.scad>; //select needle size file that will be used ////MAIN SETTINGS//// //diameter from inside edge of needles p2needlegrooveID=274.4; //number of "p2" parts around circle p2number=12; //number of needles mounted on each "p2" part p2needles=5; //number of "p3" parts around circle p3number=4; //number of "p4" parts around circle p4number=4; ////PART SETTINGS//// //p2 needleWidth=1.8; p2needlegroovefromID=2.2; p2ID=p2needlegrooveID-(p2needlegroovefromID*2); p2needlegrooveDepth=2.8; p2H=104; p2W=4.8; p2OD=p2ID+(p2W*2); p2holeH=75; p2holeD=2; p2holeCSD=4.01726; p2holeCSL=1.5; //p3 p3wiggle=0.1; p3baseH=3; p3baseID=p2ID-20-(p3wiggle*2); p3baseOD=p2OD+20+(p3wiggle*2); p3baseholefromODID=3; p3baseholeD=3; p3baseholenumber=4; p3ridgeW1=3; p3ridgeW2=5; p3ridgeH=5; p3wallW=3; p3wallchamfW=2; p3wallchamfH=3; p3wallHaboveholesc=5; p3grooveH1=18; ///greater of: height of gear plate OR needle's nB dimension p3grooveH2=73; p3grooveW=2.2; //p4 p4rampW=4; 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=5.09; p4clawW=9; p4holesnumber=3; p4holeH=5; //calculated settings centerlineD=p2ID+(p2W+(p3wiggle*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; p3wallH=p3wallHaboveholesc+p2holeH+p3baseH; ////SETTINGS OUTPUT ECHOS/// echo("Total Needles:", p2number*p2needles); echo("Millimeters Between Needles:", PI*p2needlegrooveID/(p2number*p2needles));
CKp2.scad
include <CKvars.scad>; CKp2(); module CKp2(){ rez=360/p2number*2*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; rotate([0,0,-firstcenter]){ 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+firstcenter]){ 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 module
CKp3.scad
include <CKvars.scad>; CKp3(); module CKp3(){ rez=360/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 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); } } 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); } } //first and last holes rotate([0,0,-firstcenter]){ 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); } } rotate([0,0,-(360/p2number*(p3number-1))+firstcenter]){ 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); } } //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); } } } //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); } } }//end for //end middle holes } } } //end module
CKp4.scad
- Curve of ramp not exactly the same as the original.
- I think its close enough until proven otherwise :D
include <CKvars.scad>; CKp4(); module CKp4(){ rez=360/p2number*2*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 for(i=[1:p2number/p4number]){ rotate([0,0,(360/p2number)-(360/p2number*i)-((360/p2number)/2)]){ 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 union } } } //end holes for } //end main difference } //end main translate } //end module
CKmountain.scad
- 50mm tall
- 5.75mm from top of path to top of part
- 37.2mm from bottom of path to bottom of part
- groove 7mm high at top
- width of flat part of path at highest point in X 15mm
- groove 9.5mm high in Z on incline
- groove entrance 11.8 from bottom
- groovy top at lowest point 6.8mm from base
- center of lowest point from side in X ~8mm
- path angle ~45 degrees
- thickness at thinnest section 19.5
- relates to butt of needle nH
- groove depth 12mm
Needle Files
CKneedleVars-SK120.scad
- estimated "H" value using mountain stl file
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.
CKneedle.scad
used to render needle
//needle variable file you want to use include <CKneedleVars-SK120.scad>; needle(); module needle(){ mH=0.00001; bP=1.6; bN=0.6; $fn=36; translate([nX/2,0,(nX/2)]){ //flipper cut diff difference(){ union(){ minkowski(){ union(){ //tail translate([0,nX/2,0]) cube([nY-nX,nB-(nY*bN),mH]); //bottom curve of butt translate([-(nY*bP)+nY,nB-(nY*bN)+nX/2,0]){ intersection(){ difference(){ cylinder(r=(nY*bP)-nX,h=mH); cylinder(r=(nY*bN),h=mH); }//end diff cube([(nY*bP)-nX,(nY*bP)-nX,mH]); } //end inters } //end bottom curve of butt translate translate([-(nH-(nC/2)-(nY*1.4))-(nY*1.4)+nY,nB+(nC/2)-((nC-nX)/2),0]) cube([nH-(nC/2)-(nY*bP),nY-nX,mH]); //C curve translate([-(nH-(nC/2)-(nY*bP))-(nY*bP)+nY,nB+(nC/2),0]){ difference(){ cylinder(d=nC-nX,h=mH); cylinder(d=(nC-nX)-((nY-nX)*2),h=mH); translate([0,-nC/2,0]) cube([nC,nC,mH]); }//end diff } //end C curve translate //second horz translate([-(nH-(nC/2)-(nY*bP))-(nY*bP)+nY,nB+(nC/2)+(((nC-nX)-((nY-nX)*2))/2),0]) cube([nH-(nC/2)-(nY*bP),nY-nX,mH]); //end second horz //upper curve of butt translate([-(nY*bP)+nY,nB+nC+(nY*bN)-(nX/2),0]){ intersection(){ difference(){ cylinder(r=(nY*bP)-nX,h=mH); cylinder(r=(nY*bN),h=mH); }//end diff translate([0,-((nY*bP)-nX),0]) cube([(nY*bP)-nX,(nY*bP)-nX,mH]); } //end inters } //end upper curve of butt translate //mid section translate([0,nB+(nC/2)+(((nC-nX)-((nY-nX)*2))/2)+(nY*bP)-nX,0]) cube([nY-nX,nA-(nE*2)-(nB+(nC/2)+(((nC-nX)-((nY-nX)*2))/2)+(nY*bP)-nX),mH]); //end mid section } //end union //traveling minkowski shape sphere(d=nX); } //end minkowski //transition to hook hull(){ minkowski(){ translate([0,nA-(nE*2),0]) cube([nY-nX,mH,mH]); sphere(d=nX); } translate([nY-(nG/2)-(nX/2),nA-(nD/2),0]) sphere(d=nG); } //end transition to hook //hook body minkowski(){ difference(){ translate([nY-(nD/2)-(nX/2),nA-(nD/2),0]) cylinder($fn=36,d=nD-nG,h=mH); translate([nY-(nD/2)-(nX/2),nA-(nD/2),0]) cylinder($fn=36,d=nD-nG-0.001,h=mH); translate([(nY-(nD/2)-(nX/2))-(nD/2),(nA-(nD/2))-nD,0]) cube([nD,nD,mH]); } sphere(d=nG); } //end hook body //hook tip hull(){ translate([nY-(nG/2)-(nX/2)-nD+nG,nA-(nD/2),0]) sphere(d=nG); translate([nY-nD-(nG/4),nA-nE+(nG/4),0]) sphere(d=nG/2); } //end hook tip } //end union translate([-15-(nX/2)+(nY/3),nA-nF+(nY/2),-(nX/2)]) cylinder($fn=360,d=30,h=nX); } //end flipper cut difference //flipper hull(){ minkowski(){ translate([-nX/3,nA-(nF/2)-(nD/3),0]) cube([nY-nX,mH,mH]); sphere(d=nX/3); } translate([-(nY/2),nA-nF+(nX/3),0]) sphere(d=nX/3); } //end flipper } //end main translate } //end module
Original Files
Notes
- all measurements in millimeters as used in original design
Needles
- I think original CircularKnitic uses needles from Brother brand knitting machines
- These machines were last produced in 1996 [1]
- Needles are different shapes/sizes for each model.
- Brother needles are sometimes available from specialty stores online
- Comments on the CircularKnitic Instructables comments section indicate people having trouble with sourcing same needles
- Silver-Reed brand machines are still being produced
- might be good to switch to needles are are being made for new machines
- http://www.knitknackshop.com/silver-reed-acc.html
- Need to change heights and depths based on different needle availabilty
- Perhaps need to make needle dimensions as input variables to allow different needles to be used
- would allow more flexibility in sourcing.
- Perhaps need to make needle dimensions as input variables to allow different needles to be used