Spool Roller
A filament spool holder that lets the spool turn on four 608 bearings (22 x 8 x 7 mm, bought separately) as the printer pulls filament. A flat frame carries two rails; each rail has two bearing blocks, and a printed pin holds a bearing between the uprights of each block. The rail spacing follows the spool width so the bearings sit under the flanges, the roller spacing follows the spool diameter, and the file checks that the spool clears the frame. The default suits a 200 mm by 65 mm spool: the frame measures 139 x 72 x 26 mm and the four pins are laid out beside it. Everything prints flat with no supports; press a pin through each block with a bearing between the uprights. Adjustable parameters: spool diameter and width, roller angle, bearing side play and pin diameter.
# Spool Roller - filament spool holder on four 608 bearings, sized from the spool
#
# A flat frame with two rails; each rail carries two bearing blocks, and a 608 bearing
# (22 x 8 x 7 mm) sits in each block on a printed pin. The spool's flanges rest on the
# four bearings and the spool turns freely as the printer pulls filament. The rail
# spacing follows the spool width and the roller spacing follows the spool diameter,
# and the file checks that the spool clears the frame. Printed parts: the frame and
# four pins (laid out beside it); the bearings are bought. Press a pin through each
# block with a bearing between the uprights. Prints flat with no supports.
@param 150..220 step:5 group:"Spool" desc:"Spool diameter (mm)"
$spool_d = 200
@param 40..100 step:1 group:"Spool" desc:"Spool width, flange to flange (mm)"
$spool_w = 65
@param 20..35 step:1 group:"Spool" desc:"Angle from the spool centre to each roller (deg): wider is steadier, narrower turns easier"
$roller_angle = 27
@param 0.1..0.4 step:0.05 group:"Fit" desc:"Clearance of the bearing between the uprights (mm, each side)"
$side_play = 0.2
@param 7.6..8.1 step:0.05 group:"Fit" desc:"Pin diameter (mm): the bearing bore is 8.0"
$pin_d = 7.9
$b_od = 22 # 608 bearing
$b_w = 7
$base_t = 6
$bar_w = 14
$up_t = 3 # upright thickness
$gap = $b_w + 2 * $side_play # between the uprights
$axle_z = $base_t + $b_od / 2 + 2 # bearing 2 mm above the base
$span = 2 * ($spool_d / 2 + $b_od / 2) * sin($roller_angle) # roller centre spacing
$track = $spool_w - $b_w # rail spacing: bearings under the flanges
$len = $span + $b_od + 16
$wid = $track + $bar_w
# --- Frame: two rails, two cross bars ---
$rails = union [box $len $bar_w $base_t at:(0, $y) center:(true, true, false) for $y in [-$track / 2, $track / 2]]
$cross = union [box $bar_w $wid $base_t at:($x, 0) center:(true, true, false) for $x in [-$len / 2 + $bar_w / 2, $len / 2 - $bar_w / 2]]
$frame_base = ($rails + $cross) | edges =Z | fillet 2
# bearing blocks: two uprights per bearing with a pin hole, at four positions
$up_h = $axle_z + $pin_d / 2 + 3
$upright = box $bar_w $up_t $up_h center:(true, true, false) | edges >Z =X | fillet 3
def block($x, $y) = union [$upright | translate $x ($y + $s * ($gap / 2 + $up_t / 2)) 0 for $s in [-1, 1]]
$px = [-$span / 2, -$span / 2, $span / 2, $span / 2] # the four bearing positions
$py = [-$track / 2, $track / 2, -$track / 2, $track / 2]
$blocks = union [block($px[$i], $py[$i]) for $i in range(4)]
$pin_holes = union [cylinder ($pin_d / 2 + 0.05) ($gap + 2 * $up_t + 2) | rotate 90 0 0 | translate ($px[$i]) ($py[$i]) $axle_z for $i in range(4)]
$frame = ($frame_base + $blocks) - $pin_holes
assert $frame.solids == 1
assert $frame.bbox.x ~ $len
assert $frame.bbox.y ~ $wid
assert $frame.bbox.z ~ $up_h
# --- Bearings (bought) in place, for the clearance checks ---
$bearing = (cylinder ($b_od / 2) $b_w) - (cylinder 4 ($b_w + 2)) | rotate 90 0 0
$bearings = union [$bearing | translate ($px[$i]) ($py[$i]) $axle_z for $i in range(4)]
assert clear($bearings, $frame)
# the spool: a disc of the spool diameter resting on the two rollers of one rail
$spool_z = $axle_z + sqrt(($spool_d / 2 + $b_od / 2) ** 2 - ($span / 2) ** 2)
$spool = cylinder ($spool_d / 2) $spool_w | rotate 90 0 0 | translate 0 0 $spool_z
assert clear($spool, $frame)
assert $spool_z - $spool_d / 2 >= $base_t + 3 # spool bottom clears the base
print "spool centre height (mm)" $spool_z
print "roller spacing (mm)" $span
# --- Pins: head on one end, printed standing ---
$pin_len = $gap + 2 * $up_t + 1
$pin = (cylinder ($pin_d / 2) $pin_len center:(true, true, false)) + (cylinder 5.5 1.5 center:(true, true, false) | translate 0 0 $pin_len)
| faces <Z | chamfer 0.6
assert $pin.solids == 1
$pins = union [$pin | translate ($len / 2 + 12) (-18 + 12 * $k) 0 for $k in range(4)]
print "frame" $frame.bbox
print "pin length (mm)" $pin_len
$frame + $pins