Posts Tagged CNC

3D Foot Scanning

The Poughkeepsie Library makes a 3DSystems Sense scanner (V1) available to patrons and, after a bit of to-and-fro, I managed to get a not-awful scan of Mary’s right leg:

Mary - R foot - complete
Mary – R foot – complete

This was accomplished under field conditions in a cramped room hosting a Spanish-language “introduction to computers” class. We propped her leg across the edge of a table with her sock as a cushion.

The depth image resolution seems to be 1 mm and the software attempts to stitch multiple views from different angles into a consistent 3D model. The scanner requires a steady hand and a steady model to successfully glue new data onto the existing model; what seem small misalignments derail the matching.

The software has several presets, of which “Head” produces the best results. I have no idea what the algorithm thinks of her foot; maybe it’s been trained on some truly ugly faces.

Exporting the solid model as either STL or PLY allows import into (Windows-only) Meshmixer, wherein I sawed off the pieces we won’t need:

Mary R foot trimmed
Mary R foot trimmed

If only I had a foot fetish …

The 3DSystems software requires a fairly specific Windows 8 (or 10, which is so not happening) + Intel hardware configuration, which recently arrived as a $250 off-lease Dell Latitude 7250 laptop. It works fine through VNC, so I can use it from the Comfy Desk.

However, using a 3D scanner in your own home isn’t actually private:

3DSystems Sense Scanner - EULA
3DSystems Sense Scanner – EULA

All your data are belong to them:

3D Systems may also automatically collect and report back to 3D Systems information about the Software and Licensee’s usage along with limited information about the Device, 3D Printer, and/or other third-party applications. If 3D Systems implements automated data collection practices then Licensee may opt out of providing such data if Licensee has a license that authorizes Commercial Use.

Oh, and then you must activate the software before using it. The library IT folks tell me I can install & activate the scanner on my system without derailing their setup. I have my doubts, but we’ll see how it goes.

I must get into photogrammetry, ideally from the sofware libre branch as described there. The openMVG repo seems promising.

2 Comments

CNC 3018-Pro: HD and CD Fixtures

I actually had this in mind when I laid out the hard drive and CD engraving fixtures:

CNC 3018-Pro - HD and CD fixtures
CNC 3018-Pro – HD and CD fixtures

The fixtures are centered at X±70.0 mm / Y=0.0 from the G54 workspace coordinate origin dead-center in the middle of the platform, with G55 centered on the HD fixture to the left and G56 on the CD fixture to the right.

So the engraving workflow amounts to homing the CNC 3018 when I turn it on, taping a platter in a fixture, selecting the corresponding WCS, loading a suitable G-Code file, and firing it off. It seems bCNC returns to G54 after completing the file, so verifying the WCS selection every time is Very Good Practice.

The friable lacquer coating on some CDs fills my world with glitter whenever I engrave a pattern on their label side. I didn’t plan on a dust shoe for this thing!

, ,

Leave a comment

GCMC Platter Engraving

Engraving Spirograph / Guilloché patterns on scrap CDs and hard drive platters now works better than ever:

Spirograph - 674203941 - preview
Spirograph – 674203941 – preview

After, that is, I realized:

  • Any Rotor will work, as long as it’s smaller than the Stator
  • You must pick pen offset L so the pattern never crosses the stator center point
  • L ≥ 1 is perfectly fine
  • You must scale the resulting pattern to fit the actual space on the disk

One of my final doodles showing how the variables relate to each other, although the Wikipedia article may be useful for the underlying math and other posts have more pix on various machines:

Spirograph Scaling doodles
Spirograph Scaling doodles

Cheat sheet:

  • Stator has tooth count (∝ radius) R
  • Rotor has tooth count (∝ radius) r
  • K = r/R, so if you normalize R=1, K=r
  • Pen offset L puts it at radius rL in the rotor

Picking a suitable rotor requires iterating with random choices until one fits:

  RotorTeeth = Stators[-1];
  n = 0;
  while (RotorTeeth >= floor(0.95 * StatorTeeth) || RotorTeeth < 5) {
    RotorTeeth = (XORshift() & 0x007f);       // this is why Stator can't have more than 127 teeth
    n++;
  }
  comment("Rotor: ",RotorTeeth," in ",n," iterations");

The 5% buffer on the high end ensures there will be an L keeping a hole in the middle of the pattern. Requiring at least five teeth on the low end just seems like a Good Idea.

Given the stator & rotor tooth counts, iterate on random L values until one works:

  n = 0;
  do {
    L = (to_float((XORshift() & 0x1f) + 1) / 32.0) * (1.0/K - 1.0);   // allow L > 1.0
    n++;
  } while (L >= (1.0/K - 1.0) || L < 0.01);
}
comment("Offset L: ", L," in ",n," iterations");

