RotoKnitic v19.01: Difference between revisions
Jump to navigation
Jump to search
(Created page with "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 *...") |
|||
(37 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 | |||
==Concept== | ==Concept== | ||
===Standard=== | |||
[[Image:RotoKnitic - Concept Drawing 20190102.png|800px]] | [[Image:RotoKnitic - Concept Drawing 20190102.png|800px]] | ||
[https://docs.google.com/drawings/d/1cJI2ldYQc8stUkN_m6oAq8sJfdkBs8hRQC-ZErb_UMs/edit google doc] | |||
===Pick-a-Needle=== | |||
[[Image:OSE - RotoKnitic Pick-a-Needle - Concept Drawing 20190427.png|800px]] | |||
[https://docs.google.com/drawings/d/1C2iLO4IXJmCDH09A349jZvGN7lp5rbjOS69YNhRg13s/edit google doc] | |||
==Goals== | |||
*change direction | |||
*sock heels | |||
===Needle Accomodation=== | |||
*pick-a-needle, optionally raise needles to an inactive postion | |||
*Test laser cut needles, printed latch? | |||
*Test 3D printed needles | |||
===Fabric Spool=== | |||
*Apply constant tension on fabric | |||
*Roll onto spool for easy handling and storage | |||
===Improve Stepper Control=== | |||
*[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= | |||
*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=== | |||
[[File:pontiaccoil.png|400px]] | |||
<nowiki> | |||
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 | |||
</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> | |||
=TODO= | |||
*remove p8 plate connector under mountain | |||
**put hole for makerbeam on plate below | |||
*breakup tabletop plate into multiple pieces to make max size smaller | |||
*could make all cut plates hexagons except for geared plate. | |||
**could make geared a little larger if move support spacer to bridge stepper gear | |||
*tweak outiside diameter values to remove p9 | |||
**change p9 to a simple p8 variant near steppers | |||
**could just set p9 thickness to zero for now | |||
=Links= | |||
https://www.thingiverse.com/thing:2072364/files | |||
[[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