An Obsession with Flatness – Part 5

Inconvenient Truths

DIY Repeat-O-Meter sitting on the tiny import granite surface plate.

The DIY Repeat-O-Meter is done and works. But there are details I left out, and in honor of transparency and metrology, I think it’s important that I note them before we finish this chapter.

Metrology is just as much about measuring error as it is measuring your part. All measurements have error, the only question is how much? This is something to keep in mind when reading about my experiments in measuring and creating flatness.

First, this actually doesn’t measure overall “flatness.” This measures local variations in height over relatively small areas of a granite surface plate. I think this has been made clear earlier, but it’s worth noting again. And to that end, when I refer to the flatness of surface plates using just this tool, this is just 1 of 2 main tests to measure flatness across the surface. The other test measures overall flatness using an instrument such as an autocollimator.

Second, this isn’t a real Repeat-O-Meter, obviously. But it’s not a clone like the NYCCNC/OxTools version either. This was a version designed to help me with my needs for a much smaller surface plate than typically measured. But if you look at the Federal GGG-463c spec, then you’ll see that the design and dimensions for a repeat reading gage is specifically called out.

From the digitized Federal GGG-463c spec. I know how to spell indicating. Also, I don’t use 3/6″ to describe a half inch. But it’s another error in the digitization, it should be 3/8″.

The ShadonHKW design (which I largely used with modifications) has different dimensions. The major dimensional changes (in regards to precision of measurements) are the difference between the space between the feet, the placement of the 2 side by side feet, and the size of the feet.

The design I chose has the two feet which are side by side in the front, rather than the back, which is the opposite of the way that the Fed spec calls for. Instead of their being 5 inches between the each foot, my design has a spacing of 2.25″ for the 3 feet on the base, and then 3″ between the two front feet on the base and the 1 floating foot on the front arm of the device. The spacing is both less, and slightly inconsistent. I’m not too worried about where the feet are placed, given that the 3 feet should naturally create their own plane, and provide the base for the 1 floating foot that provides the measurements.

Two tiny little feet in the middle, 1 at the very back.

Further the spec also calls for feet with a diameter of 3/8″. I used 1/4″ hardened ball bearings, that were then ground flat. The flat area is approximately 0.150″, less than half of the 0.375″ called for. I had ordered some carbide inserts to use for feet, but they took so long to get to me, that I went with the ball bearings, as I already had 1/4″. But 1/2″ (3/6″ according to the image from the Fed spec) would have been better, as I could have ground them down to a flat 3/8″ diameter.

With smaller feet, and a closer footprint, I believe this will add up to a device that will measure higher variations (especially in terms of highly localized dings/dents in well used surface plates) along a surface plate. One may think that this is better, (higher accuracy in the readings!) but I found it’s a double edged sword when trying to read the gage as you move it across the surface. Too much movement makes it difficult to see the overall average (and any real spikes) in the measurements.

About measuring the surface plates

If you look at the specifications for repeatability measurements (according to the Federal GGG-463c spec), the larger the surface plate, the larger the tolerances allowed. Well, the opposite is true, the smaller the plate, the tighter the tolerances. A small plate should probably have higher accuracy, and thus have smaller localized variations. Meaning that even with my plate, I would want less than 35 millionths total indicated measurement for a Grade AA plate.

With metrology, I’m always wondering about the limits of both my equipment and my technique. I know there’s almost always a way to measure with higher accuracy and precision. I may not know what it that methodology is (or have the equipment), but it helps me think about what I am doing, and what effects it has on the measurements.

Next Up: The looks on peoples faces when I tell them that I spent all weekend rubbing 3 cast iron plates together.

An Obsession with Flatness – Part 4

The Finished results

The Finished DIY Repeat-O-Meter

So after some playing around, I finally got it finished and operating. I added some parts, such as the 3d printed handles (I found the low handle helps keep the device steadier when pushing it across a table and provides for better readings. ) The 3d printed handles should also provide some thermal insulation so the heat from your hands does not unduly affect the results. (Does that really matter for the cases I’m using it with? Nah.) I also added a rubber band around the top arm as it seemed to limit some vibrations, and again provided for better, quicker, more consistent readings.

