Santa delivered a pair of helmets that will require mirror mounts and a mic boom before the spring riding season kicks in. The visor has tabs that snap into sockets on each side of the helmet:

It occurred to me that I could make an interposer between the helmet and the visor that could anchor the mic boom, with a tab for the helmet and a socket of some sort for the visor. While that’s still on the to-do list, the tab looks like this:

Those are 1 mm cubes on 10 mm centers, so this is a teeny little thing.
I don’t have a good idea for the corresponding socket, because those little grippers seem much too small for 3D printing, but now I have some tabs to play with:

The OpenSCAD source code puts the tab atop an oval base plate, but it’ll eventually stick out of the boom mount:
// Bell Helmet Visor Mount // Ed Nisley KE4ZNU // December 2013 // Layout options Layout = "Build"; // Build Show //----- // Extrusion parameters must match reality! ThreadThick = 0.20; ThreadWidth = 0.4; HoleWindage = 0.2; //-- Handy stuff function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit); Protrusion = 0.1; // make holes end cleanly inch = 25.4; //---------------------- // Dimensions //---------------------- // Useful routines module PolyCyl(Dia,Height,ForceSides=0) { // based on nophead's polyholes Sides = (ForceSides != 0) ? ForceSides : (ceil(Dia) + 2); FixDia = Dia / cos(180/Sides); cylinder(r=(FixDia + HoleWindage)/2, h=Height, $fn=Sides); } //- Put peg grid on build surface module ShowPegGrid(Space = 10.0,Size = 1.0) { RangeX = floor(100 / Space); RangeY = floor(125 / Space); for (x=[-RangeX:RangeX]) for (y=[-RangeY:RangeY]) translate([x*Space,y*Space,Size/2]) %cube(Size,center=true); } //------------------- // Shapes TabBaseLength = 17.0; TabTopLength = 15.5; TabWidth = 4.00; TabHeight = 5.5; TabEmbed = 0.5; TabTaperHeight = 3.70; TabBaseHeight = TabHeight - TabTaperHeight; LatchBar = 2.25; // square cross section WebIndent = 1.60; // from outside edge of post WebThick = TabWidth - 2*WebIndent; LatchIndentTall = TabHeight - LatchBar; PostLength = 5.00; PostTaper = 1.25; LatchIndentLength = TabBaseLength - 2*(PostLength + PostTaper); module BellLatch() { difference() { intersection() { translate([0,TabWidth/2,0]) rotate([90,0,0]) // side view linear_extrude(height=TabWidth) polygon(points=[ [-TabBaseLength/2,-TabEmbed],[-TabBaseLength/2,TabBaseHeight],[-TabTopLength/2,TabHeight], [TabTopLength/2,TabHeight],[TabBaseLength/2,TabBaseHeight],[TabBaseLength/2,-TabEmbed] ]); translate([0,0,-TabEmbed]) linear_extrude(height=(TabHeight + TabEmbed),convexity=3) // top view polygon(points=[ [-TabBaseLength/2,-TabWidth/2], [-TabBaseLength/2, TabWidth/2], [-(TabBaseLength/2 - PostLength), TabWidth/2], [-(TabBaseLength/2 - PostLength - PostTaper),LatchBar/2], [ (TabBaseLength/2 - PostLength - PostTaper),LatchBar/2], [ (TabBaseLength/2 - PostLength),TabWidth/2], [ TabBaseLength/2, TabWidth/2], [ TabBaseLength/2,-TabWidth/2], [ (TabBaseLength/2 - PostLength),-TabWidth/2], [ (TabBaseLength/2 - PostLength - PostTaper),-LatchBar/2], [-(TabBaseLength/2 - PostLength - PostTaper),-LatchBar/2], [-(TabBaseLength/2 - PostLength),-TabWidth/2] ]); } for (y=[-1,1]) translate([0,y*((TabWidth/2 + WebThick/2)),LatchIndentTall/2]) cube([LatchIndentLength,TabWidth,LatchIndentTall],center=true); } /* difference() { translate([0,0,TabHeight/2]) cube([TabLength,TabWidth,TabHeight],center=true); } */ } //------------------- // Build things... ShowPegGrid(); if (Layout == "Show") BellLatch(); if (Layout == "Build") { translate([0,0,2.0]) BellLatch(); difference() { resize([20.0,10.5,2.0]) cylinder(r=2,h=2,$fn=32); for (x=[-1,1]) translate([x*(5/2 + TabBaseLength/2 + 0.5),0,5+0.6]) cube([5,25,10],center=true); } }