The Smell of Molten Projects in the Morning

Ed Nisley's Blog: Shop notes, electronics, firmware, machinery, 3D printing, laser cuttery, and curiosities. Contents: 100% human thinking, 0% AI slop.

Crosman BB Bottle Cap

Mary made a frame weight to maintain tension on the fabric in the HQ Sixteen longarm:

Longarm fabric frame weight
Longarm fabric frame weight

It’s a sturdy cloth tube filled with BBs, somewhat like a grossly overweight door snake (a.k.a. draft stopper).

The bottle of 6000 copper-plated steel BBs arrived in an overwrap bag of the sort Amazon applies to all bottled products. This was a Good Thing, because the scrap of packing paper did nothing to cushion the bottle in an otherwise empty box. The bag contained most of the shattered cap and a few BBs, with escapees rattling around inside the box and surely a few left along the way.

So I conjured a replacement cap from TPU:

Crosman BB bottle cap - solid model - build view
Crosman BB bottle cap – solid model – build view

It fits around the bottle neck and snaps onto the spout just like the original:

Crosman BB bottle cap
Crosman BB bottle cap

Except this one is unbreakable.

The strapless TPU cap was a quick test to verify the fiddly shoulder snapping onto the bottle snout:

Crosman BB bottle cap - solid model - section view
Crosman BB bottle cap – solid model – section view

As it turned out, we poured all 6000 BBs (minus those few lost-in-transit strays) into the cloth tube, but the bottle will come in handy for something someday.

The OpenSCAD source code as a GitHub Gist:

// Crosman BB bottle cap
// Ed Nisley – KE4ZNU
// 2026-02-22
include <BOSL2/std.scad>
Layout = "Show"; // [Show,Build,Section]
/* [Hidden] */
ID = 0;
OD = 1;
LENGTH = 2;
HoleWindage = 0.2;
Protrusion = 0.1;
NumSides = 6*3*4;
$fn=NumSides;
WallThick = 1.0;
Heights = [1.2,2.0,13.0,WallThick]; // for easy tweaking
Ring = [34.5,39,WallThick];
Strap = [70.0,5.0,Ring[LENGTH]];
CapOAL = sum(Heights);
//—–
// Conjure it with magic numbers
module Cap() {
tube(Heights[0],id=16.8,wall=WallThick+0.6/2,anchor=BOTTOM) position(TOP)
tube(Heights[1],id=17.4,wall=WallThick,anchor=BOTTOM) position(TOP)
tube(Heights[2],id1=17.4,id2=14.0,wall=WallThick,anchor=BOTTOM) position(TOP)
cyl(Heights[3],d=14.0+2*WallThick,rounding2=WallThick/2,anchor=BOTTOM) position(BOTTOM)
cuboid(Strap,anchor=BOTTOM+LEFT) position(BOTTOM+RIGHT)
left(1.0)
tube(Ring[LENGTH],id=Ring[ID],od=Ring[OD],anchor=BOTTOM+LEFT);
}
//—–
// Build things
if (Layout == "Show") {
Cap();
}
if (Layout == "Section") {
difference() {
Cap();
down(Protrusion)
cuboid(2*Strap.x,anchor=BOTTOM+LEFT+FRONT);
}
}
if (Layout == "Build") {
back(Strap.x/2)
zrot(90)
up(CapOAL)
yrot(180)
Cap();
}

Comments

Spam comments get trashed, so don’t bother. Comment moderation may cause a delay.