Mahr Supramess
Mahr Supramess Dial Comparator. It reads 0.00002″ (“20 millionths”, about half a micron). Here it is zeroed out.

I found that after installing the Supramess Comparator (which reads 0.00002″), and zeroing it out, and locking down the fine height adjustment, the repeat-o-meter actually worked! Surprisingly well actually. When moved on a typical granite kitchen counter top, the dial indicator would jump between -5 and +5 (a swing of 0.001″) with regular outliers pegging the needle. When compared to a 36″ x 24″ surface plate, the movement is generally less than a swing of 0.0002″. While I cannot self-calibrate the repeating instrument, and thus it’s not something that I would use for lab grade metrology, for my purposes, it’ll work.

So How Flat is it?

That’s a lot of work just to get an idea about how flat my tiny, cheap, import surface plate is. So how flat is it? The answer, not too bad. For the most part, the surface plate is within 0.000060″ (60 millionths, or 60 microinches, ~1.5 microns) total indicator movement. However, there are two corners where the indicator drops to 0.0001″. This isn’t too surprising, as this is just at the very edge of the plate (less than 1 inch from the edge in both cases.) If you’ve ever done any lapping, it’s quite easy to roll an edge if you’re not careful. I’m assuming that this is what happened to this plate. If I ignored the corners, the repeatability is within the 60 millionths range and I would say that in terms of repeatability, this is a Grade A surface plate. Pretty decent as it was sold as a Less than B Grade plate. (Sold as +-0.0001″, that may be a marketing error, as a Grade B would be half that.)

I have access to a number of granite surface plates, and as such I’ve used this to test them. The relatively new surface plates have shown very consistent results, and even a well used plate is still well within Grade A repeatability measurements, with the exception of a ~6 inch diameter spot, now on the back of the plate where it was reading quite high and had a very rough surface finish. (this plate has had a rough life, and has been repaired a few times.)

Yikes! This old surface plate was well used in one particular spot. Compared to the center of the plate, it was out 0.00024″ You could feel the granite had a more porous, rougher texture in this location. I don’t know what has caused this.

All in all, I’m quite happy with my DIY Repeat-O-Meter and my really cheap surface plate. Neither are perfect, but they’ll work for the purposes that I use them for. And it helped me think more about how we measure flatness and answered my curiosity about how flat my surface plate actually was, which has helped down the road as I continue to think and work on making things flat.

Next Up: Let’s take a closer look at some things we’ve conveniently skipped over.

An Obsession with Flatness – Part 3

Prototyping ain’t easy, but it’s necessary

As the saying goes, everyone has a plan until they get punched in the mouth. The same goes for taking a design and turning it into a physical object. You may not have the tools or material you need, you may realize that in reality, things don’t operate the way that you want, or the way you designed something just isn’t feasible to build. The other side of the coin is that maybe you come up with a better design while you build.

Building the DIY Repeat-O-Meter, most of the above happened. This doesn’t lead to a pretty finished product. Extra holes drilled throughout the part to try one one idea or another. Slots roughly cut, then a design change halfway through. It’s not the best work I’ve ever done. But I’ve built enough prototypes at this point, that I at least expect this sort of thing to happen.

Bottom of repeat-o-meter
Excellent machining! Good job centering that slot. Nice Extra holes on the side of the base. The two holes on the back of the arm by the foot are where the arm connects to the base via two screws, and one was re-drilled for some reason? (I think I was going to originally try and put the ball for the foot in the very back?)

The most difficult part was determining how much of a slot, and how thin of a web to leave on the arm to get reliable flexing, that would not lead to permanent deformation, but be “soft” enough to provide good readings. It took a bit of experimentation, but I finally arrived at something that seemed like it would work.

flexure hinge
The Flexure. She ain’t pretty, but she works. It took a bit of trial and error to get the right amount of flex. And once again, an extra hole from the original design.

