CircularKnitic Parametric
Jump to navigation
Jump to search
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