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: M2

Using and tweaking a Makergear M2 3D printer

  • Desk Lamp Conversion: Photo Light Cold Shoe

    Having recently acquired a pair of photo lights and desirous of eliminating some desktop clutter, I decided this ancient incandescent (!) magnifying desk lamp had outlived its usefulness:

    Desk Lamp - original magnifiying head
    Desk Lamp – original magnifiying head

    The styrene plastic shell isn’t quite so yellowed in real life, but it’s close.

    Stripping off the frippery reveals the tilt stem on the arm:

    Desk Lamp - OEM mount arm
    Desk Lamp – OEM mount arm

    The photo lights have a tilt-pan mount intended for a camera’s cold (or hot) shoe, so I conjured an adapter from the vasty digital deep:

    Photo Light Bracket for Desk Lamp Arm - solid model
    Photo Light Bracket for Desk Lamp Arm – solid model

    Printing with a brim improved platform griptivity:

    Photo Light Bracket for Desk Lamp Arm - Slic3r preview
    Photo Light Bracket for Desk Lamp Arm – Slic3r preview

    Fortunately, the photo lights aren’t very heavy and shouldn’t apply too much stress to the layers across the joint between the stem and the cold shoe. Enlarging the stem perpendicular to the shoe probably didn’t make much difference, but it was easy enough.

    Of course, you (well, I) always forget a detail in the first solid model, so I had to mill recesses around the screw hole to clear the centering bosses in the metal arm plates:

    Photo Lamp - bracket recess milling
    Photo Lamp – bracket recess milling

    Which let it fit perfectly into the arm:

    Desk Lamp - photo lamp mount installed
    Desk Lamp – photo lamp mount installed

    The grody threads on the upper surface around the end of the slot came from poor bridging across a hexagon, so the new version has a simple and tity flat end. The slot is mostly invisible with the tilt-pan adapter in place, anyway.

    There being no need for a quick-disconnect fitting, a 1/4-20 button head screw locks the adapter in place:

    Photo Lamp - screw detail
    Photo Lamp – screw detail

    I stripped the line cord from inside the arm struts and zip-tied the photo lamp’s wall wart cable to the outside:

    Photo Lamp - installed
    Photo Lamp – installed

    And then It Just Works™:

    Photo Lamp - test image
    Photo Lamp – test image

    The lens and its retaining clips now live in the Big Box o’ Optical parts, where it may come in handy some day.

    The OpenSCAD source code as a GitHub Gist:

    // Photo light mount for desk lamp arm
    // Ed Nisley – KE4ZNU
    // 2019-03
    /* [Layout Options] */
    Layout = "Build"; // [Show,Build]
    Part = "Mount"; // [LampArm,ShoeSocket,Mount]
    /* [Extrusion Parameters] */
    ThreadWidth = 0.40;
    ThreadThick = 0.25;
    HoleWindage = 0.2;
    Protrusion = 0.1;
    //—–
    // Dimensions
    /* [Hidden] */
    ID = 0;
    OD = 1;
    LENGTH = 2;
    /* [Dimensions] */
    FrictionDisk = [4.0,16.5,11.0]; // squashed inside desk lamp arm frame
    Divots = [4.0,9.5,0.75]; // recesses for frame alignment bumps
    ArmLength = 30.0; // attached to disk
    ShoeWheelOD = 32.0; // lock wheel on photo lamp
    ShoeBase = [18.5,18.5,2.0] + [HoleWindage,HoleWindage,2*ThreadWidth]; // square base on photo lamp gimbal
    ShoeStem = [6.3,12.0,1.5]; // top slide clearance, ID = 1/4 inch screw
    ShoeBlock = [ShoeWheelOD,ShoeWheelOD,2*(ShoeBase.z + ShoeStem.z)]; // overall shoe block
    NumSides = 3*4;
    //—–
    // Useful routines
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    module PolyCyl(Dia,Height,ForceSides=0,Center=false) { // 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,center=Center);
    }
    //—–
    // Various Parts
    // Arm captured in disk lamp
    module LampArm() {
    difference() {
    union() {
    cylinder(d=FrictionDisk[OD],h=FrictionDisk[LENGTH],$fn=NumSides,center=true);
    hull()
    for (j=[-1,1])
    translate([0,j*(FrictionDisk[OD]/2 – FrictionDisk[LENGTH]/2),0]) {
    rotate([0,90,0]) rotate(180/NumSides)
    cylinder(d=FrictionDisk[LENGTH]/cos(180/NumSides),h=ArmLength/2,$fn=NumSides);
    translate([ArmLength – FrictionDisk[LENGTH]/2,0,0])
    sphere(d=FrictionDisk[LENGTH],$fn=NumSides);
    }
    }
    rotate(180/6) {
    PolyCyl(FrictionDisk[ID],FrictionDisk[LENGTH] + 2*Protrusion,6,Center=true);
    for (k=[-1,1])
    translate([0,0,k*(FrictionDisk[LENGTH]/2 – Divots[LENGTH]/2)])
    PolyCyl(Divots[OD],Divots[LENGTH] + Protrusion,6,Center=true);
    }
    }
    }
    // Basic hot shoe socket
    module ShoeSocket() {
    difference() {
    union() {
    cube(ShoeBlock,center=true); // overall blocky retainer
    translate([-ShoeBlock.x/2,0,0])
    cylinder(d=ShoeBlock.x,h=ShoeBlock.z,$fn=NumSides,center=true);
    }
    translate([0,0,-2*ShoeBlock.z]) // screw hole throughout
    rotate(180/6)
    PolyCyl(ShoeStem[ID],4*ShoeBlock.z,6);
    translate([0,0,ShoeBase.z/2]) // base slot under pillar
    cube([ShoeBase.x,ShoeBase.y,ShoeBase.z],center=true);
    translate([ShoeBase.x/2,0,ShoeBase.z/2]) // base slot opening
    cube([ShoeBase.x,ShoeBase.y,ShoeBase.z],center=true);
    translate([ShoeStem[OD]/2,0,ShoeBase.z/2 + ShoeStem[LENGTH]]) // stem slot
    cube([2*ShoeStem[OD],ShoeStem[OD],2*ShoeStem[LENGTH]],center=true);
    }
    }
    // Stick parts together
    module Mount() {
    rotate([90,0,0])
    LampArm();
    translate([ArmLength + ShoeBlock.x/2 – Protrusion,0,0])
    ShoeSocket();
    }
    //—–
    // Build things
    if (Layout == "Build") {
    rotate([0,90,0])
    translate([-(ArmLength + ShoeBlock.x),0,0])
    Mount();
    }
    if (Layout == "Show")
    if (Part == "LampArm")
    LampArm();
    else if (Part == "ShoeSocket")
    ShoeSocket();
    else if (Part == "Mount")
    Mount();

    The original dimension doodles, made before I removed the stem and discovered the recesses around the screw hole:

    Photo Light - Desk Lamp Arm Dimensions
    Photo Light – Desk Lamp Arm Dimensions
  • 3D Printed Chain Mail Armor: Failure Analysis

    While dropping some recent 3D printed odds-n-ends into the show-n-tell box, I discovered the large sheet of square chain mail armor had a missing link:

    Chain Mail Armor - the missing link
    Chain Mail Armor – the missing link

    Fortunately, the link fell off in the box and I recovered all the pieces for a failure analysis:

    Chain Mail Armor - failed link - glue spots
    Chain Mail Armor – failed link – glue spots

    I’d glued the PLA together with IPS #4, a hellish mixture of plastic solvents including methylene chloride, one of the few chemicals able to chew into PLA, but there’s not much penetration or bonding going on.

    Let’s try that again with a bit more solvent.

    First, slide the bars into place:

    Chain Mail Armor - failed link - bars in place
    Chain Mail Armor – failed link – bars in place

    I applied four solvent drops in two passes to give it time to work its way in, put four matching drops on the armor cap, squished the cap in place, tweaked the bar alignment, then applied pressure while contemplating the whichness of the why for half a minute while the solvent worked its magic.

    Things look pretty good once more:

    Chain Mail Armor - missing link - repaired
    Chain Mail Armor – missing link – repaired

    There’s no way to determine the repair’s goodness, other than by deliberately trying to snap off a bar, so I’ll just put it back in the box and hope for the best.

  • Injured Arm Support Table: Wide Version

    This table must sit across the threshold of a walk-in / sit-down shower, with the shower curtain draped across the table to keep the water inside.

    Starting with another patio side table, as before, I installed a quartet of 5 mm stainless screws to lock the top panels in place and convert the table into a rigid assembly:

    Arm Supports - wide table - overview
    Arm Supports – wide table – overview

    Because the shower floor is slightly higher than the bathroom floor, I conjured a set of foot pads to raise the outside legs:

    Patio Side Table Feet - OpenSCAD model
    Patio Side Table Feet – OpenSCAD model

    The sloping top surface on the pads compensates for the angle on the end of the table legs:

    Arm Supports - leg end angle
    Arm Supports – leg end angle

    I think the leg mold produces legs for several different tables, with the end angle being Close Enough™ for most purposes. Most likely, it’d wear flat in a matter of days on an actual patio.

    Using good 3M outdoor-rated foam tape should eliminate the need for fiddly screw holes and more hardware:

    Arm Supports - leg pads
    Arm Supports – leg pads

    The feet fit reasonably well:

    Arm Supports - leg pad in place
    Arm Supports – leg pad in place

    They may need nonskid tape on those flat bottoms, but that’s in the nature of fine tuning.

    And, as with the narrow table, it may need foam blocks to raise the top surface to arm level. Perhaps a pair of Yoga Blocks will come in handy for large adjustments.

    The OpenSCAD source code as a GitHub Gist:

    // Patio Side Table Feet
    // Ed Nisley – KE4ZNU
    // 2019-03
    /* [Layout Options] */
    Layout = "Build"; // [Show,Build]
    /* [Extrusion Parameters] */
    ThreadWidth = 0.40;
    ThreadThick = 0.25;
    HoleWindage = 0.2;
    Protrusion = 0.1;
    //—–
    // Dimensions
    TapeThick = 1.0; // 3M double-stick outdoor tape
    LegWall = [2.5,3.5]; // leg walls are not the same in X and Y!
    LegBase = [36.0,19.0]; // flat on floor
    LegOuter = [31.0,19.0]; // perpendicular to leg axis
    LegInner = [28.5,11.5]; // … ditto
    LegAngle = 90 – 53; // vertical to leg
    LegRecess = [LegInner.x,LegInner.y,LegInner.x*tan(LegAngle)];
    PadWedge = 2; // to fit end of leg
    PadRadius = 4.0; // rounding radius for nice corners
    PadBase = [LegBase.x + 2*PadRadius,LegBase.y + 2*PadRadius,5.0];
    PadSides = 6*4;
    BathStep = 20; // offset between shower bottom and floor
    /* [Hidden] */
    EmbossDepth = 1*ThreadThick; // recess depth
    DebossHeight = 1*ThreadThick + Protrusion; // text height + Protrusion into part
    //—–
    // Useful routines
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    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);
    }
    //—–
    // Foot pad
    module FootPad(Riser = 0.0) {
    difference() {
    union() {
    hull()
    for (i=[-1,1], j=[-1,1]) {
    translate([i*(PadBase.x/2 – PadRadius),j*(PadBase.y/2 – PadRadius),0])
    cylinder(r=PadRadius,h=1,$fn=PadSides);
    translate([i*(PadBase.x/2 – PadRadius),
    j*(PadBase.y/2 – PadRadius),
    Riser + PadBase.z – PadRadius – (i-1)*PadWedge/2])
    sphere(r=PadRadius/cos(180/PadSides),$fn=PadSides);
    }
    translate([PadRadius – PadBase.x/2,0,Riser + PadBase.z])
    rotate([0,LegAngle,0])
    translate([LegRecess.x/2,0,(LegRecess.z – Protrusion)/2 ])
    cube(LegRecess – [2*TapeThick,0,2*TapeThick],center=true);
    }
    translate([0,0,-2*PadBase.z]) // remove anything under Z=0
    cube(4*PadBase,center=true);
    cube([17,12,2*DebossHeight],center=true);
    }
    mirror([1,0,0])
    linear_extrude(height=EmbossDepth)
    translate([0,0,0])
    text(text=str(Riser),size=10,spacing=1.05,
    font="Arial:style=Bold",
    valign="center",halign="center");
    }
    //—–
    // Build things
    if (Layout == "Build") {
    if (true) {
    translate([-0.7*PadBase.x,-0.7*PadBase.y,0])
    FootPad(0);
    translate([-0.7*PadBase.x,+0.7*PadBase.y,0])
    FootPad(0);
    }
    translate([+0.7*PadBase.x,-0.7*PadBase.y,0])
    FootPad(BathStep);
    translate([+0.7*PadBase.x,+0.7*PadBase.y,0])
    FootPad(BathStep);
    }
    if (Layout == "Show")
    FootPad();

  • 3D Printing: Erratic Z Axis Motion

    From a discussion on the Makergear 3D printer forums

    A Makergear M2 user, while troubleshooting other problems, had the Z axis begin stalling and moving erratically.

    the random up and down movement doesnt make any sense

    It’s what happens when a stepper is mechanically overloaded: the rotor can’t turn at the commanded rate.

    Start by cleaning & lubing the Z axis guide rods and leadscrew. If that solves the problem, just clean and lube a bit more often. Which none of us do until there’s a problem, of course. [sigh]

    If it continues to stall, reduce the Z axis speed by a factor of four. If that solves the problem, then perhaps you tweaked the speed while you were fixing other problems and never noticed.

    the technical reason why the motor would move in the opposite direction

    The windings set up a rotating magnetic field which, in normal operation, drags the rotor around with it. When the rotor stalls, it vibrates back-and-forth and may wind up synchronizing with the field in the wrong direction.

    Old Western movies had a similar problem with wagon wheels turning faster than the frame rate and looking like their spokes rotated backwards.

    The stepper may emit horrible sounds, but stalling doesn’t do any damage to the motor or its driver.

    I took the bottom of the motor apart

    No sugarcoating: disassembling a stepper demagnetizes the rotor. You must buy a new Z-axis motor.

    The motor is assembled with the rotor demagnetized, then it’s magnetized in place. When you take it apart, the rotor smacks into the stator, which creates a localized high-density magnetic path between the rotor poles. The rotor poles can’t support the high flux and demagnetizes.

    You can put the motor together and it will “work”, in the sense that the rotor will go around, but the decreased magnetic field reduces the torque for a given winding current. You can’t increase the winding current, because the motor will overheat.

    The PCB traces look mangled and warped

    There’s a conformal coating over the whole PCB to prevent corrosion, so what you see is perfectly normal.

    Any analysis of the data from my previous posts?

    You’ve been doing a lot of fiddling with the machinery as part of finding the extruder problem, so: did you, at any time, even once, unplug / disconnect the Z axis motor when the power was turned on?

    If so, that likely killed a driver transistor in that channel. Order a new RAMBo board along with the new motor.

    New Rambo board came today and the z axis is working properly now.

    Moral of the story: never fiddle with the electronics with the power turned on!

  • Makergear M2: Z Endstop Crashes Firmware

    From a discussion on the Makergear 3D printer forums

    A Makergear M2 user reassembled his printer, only to encounter a problem:

    As soon as my z endstop triggers, the firmware resets

    The Z endstop cable is plugged backwards into the RAMBo socket.

    The RAMBo socket has three pins: [+ – S].

    The two-wire switch cable ends in a three pin connector shell (*) with one empty contact. Unfortunately, the cable connector is not symmetric, not keyed to fit the socket latch, and easily fits into the RAMBo socket either way.

    Plugged correctly, the two switch wires go to the [- S] socket pins, putting the [+] socket pin in the empty contact.

    If the cable is plugged backwards, the two switch wires go to the [+ -] pins, putting the [S] pin in the empty contact.

    Plugged backwards, when the switch trips, it shorts the power supply to ground. Unpleasant consequences ensue.

    (*) I’d be unsurprised to discover a machine with a two-wire switch cable ending in a two-pin connector shell. Those must plug into the [- S] pins, leaving the [+] pin waving in the breeze.

  • Makergear M2: Bed Heating Failure

    From a discussion on the Makergear 3D printer forums

    A Makergear M2 user with an older printer (dating back to 2012) had a bed heater failure:

    all of a sudden I noticed that my bed temps had started dropping

    With a 12 V heater, the most likely problem is at the power input connector on the RAMBo board. The wires from the 12 V power brick generally work loose inside their screw terminals, whereupon the absurdly high current heats up the weak joint and destroys the connector. You can find some hideous pictures somewhere on the forum.

    Next most likely is a broken wire between the RAMBo and the heater, caused by repetitive stress injury from all that back-and-forth motion. You may be able to find this with a ohmmeter and some wiggle-jiggle action on the cable, but if even one strand remains intact, the resistance will remain very low at the meter’s trivial test current. Pulling the wires out of the braided sheath will be more definitive; the insulation will be wrecked at the break.

    Least likely seems to be the connector where the cable from the heater terminates on the RAMBo.

    Start by inspecting the connectors; you may find some seriously charred plastic.

    Depending on what you find, you may have a zero-dollar repair.

    It’s like you’re psychic.

    Suffice it to say you’re not the first person to see charred plastic … [grin]

    My solution was to move the high-current switching off the RAMBo board to a solid state relay, with the heater power from a separate 40 VDC supply:

    M2 - SSR for Improved HBP
    M2 – SSR for Improved HBP
  • 3D Printing: Native G-Code?

    From a discussion on the Makergear 3D printer forums

    From a new M2 user disillusioned by the learning curve:

    Is there a 3D CAD software out there that natively creates .g or .gcode files It’s not just a 3D printing thing.

    CAD (computer-aided design) software produces a solid model, which a CAM (computer-aided manufacturing) program then converts into the specific dialect(s) of G-Code required by whatever machine tool(s) will create the widget. You can create the solid model using many different CAD programs and convert it into G-Code with many different CAM programs, each with its own collection of features and warts.

    3D printing calls the CAM program a “slicer”, but it’s a different name for the process of converting geometry into machine instructions.

    Even in subtractive manufacturing using lathes and mills, you absolutely must understand how the G-Code interacts with the production hardware.

    I unfortunately don’t want to learn all the nuances and parameters of the slic3r software

    Then you must use a service like Shapeways: you create the model, send it to them, and get a neat widget a few days later. Their laser-sintered powder process provides much better built-in support than you’ll ever get from consumer-grade fused-filament printers, you can select from a wide variety of materials (including metals!), and, as long as you follow their straightforward design guidelines, you’ll never know how the magic happens.

    If you intend to create more than a trivial number of widgets, though, the cost in both cycle time and money will begin gnawing at you. In round numbers, I’ve been designing and printing one widget a week for the last seven years, so adding a printer to my basement shop and learning how to use it has been a major win.