Next up: Finally Finished.

Air Scoop

Why I like OpenSCADAccidents

An air scoop.

I like OpenSCAD for a number of reasons. It can be quick and easy to make simple, geometric objects very quickly. It’s my goto (pun intended) app for designing something quick when the dimensions are already known. It’s great for parametric designs, which allow for quick changes to a basic design. It’s one 3d modeling tool out of many, and I use it more than many others.

However, OpenSCAD does have it’s limits. To be fair, a large part of it’s limitations are on the user. If you know how to do the math in order to model an object, there’s a good bet OpenSCAD can do it. But as I’m not a mathematician, I’m limited in what I can create with it. (But if you want to see what real mathematician’s can do with OpenSCAD, check out MathGrrl (Lauren Taalman), Henry Segerman, and kitwallace (Chris Wallace))

That said, at the same time, OpenSCAD allows me to stumble upon accidents that I wasn’t actually trying to create. It’s one of the best features of OpenSCAD in my opinion. Accidental Modeling.

Sometimes I start modeling one thing, only to find myself accidentally creating something completely different. The air scoop was one of these happy accidents. I don’t even remember what I was trying to model, but I did a rotate_extrude, and there it was.

A second scoop, designed for the intake opening to be closer/lower to the output.

And then all that’s left is to make some parameter tweaks, and you can get different shapes. Now all I have to do is to make a dragster so that I can 3d print these and place it on the hood.

With some relatively minor changes, you can make a more complex shape.

The Code. Just remember, that like 99% of my programs, the parameters are designed for a sweet spot. Once you take it out of that range, it’s probably going to have problems. The good news is that this might help you make your own happy little accident.

//sgn - july 2017
//air scoop test - work in progress
//I recommend getting the shape, then just scaling it for correct size.

$fn = 64;

scale_x = 2.3;
scale_y = 1.2;
scale_z = 1;
main_diameter = 26; //has to be below 40. because it runs into itself if translation value stays at 22.
translation_value = 22;  //sort of height of scoop

//test one
//main body
difference(){
scale([scale_x,scale_y,scale_z])
rotate([90,270,0])
rotate_extrude(angle=90, convexity=10)
   translate([translation_value, 0]) 
    circle(d = main_diameter);

//subtractive copy
scale([0.98,0.98,0.98]){
translate([-0.5,0,0.3])  //these values will need to be played with sometimes to get the openings correct    
scale([scale_x,scale_y,scale_z])
rotate([90,270,0])
rotate_extrude(angle=90, convexity=10)
   translate([translation_value, 0]) 
    circle(d = main_diameter);


//top opening
translate([-0.55,0,translation_value + 0.3])  //these values will need to be played with sometimes to get the openings correct
scale([scale_x,scale_y,scale_z])
rotate([0,90,0])
cylinder(d = main_diameter, h = 1.1);


//bottom opening
translate([-51.11,0,-0.1])  //these values will need to be played with sometimes to get the openings correct
scale([scale_x,scale_y,scale_z])
cylinder(d = main_diameter, h = 1.1);
}
}

An Obsession with Flatness – Part 2

The Repeat-O-Meter continues. The Design Phase

Having bought a small, cheap, granite surface plate (12″ by 8″), that (I think) was Grade B (as compared to the AA and A which are better), it totally makes sense to check it’s relative flatness. Because the work I do in my bedroom requires high precision. Or at least that’s what I told myself.

a Rahn Repeat-O-Meter at a hefty 10″ long would barely have fit on my tiny surface plate. Forget about trying to take any type of systematic measurements with it. Instead of building a full size Repeat-O-meter, I’d have to create a smaller version in order to have it work on my small surface plate.

So let’s do this. Let’s spend hours of our life designing, developing, and building a small DIY repeat-o-meter, that I’m going to be unsure of it’s actually accuracy and repeatability. And let’s not mention the fact that you need a millionth’s (0.00005″) level indicator to actually do this, which are not cheap.

