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.

Category: Machine Shop

Mechanical widgetry

  • MPCNC – Autolevel Probe, Collet Edition

    Although putting a Z-axis height probe in a rigid pen holder worked well enough, it’d be handy to have a probe with a stud suitable for clamping in the DW660 spindle (with the power off!):

    MPCNC - Z probe - DW660 - 0.25 collet
    MPCNC – Z probe – DW660 – 0.25 collet

    Inside, it uses the same pushbutton and pogo pin as the pen holder design, with a similar brass tube around the pogo pin.

    There’s a conspicuous lack of good wire management; we all know where those wires will snap. In practice, you’d secure it to the DW660 power cord, way up on top, to eliminate most of the flexing. Still, it wants better strain relief than its gets from those heatstink tubes.

    The solid model looks like a weaving shuttle:

    MPCNC - Autolevel probe - collet - Slic3r preview
    MPCNC – Autolevel probe – collet – Slic3r preview

    It’s sitting upside-down in a 5 mm brim for more platform adhesion.

    The next one will have a 1/8 inch stud to fit the DW660’s other collet and shorten the top by 3/8 inch, because I want the rod inserted three diameters for stability. The bottom can’t get much shorter, because the pogo pin determines the switch-to-tip distance. Maybe a simple membrane switch will work well enough?

    You can see the depression in the glass sheet pretty clearly in a bCNC Autolevel scan on 30 mm centers (clicky for more dots):

    bCNC - Probe Array - 600x390 30 mm OC - ISO2
    bCNC – Probe Array – 600×390 30 mm OC – ISO2

    The OpenSCAD source code as a GitHub Gist:

    // MPCNC Z Axis Height Probe for router collet
    // Ed Nisley KE4ZNU – 2018-02-14
    Layout = "Build"; // Build, Show
    Section = false;
    /* [Extrusion] */
    ThreadThick = 0.25; // [0.20, 0.25]
    ThreadWidth = 0.40; // [0.40]
    /* [Hidden] */
    Protrusion = 0.1; // [0.01, 0.1]
    HoleWindage = 0.2;
    inch = 25.4;
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    ID = 0;
    OD = 1;
    LENGTH = 2;
    //- Adjust hole diameter to make the size come out right
    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);
    }
    /* [Switch] */
    SwitchBody = [7.8,6.8,7.0]; // PCB mount hardware extends infinitely to +Y
    SwitchButton = [3.5,5.0,1.0]; // OD allows some clearance
    SwitchClear = 5.0; // room for pad atop probe rod
    SwitchZ = SwitchBody.z + SwitchButton.z + SwitchClear;
    Sleeve = [1.5,2.5,15.0]; // tube around pogo pin
    ShankOD = 0.25 * inch; // rod into tool collet
    /* [Hidden] */
    WallThick = 3.0; // basic wall & floor thickness
    ProbeBody = [Sleeve[OD],
    2*WallThick + sqrt(pow(SwitchBody.x,2) + pow(SwitchBody.y,2)),
    3*ShankOD + SwitchZ + Sleeve[LENGTH]];
    echo(str("Probe Body: ",ProbeBody));
    NumSides = 2*4;
    //—–
    // Define shapes
    module Switch() {
    union() {
    translate([0,0,SwitchBody.z/2])
    cube(SwitchBody,center=true);
    translate([0,ProbeBody[OD]/2 – SwitchBody.y/2,(SwitchBody.z + SwitchButton.z)/2])
    cube([SwitchBody.x,ProbeBody[OD],SwitchBody.z + SwitchButton[LENGTH]],center=true);
    translate([0,0,SwitchBody.z])
    PolyCyl(SwitchButton[OD],SwitchButton[LENGTH] + SwitchClear,6);
    }
    }
    module ProbeHolder() {
    difference() {
    hull() {
    PolyCyl(Sleeve[OD] + 6*ThreadWidth,Protrusion,NumSides);
    translate([0,0,Sleeve.z])
    rotate(180/8)
    PolyCyl(ProbeBody[OD],SwitchZ,NumSides);
    translate([0,0,Sleeve.z + SwitchZ + 3*ShankOD – Protrusion])
    PolyCyl(ShankOD + 10*ThreadWidth,Protrusion,NumSides);
    }
    translate([0,0,SwitchZ + Sleeve[LENGTH]])
    rotate([0,180,0])
    Switch();
    translate([0,0,-Protrusion])
    PolyCyl(Sleeve[OD],Sleeve[LENGTH] + 2*Protrusion,NumSides);
    translate([0,0,Sleeve.z + SwitchZ – Protrusion])
    PolyCyl(ShankOD,3*ShankOD + 2*Protrusion,NumSides);
    if (Section)
    translate([ProbeBody[OD]/2,0,ProbeBody[LENGTH]/2])
    cube([ProbeBody[OD],2*ProbeBody[OD],ProbeBody[LENGTH] + 2*Protrusion],center=true);
    }
    }
    //—–
    // Build it
    if (Layout == "Show")
    ProbeHolder();
    if (Layout == "Build") {
    translate([0,0,ProbeBody.z])
    rotate([0,180,0])
    ProbeHolder();
    }
  • Quilting Ruler Pivot Pin Sharpening

    Mary mentioned the pivot pin supplied with a quilting ruler tended to hang up on the layers of fabric and batting in the quilt squares she’s been making. A quick look showed the pin bore a remarkable resemblance to an ordinary thumb tack:

    Ruler Quilting Pivot Pin - as delivered
    Ruler Quilting Pivot Pin – as delivered

    I reset the pin shaft perpendicular to the head, grabbed a small brass tube in the lathe tailstock, inserted pin in tube, grabbed the head in the chuck, ignored a slight radial offset, and attacked the pin with fine files and sandpaper:

    Ruler Quilting Pivot Pin - sharpened
    Ruler Quilting Pivot Pin – sharpened

    The lathe chuck seemed the easiest way to firmly hold the head; I rotated the chuck by hand while filing.

    Most of the remaining scratches go mostly parallel to the pin, but it really didn’t work much better than before. We decided polishing the pin wouldn’t improve the situation enough to make it worthwhile.

    That’s the difference between sharp and keen, which cropped up with the cheap ceramic knife from a while ago. The point may penetrate the fabric, but the shaft can’t get through the tight weave.

    She’s now using a scary thin and pointy embroidery pin, having successfully rebuffed my offer to mount it in a suitable base.

  • Suet Feeder Temporary Fix

    The neighborhood raccoons made off with our steel-cage suet feeder, leaving a dangling chain, several puzzled woodpeckers, and a potential gap in Mary’s FeederWatch data. A quick Thingiverse search turned up a likely candidate and a few hours of 3D printing produced a replacement:

    3D printed suet feeder
    3D printed suet feeder

    The cheerful party colors just sort of happened after I realized orange wasn’t the new steel.

    I bandsawed the top plate from an acrylic sheet, rather than devote several hours to printing a simple disk with two slots. Said slots came from a bit of freehand work with the drill press, a step drill bit, and a nasty carbide milling bur(r).

    The loops holding the chains won’t last for long, as hairy and red-bellied woodpeckers land with thump.

    It hangs from the stub of a former ski pole, loosely secured to the bracket holding the former feeder, and extending another two feet over the abyss beyond the patio. I doubt the raccoons will remain daunted for long, but maybe they’ll catch a heart attack when it collapses.

  • M2 Platform Alignment and Nozzle Height Check: Z Offset Confusion

    A set of five calibration boxes will check both platform alignment and extruder settings:

    Calibration Squares - rectified
    Calibration Squares – rectified

    Those boxes have three threads in their walls and stand 3.0 mm tall:

    Calibration Boxes - alignment layout - corner detail - Slic3r preview
    Calibration Boxes – alignment layout – corner detail – Slic3r preview

    The first pass measurements:

    Calibration Boxes - initial measurements - 2018-02-07
    Calibration Boxes – initial measurements – 2018-02-07

    The skirt is scant at 0.20 mm, the boxes are 0.15 mm short at 2.85 mm, and the walls are 0.03 mm too thin. Some Z offset adjustment seems in order, as the first few layers (on the left) came out grossly squished:

    Calibration box - 2.85 - detail
    Calibration box – 2.85 – detail

    However, the box heights came out sufficiently uniform to show the platform alignment remains just fine.

    Long ago, I moved the Z endstop switch to the X axis gantry, where it can directly sense the platform position:

    M2 - V4 hot end - Z endstop switch
    M2 – V4 hot end – Z endstop switch

    Putting it there replaces all the mechanical putzing and adjusting cute little screws / bolts / nuts / spacers / suchlike with a simple offset in the startup G-Code:

    G28 Z-2.15				; home Z to platform switch, with measured offset
    

    So I changed the startup G-Code in Slic3r to use G28 Z-2.30, sliced a single box in the middle of the platform, printed it, and … it came out exactly the same height: 2.85 mm.

    Huh.

    To make a very long story short, it turns out Marlin 1.1 ignores the numeric parameter in G28. When I updated the firmware to that version, I had changed the Configuration.h file to include the homing offsets:

      #define MANUAL_X_HOME_POS -100
      #define MANUAL_Y_HOME_POS -127
      #define MANUAL_Z_HOME_POS -2.15
    

    So, with the same offset burned into the firmware, it looked like the startup G-Code was Doing The Right Thing. I never deleted the offset from the startup G-Code and, at some point, Marlin stopped supporting the numeric parameter.

    Huh.

    However, the X and Y homing offsets must be hardcoded, because I want the XY origin in the middle of the platform to match my original OpenSCAD part designs. Everybody else prefers the XY origin in the front-left corner. FWIW, in Marlin 1.1-RC5 (two years old by now), the #define BED_CENTER_AT_0_0 constant appears only in that line and nowhere else in the source code. Maybe it was a change in progress back then?

    Anyhow, rather than hardcode the Z offset again, I set it to 0.00:

      #define MANUAL_X_HOME_POS -100
      #define MANUAL_Y_HOME_POS -127
      #define MANUAL_Z_HOME_POS  0.0
    

    Recompile and reload the firmware, then change the startup G-Code to use G28 Z without the offset.

    Doing so means I can measure and adjust the actual Z offset with M206, then store the value in EEPROM with M500:

    M206 Z-2.25
    M500
    

    I went a little short at -2.25, for reasons I cannot explain now.

    Measuring the offset goes like this:

    • Zero the offset: M206 Z0
    • Move the extruder off to the right: G0 X135
    • Home Z: G28 Z
    • Get some air under the nozzle: G0 Z4.0
    • Measure the actual clearance, perhaps using your taper gauge, at (let’s say) 1.7 mm
    • Set (1.7 – 4.0) as the offset: M206 Z-2.3
    • Print a box and adjust the offset accordingly

    Using my actual measurement, not the for-instance example, I resliced the box, printed it, and it came out at 2.94 mm, just slightly short, so I re-tweaked the offset to Z-3.28 and re-stored it.

    Embiggening the wall thickness turned out to be a matter of updating the filament diameter. I measured the start of the current spool of orange PETG at 1.75 mm, the same as the previous natural PETG spool, but the current section is 1.70 mm. Plugging that into Slic3r, reslicing, and reprinting produced a dead-on square: 3.00 mm tall with 1.20 mm walls:

    Calibration Square series
    Calibration Square series

    The skirt now comes out at 0.25 mm, the way it should, too. The difference between the original 0.20 mm skirt and 0.25 mm suggests the squashed center thread (of the three in the skirt around the first set of five boxes) forced the two adjacent threads to become a bit taller, for lack of somewhere for the excess plastic to go on one side of each thread, and the nozzle rode higher than you’d (well, I’d) expect from the bare numbers.

    The picture is missing a few squares in the middle, because I couldn’t believe changing the G28 Z-2.15 offset had no effect. It was easier to believe I’d inadvertently loaded the wrong file than the software / firmware was doing something wrong.

    However, during the course of the adventure, I established M851 does exactly nothing in this context, perhaps because it applies to some different type of homing / probing / mesh leveling / whatever. You can set the Z offset with several other G-Code and M-Code commands, but the documentation isn’t always forthcoming about how the various methods interact and different firmware uses identical codes for completely different functions, so proceed with Exceedingly Great Caution.

    In any event, it’s much easier and faster to adjust the printer & slicing parameters by measuring test boxes than by puzzling over actual prints, so …

    The OpenSCAD source code as a GitHub Gist:

    // Simple calibration boxes
    // Thin wall open box – verify Extrusion Multiplier
    // Solid box – verify infill settings
    // Ed Nisley – KE4ZNU
    // https://softsolder.com/
    Layout = "Open"; // Open Solid
    Texting = ""; // text message on solid box or empty string to suppress
    //——-
    //- Extrusion parameters must match reality!
    ThreadThick = 0.25;
    ThreadWidth = 0.40;
    Protrusion = 0.1; // make holes end cleanly
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    //——-
    // Dimensions
    WallThick = 3.0 * ThreadWidth;
    echo(str("Wall thickness: ",WallThick));
    BoxSize = 40.0;
    echo(str("Overall size: ",BoxSize));
    NominalHeight = 3.0;
    echo(str("Nominal height: ",NominalHeight));
    Height = IntegerMultiple(NominalHeight,ThreadThick);
    echo(str("Actual height: ",Height));
    Rotation = 0; // 45 to exercise X and Y axis motors at same time
    CornerRadius = max(2.0, 2.0 + WallThick);
    CornerSides = 8*4;
    //——–
    module Solid() {
    difference() {
    hull()
    for (i=[-1,1], j=[-1,1])
    translate([i*(BoxSize – 2*CornerRadius)/2,j*(BoxSize – 2*CornerRadius)/2,0])
    cylinder(r=CornerRadius,h=Height,$fn=CornerSides);
    if (len(Texting))
    translate([0,0,-Protrusion/2])
    linear_extrude(height=3*ThreadThick + Protrusion)
    mirror([1,0,0])
    text(text=Texting,size=6,spacing=1.05,font="ITC Zapf Chancery:style=Italic",halign="center",valign="center");
    }
    }
    module Thinwall() {
    difference() {
    Solid();
    hull()
    for (i=[-1,1], j=[-1,1])
    translate([i*(BoxSize – 2*CornerRadius)/2,j*(BoxSize – 2*CornerRadius)/2,-Protrusion])
    cylinder(r=(CornerRadius – WallThick),h=(Height + 2*Protrusion),$fn=CornerSides);
    }
    }
    //——-
    rotate(Rotation)
    if (Layout == "Open")
    Thinwall();
    else
    Solid();
  • Sakura Pen Nib

    Emboldened by Erik’s suggestion to file the end of a smashed Sakura pen, I filed a notch around the metal snout, snapped it off, and pulled on the tip:

    Sakura pen - extended nib
    Sakura pen – extended nib

    Come to find out the end of the snout is compressed around the nib and holds it in place. I don’t know how long the fiber cylinder might be, but it slides right out of the pen body.

    So I squished the snout just a little, snipped off the metal tip, filed the fiber cylinder’s end to a point, and … it sorta-kinda works, but it’ll never again be a very good pen.

    Obviously, I should conjure a slightly compliant pen holder for the MPCNC.

  • MPCNC: Bar Clamp Mounts, Redux

    With the new thermistor installed and the nozzle at (pretty nearly) the right height, the final set of bar clamp mounts came out perfectly:

    MPCNC - reprinted bar clamp mounts
    MPCNC – reprinted bar clamp mounts

    They’re supporting the snippets produced by trimming the clamp extrusions to fit across the bench under the MPCNC; I figure they ought to come in handy for something.

    Both extrusions carry a warning sticker giving the bar’s serial number:

    Harbor Freight Bar Clamp Labels
    Harbor Freight Bar Clamp Labels

    Huh.

    I could be persuaded the number applies to a given production batch, although I’d be unsurprised to learn it’s a batch of labels, not clamps.

    They don’t look much different than the previous versions:

    MPCNC - bar clamp mount
    MPCNC – bar clamp mount

    The main change was to raise the bars by another 2 mm to give one of the clamp shoes more clearance. As you might expect, the top and bottom halves of the clamp castings aren’t quite symmetric.

    The plastic mounts come in mirror-image sets due to that off-center bolt hole.

    Yes, the threaded casting is slightly angled from the screw clamping force.

    All in all, the mounts look pretty good, in a bright-orange sort of way.

  • M2 Nozzle Coating and Installation

    Quite some time ago, Vedran described a silicone boot he put over the nozzle. Rather than building a mold and casting the RTV, I threw caution to the winds, ignored any acetic acid corrosion issues, and troweled a layer of RTV on the nozzle:

    M2 - nozzle silicone - applied
    M2 – nozzle silicone – applied

    That’s JB Weld Hi-Temp Red Silicone, rated up to 550 °F = 290 °C continuous operation, so it should be Just Fine at  PETG’s usual 250 °C.

    I slipped the rebuilt thermistor into its hole, slipped the hot end back into the M2’s extruder, raised it a bit higher than it was before, fired up the M2, and …

    • Home the X axis
    • Set X offset: G28 X-100
    • Move it off to the right: G0 X130
    • Home the Z axis
    • Set Z offset: G28 Z-2.15
    • The Y axis is pretty near the middle, so it’s all good
    • Move the nozzle to the middle: G0 X0
    • Move the platform to Z=0: G0 Z0

    N.B.: I have the XY=0 origin in the middle of the platform, so don’t do like I do and expect it to work if you put the origin elsewhere.

    Then loosen the hot end clamp, slide the hot end down until the nozzle touches the platform, tighten the clamp, and the tip of the nozzle should be pretty close to where it started out:

    M2 - nozzle silicone - Z 0.0 set
    M2 – nozzle silicone – Z 0.0 set

    The microswitch in the background senses the top of the platform, eliminating all the putzing around everybody else does to get a consistent Z offset. I verified the switch trip point by sliding my trusty Starrett No. 270 Taper Gage under the lever until it tripped at 2.1 mm; about as close to 2.15 mm as one might hope for.

    For reasons not relevant here, the test print was another set of Epson projector foot repair parts:

    Epson S5 Projector Foot - Slic3r preview
    Epson S5 Projector Foot – Slic3r preview

    The PETG hairs I described in the original post were conspicuous by their absence. It’s too early to tell if the silicone coating is a complete cure, but at least it’s not causing any obvious problems.

    The skirt around those parts came out close enough to its nominal 0.25 mm layer thickness:

    M2 - nozzle alignment - skirt thickness
    M2 – nozzle alignment – skirt thickness

    I must print some calibration squares to verify the platform alignment and the overall height.

    Just for completeness, here’s looking up at the new nozzle, snug inside its fuzzy fiberglas insulating wrap, with a PETG strand drooling from its orifice:

    M2 - nozzle silicone - bottom view
    M2 – nozzle silicone – bottom view

    I really should order a couple of thermistors, a cartridge heater, and maybe a nozzle …