Archive for November, 2011

Monthly Aphorism: On Science

  • If it disagrees with experiment, it is wrong.

That’s from Richard Feynman, who should know a thing or two about science and experiments.

The full quote, from a book review in Skeptical Inquirer (Sept/Oct 2011, p 57):

If it disagrees with experiment, it is wrong. In that simple statement is the key to science. It doesn’t make any difference how beautiful your guess is, how smart you are, who make the guess, or what his name is. If it disagrees with experiment, it’s wrong. That’s all there is to it.

We’ve all encountered folks with beliefs that simply don’t match up with reality; some of them are us. Many such beliefs are non-falsifiable, sometimes carefully phrased that way, making experiment irrelevant.

7 Comments

Dragonfly Garden Ornament – Eyeball Repair

This brass dragonfly has graced our garden for some years, but what seemed like a gentle tap during fall cleanup knocked both eyeballs out. The original adhesive looked like urethane, so I cleaned the sockets, applied a layer around the rim, and popped the marbles back in place.

The clamping looks painful…

Dragonfly Ornament - eyeball repair

Dragonfly Ornament - eyeball repair

Of course, that’s an unbroken Harbor Freight clamp

1 Comment

Driveway Concrete Vandalism

Driveway drain concrete

Driveway drain concrete

Having missed the fall driveway paving deadline, we will have a gravel section in the middle of the driveway until next spring. All the water from the garage downspouts and the back yard runs down the driveway, which dumps it directly into the gravel patch and the new retaining wall’s foundation. That means the gravel patch, at least, will become a mud hole, which I take to be a Bad Thing.

So I bandsawed some 4 inch DWV pipe & fittings in half lengthwise, glued them together as a gutter to capture the runoff and divert it into 80 feet of DWV pipe leading to the bottom end of the wall, then filled the half-pipes with gravel to let us drive right over the whole mess. Unfortunately, the top end of the gravel patch has the driveway ending in broken asphalt, Item 4 gravel, fine gravel, and rubble that make it impossible to snug the pipes up against the asphalt. That means the runoff would pretty much vanish before it reached the gutters.

So I excavated just barely enough gravel to ensure a downhill slope from the remaining asphalt, mixed up a random bag of mortar that’s been kicking around in the garage for a few years, and troweled an apron from the asphalt to the half-pipes. Generally I sign my work, but this kludge need last only a few months and I left it to cure.

The next morning I discovered one of the chipmunks felt the work really needed a signature:

Chipmunk tracks in concrete

Chipmunk tracks in concrete

That’s OK with me…

FWIW, this is why you need Too Many Clamps:

Clamping a half-pipe joint

Clamping a half-pipe joint

,

2 Comments

Moen Bath Sink Faucet: A “Laying On Of Hands” Repair

Moen faucet parts

Moen faucet parts

The Moen sink faucet in our black bathroom (so named because of its black tile, white trim, and gray floor) began piddling a few days ago, which seemed odd: Moen says it has a good-for-your-lifetime ceramic valve. So I took it apart, extracting an impressive vector of internal parts in the process.

The “notch” that indicates the hot-cold alignment isn’t particularly obvious, but evidently forward corresponds to the usual hot-on-the-left plumbing:

Moen valve cartridge alignment notch

Moen valve cartridge alignment notch

The retainer clip holding that white stop sleeve in place requires a bit of tweaking from a small pointy probe, but after you expose the hole in that notch the clip comes out easily enough:

Moen faucet retainer clip

Moen faucet retainer clip

With all the frippery out of the way, then “Using pliers, pull the cartridge out of the body by the stem”, which simply did not work for me. No matter what, the cartridge body didn’t budge:

Moen faucet cartridge top

Moen faucet cartridge top

There’s nothing about turning / unscrewing the transparent (looks black here) shell around the stem, so I didn’t try.

Putting enough of the parts back together to keep the cartridge from blowing out in my face (even if I can’t remove it, it’ll certainly blow out on its own), the faucet valve worked fine. You’re supposed to turn the gray pivot retainer 1/4 turn beyond hand tight, which compresses a wavy washer under the retainer. The retainer had been quite loose when I dismantled the faucet, which suggests that either it hadn’t been tightened at the factory or had worked itself loose. That would tend to hold the handle up just a bit, perhaps enough to prevent the valve from completely closing.

After snugging that retainer  down tight and reassembling everything, the faucet worked perfectly: happy dance!

I removed the nozzle aerator and found a surprising amount of grit for something that’s downstream of the whole-house water filter and softener:

Bath faucet nozzle grit

Bath faucet nozzle grit

Cleaned that out and it’s all good again.

4 Comments

Thing-O-Matic: Large Hole Calibration

Flushed with success on the small-hole front, I conjured up a large hole testpiece using the same HoleAdjust function that proved unnecessary with the little ones:

Circle Calibration - solid model

Circle Calibration - solid model

The first version didn’t have the cross bars, which turned out to be a mistake, because the individual rings distorted even under minimal pressure from the calipers:

Large circle cal - unlinked rings

Large circle cal - unlinked rings