repeat o meter design
The First Design. The BarZ design. The Base is on the right. The Dial Indicator is the yellow faced instrument held in the cantilever arm. And the lever arm is at the bottom left, where it influences the dial indicator’s plunger, providing for the reading. The round part on the top is just a handle.

Taking the blueprints from the BarZ DIY Repeat-O-Meter, I started in Fusion360 and built a model almost exactly to the ShadonHKW prints. Immediately changes were made to the design. Partly because of available stock, partly because of available hardware (I was doing this on the cheap, I had to drop some money on a good indicator… which would cost more than the surface plate.) But also because I didn’t know what I was doing.

The basic design is simple, as referenced in an earlier post, you have a base with 3 flat feet that holds the dial indicator out on a cantilever post. This post sits above the lever arm. The lever has one foot at the front. As you move the device across the surface plate, the lever arm will influence the dial indicator, giving you a reading of the variations of the flatness of the surface plate.

ball bearings in base
Looking from the back, and through the base, you can see the ball bearings here, held in by set screws. Note the triangular layout of the 3 feet on the bottom of the base, and one at the front on the lever arm.

For the Pivot, the BarZ design uses two center drilled holes on the lever, and two ball bearings (held in by set screws) on the base. While this should work just fine, I never built this version. The original Rahn Repeat-O-Meter uses a flexure hinge, and that design appealed to me, and as I’ve never made a flexure hinge before, I really wanted to try to see how a flexure hinge worked. At the time, I’m sure I was reading about compliant mechanisms. (And for more flexures and compliant mechanisms, check out this excellent Veritaseum video.)

One of the benefits of a flexure hinge is that I can worry less about the stiction/friction between the ball bearings and the lever arm itself. While this would normally not be an issue at all, when dealing with measuring millionths of an inch, and being moved across a plate, any little friction/stiction could possibly add error to my measurements.

flexure hinge
The design for my first flexure. I don’t know what I’m doing. Designed to be easily machinable (two holes, a slot between them, and a saw cut.)

For the simple flexure hinge, I just designed a slot into the arm, taking material off the bottom where the actual flexing will occur until there would be a good “hinge” but it wasn’t so weak that I had to worry about permanent deformation or failure from metal fatigue. I read up a bit on the topic and found some numbers of around 0.050″ for my use case. That said, it wasn’t a scientific process at all. “Okay, that looks right” and “we’ll see how it works in metal” was the best I could come up with.

And with that, the design process was done. And all that was left was to make the thing. Of course it never seems to work that way.

(Next: “Wow, you call yourself a machinist?”)

An Obsession with Flatness – Part 1

While learning how to machine using the lathe and mill, I became interested in what seemed to me a chicken/egg problem; “How do you make a precision instrument if you don’t have a precision instrument to make it with?” The answer: it starts with a flat surface, and you build up from there. (For more about this answer, I recommend “Foundations of Mechanical Accuracy” by Wayne Moore.)

Precision starts with a flat plane. Without a smooth, regular surface, it would be nearly impossible to create square objects, and from there, impossible to build all the machines and technologies to create the world around us. (Also, I can’t help but mention that as I wrote this, I was reminded of the flat plane of Central Place Theory by Christaller, for the geography nerds out there.)

And thus my unhealthy obsession with flatness began.

I started with reading about Surface plates, the granite plates that have been ground to millionths of an inch flatness. A typical surface plate you may see in a shop would be 24″ by 36″ and 4″ thick, cut from granite and ground flat with diamonds. (For a very bad copy of the Federal Specification from the GSA, which almost all surface plate manufacturers base their tolerances on, because you can’t easily find the new spec, see here: the older spec, GGG-P-463c, now superseded by ASME B89.3.7.) In order to meet these standards, you need to have your surface plate calibrated, so how do we go about doing that?

And this is where I came across the weird looking thing, with the name straight from the 1950’s: the Rahn Repeat-O-Meter.

The Rahn Repeat-O-Meter. I don’t think you can use it to bust ghosts, but I’ve never tried.