With L chosen to leave a hole in the middle of the pattern, then the pattern traced by the pen in the rotor is centered at 1.0 – K (the normalized Stator radius minus the normalized Rotor radius) and varies by ±LK (the offset times the normalized Rotor radius) on either side:

RotorMin = 1.0 - 2*K;
comment("Rotor Min: ",RotorMin);

BandCtr = 1.0 - K;                      // band center radius
BandMin = BandCtr - L*K;                //  ... min radius
BandMax = BandCtr + L*K;                //  ... max radius

BandAmpl = BandMax - BandCtr;

comment("Band Min: ",BandMin," Ctr: ",BandCtr," Max: ",BandMax);

Knowing that, rescaling the pattern to fit the disk limits goes like this:

FillPath = {};

foreach (Path; pt) {

  a = atan_xy(pt);                      // recover angle to point
  r = length(pt);                       //  ... radius to point

  br = (r - BandCtr) / BandAmpl;        // remove center bias, rescale to 1.0 amplitude
  dr = br * (OuterRad - MidRad);        // rescale to fill disk
  pr = dr + MidRad;                     // set at disk centerline

  x = pr * cos(a);                      // find new XY coords
  y = pr * sin(a);

  FillPath += {[x,y]};
}

comment("Path has ",count(FillPath)," points");

The final step prunes coordinates so close together as to produce no useful motion, which I define to be 0.2 mm:

PointList = {FillPath[0]};                // must include first point

lp = FillPath[0];
n = 0;

foreach (FillPath; pt) {
  if (length(pt - lp) <= Snuggly) {       // discard too-snuggly point
    n++;
  }
  else {
    PointList += {pt};                    // otherwise, add it to output
    lp = pt;
  }
}

PointList += {FillPath[-1]};                // ensure closure at last point

comment("Pruned ",n," points, ",count(PointList)," remaining");

The top of the resulting G-Code file contains all the various settings for debugging:

(Disk type: CD)
(Outer Diameter: 117.000mm)
(        Radius: 58.500mm)
(Inner Diameter: 38.000mm)
(        Radius: 19.000mm)
(Mid Diameter: 77.500mm)
(      Radius: 38.750mm)
(Legend Diameter: 30.000mm)
(         Radius: 15.000mm)
(PRNG seed: 674203941)
(Stator 8: 71)
(Rotor: 12 in 1 iterations)
(Dia ratio K: 0.169 1/K: 5.917)
(GCD: 1)
(Lobes: 71)
(Turns: 12)
(Offset L: 3.227 in 1 iterations)
(Rotor Min: 0.662)
(Band Min: 0.286 Ctr: 0.831 Max: 1.376)
(Path has 43201 points)
(Pruned 14235 points, 28968 remaining)

The GCMC source code as a GitHub Gist:

, ,

1 Comment

CNC 3018-Pro: Hard Drive Platter Fixture

A variation on the CD fixture produces a 3.5 inch hard drive platter fixture:

Platter Fixtures - Hard Drive on 3018
Platter Fixtures – Hard Drive on 3018

Which needed just a touch of milling for a snug fit around the platter:

CNC 3018-Pro - HD platter fixture - test fit
CNC 3018-Pro – HD platter fixture – test fit

Tape it down on the 3018’s platform, set XY=0 at the center, and It Just Works™:

CNC 3018-Pro - HD platter fixture - 70 g
CNC 3018-Pro – HD platter fixture – 70 g

The rather faint line shows engraving at -1.0 mm = 70 g downforce isn’t quite enough. Another test with the same pattern at -3.0 mm = 140 g came out better:

CNC 3018-Pro - HD platter fixture - 140 g
CNC 3018-Pro – HD platter fixture – 140 g

It’s in the same OpenSCAD file as the CD fixture, in the unlikely event you need one.

, , ,

3 Comments

MPCNC: Z-Axis Height Probe

A slight modification to the MPCNC LM12UU collet pen holder turns it into a long-reach Z-Axis Height Probe:

CNC 3018-Pro - Z-Axis height probe - overview
CNC 3018-Pro – Z-Axis height probe – overview

A flange on the top plate holds a Makerbot-style endstop switch:

Collet Holder - LM12UU - switch plate - solid model
Collet Holder – LM12UU – switch plate – solid model

The brass probe rod sports a 3/32 inch ball epoxied on its tip, although for my simple needs I could probably use the bare rod:

CNC 3018-Pro - Z-Axis height probe - ball tip detail
CNC 3018-Pro – Z-Axis height probe – ball tip detail

I clamped the rod to extend a bit beyond the plate, where it can soak up most of the switch release travel, leaving just enough to reset the clickiness after each probe:

