X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=reprap-play.git;a=blobdiff_plain;f=filamentspool.scad;h=fe29eea1f926f91efcb8fe8c085ac610f63b789d;hp=ae9084c255246e08868993ce40e878b07adb4bc5;hb=0e516ff8b8cfb2664846004e74ec7d511b577f55;hpb=1f1f60ca2563fde89041e86238b1a38aab4af9c5 diff --git a/filamentspool.scad b/filamentspool.scad index ae9084c..fe29eea 100644 --- a/filamentspool.scad +++ b/filamentspool.scad @@ -30,8 +30,10 @@ // // This file (and its includes) can generate: // -// - Heavy duty 4-armed spool suitable for holding a 100m -// Faberdashery coil on the spool arm of a Lulzbot TAZ-5. +// ===== Heavy duty 4-armed spool for 3mm x 100m coil ===== +// +// A heavy duty 4-armed spool suitable for holding a 100m +// Faberdashery coil on the spool arm of a Lulzbot TAZ-5. // // Set // fdia=2.85 @@ -44,12 +46,18 @@ // // You will also need 4 x M4 machine screws and nuts. // -// - Light duty 3-armed spool suitable for up to around 30m -// of Faberdashery 2.85mm PLA. +// This is the default. +// +// ===== Light duty 3-armed spool for 3mm x <=30m coil ===== +// +// A light duty 3-armed spool suitable for up to around 30m +// of Faberdashery 2.85mm PLA. // // Set // fdia=2.85 // lightduty=true +// (or look in filamentspool-lt.scad). +// // And print following parts // Hub // ArmEnd x 3 @@ -64,6 +72,8 @@ // (note that the light duty and heavy duty CupSecuringClips // are slightly different) // +// ===== Notes regarding both the above spools ===== +// // When mounting either spool on the TAZ-5 spool arm, put the `pointy' // end of the hub towards the printer - ie, put put the spool on // `backwards'. This ensures that the spool's arms will clear the @@ -71,13 +81,50 @@ // // For the above, I generally used the Cura `Standard' PLA profile. // -// - Storage arm suitable for screwing to walls, bookshelves, -// etc. (requires non-countersunk M4 screws); will hold two -// heavy duty spools each with a 100m coil. +// ===== TAZ-5 feed tube adjustment kit ===== +// +// With a TAZ-5 I recommend using this kit to improve the feed +// reliability: +// +// Set +// fdia=2.85 +// And print following parts +// FilamentGuideSpacer (ideally, at `high detail') +// FilamentGuideArmPrint (optional; `high detail' or `standard') +// +// And possibly also +// t-nut_jig_0.2.stl +// from Aleph Objects - look here: +// http://download.lulzbot.com/TAZ/accessories/tool_heads/version_2/Dual_Extruder_v2/production_parts/stl/ +// +// The spacer clips onto the filament guide tube holder arm, on the +// inside, with the pointy flanged end towards the filament guide +// tube. It stops the filament guide tube angle (and so the +// filament's natural pickup location) changing as the print head moves. +// +// The FilamentGuideArm[Print] is a replacement for the arm supplied +// with your TAZ-5. It's longer, so that the filament pickup point is +// closer to the middle of the coil. Use the t-nut_jig to stop the +// T-nuts in the aluminium channel from annoyingly sliding down to the +// bottom while you swap out the arm. +// +// (Faberdashery coils, and therefore both the above spools, have a +// larger diameter than the flat-walled spools often supplied by other +// vendors. And the spools above have individual arms rather than a +// continuous disc. If the filament `unhooks' from the arm, it can +// pull taught around the hub and stop feeding properly.) +// +// ===== Spool storage arm, for mounting on walls ===== +// +// A storage arm suitable for screwing to walls, bookshelves, +// etc. (requires non-countersunk M4 screws); will hold two heavy duty +// spools each with a 100m coil. // // Set // fdia=2.85 // lightduty=false +// (or look in filamentspool-sm.scad). +// // And print one of these, according to taste // StorageArmLeft // StorageArmRight @@ -88,8 +135,10 @@ // For the above, I used the Cura `High detail' PLA profile because // I wanted it pretty, but the `Standard' profile should do fine. // -// - Spool (in many parts) for handing 1.75mm filament, printable -// on, and with parts for mounting on, a Reprappro Huxley. +// ===== Spools for 1.75mm filament ===== +// +// Spool (in many parts) for handing 1.75mm filament, printable +// on, and with parts for mounting on, a Reprappro Huxley. fdia=2.85; // or 1.75 @@ -109,7 +158,7 @@ channelslop=selsz(slop,0.75,slop); exteffrad = 70; hubeffrad = selsz(30, 82, 40); hubbigrad = selsz(20, 38, 38); -hublwidth = selsz(3, 2.5, 4); +hublwidth = selsz(3, 2.5, 3.0); hubstemwidth = 2; hublthick = 10; hubaxlerad = selsz(5, 28/2, 28/2); @@ -164,6 +213,12 @@ wingthick=3; armendwallthick=selsz(2.5, 1.8, 2.5); armendbasethick=selsz(1.2, 1.2, 1.2); +numbers_relief = 0.7; +numbers_tick_len = 8; +numbers_tick_width = 0.75; +numbers_tick_linespc = 1.0; +numbers_height_allow = 8; + axlehorizoffset = 12.5; axlevertheight = 100; towercliph = 16; @@ -197,6 +252,14 @@ include include include include +include + +hub_clip_baseextend = (hubeffrad - DoveClip_depth() + - hubbigrad + hublwidth); + +real_exteffrad = selsz(exteffrad + hub_clip_baseextend, + hubeffrad + DoveClip_depth(), + hubeffrad + nondove_armbase); channelwidth = prongthick + channelslop; channeldepth = prongwidth + ratchettoothheight; @@ -204,6 +267,8 @@ totalwidth = armendwallthick*2 + channelwidth; totalheight = channeldepth + armendbasethick; stalkwidth = prongwidth + prongstalkxwidth; +tau = PI*2; + module ArmEnd(length=armend_length){ ////toplevel if (usedove()) { translate([ratchettoothsmoothr, channelwidth/2, -armendbasethick]) { @@ -219,27 +284,68 @@ module ArmEnd(length=armend_length){ ////toplevel -armendwallthick + totalwidth/2, -armendbasethick -1]) cylinder(r= nondove_armhole_hole/2, h=totalheight+2, $fn=10); + translate([-nondove_armbase, -armendwallthick, -armendbasethick]) + rotate([90,0,0]) + Commitid_BestCount([nondove_armbase, totalwidth]); } } difference(){ - translate([0, -armendwallthick, -armendbasethick]) - cube([length, totalwidth, totalheight]); - translate([-1, 0, 0]) - cube([length+1 - ratchettooth, channelwidth, channeldepth+1]); - translate([-1, 0, ratchettoothheight]) - cube([length+2, channelwidth, channeldepth+1]); - } - for (dx = [0 : ratchetstep : length - ratchetstep]) translate([dx,0,0]) { - translate([ratchettoothsmoothr+0.5, armendwallthick/2, 0]) minkowski(){ - rotate([90,0,0]) - cylinder($fn=20, r=ratchettoothsmoothr, h=armendwallthick); - multmatrix([ [ 1, 0, ratchettoothslope, 0 ], - [ 0, 1, 0, 0 ], - [ 0, 0, 1, 0 ], - [ 0, 0, 0, 1 ]]) - cube([ratchettooth - ratchettoothsmoothr*2, - channelwidth, ratchettoothheight - ratchettoothsmoothr]); + union(){ + difference(){ + translate([0, -armendwallthick, -armendbasethick]) + cube([length, totalwidth, totalheight]); + translate([-1, 0, 0]) + cube([length+1 - ratchettooth, channelwidth, channeldepth+1]); + translate([-1, 0, ratchettoothheight]) + cube([length+2, channelwidth, channeldepth+1]); + } + for (dx = [0 : ratchetstep : length - ratchetstep]) translate([dx,0,0]) { + translate([ratchettoothsmoothr+0.5, armendwallthick/2, 0]) minkowski(){ + rotate([90,0,0]) + cylinder($fn=20, r=ratchettoothsmoothr, h=armendwallthick); + multmatrix([ [ 1, 0, ratchettoothslope, 0 ], + [ 0, 1, 0, 0 ], + [ 0, 0, 1, 0 ], + [ 0, 0, 0, 1 ]]) + cube([ratchettooth - ratchettoothsmoothr*2, + channelwidth, ratchettoothheight - ratchettoothsmoothr]); + } + } + } + + for (otherside=[0,1]) { + for (circum = [300:100:1500]) { + assign(rad = circum / tau) + assign(fn = str("filamentspool-number-n",circum,".dxf")) + assign(rotateoffset = [0, totalwidth/2, 0]) + assign(xlen = rad - real_exteffrad) { + if (xlen >= numbers_tick_width/2 + + (otherside ? numbers_height_allow : 0) && + xlen <= length - (otherside ? 0 : numbers_height_allow)) + translate([xlen, -armendwallthick, + -armendbasethick + (totalheight - numbers_tick_len)/2]) + translate(rotateoffset) + rotate([0,0, otherside*180]) + translate(-rotateoffset){ + translate([-numbers_tick_width/2, -1, 0]) + cube([numbers_tick_width, numbers_relief+1, numbers_tick_len]); + translate([numbers_tick_width/2 + numbers_tick_linespc, + 1, + numbers_tick_len]) + rotate([90,0,0]) + rotate([0,0,-90]) + linear_extrude(height= numbers_relief+1) + // scale(templatescale) + import(file=fn, convexity=100); + } + } + } + } + + if (usedove()){ + translate([0, -armendwallthick, -armendbasethick]) + Commitid_BestCount_M([length/3, totalwidth]); } } } @@ -272,7 +378,7 @@ module FilamentCupCup(){ } } -module FilamentCup() { ////toplevel +module FilamentCupPositive() { FilamentCupHandle(); gapy = prongwidth; @@ -327,6 +433,14 @@ module FilamentCup() { ////toplevel } } +module FilamentCup() { ////toplevel + difference(){ + FilamentCupPositive(); + translate([0, -stalkwidth, 0]) + Commitid_BestCount_M([stalklength - stalkwidth, stalkwidth]); + } +} + module CupSecuringClipSolid(w,d,h1,h2){ rotate([0,-90,0]) translate([0,-h1/2,-w/2]) linear_extrude(height=w) { polygon(points=[[0,0], [d,0], [d,h2], [0,h1]]); @@ -388,8 +502,7 @@ module Hub(){ ////toplevel difference() { translate([hubeffrad,0,0]) DoveClipPairSane(h=doveclipheight, - baseextend = (hubeffrad - DoveClip_depth() - - hubbigrad + hublwidth)); + baseextend = hub_clip_baseextend); if (hole>hublwidth && holewidth > 2) { translate([hubbigrad + hublwidth, -holewidth/2, -1]) cube([hole, holewidth, hublthick+2]); @@ -425,6 +538,16 @@ module Hub(){ ////toplevel } } translate([0,0,-1]) cylinder($fn=60, h=hubaxlelen+2, r=axlerad); + + rotate([0,0, selsz(0,0,45)]) + translate([axlerad+hublwidth, + -hublwidth/2, + 0]) + rotate([90,0,0]) + Commitid_BestCount([(hubbigrad-hublwidth) - (axlerad+hublwidth), + hublthick + + hublwidth/2 * hubaxlelen/(hubbigrad-axlerad), + ]); } } @@ -680,12 +803,13 @@ module StorArmHoleTest(){ ////toplevel guide_armdia = 15.0; guide_armwidth = 10.2; -guide_armcorelen = 15.3; +guide_armcorelen = 25.0; +guide_clipcirclethick = 10.0; guidefilclip_outerdia = 22.8; guidespacer_armslop = 0.75; -guidespacer_armlenslop = 0.75; +guidespacer_armlenslop = 1.05; guidespacer_prongprotrude = 4; guidespacer_thick = 1.6; @@ -694,7 +818,8 @@ guidespacer_thick = 1.6; guidespacer_armdia = guide_armdia + guidespacer_armslop; guidespacer_armwidth = guide_armwidth + guidespacer_armslop; -guidespacer_len = guide_armcorelen + guidespacer_armlenslop; +guidespacer_len = guide_armcorelen - guide_clipcirclethick + + guidespacer_armlenslop; guidespacer_wingheight = (guidefilclip_outerdia - guidespacer_armdia)/2; @@ -747,38 +872,119 @@ module FilamentGuideSpacer(){ ////toplevel guidearm_armslop = 0.25; guidearm_armlenslop = 0.25; -guidearm_hookprotr = 4; +guidearm_hookprotr = 3; guidearm_hookprotrflat = 1; guidearm_hookslope = 0.3; +guidearm_totallen = 60; + +guidearm_screwplatesz = 12; +guidearm_screwplateth = 4; +guidearm_screwplatewd = 15; +guidearm_screwhole = 5 + 0.5; + +guidearm_bendlen = 40; +guidearm_bendslot = 4.5; + +guidearm_stopthick = 4; +guidearm_protrslop = 1.0; + // calculated guidearm_armdia = guide_armdia - guidearm_armslop; guidearm_armwidth = guide_armwidth - guidearm_armslop; guidearm_armcorelen = guide_armcorelen + guidearm_armlenslop; -module FilamentGuideArm(){ ///toplevel +guidearm_base_z0 = -(guidearm_totallen - guidearm_armcorelen); + +guidearm_realbendlen = min(guidearm_bendlen, + guidearm_totallen - guidearm_screwplateth - 0.1); +guidearm_slopelen = guidearm_hookprotr/guidearm_hookslope; + +module FilamentGuideArmStop(h){ + for (ts=[-1,+1]) { + translate([ts * guidearm_hookprotr, 0,0]) + cylinder(r=guidearm_armdia/2, h, $fn=80); + } +} + +module FilamentGuideArmShaftPositive(){ r = guidearm_armdia/2; - translate([0,0,-1]) - cylinder(r=r, h= guidearm_armcorelen+2); + translate([0,0, guidearm_base_z0+1]) + cylinder(r=r, h= guidearm_totallen, $fn=80); translate([0,0, guidearm_armcorelen]){ hull(){ + FilamentGuideArmStop(guidearm_hookprotrflat); + translate([0,0, guidearm_slopelen]) + cylinder(r=r, h=guidearm_hookprotrflat, $fn=80); + } + } + mirror([0,0,1]) + FilamentGuideArmStop(guidearm_stopthick); +} + +module FilamentGuideArmBase(){ + translate([0, + (guidearm_screwplatewd - guidearm_armwidth)/2, + guidearm_base_z0]){ + difference(){ + translate([0,0, guidearm_screwplateth/2]) + cube(center=true, + [guidearm_armdia + guidearm_screwplatesz*2, + guidearm_screwplatewd, + guidearm_screwplateth]); for (ts=[-1,+1]) { - translate([ts * guidearm_hookprotr, 0,0]) - cylinder(r=r, h=guidearm_hookprotrflat); + translate([ts * (guidearm_armdia/2 + guidearm_screwplatesz/2), + 0, + -20]) + cylinder(r= guidearm_screwhole/2, h=40, $fn=20); + } + } + } +} + +module FilamentGuideArm(){ ///toplevel + intersection(){ + difference(){ + FilamentGuideArmShaftPositive(); + translate([-guidearm_bendslot/2, + -50, + -guidearm_realbendlen + guidearm_armcorelen]) + cube([guidearm_bendslot, + 100, + guidearm_realbendlen + 100]); + hull(){ + for (zx=[ [ 0, guidearm_bendslot ], + [ guidearm_armcorelen + guidearm_slopelen, + guidearm_hookprotr*2 + guidearm_protrslop ] + ]) { + translate([-zx[1]/2, -50, zx[0]]) + cube([zx[1], 100, 1]); + } } - translate([0,0, guidearm_hookprotr/guidearm_hookslope]) - cylinder(r=r, h=guidearm_hookprotrflat); } + cube(center=true, + [guidearm_armdia*2, + guidearm_armwidth, + guidearm_totallen*3]); } + FilamentGuideArmBase(); } +module FilamentGuideArmPrint(){ ////toplevel + rotate([90,0,0]) + FilamentGuideArm(); +} -module Demo(){ - translate([-hubeffrad-30,50,0]) Hub(); +module Demo(){ ////toplevel + translate([-real_exteffrad,-20,0]) Hub(); ArmEnd(); - translate([0,50,0]) FilamentCup(); + translate([ratchettooth*2, 30, 0]) FilamentCup(); + if (selsz(true,false,false)) { + translate([-exteffrad + hubeffrad - hub_clip_baseextend, -10, 0]) + ArmExtender(); + } } //ArmEnd(); @@ -795,4 +1001,5 @@ module Demo(){ //StorArmHoleTest(); //FilamentGuideSpacer(); //FilamentGuideArm(); +//FilamentGuideArmPrint(); //Demo();