RotoKnitic v19.01

From Open Source Ecology
Jump to: navigation, search

Testing

First run -

CAD

See more below

Rotoknit.png

Intro

Using same parts and materials from OSE CircularKnitic v18.03, but switch mounting plates so that the mountain is stationary.

  • requires spinning spool for fabric output
  • allows for more multiple mountains and input threads

Design

Concept

Standard

RotoKnitic - Concept Drawing 20190102.png

google doc

Pick-a-Needle

OSE - RotoKnitic Pick-a-Needle - Concept Drawing 20190427.png

google doc

Goals

  • change direction
  • sock heels

Needle Accomodation

  • pick-a-needle, optionally raise needles to an inactive postion
  • Test laser cut needles, printed latch?
  • Test 3D printed needles

Fabric Spool

  • Apply constant tension on fabric
  • Roll onto spool for easy handling and storage


Improve Stepper Control

Provisional BOM

Part SCAD Code

Variable Profiles

CKvarsProfile_36in_201906.scad


///////////////////  USER SETTINGS  ///////////////////

/////////////
//  USING THIS FILE:
//  choose desired settings below
//  rename and save this file into the "SCAD" folder
//  for example CKvarsProfile-Small2019.scad
//  then open the file named CKvars.scad in the "SCAD" folder
//  find the "include" commands at the begining of the file
//  change this information to the new file's name, then save
//  you can now open then render each part file with these settings
/////////////

//File Notes - Large201903
// attempting to get near 45" 1100mm fabric width/circumference
// 

/////////////
// DIMENSIONS

//number of "p2" needle guides around circle                    //Jan2019  //small
UPp2number=30;                //12                //36  ///36   //12       //8

//number of needles mounted on each "p2" part
UPp2needles=5;                //5                 //10  ///5    //5        //7

//number of "p3" parts around circle
UPp3number=10;                 //4                 //18  ///4    //4        //2

//number of "p4" parts around circle
UPp4number=10;                 //4                 //18  ///4    //4        //2

//distance from the inside face of one needle to the next
UPneedle2needle=9.7;     //default=14.35615  //try 8.414    //13.5334  //9.25

//mountain settings
UPpMgrooveturnR=14; //radius of upper curved path in groove //14  //10
UPpMgrooveturnR2=7; //radius of lower curved path in groove //7
UPpMp3X=2.5;        //length of lower plateu of groove  //2.5   //2
UPpMp7X=3;          //half of length of top plateu of groove //3  //2

UPnumberMountain=6;

/////////////
// MATERIALS

//thread diameter
UPthreadD=2.5;

//number of stepper motors driving the geared plate
UPc1steppersnumber=UPnumberMountain;  

//laser cut part thickness
UPupper_surfaceH=5;  //thickness of upper rotating plate  ///5  //6.35= 1/4"inch
UPbottom_surface_motor_gearsH=5;  //thickness of geared rotating plate
UPtable_surface=10;        //thickness of plate of main table

UPtable_support=12.7;       //thickness of support board below table surface

//width of wood used to support table around the edges
UPwoodbeamW=25.4;           //table leg wood beam width  1.0 inch
UPwoodbeamScrewOD=6;     // M6 screw hole into wood beam

//thread feeder option
UPTF=1;    //  0=none  1=angle iron  2=makerbeam10mm

//angle iron option dimensions
UPaaX=12.7;      //width            //12.7    =  1/2in          
UPaaT=1.5875;    //thickness        //1.5875  = 1/16in

///////////////////////////////////////////////
 

CKvars.scad


//////////////////////////////////////
///// Circular Knitic Variables //////
//////////////////////////////////////


//////////////////////////////////////
///////  CHOOSE MAIN SETTINGS  ///////

//select the needle size file that will be used
include <CKvarsNeedle-KH260.scad>;

//select the settings profile file
include <CKvarsProfile_36in_201906.scad>;

//////////////////////////////////////






//////////////////////////////////////
///////   ADVANCED SETTINGS    ///////

//number of "p2" parts around circle                          //Jan2019  //small
p2number=UPp2number;        //12                //36  ///36   //12       //8

//number of needles mounted on each "p2" part
p2needles=UPp2needles;      //5                 //10  ///5    //5        //7

//number of "p3" parts around circle
p3number=UPp3number;        //4                 //18  ///4    //4        //2

//number of "p4" parts around circle
p4number=UPp4number;        //4                 //18  ///4    //4        //2

//distance from the inside face of one needle to the next
needle2needle=UPneedle2needle; //default=14.35615             //13.5334  //9.25

//number of mountains aka number of thread spools being used at a time
numberMountain=UPnumberMountain;

//calculated diameter from inside edge of needles
p2needlegrooveID=((needle2needle*p2number*p2needles)/PI);


//nnumber of Z bearing mounts
c1zmounts=max(p3number,4);           //p3number  //4

