X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=reprap-play.git;a=blobdiff_plain;f=filamentspool.scad;h=e44b550011710e9d1dee12e8d4828867bd934bae;hp=cbef1a0af80b3a1bf9fa2ad9dd0fc490d4b4cdf9;hb=1cf13680665629e8fa0acba6e078e2a6157533a3;hpb=9300efdd28e6235630c8971c32ece6ff2ca4fe4f diff --git a/filamentspool.scad b/filamentspool.scad index cbef1a0..e44b550 100644 --- a/filamentspool.scad +++ b/filamentspool.scad @@ -1,7 +1,100 @@ // -*- C -*- -fdia=2.85; -lightduty=true; +// filamentspool.scad +// 3D design for filament spools to hold coils as supplied by Faberdashery +// + +// +// Copyright 2012,2013,2016 Ian Jackson +// +// This work is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This work is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this work. If not, see +// + +// +// Each spool is a hub with 3 or 4 arms. Each arm has a cup for +// holding the filament. The effective diameter can be adjusted by +// setting the cup into a different seat in the arm. The cups are +// held on with simple clips, so the filement coil can easily be +// removed and replaced. +// +// 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. +// +// Set +// fdia=2.85 +// lightduty=false +// And print following parts +// Hub +// ArmEnd x 4 +// FilamentCup x 4 (or FilamentCupPair x 2) +// CupSecuringClip x 4 +// +// 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. +// +// Set +// fdia=2.85 +// lightduty=true +// And print following parts +// Hub +// ArmEnd x 3 +// FilamentCup x 3 (or FilamentCup + FilamentCupPair) +// CupSecuringClip x 3 +// TowerDoveClipPin x 6 +// +// When assembling, insert one TowerDoveClipPin from each side, +// joining each ArmEnd to the Hub with two TowerDoveClipPins. +// Modest force with pliers is good to seat them properly. +// +// (note that the light duty and heavy duty CupSecuringClips +// are slightly different) +// +// 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 +// printer framework. +// +// 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. +// +// Set +// fdia=2.85 +// lightduty=false +// And print one of these, according to taste +// StorageArmLeft +// StorageArmRight +// +// NB that the `light duty' version of this is shorter and +// will only take two `light duty' spools. +// +// 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. + + +fdia=2.85; // or 1.75 +lightduty=false; // or true + slop=0.5; bigslop=slop*2; @@ -11,6 +104,8 @@ function usedove() = selsz(true,true,false); num_arms = selsz(3,3,4); +channelslop=selsz(slop,0.75,slop); + exteffrad = 70; hubeffrad = selsz(30, 82, 40); hubbigrad = selsz(20, 38, 38); @@ -56,7 +151,7 @@ overcliproundr=2.0; overclipthick=1.0; overclipcupnextgap=selsz(20,15,20); -hubaxlelen = selsz(25, 62.5, 87.5); +hubaxlelen = selsz(25, 62.5, 77.5); echo(hubaxlelen); overclipsmaller=-2.5; @@ -103,7 +198,7 @@ include include include -channelwidth = prongthick + slop; +channelwidth = prongthick + channelslop; channeldepth = prongwidth + ratchettoothheight; totalwidth = armendwallthick*2 + channelwidth; totalheight = channeldepth + armendbasethick; @@ -449,6 +544,175 @@ module FilamentCupPair(){ ////toplevel rotate([0,0,180]) FilamentCup(); } +//----- storarm ----- + +storarm_hooklen = 8; +storarm_hookheight = 5; +storarm_thick = 10; +storarm_axleslop = 4; + +storarm_base_w = 30; +storarm_base_h = 100; +storarm_base_d = 15; +storarm_base_mind = 2; + +storarm_cope_hubaxle_mk1 = true; + +storarm_screw_hole = 4; +storarm_screw_hole_slop = 0.5; +storarm_besides_hole = 4; + +storarm_under_hole = 5; +storarm_screw_hole_head = 8.8; +storarm_screw_hole_head_slop = 1.5; + +// calculated + +storarm_axlerad = hubaxlerad - storarm_axleslop; +storarm_mainlen = hubaxlelen*2 + storarm_axleslop + + (storarm_cope_hubaxle_mk1 ? 10 : 0); +storarm_totlen = storarm_mainlen + storarm_hooklen; + +storarm_mid_off_y = storarm_axlerad; + +storarm_base_off_y = storarm_mid_off_y + storarm_base_h/2; + +module StorageArmDiagPartSide(xmin, xmax){ + xsz = xmax-xmin; + yuse = storarm_thick/2; + + intersection(){ + translate([xmin-1, -storarm_axlerad, storarm_thick/2]) + rotate([0,90,0]) + cylinder(r=storarm_axlerad, h=xsz+2, $fn=60); + translate([xmin, -yuse, 0]) + cube([xsz, yuse, storarm_thick]); + } +} + +module StorageArmDiagPart(xmin, xmax, shear, adjbot){ + hull(){ + StorageArmDiagPartSide(xmin,xmax); + + multmatrix([[1,0,0,0], + [shear,1,0,0], + [0,0,1,0], + [0,0,0,1]]) + translate([0, -storarm_axlerad*2 + adjbot, 0]) + mirror([0,1,0]) + StorageArmDiagPartSide(xmin,xmax); + } +} + +module StorageArmBaseTemplate(){ + square([storarm_base_w, storarm_base_h]); +} + +module StorageArmAtMountingHoles(){ + bes = storarm_besides_hole + storarm_screw_hole; + + x0 = bes; + x1 = storarm_base_w-bes; + y1 = storarm_base_h - bes; + y0 = bes; + + for (pos=[ [x0, y1], + [x1, y1], + [x1, y0] ]) { + rotate([0,90,0]) + translate([pos[0] - storarm_base_w, + pos[1] - storarm_base_off_y, -storarm_base_d]) + children(); + } +} + +module StorageArmRight(){ ////toplevel + shear = storarm_hookheight / (storarm_mainlen/2); + + StorageArmDiagPart(-1, storarm_mainlen/2+1, shear, 0); + StorageArmDiagPart(storarm_mainlen/2-1, storarm_mainlen+1, shear/2, + storarm_hookheight/2); + + translate([0, storarm_hookheight, 0]) + StorageArmDiagPart(storarm_mainlen, storarm_totlen, + shear/2, -storarm_hookheight/2); + + difference(){ + union(){ + hull(){ + translate([-storarm_base_d, -storarm_base_off_y, storarm_base_w]) + rotate([0,90,0]) + linear_extrude(height=storarm_base_mind) + StorageArmBaseTemplate(); + StorageArmDiagPart(-1, 0, shear, 0); + } + StorageArmAtMountingHoles(){ + cylinder(r= storarm_screw_hole_head/2, + h=10); + } + } + StorageArmAtMountingHoles(){ + translate([0,0,-1]) + cylinder(r= (storarm_screw_hole + storarm_screw_hole_slop)/2 , + h=20); + translate([0,0,storarm_under_hole]) + cylinder(r= (storarm_screw_hole_head + storarm_screw_hole_head_slop)/2, + h=20); + } + } +} + +module StorageArmLeft(){ ////toplevel + mirror([1,0,0]) StorageArmRight(); +} + +module StorArmHoleTest(){ ////toplevel + sz = storarm_screw_hole_head + storarm_besides_hole*2; + intersection(){ + StorageArmRight(); + translate([-50, -storarm_base_off_y, -1]) + cube([100, sz, sz+1]); + } +} + + +//----- filament guide clip spacer clip ----- + +guideclip_armdia = 15.0 + 0.5; +guideclip_armwidth = 10.2 + 0.5; +guideclip_armspacelen = 15.3 - 0.25; + +guideclip_prongprotrude = 4; +guideclip_thick = 1.6; + +module FilamentGuideClipArmTemplate(extra=0){ + intersection(){ + circle(r= (guideclip_armdia/2) + extra); + square(center=true, [guideclip_armwidth+extra*2, + guideclip_armdia + extra*2 + 10]); + } +} + +module FilamentGuideClipSpacerClipInnerTemplate(){ + FilamentGuideClipArmTemplate(); + translate([0, -guideclip_armdia/2]) + square(center=true, [guideclip_armwidth - guideclip_prongprotrude, + guideclip_armdia]); +} + +module FilamentGuideClipSpacerClip(){ ////toplevel + difference(){ + union(){ + linear_extrude(height= guideclip_armspacelen) + FilamentGuideClipArmTemplate(extra= guideclip_thick); + } + translate([0,0,-1]) + linear_extrude(height= guideclip_armspacelen+2) + FilamentGuideClipSpacerClipInnerTemplate(); + } +} + + module Demo(){ translate([-hubeffrad-30,50,0]) Hub(); ArmEnd(); @@ -465,3 +729,6 @@ module Demo(){ //AxleWasher(); //AxlePin(); //AxleFrictionWasher(); +//StorageArmLeft(); +//StorArmHoleTest(); +//Demo();