Spool Hub Silica Gel Canister
A short vented can for silica gel beads that sits inside the centre hole of a filament spool in its storage bag or dry box, so the desiccant travels with the spool. The wall carries rings of vent holes and the lid top is perforated too, all smaller than the beads; the lid screws on with a printed thread. The can's outer diameter is 4 mm under the hub diameter you enter, and the lid is checked to fit through the hub as well. The default fits a 52 mm hub: the can is 48 mm across and 50 mm tall, the lid 53 mm across. Print the can upright and the lid upside down as laid out, with no supports. Fill with beads, screw the lid on and drop it into the spool. Adjustable parameters: hub diameter, can height, wall thickness, vent hole diameter and count per ring, thread pitch and thread clearance.
# Silica Gel Canister - vented screw-lid can that sits in the hub of a filament spool
#
# A short can of silica gel beads that goes inside the centre hole of a filament spool
# in its storage bag or dry box. The wall and the lid top are perforated with holes
# smaller than the beads; the lid screws on with a printed thread. The can's outer
# diameter is 4 mm under the hub diameter and the lid is checked to fit through the hub.
# Print layout: can upright, lid upside down beside it (internal thread needs no
# supports). Fill with beads, screw the lid on, drop it in the spool.
@param 40..80 step:1 group:"Size" desc:"Inner diameter of the spool hub it fits (mm)"
$hub_d = 52
@param 30..80 step:1 group:"Size" desc:"Can height without the lid (mm)"
$height = 50
@param 1.2..2.4 step:0.2 group:"Size" desc:"Wall thickness (mm)"
$wall = 1.6
@param 1..3 step:0.1 group:"Vents" desc:"Vent hole diameter (mm): smaller than the beads"
$hole_d = 1.8
@param 8..16 step:1 group:"Vents" desc:"Vent holes per ring around the wall"
$per_ring = 12
@param 2..5 step:0.5 group:"Thread" desc:"Thread pitch (mm)"
$pitch = 3
@param 0.2..0.6 step:0.05 group:"Thread" desc:"Radial clearance between can and lid thread (mm)"
$clearance = 0.4
$r_out = $hub_d / 2 - 2 # can outer radius
$r_in = $r_out - $wall
$floor_t = 1.6
$depth = 1.2 # thread depth
$land = $pitch - 2 * $depth # 45 deg flanks
$turns = 2
$band_h = $turns * $pitch
$neck_root = $r_out - $depth - 0.6 # the neck steps in so the lid stays inside the hub
$neck_crest = $neck_root + $depth
$neck_z = $height - $band_h - 1 # neck starts here; 1 mm plain at the rim
$lid_root = $neck_crest + $clearance
$lid_out = $lid_root + $wall
$cap_t = 2
assert 2 * $lid_out <= $hub_d - 1 # the lid fits through the hub too
$neck_bore = $neck_root - 1.2 # the bore narrows under the thread (1.2 mm neck wall)
assert $neck_bore >= 15 # still wide enough to pour beads through
# --- Can ----------------------------------------------------------------------
$thread = thread $neck_crest $pitch $band_h land:$land depth:$depth chamfer:($depth, $depth) center:(true, true, false)
| translate 0 0 $neck_z
$shell = (cylinder $r_out $neck_z center:(true, true, false))
+ (cylinder $neck_root ($height - $neck_z) center:(true, true, false) | translate 0 0 $neck_z)
+ $thread
- (cylinder $r_in ($neck_z - 1.5 - $floor_t) center:(true, true, false) | translate 0 0 $floor_t) # 1.5 mm ceiling ring joins body and neck
- (cylinder $neck_bore ($height - $neck_z + 4) center:(true, true, false) | translate 0 0 ($neck_z - 1.6)) # the bore reaches the cavity
# vent rings on the wall: radial holes, every other ring turned half a step
$ring_n = floor(($neck_z - 8) / 5)
$vent = cylinder ($hole_d / 2) ($r_out * 2 + 4) | rotate 90 0 0
$vents = union [$vent | polar $per_ring 0 | rotate 0 0 (($k % 2) * 180 / $per_ring) | translate 0 0 (6 + 5 * $k) for $k in range($ring_n)]
$can = ($shell - $vents) | edges <Z | chamfer 0.6
assert $can.solids == 1
assert $can.bbox.x ~ (2 * $r_out) tol:0.2
assert $can.bbox.z ~ $height
# --- Lid, in its screwed-on position --------------------------------------------
$n_below = 2
$cutter = thread $lid_root $pitch ($band_h + 8 * $pitch) land:$land depth:$depth center:(true, true, false)
| translate 0 0 ($neck_z - $n_below * $pitch)
$skirt_z = $neck_z + 0.5 # the skirt stops above the step from the body to the neck
$lid_h = $height + $cap_t - $skirt_z
$skirt = (cylinder $lid_out ($height - $skirt_z) center:(true, true, false) | translate 0 0 $skirt_z) - $cutter
$lead = cone ($lid_root + 0.6) ($lid_root - $depth) ($depth + 0.6) center:(true, true, false) | translate 0 0 $skirt_z
$cap = cylinder $lid_out $cap_t center:(true, true, false) | translate 0 0 $height
$grip = cylinder 1 ($lid_h - 1) center:(true, true, false) | polar 36 $lid_out | translate 0 0 ($skirt_z + 0.5)
$top_vents = (cylinder ($hole_d / 2) ($cap_t + 2) | polar 12 ($lid_out * 0.6))
+ (cylinder ($hole_d / 2) ($cap_t + 2) | polar 6 ($lid_out * 0.3))
| translate 0 0 ($height + $cap_t / 2)
$lid_on = $skirt + $cap + $grip - $lead - $top_vents
assert $lid_on.solids == 1
assert clear($can, $lid_on)
$probe_in = thread ($neck_crest + $clearance - 0.05) $pitch $band_h land:$land depth:$depth center:(true, true, false) | translate 0 0 $neck_z
$probe_out = thread ($neck_crest + $clearance + 0.1) $pitch $band_h land:$land depth:$depth center:(true, true, false) | translate 0 0 $neck_z
assert clear($probe_in, $lid_on)
assert clear($probe_out, $lid_on) == false
# --- Print layout -------------------------------------------------------------
$lid = $lid_on | rotate 180 0 0 | floor | translate ($r_out + $lid_out + 10) 0 0
assert $lid.bbox.z ~ $lid_h tol:0.01
print "can" $can.bbox
print "lid" $lid.bbox
print "vent holes on the wall" ($ring_n * $per_ring)
$can + $lid