c1steppersnumber=UPc1steppersnumber;  //number of stepper motors driving the gear

c1Sides=max(6,c1steppersnumber);  //number of sides of plate


Td=5; //tooth depth-ish? - used to calculate # teeth large gear and pitch

////MATERIALS////

//thread diameter
threadD=UPthreadD;
//approx fabric circumference
echo("estimated fabric circumference", threadD*2*1.3*p2number*p2needles);

//thread feeder stand above mountain
TF=UPTF;    //  0=none  1=angle iron  2=makerbeamm
TFW=60;  //distance between outside edge of makerbream
aaX=UPaaX;   //12.7 = 1/2in
aaT=UPaaT;    //1.5875 = 1/16in
aaboltD=3;
aaboltHD=5.68;
aaboltHH=3;
aanutH=4;
aasqNutW=5.5;
aasqNutH=1.8;
aasqNutSlop=0.25;
pM2slop=0.35;
pM2H=aaX*3;
pM2mink=4;
pM2fH=10;
tipHole=3;    //hole Size 
tipOpenX=10;
tipOpenZ=10;
tipcylD=1.75;  //1.5
tipcy2D=tipcylD*1.5;


//-(tipOpenX/2)+(tipcylD/2)

//thickness of upper rotating plate  ///5  //6.35= 1/4"inch
upper_surfaceH=UPupper_surfaceH;  
//thickness of geared rotating plate
bottom_surface_motor_gearsH=UPbottom_surface_motor_gearsH;  
//thickness of plate of main table
table_surface=UPtable_surface;  
//thickness of support board below main table
table_support=UPtable_support;

woodbeamW=UPwoodbeamW; //table leg wood beam width  1.0 inch
woodbeamScrewOD=UPwoodbeamScrewOD;   // 1/4" screw hole

////PART SETTINGS////

//plate 
pPplate1=bottom_surface_motor_gearsH;  //thickness of geared plated
pPplate2=upper_surfaceH;
pPplate3=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
bearingholderSmallgaproll=0.05; //extra space to leave below bearing for rolling
bearingholderSmallgapclear=0.5; //extra space to leave above bearing inside holder


//BearringZ
bearingholderZBOD=10;   //Outside Diameter of bearing
bearingholderZBID=4.9;    //Inside Diameter of bore hole of bearing
bearingholderZBW=4;     //Width of bearing  //4

//p1 - stepper gear
NEMAshaftOD=5;
NEMAshaftCut=0.5;
NEMAshaftL=20;   //length of shaft from motor face
NEMAshaftFL=15;  //length of flat side of shaft

NEMAboltOD=3;
NEMAboltHeadH=3;
NEMAboltHeadOD=5.68;
NEMAboltHexOD=2.87;
NEMAfaceCricOD=22;
NEMAboltDis=31;
NEMAmotorW=42;

NEMAsetboltL=8;  //length of M3 botl used for set screw
NEMAsetboltOD=3;
NEMAsetHeadOD=5.68;
NEMAsqNutW=5.5;
NEMAsqNutH=1.8;
NEMAsqNutSlop=0.25;


spurgearTn=16;  //number of teeth on bull gear

//p2 - inner needle wall holder
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;  //depricate
p2holeCSD=4.01726;  //depricate
p2holeCSL=1.5;  //depricate
p2endtrim=0.5;  //trim end of wall to give room between p2's
p2p3boltType=2;  //1 = reg cap screw, 2 = flat cap screw
//type 1
p2p3boltD=3;
p2p3boltHH=3;
p2p3boltHD=5.68;
//type 2
p2p3flatD=3;
p2p3flatHA=90;
p2p3flatHD=6.72;  //listed as 6.72 max 5.54 min
p2p3flatHH=1.86;
p2p3nutH=4;
p2p3nutOD=6.01;

p2p4type=0;  //0 for regular, 1 for flat
p2p4flatD=2;
p2p4boltD=2;
p2p4flatHA=90; //angle between head's slopes
p2p4flatHD=6.72;  //listed as 6.72 max 5.54 min
p2p4boltHD=4.16;  //head Diameter
p2p4flatHH=1.86;
p2p4boltHH=2;  //head height
p2p4nutH=1.6;

echo("p2 lower bolt L",p2W+p3upperwallW+0); //fix
echo("p2ID", p2ID);

//p3 - outer needle wall slide
p3wiggle=0.1;
p3baseH=3; //height of outer base
p3wallW=(nH-nY)/2;  //half of needle butt
p3upperwallW=3;
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
p3grooveHslop=1;
p3grooveWslop=0.8;  //extra Width in needle groove
p3grooveW=nX+p3grooveWslop;
p3clear=5;   //distance from top of p3 to needle flipper in down position
p3baseID2N=2; //clearance between baseID and needles
p3baseID=p2OD+(p3baseID2N*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));
p3base45W=p3ridgeW2+p3wiggle+p2W+p3wiggle+p3baseID2N;
p3base45H=p3base45W; //height of 45 degree overhang
p3needleholefactorW=1.5; //multiply width of needle tail hole in base by this
p3endtrim=0.5;

