RotoKnitic v19.01
Jump to navigation
Jump to search
Testing
First run -
CAD
See more below
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
- Needles will rotate around the machine instead of being stationary like in OSE_CircularKnitic_v18.03
- https://github.com/OpenSourceEcology/circular_knitic_pick-a-needle
Concept
Standard
Pick-a-Needle
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
- https://www.digikey.com/product-detail/en/pontiac-coil-inc/F0451A/527-1016-ND/668301
- 10mmx10mmx2mm angle - https://www.amazon.com/4pcs-250mm-Thick-Aluminum-Angle/dp/B07G2Y99V4/
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
CKneedleVars-KH260.scad
- purchased here: http://shop.sckmcl.com.hk/product_info.php?products_id=136
//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
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
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