CNC 3018-Pro - Z-Axis height probe - detail
CNC 3018-Pro – Z-Axis height probe – detail

The probe responds only to Z motion, not tip deflection in XY, so it’s not particularly good for soft objects with sloped sides, like the insole shown above. It works fine for rigid objects and should suffice to figure the modeling workflow.

The bCNC Auto-Level probe routine scans a grid over a rectangular region:

Insole - bCNC AutoLevel Probe Map - detail
Insole – bCNC AutoLevel Probe Map – detail

Which Meshlab turns into a solid model:

Insole - Meshlab triangulation
Insole – Meshlab triangulation

That’s the bottom of the insole probed on a 5 mm grid, which takes something over an hour to accomplish.

The OpenSCAD code as a GitHub Gist:

, ,

1 Comment

CNC 3018-Pro: CD Fixture Probe Camera Target

Taping the CD fixture to the CNC 3018-Pro’s raised platform solves the repeatability problem by putting the CD at a fixed location relative to the machine’s Home coordinates. The next step puts the XY=0 coordinate origin at the exact center of the platter, so the pattern comes out exactly centered on the disc:

CNC 3018-Pro - CD fixture
CNC 3018-Pro – CD fixture

The fixture has a central boss:

Platter Fixtures - CD on 3018 - tape flange
Platter Fixtures – CD on 3018 – tape flange

The blue boss centers the CD’s hub hole, the red plateau supports the disc, and the white background lies 5 mm below the CD’s upper surface:

CNC 3018-Pro - CD holder target
CNC 3018-Pro – CD holder target

Yup, red and blue Sharpies FTW.

The bCNC probe camera image includes two faint cyan rings centered on the crosshair:

CNC 3018-Pro - bCNC probe camera - red-blue CD target
CNC 3018-Pro – bCNC probe camera – red-blue CD target

Set the diameter to 15 mm (or a bit less), center the outer ring on the hub hole = the border between blue & red, set XY=0, and it’s within maybe ±0.1 mm of the true center.

Done!

, ,

1 Comment

bCNC Probe Camera Calibration

I’m sure I’ll do this again some time …

Focus the camera at whatever distance needed to clear the longest tooling you’ll use or, at least, some convenient distance from the platform. You must touch off Z=0 at the surface before using bCNC’s probe camera alignment, because it will move the camera to the preset focus distance.

Align the camera’s optical axis perpendicular to the table by making it stare into a mirror flat on the platform, then tweaking the camera angles until the crosshair centers on the reflected lens image. This isn’t dead centered, but it’s pretty close:

CNC 3018-Pro - bCNC Probe Camera - collimation - detail
CNC 3018-Pro – bCNC Probe Camera – collimation – detail

The camera will be focused on the mirror, not the reflection, as you can tell by the in-focus crud on the mirror. Whenever you focus the lens, you’ll probably move the optical axis, so do the best you can with the fuzzy image.

You can adjust small misalignments with the Haircross (seems backwards to me) Offset values.

A cheap camera’s lens barrel may not be aligned with its optical axis, giving the lens a jaunty tilt when it’s correctly set up:

CNC 3018-Pro - Engraving - taped
CNC 3018-Pro – Engraving – taped

With the camera focus set correctly, calibrate the camera Offset from the tool (a.k.a. Spindle) axis:

  • Put a pointy tool at XY=0
  • Touch off Z=0 on a stack of masking tape
  • Put a dent in the tape with the bit
  • Move to the camera’s focused Z level
  • Make the dent more conspicuous with a Sharpie, as needed
  • Register the spindle location
  • Jog to center the crosshair on the dent
  • Register the camera location

Calibrate the Crosshair ring diameter thusly:

  • Put an object with a known size on the platform
  • Touch off Z=0 at its surface
  • Move to the camera’s focused Z level
  • Set the Crosshair diameter equal to the known object size
  • Adjust the Scale value to make the Crosshair overlay reality

For example, calibrating the diameter to 10 mm against a shop scale:

CNC 3018-Pro Probe Camera - scale factor - detail
CNC 3018-Pro Probe Camera – scale factor – detail

At 10 mm above the CD, setting the camera’s resolution to 11.5 pixel/mm:

CNC 3018-Pro - bCNC probe camera - settings
CNC 3018-Pro – bCNC probe camera – settings

Makes the outer circle exactly 15.0 mm in diameter to match the CD hub ring ID:

CNC 3018-Pro - bCNC probe camera - red-blue CD target
CNC 3018-Pro – bCNC probe camera – red-blue CD target

I doubt anybody can find the pixel/mm value from first principles, so you must work backwards from an object’s actual size.

, , ,

3 Comments