//p4
p4rampH=14.57;
p4rampfromID=2.5;
p4rampoverhangH=4;
p4rsH=p4rampH-p4rampoverhangH;  //height of ramp surface
p4rampfromOD=1.34;
p4rampC1=10;
p4rampC2=40;
p4rampC2transX=10;
p4rampC2transZ=3.82;
p4basegapH=max(p2p4flatD*3,8);
p4baseH=p4basegapH+nD;  //sin(45) of angle from front of needle??
p4baseW=11.2;
p4basegapW=p2W+0.2; //5.09
p4clawW=min((needle2needle-(nX*2)),9);
p4holesnumber=3;
p4holeH=p4basegapH/2;
p4rampW=max(min(p4clawW-3,4),2.5);
p4rampMinkD=(p4rampW/3)*2;  //minkoski diameter 
p4rampWm=p4rampW-p4rampMinkD;
p4clear=-0.5;  //distance above top of p4 from flipper in down position //need to fix -0.5?  //-p4rampH*(1/3) or -5?
//p4clear maybe need to calculate sin(45) distnace from top of baseH, distance from OD of needle to ID of base
p4endtrim=0.5;
p4clawWslanttop=1;   //0 = slant to rampW, p4rampW = no slant

echo("rampW", p4rampW);


//space between rotating plates
pPextra=1;   //extra room below nC at lowest point
pPspace2=nC+(p4baseH-p4basegapH)+pPextra; //space between geared plate and mountain plate, needle nC?  //12

//p5 small bearing holder
p5boltHeadOD=8; //look up sales drawing - used to cut mountain
p5boltHeadH=3.65;  //look up sales drawing - used to cut mountain
p5nutH=3;  //jam nut
p5boltD=5;
p5boltL=25;  //bolt to hold bearings
p5wingW=7;
p5wingL=p5boltHeadH+p5boltL;
p5wingH=3;
p5bodyW=bearingholderSmallBOD+6;
p5bodyL=p5boltL-p5nutH;
p5bearCl=1.5; //distance from top of body to OD of bearing
p5bodyH=bearingholderSmallgapclear+bearingholderSmallBOD-p5bearCl;
p5wiggleL=0.4;  //clearnace around bearing
p5wiggleW=0.25; //clearnace around bearing
p5bearingfromwall=4.25;
p5mountholeOD=3;     //mounting bolt OD
p5mountBoltHeadOD=5.68;

pPspace1=bearingholderSmallgapclear+bearingholderSmallBOD+bearingholderSmallgaproll; //? space from main table top to first plate - calc w/ bearing holder height, stepper motor shaft length?
//made max of bearing holder, and p3wall45H?

echo("pPspace1",pPspace1);

p1H=pPspace1+pPplate1+1;

//p6 big bearing holder - depricated
p6wingW=30;
p6wingL=25;
p6wingH=3;
p6bodyW=16;
p6bodyL=25;
p6bodyH=9.5;
p6wiggleL=0.4;
p6wiggleW=0.6;
p6bearingfromwall=4.25;
p6mountholeOD=3;
p6mountholeHeadOD=5.68;  //OD of socket screw head
p6mounthole2front=8;
p6mounthole2side=3;

//p7 Z bearing holder - need to tweak more for different size bearings

    //bearing bolt
p7boltHeadOD=8; //look up sales drawing - used to cut mountain
p7boltHeadH=3.65;  //look up sales drawing - used to cut mountain
p7nutH=2.7;  //jam nut
p7boltD=5;
p7boltL=16;  //bolt to hold bearings

p7baseH=4;
p7wallW=3;
p7mountH=bearingholderZBOD-2;
p7mountholeOD=3;
p7mountholeHeadOD=5.68;
p7mountnutOD=6.01;
p7mountnutH=3;
p7mounthole2edge=4.5;
p7bearingfromfront=3;
p7wiggleL=0.4;
p7wiggleW=0.25;
p7baseW=bearingholderZBOD+8;  //16
p7baseL=max((((p7bearingfromfront+bearingholderZBW+p7bearingfromfront)*2)+p7wallW),(p7mountholeHeadOD*2)+p7wallW,(p7mounthole2edge*2)+p7wallW);  //23
p7mountL=(p7baseL-p7wallW)/2;  //13

echo("suggested boltL for Z bearing", ceil(((((p7baseL-p7wallW)/2)+p7wallW+p7nutH)/2))*2   );

//p8 plate connector
p8boltHeadOD=5.68; //look up sales drawing - used to cut mountain
p8boltHeadH=3;  //look up sales drawing - used to cut mountain
p8nutH=4;  //jam nut
p8boltD=3;
p8boltL=30;  //bolt to hold bearings  ????