A Repeat-O-Meter measures the variation in relative flatness across the surface plate. It’s a rather simple device, consisting of essentially a floating lever attached to a base. The base has an arm above the lever that holds a high precision dial indicator (0.00002″usually.) The lever lifts the plunger on the dial indicator as you sweep the whole thing across your surface plate. And as you move the Repeat-O-Meter around your plate, you see the variation in the flatness of your plate (relative, because it shows the variance from one point on the plate compared to another point.) Obviously, the less variance, the better the plate for high precision work.

When I googled the Repeat-O-Meter, I came across one of my favorite machinist Youtube Channels, Oxtoolco (Tom Lipton) and his videos on the Repeat-O-Meter and re-surfacing his granite plates, and his collaboration with NYCCNC on re-creating their own DIY Repeat-O-Meter. (And by the way, you’re going to see a lot of references to Tom Lipton on this blog when it comes to metrology, flatness, and all things machining. He’s my spirit animal.) And just as an aside, I’d be remiss not to mention this amazing design by Robin Renzetti.)

However, my biggest influence was the guys at Bar Z. This video (and their blueprints found in the description of the video) of their own DIY mini Repeat-O-Meter.

BarZ repeat-o-meter (From ShadowHKW’s Youtube Channel)

Now, I didn’t learn all this all at once. I had been reading and watching these videos over a period of a few months. And in that time, I had enough use for a surface plate that I bought a small (12″ x 8″) import granite surface plate from Ebay. And not knowing how flat this rather inexpensive and small plate was, I wanted a wear to investigate it’s properties. So I set out to make my own Repeat-O-Meter.

And this is where the trouble began….

(Next Up: “A slight change.”)

OpenSCAD Screwdriver Handle

I’ve needed to make a couple of handles for some homemade tools over the past few years, and I’ve always like the look and feel of the traditional screwdriver handle, so I made a semi-parametric OpenSCAD handle.

You may need to make changes for the actual tool holding aspect. I’ve used epoxy, as well as a flat, and in one simple case, just an interference fit (it worked just fine for the low torque tool.)

Here’s the code:

//Tool Handle - SGN 2016
//modified 2020
//STILL HAVE TO MAKE CHANGES FOR TOOL HOLDING


handle_height = 45;
handle_diameter = 25;
tool_diameter = 13.12;
tool_height = 7.2;
handle_cutout_diameter = 6.5;
toroid_adj = -9; //have to sometimes adjust height of toroid 


difference(){
union(){
//main handle
cylinder(h = handle_height, d = handle_diameter, $fn = 18);


//ball on top of handle
translate([0,0,handle_height + 0.25])
sphere(d = handle_diameter - 0.25, $fn = 100);

//BOTTOM CONES
union(){    
translate([0,0,-21])
cylinder(h = 2, d = handle_diameter - 2, $fn = 18);
    
translate([0,0,-23])
cylinder(h = 2, d1 = handle_diameter - 4, d2 = handle_diameter - 2, $fn = 18);

translate([0,0,-19])
cylinder(h = 3, d1 = handle_diameter - 2, d2 = handle_diameter - 7, $fn = 18);
}    

//MID-BOTTOM CONES FOR TOROID
translate([0,0,-10])
cylinder(h = 10, d1 = handle_diameter - 11, d2 = handle_diameter, $fn = 18); //$fn = 64

//translate([0,0,-18])
//cylinder(h = 12, d1 = 19, d2 = 14, $fn = 18); //$fn = 64

translate([0,0,-19])
cylinder(h = 28, d1 = handle_diameter - 2.7, d2 = handle_diameter - 11, $fn = 64); //$fn = 64

}



//internal cutouts for main handle texture
for ( i = [0 : 5] ){
    rotate( i * 60, [0, 0, 1]){
    translate([(0.5 * handle_diameter) + 1, 0, -8])
    cylinder(h = handle_height + 20, d = handle_cutout_diameter, $fn = 16);
    //translate([12,0,5])
    //sphere(d = 6, $fn = 64);
    //translate([12,0,43])
    //sphere(d = 6, $fn = 64);
    }
}


translate([0,0,-30])    
//internal cutouts for bottom handle texture
for ( i = [0 : 5] ){
    rotate( i * 60, [0, 0, 1]){
    translate([(handle_diameter * 0.5), 0, 5])
    cylinder(h = 12, d = handle_cutout_diameter - 2, $fn = 64);
    
    }
}

//toroid to cut out of bottom of handle
translate([0, 0, toroid_adj]){
rotate_extrude(convexity = 10, $fn = 64)
translate([handle_diameter - 5, 0, 0])
circle(r = (0.5 * handle_diameter) - 0.5 , $fn = 128);
}


//TOOL HOLDING PART!
translate([0,0,-25])
cylinder(h = 12, d = 10.1, $fn = 6);

//SCREWDRIVER HOLDING PART
union(){
translate([0,0,-25])
cylinder(d = 3.7, h = 15.5, $fn = 64);

translate([0,0,-18])
cylinder(d1 = tool_diameter + 0.03, d2 = tool_diameter - 7, h = 5.5, $fn = 64);

translate([0,0,-25])
cylinder(d = tool_diameter, h = tool_height, $fn = 64);
}
}

