RotoKnitic v19.01: Difference between revisions
Jump to navigation
Jump to search
(→TODO) |
|||
(24 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
=Testing= | |||
First run - | |||
<html><iframe width="560" height="315" src="https://www.youtube.com/embed/Tz_eA8STOgk" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></html> | |||
=CAD= | |||
See more below | |||
[[File:rotoknit.png|500px]] | |||
=Intro= | |||
Using same parts and materials from [[OSE CircularKnitic v18.03]], but switch mounting plates so that the mountain is stationary. | Using same parts and materials from [[OSE CircularKnitic v18.03]], but switch mounting plates so that the mountain is stationary. | ||
Line 6: | Line 16: | ||
=Design= | =Design= | ||
*Needles will rotate in | *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 | *https://github.com/OpenSourceEcology/circular_knitic_pick-a-needle | ||
Line 29: | Line 39: | ||
*sock heels | *sock heels | ||
===Needle | ===Needle Accomodation=== | ||
*pick-a-needle, optionally raise needles to an inactive postion | *pick-a-needle, optionally raise needles to an inactive postion | ||
Line 40: | Line 50: | ||
*Roll onto spool for easy handling and storage | *Roll onto spool for easy handling and storage | ||
===Improve Stepper Control=== | |||
*[https://www.airspayce.com/mikem/arduino/AccelStepper/index.html AccelStepper] | |||
**[https://www.makerguides.com/l298n-stepper-motor-arduino-tutorial/ guide] | |||
**[https://groups.google.com/forum/#!topic/accelstepper/UlStodrb7AI accelstepper on motorshielf rev3] | |||
=Provisional BOM= | =Provisional BOM= | ||
*https://www.digikey.com/product-detail/en/pontiac-coil-inc/F0451A/527-1016-ND/668301 | *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=== | |||
<nowiki> | |||
/////////////////// 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 | |||
/////////////////////////////////////////////// | |||
</nowiki> | |||
==CKvars.scad== | |||
<nowiki> | |||
////////////////////////////////////// | |||
///// 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) ); | |||
} | |||
</nowiki> | |||
==Needles== | |||
[[Image:CKneedle-dimensions.png|200px]] | |||
===CKneedleVars-KH260.scad=== | |||
[[Image:CKneedle-kh260.png|400px]] | |||
*purchased here: http://shop.sckmcl.com.hk/product_info.php?products_id=136 | |||
<nowiki> | |||
//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. | |||
</nowiki> | |||
===CKneedleVars-SK120.scad=== | |||
*difficult to find these exact needles for sale | |||
<nowiki> | |||
//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. | |||
</nowiki> | |||
==2D Laser Cut Parts== | |||
==3D Printed Parts== | |||
===p4 "yarn holder"=== | |||
<nowiki> | |||
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 | |||
</nowiki> | |||
==Parts== | |||
===Pontiac Coil L-09=== | ===Pontiac Coil L-09=== | ||
[[File:pontiaccoil.png|400px]] | |||
<nowiki> | <nowiki> | ||
Line 109: | Line 1,255: | ||
}//end module | }//end module | ||
</nowiki> | |||
==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== | |||
*[https://docs.google.com/spreadsheets/d/1K-vQ3XHc15T8SOtMXUOTjrObDgCIKWEMbxj68ERkwAA/edit#gid=0 Google Doc] | |||
=Arduino Stepper Driver Code= | |||
===Constant Speed=== | |||
using https://www.airspayce.com/mikem/arduino/AccelStepper/ | |||
<nowiki> | |||
#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(); | |||
} | |||
} | |||
</nowiki> | |||
===Potentiometer Control=== | |||
https://github.com/waspinator/AccelStepper/blob/master/examples/ProportionalControl/ProportionalControl.pde | |||
<nowiki> | |||
</nowiki> | </nowiki> | ||
Line 116: | Line 1,339: | ||
**put hole for makerbeam on plate below | **put hole for makerbeam on plate below | ||
*breakup tabletop plate into multiple pieces to make max size smaller | *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= | =Links= | ||
https://www.thingiverse.com/thing:2072364/files | https://www.thingiverse.com/thing:2072364/files | ||
[[Category: Textiles]] |
Latest revision as of 21:43, 5 March 2023
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