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