CircularKnitic Parametric

From Open Source Ecology
Jump to: navigation, 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

edit image

  • 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

CKp2.png

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

CKp3.png



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

CKp4.png

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

CKneedle-dimensions.png

CKneedleVars-SK120.scad

CK-needle-scad.png

  • 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

Media:CircularKnitic.skp

github

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
  • 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.

[2]

[3]

See Also

Useful Links