p8baseW=8;
p8holeD=p8boltD;
p8H=pPspace2;


echo("suggested boltL for spacer", ceil((upper_surfaceH+pPspace2+bottom_surface_motor_gearsH+p8nutH)/5)*5   );  //20,22,25,30 commonly availabble

//p9 outer connector
p9thickness=3;
p9H=10;

//mountain
pMwallT=9;  //min thickness from groove to back wall  //7.5  //10
pMgroove=nH-nY-p3wallW+1;  //depth of groove
pMgrooveSlop=0.5;  //height slop of groove
pMgrooveD=nC+pMgrooveSlop; //Z plane diamter of groove cut 
pMgrooveAngle=45;  // only 45 is working
pMgrooveC1=pPspace2;    //top of groove at position 1 "entrance"  pPspace2 ///////////
pMgrooveC2=nC+pPextra;        //top of groove at position 2 "push down"  nC+2 ////////////
echo("pushdown distance",pPspace2-(nC+pPextra));
threadthickness=0.5;    //approx used to leave space above p2

pMgrooveC3=pMgrooveC2+(pMgrooveD-nC)-(nG+threadthickness)+(p4baseH-p4basegapH)+p4rampH+p4clear+nF;       //top of groove at position 3 "top center" calc! //44.25
pMwallHextra=3.75;      //extra height above groove at heighest point
pMH=pMwallHextra+pMgrooveC3; //total height of mountain
pMshelfH=4; //thickness of shelf resting on top of c3 - depricated
pMshelfchamfR=3; //radius of chamfer at join shelf/wall
pMshelfBoltD=3;

pM3c2c=(pMH-(aaboltHD/2)-5)-((pPspace2+pPplate2+1)+(aaboltHD/2)+bearingholderZBOD);
pM3c2e=min(
pMH-(pMH-(aaboltHD/2)-5)
,
((pPspace2+pPplate2+1)+(aaboltHD/2)+bearingholderZBOD)
-(pMshelfchamfR+pPspace2+pPplate2)
);
//distance between bolts + 2X the min distance from bolt to top or bolt to bottom
pM3H=(
pM3c2c
+(2*min(
pMH-(pMH-(aaboltHD/2)-5)
,
((pPspace2+pPplate2+1)+(aaboltHD/2)+bearingholderZBOD)
-(pMshelfchamfR+pPspace2+pPplate2)
))
);
pM3mink=6;
pM3slop=0.25;

pMsqNutW=5.5;
pMsqNutH=1.8;
pMsqNutSlop=0.25;

//pS1 - pick a needle geared riser
pS1W=(needle2needle-nX)/2;  //width
pS1wallT=4; //Cross section to fit in guide groove
pS1wallW=pS1W+8;
pS1T=8; //thickness of vertical section without gears
pS1GearD=10; //filler for now, TODO calculate
pS1Z=pPplate1+pMH+pPplate3+pMgrooveD+pS1GearD;


//c2 geared plate - clean up below, not used to generate gear
c2H=bottom_surface_motor_gearsH;
c2gap=0.5;  //gap between c2ID and p3wallOD  // 0.7?  0.5?  0.35? how low can you go?
c2t2t=6.858;
c2width=50;  //depricated?
c2OD=p3baseOD+(p5boltL*2)+(p5boltHeadH*2)+(Td*2)+(2*2);
c2ID=(c2gap*2)+p2OD+(p3wiggle*2)+(p3wallW*2);   //should this be p3wallOD+(c2gap*2)
c2teeth=((c2OD*PI)/c2t2t);
c2dipitch=c2teeth/(c2OD*PI);

cWiggle=0.1; //extra height on mountaint cutout for c3 to sit in  ?? is this used ??




/////////////////////
//calculated settings
/////////////////////

bearingholderZB2C=(bearingholderZBOD/2)+pPspace1+pPplate1+pPspace2+pPplate2;  //from base of bearing holder to center of bearing

rez=p2number*p2needles*2;

centerlineD=p2ID+(p2W+(p3wiggle*2));


p3grooveH1=pPspace1+pPplate1; //bottom of verticle groove in p3
p3grooveH2=pPspace1+pPplate1+pMH+pPplate3+pMgrooveD;  //top of groove in p3

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=pPspace1+pPplate1+pMgrooveC2+(nA-nC-nB-nG)-threadthickness-p3base45H;

p3wallH=pPspace1+pPplate1+pMgrooveC2+nA-nB-nC-nF-p3clear;

p2holeH=p3grooveH2+((p3wallH-p3grooveH2)/2);  //hight from table top

//c3
c3ID=c2ID;
c3H=upper_surfaceH;

//c6
c6H=c3H;

pMID=c2ID;
pMODwall=c2ID+(pMgroove*2)+(pMwallT*2);

