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.

Tag: Improvements

Making the world a better place, one piece at a time

  • Mini-lathe Metric Threading: Stackable Change Gear Generator

    Mini-lathe Metric Threading: Stackable Change Gear Generator

    Although OpenSCAD’s MCAD library includes a gear generator, I don’t profess to understand the relations between reality and its myriad parameters, plus I vaguely recall it has a peculiar definition for Diametral Pitch (or some such). Rather than fiddle with all that, I start with an SVG outline from Inkscape’s Gears extension and go all 3D on it.

    So, the “gear blank” looks like this after extruding the SVG:

    Mini-lathe change gear - 42 tooth - SVG import
    Mini-lathe change gear – 42 tooth – SVG import

    Producing this is a lot easier in OpenSCAD than in real life:

    Mini-lathe change gear - 42 tooth - solid model
    Mini-lathe change gear – 42 tooth – solid model

    OpenSCAD centers the blank’s bounding box at XY=0, which won’t be exactly on the bore centerline for gears with an odd number of teeth. One tooth sits at 0° and two teeth bracket 180°, so the bounding box will be a little short on one side

    A reference for gear nomenclature & calculations will come in handy.

    For a 21 tooth module 1 gear, which should be pretty close to the worst case in terms of offset:

    • Pitch dia = d = 21 × 1 = 21 mm
    • Tip dia = da = d + 2m = 23 mm
    • Tip radius = da/2 = 11.5 mm
    • Tooth-to-tooth angle = 360/21 = 17.143°
    • Radius to tangent across adjacent teeth = 11.5 × cos 17.143°/2 = 11.372 mm

    An actual metal 21 tooth gear measures 22.87 mm across a diameter, dead on what those numbers predict: 11.5 + 11.372 = 22.872 mm.

    So the bounding box will be 11.5 mm toward the tooth at 0° and 11.372 mm toward the gap at 180°. The offset will be half that, with the tooth at 0° sitting 0.063 mm too close to the origin. Gears with more teeth will have smaller errors.

    Given that we’re dealing with a gear “machined” from plastic goo, that’s definitely close enough:

    Mini-Lathe change gears - 1 mm - 45-50-45-60
    Mini-Lathe change gears – 1 mm – 45-50-45-60

    That’s an earlier version with the debossed legend.

    The code can also generate stacked gears for the BC shaft in the middle:

    Mini-lathe change gear - 42-55 tooth stacked - solid model
    Mini-lathe change gear – 42-55 tooth stacked – solid model

    In principle, the key locking the gears together isn’t needed and the bore could fit the inner shaft, rather than the keyed bushing, but then you’d (well, I’d) be at risk of losing the bushing + key in one easy operation.

    So it’s better to go with the bushing:

    Mini-Lathe change gears - stacked 50-42 - installed
    Mini-Lathe change gears – stacked 50-42 – installed

    Now, to cut some threads!

    The OpenSCAD source code as a GitHub Gist:

    // LMS Mini-Lathe
    // Change gears with stacking
    // Generate SVG outlines with Inkscape's Gear extension
    // Ed Nisley – KE4ZNU
    // 2020-05
    /* [Gears] */
    TopGear = 0; // zero for single gear
    BottomGear = 42;
    /* [Hidden] */
    ThreadThick = 0.25;
    ThreadWidth = 0.40;
    HoleWindage = 0.2;
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    Protrusion = 0.1; // make holes end cleanly
    Dir = ""; // empty string for current directory
    /* [Dimensions] */
    ShaftOD = 12.0;
    ShaftSides = 4*3;
    GearThick = 7.75;
    Keyway = [3.5 + HoleWindage,3.0 + HoleWindage,3*GearThick]; // x on radius, y on perim, z on axis
    LegendThick = 2*ThreadThick;
    LegendZ = (TopGear ? 2*GearThick : GearThick) – LegendThick;
    LegendRecess = [10,7,LegendThick];
    LegendEnable = (TopGear == 0 && BottomGear > 41) || (TopGear > 41);
    //———————-
    // Useful routines
    // Enlarge holes to prevent geometric shrinkage
    // based on nophead's polyholes
    // http://hydraraptor.blogspot.com/2011/02/polyholes.html
    // http://www.thingiverse.com/thing:6118
    module PolyCyl(Dia,Height,ForceSides=0) {
    Sides = (ForceSides != 0) ? ForceSides : (ceil(Dia) + 2);
    FixDia = Dia / cos(180/Sides);
    cylinder(r=(FixDia + HoleWindage)/2,
    h=Height,
    $fn=Sides);
    }
    //———————–
    // Build it!
    union() {
    difference() {
    union() {
    linear_extrude(GearThick,center=false,convexity=5)
    import(file=str(Dir,"Change Gear – ",BottomGear," teeth.svg"),
    center=true);
    if (TopGear)
    translate([0,0,GearThick])
    linear_extrude(GearThick,center=false,convexity=5)
    import(file=str(Dir,"Change Gear – ",TopGear," teeth.svg"),
    center=true);
    }
    rotate(180/ShaftSides)
    translate([0,0,-Protrusion])
    PolyCyl(ShaftOD,3*GearThick);
    translate([ShaftOD/2,0,Keyway.z/2 – Protrusion])
    cube(Keyway,center=true);
    if (LegendEnable) {
    translate([0,1.1*ShaftOD,LegendZ + LegendRecess.z/2])
    cube(LegendRecess + [0,0,Protrusion],center=true);
    if (TopGear) {
    translate([0,-1.1*ShaftOD,LegendZ + LegendRecess.z/2])
    cube(LegendRecess + [0,0,Protrusion],center=true);
    }
    }
    }
    if (LegendEnable)
    translate([0,0,LegendZ – Protrusion])
    linear_extrude(height=LegendThick + Protrusion,convexity=10) {
    translate([-0*2.5,1.1*ShaftOD])
    rotate(-0*90)
    text(text=str(BottomGear),size=5,font="Arial:style:Bold",halign="center",valign="center");
    if (TopGear)
    translate([-0*2.5,-1.1*ShaftOD])
    rotate(-0*90)
    text(text=str(TopGear),size=5,font="Arial:style:Bold",halign="center",valign="center");
    }
    }
  • Pride Lift Chair: Fuzzy Felt Feet

    Pride Lift Chair: Fuzzy Felt Feet

    By the Universal Principle of the Conservation of Perversity, the base of the floor lamp just barely doesn’t fit under the edge of the Comfy Chair:

    Floor Lamp - copper 70° elbow - installed
    Floor Lamp – copper 70° elbow – installed

    Well, I can fix that!

    Lift Chair Foot - installed
    Lift Chair Foot – installed

    The feet descend from the fuzzy felt feet on the plant shelves, with the hex head socket transmogrified into a circle to match the chair feet. The support structure grew a flat plate to ensure it doesn’t pull loose from the platform:

    Lift Chair Feet - solid model - support view
    Lift Chair Feet – solid model – support view

    Print ’em out, stick the felt in place:

    Lift Chair Feet - assembly
    Lift Chair Feet – assembly

    Lift the chair (maybe with a small prybar atop some plywood to protect the floor), position the feet, lower gently: done!

    While the M2 was warm, I ran off another set for the other Comfy Chair, just for symmetry.

    The OpenSCAD source code as a GitHub Gist:

    // Feet for Pride lift chair
    // Ed Nisley KE4ZNU 2020-05
    Layout = "Build"; // [Show, Build]
    Support = true;
    //- Extrusion parameters must match reality!
    // Print with 2 shells and 3 solid layers
    /* [Hidden] */
    ThreadThick = 0.25;
    ThreadWidth = 0.40;
    HoleWindage = 0.2;
    Protrusion = 0.1; // make holes end cleanly
    inch = 25.4;
    //———————-
    // Dimensions
    /* [Dimensions] */
    ChairFootOD = 33.0;
    ChairFootRecess = 5.0;
    FeltOD = 39.0;
    FeltRecess = 2.5;
    FootPlate = 6*ThreadThick;
    FootWall = 4*ThreadWidth;
    FootOD = 2*FootWall + max(ChairFootOD,FeltOD);
    echo(str("Foot OD: ",FootOD));
    FootTall = ChairFootRecess + FootPlate + FeltRecess;
    echo(str(" … height: "),FootTall);
    NumSides = 9*4;
    //———————-
    // Useful routines
    module FootPad() {
    difference() {
    cylinder(r=FootOD/2,h=FootTall,$fn=NumSides);
    translate([0,0,FeltRecess + FootPlate])
    cylinder(d=ChairFootOD,h=2*ChairFootRecess,$fn=NumSides);
    translate([0,0,-Protrusion])
    cylinder(d=FeltOD,h=(FeltRecess + Protrusion),$fn=NumSides);
    }
    }
    //——————-
    // Build it…
    if (Layout == "Show")
    FootPad();
    if (Layout == "Build") {
    translate([0,0,FootTall])
    rotate([180,0,0])
    FootPad();
    if (Support)
    color("Yellow") {
    for (Seg=[0:5])
    rotate(30 + 360*Seg/6)
    translate([0,0,(ChairFootRecess – ThreadThick)/2])
    cube([(ChairFootOD – 3*ThreadWidth),
    2*ThreadWidth,
    (ChairFootRecess – ThreadThick)],
    center=true);
    rotate(180/6)
    cylinder(d=0.5*ChairFootOD,h=ThreadThick,$fn=6);
    }
    }
  • Mini-Lathe Metric Threading: 42 Tooth Gear

    Mini-Lathe Metric Threading: 42 Tooth Gear

    Going from a 21 tooth gear to a 42 tooth gear means you must reduce the remaining train ratio by a factor of two for a given thread pitch. Here’s a 42-50-45-60 train, with the same -125 ppm error as the 21-50-60-40 train and no screw / washer clearance issues between the A screw and the C gear:

    Mini-Lathe change gears - 1 mm - 45-50-45-60
    Mini-Lathe change gears – 1 mm – 45-50-45-60

    The original 60-40 CD pair has a 3:2 ratio, the 45-60 CD pair is 3:4, so that’s where the factor-of-two reduction happens.

    The first pass at the solid model included a debossed legend:

    Mini-lathe 42 tooth change gear - Slic3r
    Mini-lathe 42 tooth change gear – Slic3r

    With a printed gear in hand, I realized the legend must be embossed below the surface, so as not to rub against an adjacent gear; better modeling is in order.

    The general idea is to set Inkscape’s (known-good) gear generator to the correct gear parameters (module 1 → 3.14 mm circular pitch, 20° pressure angle):

    Inkscape Gear Generator dialog
    Inkscape Gear Generator dialog

    Save the outline as an SVG:

    Inkscape Gear Generator result
    Inkscape Gear Generator result

    If you do like I did and neatly position the gear at the bottom-left origin, all SVG viewers will show only the Quadrant I arc, probably because Inkscape sets the SVG file to display it that way. I’ve made that mistake before and maybe, someday, I’ll remember.

    Load the SVG into OpenSCAD, which will find the entire gear, no matter where it falls in the coordinate space, and spike it at the origin:

    linear_extrude(8.0,center=false,convexity=5) 
     import(file="/the-source-directory/Mini-Lathe/Change Gear - 42 teeth.svg",center=true);
    

    The linear_extrude( … center=false … ) keeps the bottom of the blank at Z=0. The import( … center=true … ) puts the 2D shape at the XY origin. Because OpenSCAD centers the bounding box, gears with an odd number of teeth will be ever so slightly off-center, which would matter a whole lot more in a fancier machine tool than a mini-lathe.

    All of which produces a tidy 3D gear blank:

    Mini-lathe change gear - 42 tooth - SVG import
    Mini-lathe change gear – 42 tooth – SVG import

    OpenSCAD ignores SVG holes, which isn’t a problem for me, because I’d rather punch the bore, keyway, and so forth programatically.

    But that’s another story …

  • Mini-Lathe Metric Threading: 32 Tooth Gear

    Mini-Lathe Metric Threading: 32 Tooth Gear

    While not strictly necessary for metric threading on a USA-ian mini-lathe, a 32 tooth gear can produce reasonable approximations, so I printed a pair from a Thingiverse collection:

    Mini-lathe 32 tooth change gear - Slic3r
    Mini-lathe 32 tooth change gear – Slic3r

    The model was designed for a slightly different mini-lathe, as it includes a short boss and thinner plate, but it did fit on the shaft:

    Mini-Lathe change gears - 1 mm - bad 32 60 65 55
    Mini-Lathe change gears – 1 mm – bad 32 60 65 55

    The gear mesh seemed odd, though, and comparing it with a standard 30 tooth gear and a different printed 32 tooth gear (about which, more later) showed it was definitely not compatible:

    Mini-lathe change gears - 32 30 odd 32
    Mini-lathe change gears – 32 30 odd 32

    Yes, the 32 tooth Thingiverse gear on the right is slightly smaller than the stock 30 tooth gear in the middle.

    The larger 32 tooth gear (on the left, above) meshes better:

    Mini-Lathe change gears - 1 mm - 65 55 32 60
    Mini-Lathe change gears – 1 mm – 65 55 32 60

    Both of those trains have a 600 ppm error, so they’re definitely suboptimal compared to the results with a 21 tooth gear in the train.

    The real reason you need a 32 tooth gear is for exact 25, 50, and 100 TPI threads with a 1/16 inch leadscrew. I don’t foresee much need for those around here, but you can never have too many change gears …

  • Garden Rake Cross Bolt

    Garden Rake Cross Bolt

    Mary’s long-suffering garden rake pulled apart while we were flattening a section of what will become something like a lawn next to the garden:

    Garden rake - shank and ferrule
    Garden rake – shank and ferrule

    For whatever reason, there’s no cross bolt holding the shank into the ferrule, like there should be on any tool subject to pulling force.

    After marking the wide spot on the shank, a couple of good shots with a two pound hammer flattened the ferrule around it well enough to start a hole with a 3/16 step drill:

    Garden rake - cross drilling
    Garden rake – cross drilling

    Go through the far side with a 13/16 inch drill for a generous 5 mm fit, drop a bolt into the hole while it can’t get away, tighten the nyloc nut, and it’s all good:

    Garden rake - cross bolt
    Garden rake – cross bolt

    In fact, it’s better than it ever was, because now the shank can’t pull out until the ferrule falls off the handle. Which could happen, but I’m not averse to another bolt.

    Admittedly, it’s not a stainless steel socket head cap screw, because that’d just about double the value of the rake. The handle is in such bad shape that the bolt will probably outlast the wood …

    Done!

    Update: The consensus says I totally missed the Ritual Invocation of the Epoxy, so:

    Garden rake - epoxy fill
    Garden rake – epoxy fill

    Now all is right with the world …

  • Floor Lamp Height vs. Reach: Plumbing Fitting

    Floor Lamp Height vs. Reach: Plumbing Fitting

    Update: Welcome Adafruit! The reshaped elbow shown here eventually got threaded adapters for the tubing and an awful paint job.

    The floor lamp with the invisible / non-tactile controls moved to a different chair, where it didn’t have quite enough reach and too much height. Knowing what was about to happen, I spliced a JST-SM connector into the wire inside the tube:

    Floor Lamp - base wiring JST-SM connector
    Floor Lamp – base wiring JST-SM connector

    After trimming off all the extraneous bits, the larger half of the connector (male pins) fits through the tubing and the smaller half (female sockets) barely fits through the bottom bushings.

    It turns out half-inch copper pipe fittings (ID = 15.9 mm) almost exactly fit the tubing (OD = 15.7 mm):

    Floor Lamp - copper 45° elbow
    Floor Lamp – copper 45° elbow

    A quick test showed the 45° (actually, it’s 135°, but we’re deep into plumbing nomenclature) positioned the lamp head too high and with too much reach:

    Floor Lamp - gooseneck exercise
    Floor Lamp – gooseneck exercise

    So shorten the tube attached to the head and deburr the cut:

    Floor Lamp - tube deburring
    Floor Lamp – tube deburring

    The 45° fitting is too high and a 90° fitting is obviously too low, so cut a 20° slice out of a 90° fitting:

    Floor Lamp - copper 90° elbow - 20° cutout
    Floor Lamp – copper 90° elbow – 20° cutout

    Cut a snippet of brass tubing to fit, bash to fit, file to hide, buff everything to a high shine, silver-solder it in place, and buff everything again:

    Floor Lamp - copper 90° elbow - 20° fill strip
    Floor Lamp – copper 90° elbow – 20° fill strip

    The 5/8 inch aluminum rods serve to stiffen the fitting, smooth out the torch heating, and generally keep things under control.

    Wrap the obligatory Kapton tape around the butt ends of the tubes to fill the fitting’s oversize hole, put everything together, and it’s just about perfect:

    Floor Lamp - copper 70° elbow - installed
    Floor Lamp – copper 70° elbow – installed

    I immobilized the fitting with black Gorilla tape, but it really needs something a bit more permanent. One of these days, maybe, a pair of setscrews will happen.

    The additional reach required a little more counterweight on the far side for security, so I added the broken stub of a truck leaf spring. It should be secured firmly to the base plate, but no tool I own can put a dent in those three pounds of spring steel. Maybe it’ll merit a fancy enclosure wrapped around the base?

  • Reversible Belt Buckle: Setscrew

    Reversible Belt Buckle: Setscrew

    The post in my reversible belt buckle popped out again, a year after punching it back in place, so it’s time to do a better job.

    Grab the buckle in the Sherline vise, center on the post hole, and drill a #38 = 2.58 mm hole:

    Reversible Belt Buckle - cross drilling
    Reversible Belt Buckle – cross drilling

    Tap it M3×0.5, clean out the hole, tap the post + spring back in place, dab threadlocker on the shortest M3 setscrew from the assortment, snug down on the post, and reinstall the belt:

    Reversible Belt Buckle - M3 setscrew installed
    Reversible Belt Buckle – M3 setscrew installed

    Looks like it grew there, doesn’t it?

    Now, as my buddy dBm will remind me, the real problem is too much weight in the saddle, but this fix should move the symptoms elsewhere …