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.

Author: Ed

  • HQ Sixteen: Electronics Pod Solid Model

    HQ Sixteen: Electronics Pod Solid Model

    The HQ Sixteen came with a small red-dot laser pointer attached to a threaded pin:

    HQ Sixteen - Stylus LED Mount - OEM version
    HQ Sixteen – Stylus Laser Mount – OEM version

    The pin can go into either of a pair of threaded holes in the machine castings or the laser + clamp can, as in the picture, attach to a spool pin.

    With a “pantograph” pattern laid along the rear of the table, you can stitch that design (at full size, hence “pantograph” seems aspirational) by guiding the red dot along the lines. The laser’s flimsy clamp mount seems prone to move at the worst possible moment, so neither of us liked the idea.

    Mary is good at free-motion quilting and says she’s unlikely to use the laser, but I figured staying slightly ahead of the curve would be a Good Idea. Bonus: 3D printing.

    The general idea is to tuck a (similar) red-dot laser module under the overhang of the electronics pod, with a ball mount for easy aiming and stable setting, something like this:

    HQ Sixteen - Stylus LED Mount - solid model - show
    HQ Sixteen – Stylus Laser Mount – solid model – show

    Fitting the mount into that curved corner requires a model of the electronics pod, so I held a pad of paper against the pod and traced the outline:

    HQ Sixteen - pod profile trace
    HQ Sixteen – pod profile trace

    Scan it, import the image into Inkscape, fit lines and curves around the shape:

    HQ Sixteen - pod outline - Inkscape
    HQ Sixteen – pod outline – Inkscape

    I only needed the top of the pod, so the bottom is truncated from the actual 250 mm height.

    Save the SVG, import into OpenSCAD, extrude to match the pod’s 110 mm width:

    module Pod() {
    
        xrot(90)
        down(PodWidth/2)
            linear_extrude(height=PodWidth,convexity=5)
                translate(PodRecenter)
                    import("HQ Sixteeen - pod profile.svg",
                            layer="Pod Profile");
    }
    

    The model origin is where the upper lip meets the slightly sloped top surface in the middle of the extrusion, because that’s the only easy-to-locate feature:

    HQ Sixteen - Stylus LED Mount - electronics pod - solid model
    HQ Sixteen – Stylus Laser Mount – electronics pod – solid model

    Something Has Changed in the Inkscape SVG → OpenSCAD model chain, because the parts of an Inkscape drawing lying outside the page boundary are no longer cropped from the OpenSCAD model. Now, simply putting a feature at the Inkscape origin at the lower-left corner of the document’s Page produces a complete OpenSCAD 2D shape with that feature at the 3D coordinate origin.

    For reference:

    The Inkscape layout with the entire shape off the page:

    HQ Sixteeen - pod profile - Inkscape origin
    HQ Sixteeen – pod profile – Inkscape origin

    The 2D imported shape in OpenSCAD with a matching origin:

    HQ Sixteeen - pod profile - OpenSCAD origin
    HQ Sixteeen – pod profile – Inkscape origin

    I do not know what changed or if, in fact, my misunderstanding of how things worked required the previous workaround, but this is much better. The OpenSCAD code includes a [0,0] offset value, should you need it.

    More on the mount tomorrow …

  • OMTech 60 W Laser: Engraving Wobbulation

    OMTech 60 W Laser: Engraving Wobbulation

    Continuing the experiments on Y axis wobbling produced this shaky engraving:

    Engraving - 100mm-s 0.25mm interval 9pct
    Engraving – 100mm-s 0.25mm interval 9pct

    The rectangle is 30×10 mm, with lines spaced 0.25 mm apart to simplify estimating distances (although I also have a measuring magnifier) and run at 100 mm/s to simplify converting distance to time. The lines alternate in direction, beginning with a left-to-right line at the bottom (which is bar-straight from the initial positioning move). The wobbles occur at the start of each line.

    A closer look with blown contrast:

    Engraving - 100mm-s 0.25mm interval 9pct - detail
    Engraving – 100mm-s 0.25mm interval 9pct – detail

    The maximum error in the Y axis direction looks like 0.12 mm and damps out after 3 cycles. Each cycle covers 2.8 mm = 28 ms = 35 Hz.

    The LightBurn Preview shows a 1.5 mm overscan distance and extrapolating the wobbulations leftward suggests the gantry starts the scan line with an overshoot due to the Y axis motion. The cycle-to-cycle damping is about 50%, so the initial overshoot (invisible in the overscan region) might be 0.25 mm, agreeing reasonably well with the 0.2 mm seen while cutting small squares.

    The results above come from these settings:

    • Layer speed: 100 mm/s
    • Line interval: 0.25 mm
    • Y acceleration: 2000 mm/s²
    • Y start speed: 20 mm/s

    I then made single-variable changes to the Engraving Parameters settings:

    Line shift speed

    • 500 mm/s
    • 10 mm/s

    Y Acceleration

    • 200 mm/s²

    Y start speed

    • 30 mm/s

    Today I Learned: The Y Start Speed (in mm/s) for engraving is capped by the Y Axis Jumpoff Speed (in mm/s², so perhaps the maximum change in speed), which is, in turn, capped at 80 mm/s.

    Each of the variations produced a result visually indistinguishable from the image you see above: the error magnitude and oscillation frequency were identical.

      One possible reason: None of those settings have any effect, because LightBurn doesn’t do whatever the Ruida controller defines as Engraving. However, changing both the Y start speed and the Jumpoff speed should have made at least a little change to the results and did not.

      Another possible reason: Each 0.25 mm Y axis change requires 20.8 motor steps (either 20 or 21 at 12 µm/step), so the fancy tweaks lack space to take effect, the motor thumps 20-ish steps, and the gantry shakes the same way every time.

      The closer you look, the worse it gets …

    • Ooma Telo2: Speaker2 Failure

      Ooma Telo2: Speaker2 Failure

      After not quite six years, the replacement speaker I hacked into our Ooma Telo2 VOIP gadget failed:

      Ooma Telo 2 - replacement speaker installed
      Ooma Telo 2 – replacement speaker installed

      Quite by coincidence, a few days earlier a friend reported the speaker in her Ooma Telo2 had failed. This seems to be a common failure mode, with the rest of the gadget continuing to work fine.

      The failed speaker showed continuity through its coil and, in fact, still had the same 8 Ω DC resistance as an identical speaker pulled from the Drawer o’ Small Speakers. It did not, however, make a sound when connected to a signal generator, where the new speaker squeaked happily.

      So it seems the speaker failed by a mechanical jam, rather than an electrical / wiring failure. It’s not as though we play thrash metal music through the thing, but apparently the magnet disintegrated:

      Samsung speaker magnet disintegration
      Samsung speaker magnet disintegration

      Yes, the coil gap is full of nicely oriented magnetic particles:

      Samsung speaker magnet disintegration - detail
      Samsung speaker magnet disintegration – detail

      If Samsung (or whoever built the speaker) used a poorly sealed neodymium magnet, then it would crumble exactly as shown.

      I wonder if that’s how the original speaker failed.

      Installing the identical replacement speaker involved more hot melt glue and, as expected, restored the Telo2 to normal operation:

      Ooma Telo - second speaker installed
      Ooma Telo – second speaker installed

      I can do that repair eight more times …

    • OMTech 60 W Laser: Speed vs. Corner Radius Wobbulation

      OMTech 60 W Laser: Speed vs. Corner Radius Wobbulation

      Experimenting with little squares showed the Y axis has a definite wobble:

      Subpixel Zoo - Quattron RGBY Shifted - detail
      Subpixel Zoo – Quattron RGBY Shifted – detail

      Which suggested a simple test:

      Cornering - overview
      Cornering – overview

      I adjusted the laser power to compensate for the speed, with the result being a line burned into white cardboard. The lines are a bit under 0.2 mm wide, roughly the width of the focused spot.

      The controller settings for the X and Y axes:

      KT332N - X Y Axis Parameters - 2025-02-18
      KT332N – X Y Axis Parameters – 2025-02-18

      The acceleration values may be affected by the limits in this section:

      KT332N - Cut Engraving Parameters - 2025-02-18
      KT332N – Cut Engraving Parameters – 2025-02-18

      Assuming the Y axis acceleration is 3000 mm/s², the RepRap calculator shows the Y axis speeds within the 30 mm distance along the vertical sides:

      RepRap Accel Calculator - 3000mm-s2 30mm
      RepRap Accel Calculator – 3000mm-s2 30mm

      Extracting the useful bits and lining them up for comparison:

      Cornering - detail
      Cornering – detail

      The first column in the test results shows perfectly square corners have no problem at any speed, because the controller decelerates to nearly a stop before changing direction.

      Rounding the corner to 0.5 mm introduces a distinct wobble in the Y axis that doesn’t change much, probably because the controller still decelerates as it approaches the corner.

      The 1 mm radius corners show a distinct overshoot at all speeds. The peak overshoot doesn’t change much between 250 and 500 mm/s, because the RepRap calculator shows the machine barely reaches 250 mm/s by the middle of the side, so 500 mm/s isn’t any faster.

      The first overshoot is about 0.2 mm, the first undershoot is a little over 0.1 mm, and the rest are barely visible.

      The 2 and 4 mm radius corners have barely visible wobbles. Whether that is due to the head not flexing as much due to the lower acceleration around the larger radius I cannot say.

      The machine may not follow the simple RepRap acceleration profile when approaching a corner, let alone a rounded corner.

      I think attempting to reduce the overshoot by fiddling with the belt tension / hardware fasteners / whatever will be unavailing. The laser head runs on a linear rail along the gantry with plenty of unbalanced mass hanging off the bottom:

      OMTech 60W beam alignment - head X plane
      OMTech 60W beam alignment – head X plane

      Moving the beam 0.2 mm on the platform by pivoting around the rail 6 inch = 150 mm above amounts to only 0.08°, far less than anything I can measure while adjusting the mechanics.

      Slowing down doesn’t help nearly as much as I expected and rounding the corners makes it worse.

      Word has it that much spendier machines behave better, which is both comforting and unhelpful.

    • Why I No Longer Trust Google Weather

      Why I No Longer Trust Google Weather

      You can’t make this stuff up:

      Google Weather App - precipitation puzzle
      Google Weather App – precipitation puzzle

      We didn’t get half a foot of any precipitation that day.

      That is apparently the “Pixel At a Glance” app using info scraped from weather-dot-com. The other Google Weather app, the one that may or may not still have the Weather Frog, scrapes info from noaa-dot-gov and seems somewhat less uncoordinated.

      The two apps generally disagree on what kind and how much precipitation will occur, sometimes absurdly, and rarely agree with the official National Weather Service forecast.

      Sometimes the forecasts have not converged by the time the weather arrives outside the window.

    • HQ Sixteen: Wheel Base Leveling

      HQ Sixteen: Wheel Base Leveling

      Trying out the Track Lock Blocks brought a long-standing puzzle to the surface: the left front wheel rode about a millimeter above its track, with the other three wheels carrying the weight of the machine. Neither that wheel nor the diagonally opposite wheel on the right rear worked well with the Blocks, because the machine rocked on the other two wheels.

      I initially thought the carriage rail under the machine was warped, but some poking and prodding showed the left front wheel rode higher than the others from front to back across the entire length of the table.

      So I loosened the screws holding the front wheel base plate to the machine and jacked up the front of the machine to get the wheels off their tracks:

      HQ Sixteen - track lock - jacking machine
      HQ Sixteen – track lock – jacking machine

      Then I jammed two strips of chipboard into the left side of the gap:

      HQ Sixteen - front wheel base plate shim
      HQ Sixteen – front wheel base plate shim

      I planned to use one long strip across the entire wheel base plate, but the screw holding the machine casting to the plate blocks the way, so it now has two shorter strips. Tightening the screws clamped the chipboard in place.

      The chipboard tilted the base plate and lowered the left wheel, with the right wheel surely moving slightly upward. Lowering the machine showed both front wheels now carry roughly the same load and the Track Lock Blocks now work the way I expected.

      After doing that, I found the recommended procedure in the official HQ Sixteen Service and Troubleshooting manual:

      HQ Sixteen - Wheel base shim procedure
      HQ Sixteen – Wheel base shim procedure

      The only “planed surface” around here is on the surface plate in the Basement Shop, two flights of stairs away, and I am not carrying either object to meet the other.

      In any event, I think the chipboard serves the same purpose as a simple washer, with advantage of a much larger bearing surface, so I’ll call it Good Enough until something else causes me to take the wheel base plate off.

    • HQ Sixteen: Track Lock Blocks

      HQ Sixteen: Track Lock Blocks

      Mary’s practice quilts on the HQ Sixteen suggest locking the machine’s wheels will simplify sewing a line parallel to the long edge of a quilt parallel to the table, but contemporary “Channel Locks” fit newer machines with larger wheels than on this one.

      Duplicating those rings in a smaller size seemed both difficult and not obviously functional, so I built a pair of blocks to capture the wheel on its track:

      HQ Sixteen - track lock - engaged
      HQ Sixteen – track lock – engaged

      The wheel sits in a recess holding it just barely above the track surface, so the (considerable) weight of the machine holds the block in place.

      Because lines on quilts have precise placement and Mary has quilting rulers within reach, the block measures exactly two inches from the point where it first touches the wheel to the center of the recess:

      HQ Sixteen - track lock - setup
      HQ Sixteen – track lock – setup

      She can then lay a ruler on the quilt, roll the machine front or back two inches, slide a block against each wheel, then roll the machine up a slight incline until the wheel drops into the recess:

      HQ Sixteen - track lock block - solid model
      HQ Sixteen – track lock block – solid model

      The spacing looks like this:

      HQ Sixteen - track lock block - solid model - show view
      HQ Sixteen – track lock block – solid model – show view

      The usual 3D printing process puts 0.2 mm steps along the ramp, but they’re almost imperceptible while rolling the machine:

      HQ Sixteen - track lock block - PrusaSlicer preview
      HQ Sixteen – track lock block – PrusaSlicer preview

      The ramp slope is all of 1:20 = 2.5°, so pulling / pushing the machine requires very little oomph.

      I put thin cloth tape (approximately friction tape, but with real adhesive) on the bottom of the block by the simple expedient of sticking it to the block and scissoring off the excess. A little compliance between the block and the track prevents the hard plastic shapes from sliding more easily than I’d like. If your tape is thicker than mine, knock a little off the WheelZ value.

      The OpenSCAD code can produce shapes to laser-cut an adhesive sheet, although stacking a foam sheet will definitely require height adjustment :

      HQ Sixteen - track lock block - glue sheet
      HQ Sixteen – track lock block – glue sheet

      The OpenSCAD source code as a GitHub Gist:

      // HQ Sixteen – wheel track lock block
      // Ed Nisley – KE4ZNU
      // 2025-02-14
      include <BOSL2/std.scad>
      Layout = "Show"; // [Show,Build,Glue,Track,Block,Wheel]
      /* [Hidden] */
      ID = 0;
      OD = 1;
      LENGTH = 2;
      Protrusion = 0.1;
      Windage = 0.1;
      WallThick = 5.0; // minimum wall thickness
      RailOD = 5.5; // rounded top of rail
      RailHeight = RailOD; // … flange to top
      RailBase = [100,2*15.7 + RailOD,3]; // … Y = flange width, arbitrary X & Z
      WheelOD = 38.0; // rail roller
      WheelMinor = 6.2; // … rail recess
      WheelWidth = 8.3 + 2*Windage; // … outer sides
      WheelZ = RailHeight + (WheelOD – WheelMinor)/2; // axle centerline wrt rail flange
      LockOC = 2.0*INCH; // engagement to lock recess
      GripLength = 20.0;
      BlockOA = [GripLength + WheelOD/2 + LockOC,WheelWidth + 2*WallThick,2*RailHeight];
      BlockRadius = 2.0;
      $fn = 12*3*4; // smooth outer perimeters
      //———-
      // Construct the pieces
      module Track(Len = 2*BlockOA.x) {
      zrot(90) back(Len/2) down(RailBase.z) xrot(90)
      linear_extrude(height=Len,convexity=5)
      rect([RailBase.y,RailBase.z],anchor=FRONT)
      attach(BACK,FRONT) rect([RailOD,RailHeight – RailOD/2])
      attach(BACK) circle(d=RailOD);
      }
      module Wheel(Len = WheelWidth) {
      xrot(90)
      difference() {
      cylinder(d=WheelOD,h=Len,center=true);
      torus(r_maj=WheelOD/2,d_min=WheelMinor);
      }
      }
      module Block() {
      difference() {
      left(GripLength + WheelOD/2)
      cuboid(BlockOA,anchor=LEFT + BOTTOM,rounding=BlockRadius,except=BOTTOM);
      Track();
      up(WheelZ) xrot(90)
      cylinder(d=WheelOD,h=WheelWidth,center=true);
      right(LockOC)
      up(WheelZ – WheelOD/2) yrot(atan((RailHeight – WheelMinor/2)/LockOC))
      cuboid([LockOC,WheelWidth,BlockOA.z],anchor=RIGHT+BOTTOM);
      }
      }
      //———-
      // Show & build the results
      if (Layout == "Block" || Layout == "Build")
      Block();
      if (Layout == "Track")
      Track();
      if (Layout == "Wheel")
      Wheel();
      if (Layout == "Glue")
      projection(cut=true)
      Block();
      if (Layout == "Show") {
      color("SteelBlue")
      Block();
      for (i=[0,1])
      right(i*LockOC)
      color("Silver",0.7)
      up(WheelZ) Wheel();
      color("White",0.5)
      Track();
      }