Drill Stop
A split depth-stop collar that slips onto a drill bit and stops it at the depth wanted. The bore is slightly smaller than the drill and the collar is split, so it springs open over the bit and grips it; two ears beside the split take a rubber band or a small cable tie when more grip is needed, and a groove round the outside keeps the band in place. The broad square end face is what stops against the work. Print a single collar for any drill from 2 to 13 mm, or the set of six for 3, 4, 5, 6, 8 and 10 mm, each with its size engraved on top. A single 6 mm collar is 16 x 21 x 12 mm; the set lays out as 177 x 25 x 12 mm. Prints standing on its flat end with the bore vertical, no supports. Parameters: single or set, drill diameter, collar length, grip undersize and wall thickness.
# Drill Stop - split depth-stop collar for 2 to 13 mm drills, single size or a set
#
# A collar that slips onto a drill bit and stops it at the depth wanted. The bore is a
# little smaller than the drill and the collar is split, so it springs open over the bit
# and grips it; two ears beside the split take a rubber band or a small cable tie when
# more grip is needed on a hard-running drill. A flat on the collar's end face against the
# work is what stops the drill, so the end is kept square and broad.
# "set" prints one collar for each of the common sizes (3, 4, 5, 6, 8, 10), each with its
# size engraved on the top. Prints standing on its flat end, bore vertical, no supports.
@param choices:["single", "set"] desc:"One collar or the set"
$which = "single"
@param 2..13 step:0.5 desc:"Single: drill diameter (mm)"
$drill = 6
@param 8..20 desc:"Collar length (mm)"
$length = 12
@param 0.1..0.5 step:0.1 desc:"Grip: bore undersize (mm)"
$grip = 0.25
@param 4..8 desc:"Wall thickness around the bore (mm)"
$wall = 5
$n = if $which == "set" then 6 else 1
def dia($i) = if $which == "single" then $drill else (if $i == 0 then 3 else if $i == 1 then 4 else if $i == 2 then 5 else if $i == 3 then 6 else if $i == 4 then 8 else 10)
def collar($d) = cylinder ($d / 2 + $wall) $length center:(true, true, false)
def bore($d) = cylinder (($d - $grip) / 2) ($length + 2) center:(true, true, false) | translate 0 0 -1
# the split runs along +Y; the ears flank it
def ears($d) = box 7 ($wall + 2) $length center:(true, false, false) | translate 0 ($d / 2 + $wall - 2) 0
def split($d) = box 1.2 ($d + 2 * $wall + 4) ($length + 2) center:(true, false, false) | translate 0 ($d / 2 - 1) -1
# band groove around the outside at mid height, so a rubber band stays put
def groove_ring($d) = (cylinder ($d / 2 + $wall + 1) 2.4 center:(true, true, false)) - (cylinder ($d / 2 + $wall - 1) 2.4 center:(true, true, false))
def label($d) = text ("" + $d) 4 | extrude 1 | translate 0 (-($d / 4 + $wall / 2)) ($length - 0.5)
def c0($d) = collar($d) + ears($d)
def c1($d) = c0($d) - bore($d)
def c2($d) = c1($d) - split($d)
def groove_at($d) = groove_ring($d) | translate 0 0 ($length / 2 - 1.2)
def c3($d) = c2($d) - groove_at($d)
def one($d) = c3($d) - label($d)
def px($i) = ($i - ($n - 1) / 2) * 32
$out = union [one(dia(i)) | translate px(i) 0 0 for i in range($n)]
# --- Checks ---------------------------------------------------------------------------
assert $out.solids == $n
assert $out.bbox.z ~ $length
assert $wall >= 4 # enough wall to spring, not crack
$d0 = dia(0)
assert one($d0).volume < c0($d0).volume # bore, split, groove and label all removed material
print "collars" $n
$out