However, measuring as delicately as I could, the holes seemed a scant 0.20 mm too small, more or less, kinda-sorta:

Nominal Nom+0.0
10 9.83
20 19.75
30 29.85
40 39.84
50 49.84
60 59.72
70 64.76
80 79.28
90 89.77

So I fed in HoleFinagle = 0.20 and the second iteration looks like it’d make a great, albeit leaky, coaster:

Large Circle Calibration object - HoleFinagle 0.20

Large Circle Calibration object - HoleFinagle 0.20

Measuring those holes across the center with the calipers on facets (rather than vertices), produced somewhat more stable results:

Nominal Nom+0.20
10 10.08
20 20.17
30 30.08
40 40.08
50 50.00
60 60.02
70 70.05
80 79.98
90 90.07

Frankly, I don’t believe those two least-significant digits, either, because a different set of measurements across different facets looked like this:

Nominal Nom+0.20
10 10.13
20 20.11
30 29.84
40 39.90
50 49.88
60 59.90
70 69.84
80 79.82
90 89.66

I also printed a testpiece with HoleFinagle = 0.25 that averaged, by in-the-head computation, about 0.05 larger than that, so the hole diameter compensation does exactly what it should.

Applying the calipers to the 10.0 mm hole in the small-hole testpiece gives about the same result as in this one. The fact that HoleFinagle is different poses a bit of a mystery…

The only thing I can conclude is that the measurement variation and the printing variation match up pretty closely: the actual diameter depends more on where it’s measured than anything else. The holes are pretty nearly the intended size and, should the exact size matter, you (well, I) must print at least one to throw away.

All in all, a tenth of a millimeter is Good Enough. Selah.

Oh. The ODs are marginally too small, even using PolyCyl.

The OpenSCAD source, with both adjustments set to neutral:

// Large circle diameter calibration
// Ed Nisley KE4ZNU - Nov 2011

//-------
//- Extrusion parameters must match reality!
//  Print with +1 shells, 3 solid layers, 0.2 infill

ThreadThick = 0.33;
ThreadWidth = 2.0 * ThreadThick;

HoleFinagle = 0.00;
HoleFudge = 1.00;

function HoleAdjust(Diameter) = HoleFudge*Diameter + HoleFinagle;

Protrusion = 0.1;			// make holes end cleanly

function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);

//-------
// Dimensions

Width = 2.5;
Thickness = IntegerMultiple(2.0,ThreadThick);

DiaStep = 10.0;

NumCircles = 9;

echo(str("Width: ",Width));
echo(str("Thickness: ",Thickness));

BarLength = (NumCircles + 1)*DiaStep;

//-------

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=HoleAdjust(FixDia)/2,h=Height,$fn=Sides);
}

module ShowPegGrid(Space = 10.0,Size = 1.0) {

  Range = floor(50 / Space);

	for (x=[-Range:Range])
	  for (y=[-Range:Range])
		translate([x*Space,y*Space,Size/2])
		  %cube(Size,center=true);

}

//------

module Ring(RingID,Width,Thick) {

  difference() {
	PolyCyl((RingID + 2*Width),Thick);
	translate([0,0,-Protrusion])
	  PolyCyl(RingID,(Thick + 2*Protrusion));
  }
}

//------

ShowPegGrid();

union () {
  for (Index = [1:NumCircles])
	Ring(Index*DiaStep,Width,Thickness);
  for (Index = [-1,1])
	rotate(Index*45)
	  translate([-BarLength/2,-Width/2,0])
		cube([BarLength,Width,Thickness]);
}

,

Leave a comment

Thing-O-Matic: Small Hole Calibration

The macro lens & microscope adapters for the Canon SX230HX camera required a bunch of large and fairly precise circles. The first-pass prints of the main tube and snouts came out with diameters about 2% too small, so I changed the hole diameter compensation to include a first-order Fudge Factor as well as the simple zero-order HoleWindage Finagle Constant I’d been using. In the process, I cooked up a simple OpenSCAD function with new coefficient names reflecting their order:

HoleFinagle = 0.20;
HoleFudge = 1.02;
function HoleAdjust(Diameter) = HoleFudge*Diameter + HoleFinagle;

That solved the immediate issue, but I wondered whether I was working on the right problem.

In the past, nophead’s polyholes testpiece showed the need for the 0.2 mm HoleWindage adder to make small holes turn out correctly. I rewrote his code to:

  • Use my HoleAdjust function
  • Lay the two rows out nose-to-tail
  • Add a bit more clearance between the holes

Which came out like this:

Small Hole Calibration - solid model

Small Hole Calibration - solid model

To find out where I’m starting from, I printed it (0.33 mm x 0.66 mm, 30 mm/s, 200 °C / 110 °C) with both correction factors set to “no change” and got a nice-looking plate that didn’t require any cleanup at all:

Small Hole Calibration object - HoleFinagle 0.00

Small Hole Calibration object - HoleFinagle 0.00

Note that the similar-looking holes in the two rows aren’t the same size: the row with the tiny triangle has *.0 mm holes, the tiny square marks the *.5 mm holes.

The Skirt thread thickness was 0.31 to 0.38 mm, so this object’s size should be about as good as it gets.