Random Geography Links – August 2019

Some great geography stories I just came across today:

21st Century Datacenter Locations Driven by 19th Century Politics – How the transcontinental railroad lead to Data Centers a hundred and fifty odd years later.

Cartographers of North Korea – who creates OpenStreetMap data for North Korea?

Mapmaker: The Gerrymandering game that puts the fun in undermining democracy – A board game based around Gerrymandering.

How a Gerrymander Nearly Cost Us the Bill of Rights – James Madison wanted to join Congress so he could amend the new Constitution. Patrick Henry was determined to stop him. By Richard Labunski

3d printed speaker enclosure in OpenSCAD

I designed this a few years ago just having fun with OpenSCAD. I had a small speaker that I needed a small enclosure for, and I wanted to test my new 3d printer at the time as well. So I came up with this design.

small 3d printed speaker enclosure

And the OpenSCAD Code:

//weird ass speaker cabinet for ~1.5 inch speaker. sgn June 2017

$fn = 6;
translate([0,0,102]){
rotate([195.57939, 29.244305, 54.377626]){ //puts it so base is flat, used repetier "lay flat" to find these numbers.
difference(){

snakey();

snakey2();

//SPEAKER hole
translate([5,22.5,75.75]) //translate([-1,26,75])
rotate([0,100,150])
cylinder(d = 36, h = 19, $fn = 32);

//flat face
translate([-5,28,75])
rotate([0,100,150])
cylinder(d = 57, h = 17, $fn = 32);

//"bottom" hole (for sphere at 0,0,0)
translate([0,0,-12])
cylinder(d = 6, h = 6);

//TEST CUBE
//translate([0,0,40])
//cube([100,100,20], center = true);

}

//BAD SIMPLE SPEAKER MODEL
//translate([-1,26,75])
//rotate([0,100,150])
//cylinder(d = 36, h = 10, $fn = 32);

difference(){
//FILL THE FACE
translate([-2.555,26.8,74]) //translate([-1,26,75])
rotate([0,100,150])
cylinder(d = 48, h = 2.5);

//SPEAKER hole
translate([5,22.5,75.75]) //translate([-1,26,75])
rotate([0,100,150])
cylinder(d = 36, h = 19, $fn = 32);

}

//fill small hole near speaker
//FILL THE FACE
translate([-2.5,20.5,53]) //translate([-1,26,75])
rotate([0,100,150])
cylinder(d = 5, h = 2.0);

}
}

module snakey(){

for( i = [0:11]){
translate([0,0,i
7]) rotate([0,i40,i30]) translate([0,i2,0])
sphere((i+5)*2.2);

}
}

module snakey2(){

for( i = [0:11]){
translate([0,0,i
7]) rotate([0,i40,i30]) translate([0,i2,0])
sphere((i+4.2)*2.2);

}
}