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.

Month: January 2014

  • Planetary Gear Bearing: Now With Knurling!

    OK, I couldn’t resist. Tweaking a few lines of code wrapped a knurl around emmitt’s Gear Bearing for enhanced griptivity:

    Knurled vs original Planetary Gear Bearing
    Knurled vs original Planetary Gear Bearing

    That image has desaturated red to suppress the camera’s red burnout. It looks better in the realm of pure math:

    Planetary Gear Bearing - Kurled - solid model
    Planetary Gear Bearing – Kurled – solid model

    Reducing the tolerance parameter to 0.4 produced a surprisingly rigid, yet freely turning, bearing that required no cleanup: it popped off the plate ready to roll!

    The heavy lifting in the OpenSCAD source code remains emmitt’s work. I replaced the outer cylinder with a knurl and simplified his monogram to stand out better amid the diamonds. This is the affected section:

    ... snippage ...
    translate([0,0,T/2]){
    	difference(){
    //		cylinder(r=D/2,h=T,center=true,$fn=100);
    		render(convexity=10)
    		translate([0,0,-T/2])
    			knurl(k_cyl_hg=T,
    			k_cyl_od=D,
    			knurl_wd=5.0,
    			knurl_hg=5.0,
    			knurl_dp=0.5,
    			e_smooth=5.0/2);
    		herringbone(nr,pitch,P,DR,-tol,helix_angle,T+0.2);
    //		difference(){
    			translate([0,-(D/2+4.5),0])rotate([90,0,0])monogram(h=10);
    //			cylinder(r=D/2-0.25,h=T+2,center=true,$fn=100);
    //		}
    	}
    	rotate([0,0,(np+1)*180/ns+phi*(ns+np)*2/ns])
    	difference(){
    		mirror([0,1,0])
    			herringbone(ns,pitch,P,DR,tol,helix_angle,T);
    		cylinder(r=w/sqrt(3),h=T+1,center=true,$fn=6);
    	}
    	for(i=[1:m])rotate([0,0,i*360/m+phi])translate([pitchD/2*(ns+np)/nr,0,0])
    		rotate([0,0,i*ns/m*360/np-phi*(ns+np)/np-phi])
    			render(convexity=10)
    			herringbone(np,pitch,P,DR,tol,helix_angle,T);
    }
    

    I also added a few render(convexity=n) operations to improve the preview, but that’s just cosmetic.

  • Bell Helmet Visor Mount Tabs

    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:

    Bell Helmet Visor Mount - socket
    Bell Helmet Visor Mount – socket

    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:

    Bell Helmet Visor Mount
    Bell Helmet Visor Mount

    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:

    Bell Helmet Visor Mount - OEM vs 3D Printed
    Bell Helmet Visor Mount – OEM vs 3D Printed

    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);
    	}
    
    }
    
  • Blog Summary: 2013

    I should give up on the tech and write about, oh, kittens…

    Blog summary - YE 2013
    Blog summary – YE 2013

    If I knew anything about the Raspberry Pi’s PWM, writing about it might displace that Arduino PWM post from the top spot…

    And, once again, the fifth most popular post documents my struggle to remove a water heater anode rod. That says something, but I’m not sure what.

    The Christmas post from 2011 featuring the snow-covered pine tree evidently comes up near the top of everybody’s image search; I wonder how many homebrew Christmas cards feature it?

    Onward, into the new year…