//c4 paper clip connecting weight holder plate
c4OD=p2ID-(p3ridgeW2*2)-(20*2);
c4paperclipholeD=5;
c4paperclipholeW=2;
c4paperclipholetoEdge=3;


   /////////////////////////////////
pMgrooveOR=pMgroove+(pMID/2); //center to OD of groove
    // is this supposed to be the radius? 
    /////////////////////////////////

c5OD=pMgrooveOR*2;
c5H=upper_surfaceH;

////////////////////////
// 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);
    
    //radius of upper curved path in groove //14  //10
    pMgrooveturnR=UPpMgrooveturnR; 
    //radius of lower curved path in groove //7
    pMgrooveturnR2=UPpMgrooveturnR2; 
    pMgrooveturnR3=7; // radius of entrance curved path - not used
 
    pMcutRez=2; //cuts per degree
    pMcutcylRez=36;  //number of sides on groove cutting clylinder

    pMcutA=45;    //angle of cut path

//7
    pMp7X=UPpMp7X;  //half of length of plateu of groove. preferably whole number  //3  //2
    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=UPpMp3X;            //length of lower plateu of groove  //2.5   //2
    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)+((pMgrooveD/2)-(sin(pMcutA)*(pMgrooveD/2)));  //-(cos(pMcutA)*pMgrooveturnR3); //-(pMgrooveD/2)
    pMp1X=((pMh1e)-(pMh1s))*tan(90-pMcutA);  //-sin(45)*grooveD/2  ??
    pMd1=pMp1X/glnd;
    pMd1s=pMd2e;
    pMd1e=pMd2e+pMd1;

echo("extra to subtract??",sin(pMcutA)*(pMgrooveD/2));

//0
//    pMp0X=pMgrooveD/2;  //pMgrooveD
//    pMd0=pMp0X/glnd;     //pMgrooveD/glnd; //define later

    pMp0X=0; 
    pMd0=pMp0X/glnd;
    pMd0s=pMd1e;
    pMd0e=pMd1e+pMd0;

//pM0 attempt to make curve below
/*
    pMp0X=cos(90-pMcutA)*pMgrooveturnR3; 
    pMd0=pMp0X/glnd;
    pMd0s=pMd1e;
    pMd0e=pMd1e+pMd0;
    function func0(i) = (pMgrooveturnR3*cos(asin(((i-pMd0e)*(pMp0X/pMd0))/pMgrooveturnR3))-pMgrooveturnR3);
    pMh0s=pMh1e;
    pMh0e=pMh1e+func0(pMd0e);
*/

//mounting shelf and holes settings   
    pMshelfX=pMshelfBoltD*4;  //length of shelf in mm
    pMshelfd=pMshelfX/glnd; //number of degrees of shelf
    pMdS=(pMgrooveD/2)/glnd; //to trim half
    pMdSs=pMd1e+pMdS;    
    
    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

pMbodyXr=(((c2ID+(pMgroove*2))/2)*cos(90-(pMd1e-pMd0)));  //half the X of back wall

//END MOUNTAIN VARS
///////////////////////

//c3 - redo with extra mountian tab/shelf distance
c3OD=
max(
((pow((pow((pMbodyXr+pMshelfX),2)+pow((((c2ID+(pMgroove*2)+(pMwallT*2))/2)),2)),1/2))*2)+((p7mountL+p7boltHeadH)*2)
,
((((p3baseOD/2)+1+p5wingL+1+p7bearingfromfront+(p7wiggleL/2)+bearingholderZBW))*2)
);

//removed following, going to shrink p8 as needed
//(((pMID/2)+(pMgroove)+1+(p8baseL/2)+(p8holeC2C/2)+(p8holeD*1.25)+(p7mountL))*2)


//MAX() of distance from mountain, and distance from plate spacers bolts
//need to consider tooth size on plate c2 ??

echo("X", (pMbodyXr+pMshelfX));
echo("Y", ((c2ID+(pMgroove*2)+(pMwallT*2))/2));
echo("c3OD=", c3OD);

echo("pMID less pMbodyXr*2",pMID-(pMbodyXr*2)); //needs to be positive




pMODshelf=c3OD; 

pMarcL=((PI*c2ID)*((pMd1e-pMd0)*2)/360); //approx arc length of mountain - could get more accurate number

echo("pMarcL",pMarcL);

pMmaxNum=floor((PI*c2ID)/pMarcL); //max number of mountains around circumference

echo("pMmaxNum",pMmaxNum);

pMnum=floor(pMmaxNum/2);

echo("pMnum",pMnum);

//number of sets of bearings mounted to geared plated
c2bmounts=max(3,pMnum*2);   //p3number  //probably should be higher

echo("c2bmounts",c2bmounts);

p7number=(ceil(max(
c2bmounts*1.3,
4
)/4))*4;

echo("p7number", p7number);

//number of plate connectors
//c2connectors=pMnum*3; // need to tweak so does not overlap mountain footprint
c2connectors=numberMountain;

    /////gear calcs/////