The point of the game is to circumscribe polygonal holes around a cylinder of a given diameter. I don’t have a set of metric drills (or drill rods), so I bracketed the holes with the nearest sizes of hard-inch number and letter drills:

Nominal Free fit Snug fit
1.00 0.98 1.04
2.00 2.05 2.18
3.00 2.93 3.03
4.00 3.99 4.04
5.00 5.06 5.13
6.00 6.21 6.23 no-go
7.00 6.98 7.12
8.00 7.50 8.19
9.00 8.77 9.05
10.00 9.92 10.19 tight

The “snug fit” column means the holes are definitely smaller than that measurement, so the maximum hole size comes out just about spot on; an error of 0.1 mm or so seems too small to quibble over.

So, for whatever reason, my previous Finagle Constant of 0.20 seems no longer necessary and, for sure, the Fudge Factor doesn’t bring anything to the table at this scale.

It’s definitely true that the height of the first layer affects the hole size for the next few layers, even with the Z-minimum switch measuring the build plate height. The Skirt threads generally measure within ±0.05 mm of the nominal 0.33 mm and I think much of that variation comes from residual snot on the nozzle when it touches the switch. I have no idea what the firmware’s resolution might be.

Given that I’ve been adding 0.2 mm to small-hole diameters all along, I suspect all these errors are now of the same general size:

  • Print-to-print variation (layer thickness, ABS variations)
  • Hole tolerance (size vs plastic vs speed)
  • Measurement error (digital caliper vs drills vs objects)

All in all, it’s pretty good.

The OpenSCAD source code, with the hole adjustment factors set to neutral:

// Small circle diameter calibration
// Adapted from Nophead's polyholes testpiece
// Ed Nisley - KE4ZNU - Nov 2011

//-------
//- Extrusion parameters must match reality!
//  Print with +1 shells, 3 solid layers, 0.2 infill

ThreadThick = 0.33;
ThreadWidth = 2.0 * ThreadThick;

HoleFinagle = 0.00;
HoleFudge = 1.00;

function HoleAdjust(Diameter) = HoleFudge*Diameter + HoleFinagle;

Protrusion = 0.1;			// make holes end cleanly

function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);

//-------
// Dimensions

DiaStep = 1.0;

NumHoles = 10;

Border = 5*ThreadWidth;

AllHoleLength = DiaStep*(NumHoles*(NumHoles + 1)/2) +	// total hole dia
				(NumHoles + 1)*Border +					// total border size
				DiaStep*NumHoles/2;						// radius of largest hole

BlockLength = AllHoleLength + 2*Border;
BlockWidth = 2*NumHoles*DiaStep + 2*Border;
BlockThick = IntegerMultiple(1.0,ThreadThick);

//-------

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=HoleAdjust(FixDia)/2,h=Height,$fn=Sides);
}

module ShowPegGrid(Space = 10.0,Size = 1.0) {

  Range = floor(50 / Space);

	for (x=[-Range:Range])
	  for (y=[-Range:Range])
		translate([x*Space,y*Space,Size/2])
		  %cube(Size,center=true);

}

//------

module HoleRow(DiaDelta) {

  translate([-AllHoleLength/2,
			  0,0])
	for (Index = [1:NumHoles])
	  translate([(DiaStep*(Index*(Index + 1)/2) + Index*Border),0,-Protrusion])
		PolyCyl((Index*DiaStep + DiaDelta),(BlockThick + 2*Protrusion));
}

//------

ShowPegGrid();

rotate(90)
  difference() {
	translate([-BlockLength/2,-BlockWidth/2,0])
	  cube([BlockLength,BlockWidth,BlockThick]);
	for (Index = [0,1])
	  translate([0,((2*Index - 1)*DiaStep*NumHoles/2),0])
		rotate(Index*180)
		  HoleRow(Index*0.5);
  }

,

4 Comments

Vanilla Extract: Commercial Variations

This look at the ingredients found in various commercial vanilla extracts (plus their prices) finally pushed me over the edge into brewing up that DIY vanilla extract.

We’ve been using McCormick vanilla forever, mostly because it has the simplest and shortest list of ingredients:

McCormick Vanilla

McCormick Vanilla

Nielson-Massey vanilla seemed about the same, although it’s not clear why it needs more sugar than those “vanilla bean extractives”:

Nielsen-Massey Vanilla

Nielsen-Massey Vanilla

Wal-Mart vanilla doesn’t smell like vanilla, even though it has more “extractive” than corn syrup:

Wal-Mart Vanilla

Wal-Mart Vanilla

All three extracts have “Pure” on the label, which (according to Wikipedia, anyway) means that they have at least 13.35 ounce of vanilla bean per gallon of extract. I didn’t weigh the three beans in my 8 ounces of hooch, but I suspect they weighed far less than the regulation 0.834 ounce. Next time, for sure, I’ll go for triple strength extract!

Despite that, my DIY hooch has turned brown and smells pretty good…

These full-frame pix used my new close-up lens gizmo; even with some vignetting the results seem perfectly usable. Normally I crop pix down to the central section, so this will be as bad as it gets.

2 Comments