OSE CircularKnitic v18.03: Difference between revisions

From Open Source Ecology
Jump to navigation Jump to search
Line 1,522: Line 1,522:


Number of Teeth = Floor( ((-2*OutsideDiameter)/(PitchDiameter-OutsideDiameter)) -2 )
Number of Teeth = Floor( ((-2*OutsideDiameter)/(PitchDiameter-OutsideDiameter)) -2 )
Circular Pitch = 180 * PitchDiameter / Number of Teether


  <nowiki>
  <nowiki>

Revision as of 22:05, 5 January 2019

Overview

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

edit image

  • 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

CKneedle-dimensions.png

CKneedleVars-KH260.scad

CKneedle-kh260.png

//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"

CKpM.png

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

OSE - OpenKinitic v0318 - mountain groove diagram.png


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

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

CKc3.png

  • 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

Useful Links