//solve for # of teeth and circ_pitch that gives proper tooth whole depth

Tn=floor(((-2*c2OD)/((c2OD-Td)-c2OD))-2); //number of teeth? - for big gear

pCir=180*(c2OD-(Td))/Tn; //circular pitch - use for both big and small gear

    CKp1_circular_pitch=pCir;
    CKp1_number_of_teeth=spurgearTn;
	CKp1_pitch_diameter  =  CKp1_number_of_teeth * CKp1_circular_pitch / 180;
	CKp1_pitch_radius = CKp1_pitch_diameter/2;

    CKc2_circular_pitch=pCir;
    CKc2_number_of_teeth=Tn;
	CKc2_pitch_diameter  =  CKc2_number_of_teeth * CKc2_circular_pitch / 180;
	CKc2_pitch_radius = CKc2_pitch_diameter/2;

echo("c2OD",c2OD);
echo("Tn",Tn);
echo("pitch",180*(c2OD-(Td))/Tn);
echo("pCir",pCir);


p5mounthole2front=(p5mountBoltHeadOD/2)+Td;
p5mounthole2back=
max(
(p5mountBoltHeadOD/2)+(((pMID+(pMgroove*2))-(p3baseOD+2))/2)
,
(p5mountBoltHeadOD/2)+4
);


//p8
p8holeend2C=4;

p8innerboltO2C=(c2ID/2)+pMgroove+1+p8holeend2C;   //radius of origin to center of inner bolt

p8outerboltO2C=min(
(c3OD/2)-p7bearingfromfront-(p7wiggleL/2)-bearingholderZBW-p7boltHeadH-1-(p8boltHeadOD/2)
,
CKc2_pitch_radius-(Td/2)-1-p8holeend2C
);   //radius of origin to center of outer bolt

p8holeC2C=p8outerboltO2C-p8innerboltO2C;  //p8baseL-(p8holeend2C*2)

p8baseL=p8holeC2C+(p8holeend2C*2); //25

p8dsqNutW=5.5;
p8dID=c2OD+3;

p8dH=pPspace1+pPplate2+pPspace1;
p8dD=15; //degrees around circle for each p8d
p8dboltD=3;
p8dsqNutH=1.8;
p8dsqNutSlop=0.25;

p8eNutH=5;
p8eboltD=3;

//p8d
p8dminT=p8dsqNutW+1;

//c1
c1H=table_surface;
c1width=c2width+91.36;  //depricated?
c1OD=(CKp1_pitch_radius+CKc2_pitch_radius+(NEMAmotorW/2)+woodbeamW+2)*2;  // c2OD + (c1width-c2width);
c1zOD=(((c3OD/2)-p7bearingfromfront-(p7wiggleL/2)-bearingholderZBW+(p7baseL-p7mounthole2edge))+woodbeamW+2)*2; //outside diameter of plate at Z mounts
c1W=max(
c1OD*(-ceil(1/(floor( (2-c1steppersnumber)*(c1steppersnumber/(2/c1steppersnumber)) )+1))+1)
,
c3OD
);


test=1;

echo("floor",
(-ceil(1/(floor( (2-c1steppersnumber)*(c1steppersnumber/(2/c1steppersnumber)) )+1))+1)
);  //if there are more than 2 steppers = 1

echo("c3OD",c3OD);

echo("c1W",c1W);




c6OD=c3OD+(p8dminT*2);
p8dOD=c6OD;

UPc1W=c6OD;

c1polyOD=c6OD;  //need to calculate stepper OD later


//p2 flat socket head screw
p2p3flatORmax=((c2ID+sqrt((-4*(p2p3flatHD/2)*(p2p3flatHD/2))+((c2ID)*(c2ID))))/2)/2; //maximum radius to be within c2ID

//thread feeder
M2tipY=tipOpenX/2;  //pM2mink
M2tipZ=(((tipOpenX/2)-(nE/2))*2)+tipHole+(tipcylD/2);
M2tiptopC=(((tipOpenX/2)-(nE/2))*2)+tipHole+(tipcylD/2)-(pM2mink/4);
M2inX=((((c2ID+(pMgroove*2))/2)*cos(90-(pMd1e-pMd0)))-pMshelfchamfR-(aaX-aaT))*2;
M2inY=(((c2ID+(pMgroove*2)+(pMwallT*2))/2))-((p3wallID/2)-(p2needlegrooveDepthslop/2))-(nD-nY)-nD;  //(M2tipY) //(nD-nY) //tipcylD/2
M2inZ=pM2H-pM2mink;
M2backwallOD=((c2ID+(pMgroove*2)+(pMwallT*2))/2)+aaT;


////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));


/////BOM COUNT///////

if(TF==1){
echo("Thread Feeder Mount Bolt: (2)", (ceil(((((pMID/2)-(cos(pMd4s)*(pMID/2)))+pMwallT+pMgroove)-(sin(pMd4s)*(aaboltHD))-2-aaboltHH+aaT+aanutH)/2)*2) );
}

 

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.
 

2D Laser Cut Parts

3D Printed Parts

p4 "yarn 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(){
            minkowski(){
            union(){
            translate([-p4baseOD/2+p4rampfromOD,p4rampWm/2,p4rampH+p4baseH-(p4rampC1/2)])
            rotate([90,0,0])
            cylinder(h=p4rampWm,d=p4rampC1);
            
            intersection(){
            translate([-10,0,3.82])
            translate([-p4baseOD/2+p4rampfromOD,p4rampWm/2,p4rampH+p4baseH-(p4rampC2/2)])
            rotate([90,0,0])
            cylinder(h=p4rampWm,d=p4rampC2);
                
                            translate([-7,0,-2.86/2])
            translate([-p4baseOD/2+p4rampfromOD,p4rampWm/2,p4rampH+p4baseH-(p4rampC2/2)])
            cube([p4rampC2,p4rampC2,p4rampC2],center=true);
            
            }
        }//end union
        
difference(){
translate([-p4rampMinkD/2,0,0])
cylinder(d=p4rampMinkD,h=0.01, $fn=36);
translate([-p4rampMinkD,0,-0.01])
cube([p4rampMinkD,p4rampMinkD,0.02], center=true);    
} //end diff

} //end mink
        
       translate([-p4rampC2/2,0,0])
       translate([-p4baseOD/2+p4rampfromOD,p4rampW/2,p4rampH+p4baseH-(p4rampC2/2)])
       cube([p4rampC2,p4rampC2,p4rampC2+1],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)]){
            hull(){
            translate([-p4baseOD/2,-p4clawW/2,0])
              #cube([(p4baseOD-p4baseID)/2,p4clawW,p4basegapH]);
            translate([-p4baseOD/2,-((p4rampW+p4clawWslanttop)/2),p4baseH-0.1])
              #cube([(p4baseOD-p4baseID)/2,p4rampW+p4clawWslanttop,0.1]);

            } //end hull
        }
    }//end for
            
        } //end main union
    cylinder(h=p4baseH,d=p4baseID);
    
    //simiple chamfer of inside corner    
    translate([0,0,p4baseH-0.5])
    cylinder(h=0.5,d1=p4baseID+0.5,d2=p4baseID+1.9);    
    translate([0,0,p4baseH-0.5-0.5])
    cylinder(h=0.5,d1=p4baseID,d2=p4baseID+0.5);    

        
    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);    
}


//bolt holes        
            for(i=[0:(p2number/p4number)-1]){
         rotate([0,0,(-360/p2number/p2needles*0.5)+(i*-360/p2number)]){
             

if(p2p4type==1){
    translate([-(p4baseOD/2)+((p4baseOD-p4baseID)/2),0,p4holeH])
    rotate([0,270,0])
translate([0,0,0])
union(){
cylinder(d1=p2p4flatHD,d2=0,h=(p2p4flatHD/2)/tan(45),$fn=36);
translate([0,0,-(p2p4flatHD)/tan(45)])
cylinder(d1=p2p4flatHD*3,d2=p2p4flatHD,h=(p2p4flatHD)/tan(45),$fn=36);
cylinder(d=p2p4flatD,h=((p4baseOD-p4baseID)/2)+2,$fn=36);
}//end union
}//end if
if(p2p4type==0){
    translate([-(p4baseOD/2)+((p4baseOD-p4baseID)/2),0,p4holeH])
    rotate([0,270,0])
translate([0,0,0])
union(){
translate([0,0,-p2p4boltHH/2])
cylinder(d=p2p4boltHD,h=p2p4boltHH,$fn=36);
cylinder(d=p2p4boltD,h=((p4baseOD-p4baseID)/2)+2,$fn=36);
}//end union
}//end if


}
}

//second set
       for(i=[0:(p2number/p3number)-1]){
        rotate([0,0,-(360/p2number/p2needles*0.5)+(360/p2number/p2needles)+(i*-360/p2number)+(-360/p2number)]){
 
if(p2p4type==1){  // if flat socket
    translate([-(p4baseOD/2)+((p4baseOD-p4baseID)/2),0,p4holeH])
    rotate([0,270,0])
translate([0,0,0])
union(){
cylinder(d1=p2p4flatHD,d2=0,h=(p2p4flatHD/2)/tan(45),$fn=36);
translate([0,0,-(p2p4flatHD)/tan(45)])
cylinder(d1=p2p4flatHD*3,d2=p2p4flatHD,h=(p2p4flatHD)/tan(45),$fn=36);
cylinder(d=p2p4flatD,h=((p4baseOD-p4baseID)/2)+2,$fn=36);
}//end union
}//end if
if(p2p4type==0){  // if regular socket
    translate([-(p4baseOD/2)+((p4baseOD-p4baseID)/2),0,p4holeH])
    rotate([0,270,0])
translate([0,0,0])
union(){
translate([0,0,-p2p4boltHH/2])
cylinder(d=p2p4boltHD,h=p2p4boltHH,$fn=36);
cylinder(d=p2p4boltD,h=((p4baseOD-p4baseID)/2)+2,$fn=36);
}//end union
}//end if

} //end rotate
} //end for
//end mounting holes
 
    //trim end       
    if(p4number>1){
    rotate([0,0,-(360/(p4baseOD*PI/p4endtrim))])
 mirror([1,1,0])
 cube([p4baseOD/2,p4baseOD/2,p4rampH+p4baseH]);   
    
}
    
    
    } //end main difference
} //end main translate
    
    
} //end module
 

Parts

Pontiac Coil L-09

Pontiaccoil.png


PCL90();

module PCL90(){
    
x=36.576;
y=41.402;
z=51.308;

topz=28.448;  ///distance from base to center of top mount hole
top2stroke0=42.7482;
top2stroke1=68.1482;  
plungerholeD=2.4384;
plungercutZ=9.652;
plungercutY=3.556;    
plungertop2c=3.9624;

holeOD=4.1656;
botz=topz-12.7;

D=12.7;

difference(){
    union(){
cube([x,y,z]);
translate([x/2,y/2,topz])
    difference(){
cylinder(d=D,h=top2stroke0+plungertop2c);
translate([0,D/2,top2stroke0])
rotate([90,0,0])     
#cylinder(d=plungerholeD,h=D);     
translate([-D/2,-plungercutY/2,top2stroke0+plungertop2c-plungercutZ])
#cube([D,plungercutY,plungercutZ]);       
    }
}
translate([23.7998/2,0,0]){
translate([x/2,y,topz])
    rotate([90,0,0])
cylinder(d=holeOD,h=y);

translate([x/2,y,botz])
    rotate([90,0,0])
cylinder(d=holeOD,h=y);
}
translate([-23.7998/2,0,0]){
translate([x/2,y,topz])
    rotate([90,0,0])
cylinder(d=holeOD,h=y);

translate([x/2,y,botz])
    rotate([90,0,0])
cylinder(d=holeOD,h=y);
}


}//end main diff    
    
    
}//end module
 

Full Assembly

Sketchup

Steel Stand Frame - https://app.sketchup.com/share/tc/northAmerica/E71xH0BPqFQ?stoken=_qyZonbs7k_fPGntdBMyvugDAOcc6VjkBnZVoqvg54GxEYQ4xFCG_KZdhddp_7Zn&source=web

In Progress

Auto Spooler and Tensioner - https://app.sketchup.com/share/tc/northAmerica/NJApeqgsWbw?stoken=Hg05oYWe4XmDsm1ZQ82ofyqP0gMuxExIs-eFGwwAoWbyTLsD3JMDbFG54MBhcO9F&source=web

BOM

Arduino Stepper Driver Code

Constant Speed

using https://www.airspayce.com/mikem/arduino/AccelStepper/

#include <AccelStepper.h>

AccelStepper stepper(2,12,13);

const int pwmA = 3;
const int pwmB = 11;
const int brakeA = 8;
const int brakeB = 9;

int switchStateForward = digitalRead(7);  

void setup()
{ 

 
  pinMode(pwmA, OUTPUT);
  pinMode(pwmB, OUTPUT);
  pinMode(brakeA, OUTPUT);
  pinMode(brakeB, OUTPUT);
 
  digitalWrite(pwmA, HIGH);
  digitalWrite(pwmB, HIGH);
  digitalWrite(brakeA, LOW);
  digitalWrite(brakeB, LOW);
 
  stepper.setMaxSpeed(120);
  stepper.setSpeed(110);
 
  stepper.setAcceleration(80);
  stepper.moveTo(999999999);
 
 
}

void loop(){ 

  if (stepper.distanceToGo() == 0) {
    stepper.run();                   // let the AccelStepper to disable motor current after stop
    delay(2000);                     // wait 2 sec in final position
    stepper.moveTo(-stepper.currentPosition());
  }
  stepper.run();

  if(switchStateForward == HIGH){
  stepper.stop();
  }
    
  }
 

Potentiometer Control

https://github.com/waspinator/AccelStepper/blob/master/examples/ProportionalControl/ProportionalControl.pde


 

TODO

  • remove p8 plate connector under mountain
    • put hole for makerbeam on plate below
  • breakup tabletop plate into multiple pieces to make max size smaller
  • could make all cut plates hexagons except for geared plate.
    • could make geared a little larger if move support spacer to bridge stepper gear
  • tweak outiside diameter values to remove p9
    • change p9 to a simple p8 variant near steppers
    • could just set p9 thickness to zero for now

Links

https://www.thingiverse.com/thing:2072364/files