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

Making the world a better place, one piece at a time

  • Thing-O-Matic: Extruder Motor Support

    Extruder motor support
    Extruder motor support

    In the process of tracking down the source of those Reversal zits, I noticed the motor mount flexed slightly as it reversed. That could produce a bit of backlash, so I added a quick-and-dirty support strut under the motor.

    It’s a threaded standoff with a screw in one end. The nut (secured with a dab of Loctite) lets a wrench do the height adjustment. It just stands there, held in place by compression loading.

    Unfortunately, it really didn’t have much of an effect on the problem, about which I’ll say more in a bit.

    Stepper extruder design has advanced during the last half year, so I may print up the latest iteration of Greg’s Extruder. There’s also a beefy NEMA 17 on its way around the curve of the planet that might suffice as a direct-drive extruder motor along the lines of the MBI MK6 StepStruder motor, but with lower winding resistance for better performance.

  • Thing-O-Matic: Overhead Filament Spool Holder

    Three spools of filament just arrived and needed a home; up to this point, I’ve been using the Lazy Susan Filament Spool for loose bundles atop the Thing-O-Matic. Until I use the last of the loose filament, which could take a while, I figured I could tack the spools to the floor joists.

    It turns out 1-1/2 inch PVC drain pipe fits perfectly through the spool bore, so I squared up the ends of a chunk long enough to span the floor joists at a convenient distance from the printer. That steady rest doesn’t see a lot of use, but when I need it, I need it bad:

    Turning spool axle
    Turning spool axle

    The endplate solid model looks about like you’d expect:

    Filament spool axle endplates
    Filament spool axle endplates

    I could turn those things from two chunks of plate, but this is much neater; a 3D printer makes short work of custom-sized parts.

    The two pegs of yellow filament keep the axle endplate from turning on the central screw (and, inevitably, unscrewing themselves); add glue in the blind holes and trim to fit with a flush-cutting nipper. The aluminum brackets come from a pile I’ve been using for years: as almost always, the holes were in exactly the right places.

    Filament spool axle endplate
    Filament spool axle endplate

    With all that in hand, up it went:

    Overhead filament spools
    Overhead filament spools

    I bent some coat hanger wire into a guide bar with three eyelets for the filaments, plus another chunk to hold the guide in position. Three small (color coordinated!) clamps prevent the unused filament from unwinding.

    I’m not completely happy with this arrangement, because there’s not enough control over the filament energy: the coil around each spool wants to expand into a tangle exactly the size and shape of the Basement Laboratory and there’s not a lot preventing that. I think a variation on tbuser’s Spool Guard theme might be in order: let the filament expand within a tightly enclosed space around each spool.

    The OpenSCAD source code:

    // Filament spool shaft adapter
    // Ed Nisley KE4ZNU July 2011
    
    include </home/ed/Thing-O-Matic/lib/MCAD/units.scad>
    
    Layout = "Show";					// Show or Build
    
    //-- Extrusion parameters
    
    ThreadThick = 0.33;
    ThreadWT = 2.0;
    ThreadWidth = ThreadThick * ThreadWT;
    
    HoleWindage = 0.1;			// enlarge hole dia by this amount
    Protrusion = ThreadThick;
    
    //-- End Plate dimensions
    
    PlateOD = 51.0;
    PlateThick = ThreadThick * ceil(3.0 / ThreadThick);
    
    AxleID = 40.0;
    AxleThick = ThreadThick * ceil(5.0 / ThreadThick);
    
    HoleSpacing = 0.75 * inch;
    
    StubDepth = ThreadThick * ceil(2.5 / ThreadThick);
    StubDia = 3.0;
    
    ScrewDepth = PlateThick + AxleThick;
    
    PrintOffset = 0.8*PlateOD/2;			// fraction of dia to offset objects for printing
    
    Tap6_32 = 0.1065 * inch;
    Clear6_32 = 0.1495 * inch;
    Head6_32 = 0.270 * inch;
    Head6_32Thick = 0.097 * inch;
    Nut6_32Dia = 0.361 * inch;		// across points
    Nut6_32Thick = 0.114 * inch;
    
    //----------------------
    // Useful routines
    
    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);
    }
    
    PegSize = 1.0;
    
    module ShowPegGrid(Size) {
    	for (x=[-5:5])
    	  for (y=[-5:5])
    		translate([x*10,y*10,Size/2])
    		  %cube(Size,center=true);
    
    }
    
    //----------------------
    // Single endplate
    
    module AxleEndPlate() {
    
      difference() {
    	union() {
    	  cylinder(r=PlateOD/2,h=PlateThick,$fa=10);
    	  translate([0,0,PlateThick])
    		cylinder(r=AxleID/2,h=AxleThick,$fa=10);
    	}
    
    	translate([0,0,-Protrusion])
    	  PolyCyl(Tap6_32,ScrewDepth + 2*Protrusion);
    
    	for(y=[-HoleSpacing,HoleSpacing])
    	  translate([0,y,-Protrusion])
    		PolyCyl(StubDia,StubDepth + Protrusion);
    
      }
    
    }
    
    //----------------------
    // Lash it together
    
    if (Layout == "Show")
    	ShowPegGrid(PegSize);
    
    translate([-PrintOffset,-PrintOffset,0]) AxleEndPlate();
    
    translate([PrintOffset,PrintOffset,0]) AxleEndPlate();
    
    
  • Thing-O-Matic: Un-twisting the Build Platform

    Shimmed X-axis rod
    Shimmed X-axis rod

    The aluminum build platform plates remain both flat and level, but the outline and test extrusions are consistently thin by 0.05 to 0.10 mm in the right rear corner and thick by about the same amount in the right front. That means the rear corner is too high and the front corner is too low, but the whole left side is flat to within my ability to measure it.

    The effect is significant, because I’m laying down the first layer at 10 mm/s with a layer thickness of 0.33 mm; the first layer looks exactly like all the other layers in the object. With the middle of the plate at 0.33 mm below the nozzle, the fill can be cramped at 0.23 mm and sparse at 0.43 mm. The long-term Z-min switch repeatability seems to be no better than 0.05 mm, so when the midline goes below 0.30 mm, the higher rear corner really crowds the plastic.

    Given that the left side is level front-to-back, the only way a flat plate can appear non-flat is if the X and Y axis rods aren’t quite parallel: the stage rolls or yaws as it moves.

    That could indicate a bent rod, but the last time I rolled those rods on a surface plate, they’re perfectly straight. Maybe something horrible has happened, but any stress capable of bending one of those rods will wreck the printer in passing.

    Alas, a static platform adjustment can’t fix a dynamic motion, but tweaking the rods to be (more) parallel could reduce the problem. I tried visualizing the possible causes and cures, then decided to stop thinking so much, just change something, then measure the results.

    Why my head exploded:

    • The thickness varies from front-to-back, so the Y axis rods are non-parallel, which should affect both the left and right sides. But the left side is perfectly level and the right side is not.
    • The thickness varies from left-to-right, so the X axis rods are non-parallel, which should affect both the front and back sides. But they vary oppositely: the front tilts down to the right and the back tilts up to the right. The midline from left to right, however, is level to within my ability to measure it.

    I had shimmed the rear X axis rod quite some time ago, so I decided to try a simple adjustment: move the shim from top to bottom. The picture shows the 0.4 mm shim in its original location at the top of the rod; the edge is barely visible. For lack of anything smarter, I moved the shim to the bottom of the rod to push the end upward.

    Shazam! The results of a test extrusion in units of 0.01 mm:

    39 35
    40 35 40
    33 36

    [Update: Typo in the rear-left was 49, should be 39. Drat!]

    Which says it’s give-or-take 0.05 mm around the middle, with the rear-left corner now a tad low; bear in mind that 0.05 mm is about the limit of my measurement ability. It’s off to a good start, anyway, and we’ll see how it fares over the next few weeks.

    Methinks if you’re serious about this 3D printing thing, you need a printer with real axis alignment adjustments and enough stability to make them meaningful. Nophead uses custom code that tweaks the G-Code’s Z-axis coordinates on the fly based on an initial three-point probe, which is a wonderful solution that’s not in the cards for RepG. EMC2 could incorporate that in the kinematics module, but at the moment it does just XY leadscrew mapping. It’s simpler, albeit more expensive on a per-machine basis, to get the mechanical alignment right the first time.

  • Even More Garish Kickstand Plate

    Fluorescent Red Kickstand Pad
    Fluorescent Red Kickstand Pad

    Having managed to mislay my dingy yellow kickstand plate, I made two more and this time hit ’em with fluorescent red paint. Ought to be unforgettable for another few years…

    In theory, you’re supposed to apply a white undercoat. I hosed ’em down with many drippy, runny coats of red and it’s all good. This ain’t art and they get thrown on the ground, so what’s the point of being fancy?

  • Lenovo Mini Wireless Keyboard: Readable Power Switch

    The backside of the Lenovo N5901 Mini Wireless Keyboard (which arrived with the aforementioned Q150) has a black-on-black power switch with ON and OFF legends (yes, I think they’re backwards, too) embossed in the matte black case: under anything less intense than enhanced interrogation lighting, you (well, I) can’t determine the switch position.

    Of course, the myriad certifications / ratings / labels required for compliance with all the regulations are perfectly legible:

    Lenovo Mini Keyboard - enhanced labels
    Lenovo Mini Keyboard – enhanced labels

    Working a dab of white correction fluid into the letters makes them blindingly obvious; the smudges around the letters will wear off in short order.

    I should probably add a bit of white to the switch background as well.

  • Drilling a Drainage Hole in a Plant Pot

    We divided an ancient Snake (a.k.a. Mother-In-Law’s Tongue) Plant and discovered the pot had no drainage hole, which is not to be tolerated.

    It turns out that an ordinary carbide glass drill works just fine on glazed clay pots. Use a low RPM and very slow feed, flood the scene with water, and drill from the other side after the point breaks through.

    Glass drill for plant pot hole
    Glass drill for plant pot hole

    The glaze inside the pot already had a flaw that let the water into the clay, from whence it seeped out through the unglazed lower rim. I suppose saturating the clay can’t possibly be good, but I’ve done this to many glazed pots over the years and none of them have ever complained, so it’s all good.

  • Helmet Mirror: Smaller Mirror Shaft

    This is the slightly smaller mount corresponding to the OpenSCAD code there for the two-section inspection mirror shaft, hot from the printer:

    Helmet mirror mount on build platform - smaller mirror shaft
    Helmet mirror mount on build platform – smaller mirror shaft

    It’s about the same as the previous version, despite trimming a few millimeters from the diameters and spacings:

    Helmet mirror mount size comparison
    Helmet mirror mount size comparison

    I’ll print the next one in a darker color. At least it’s not pink…

    The OpenSCAD source:

    // Helmet mirror mount
    // Ed Nisley KE4ZNU June 2011
    
    include </home/ed/Thing-O-Matic/lib/MCAD/units.scad>
    include </home/ed/Thing-O-Matic/lib/MCAD/boxes.scad>
    include </home/ed/Thing-O-Matic/lib/visibone_colors.scad>
    
    //-- Layout Control
    
    Layout = "Build";					// Build Fit Show None
    
    Examine = "None";				// AzMount ElMount ElBody ElPlate HelmetPlate None
    
    //-- Extrusion parameters
    
    ThreadThick = 0.33;
    ThreadWT = 2.0;
    ThreadWidth = ThreadThick * ThreadWT;
    
    HoleWindage = 0;			// enlarge hole dia by this amount
    
    //-- Useful sizes
    
    Tap2_56 = 0.070 * inch;
    Clear2_56 = 0.082 * inch;
    Head2_56 = 0.156 * inch;
    Head2_56Thick = 0.055 * inch;
    Nut2_56Dia = 0.204 * inch;
    Nut2_56Thick = 0.065 * inch;
    
    Tap3_48 = 0.079 * inch;
    Clear3_48 = 0.096 * inch;
    Head3_48 = 0.184 * inch;
    Head3_48Thick = 0.058 * inch;
    Nut3_48Dia = 0.201 * inch;
    Nut3_48Thick = 0.073 * inch;
    
    Tap4_40 = 0.089 * inch;
    Clear4_40 = 0.110 * inch;
    Head4_40 = 0.211 * inch;
    Head4_40Thick = 0.065 * inch;
    Nut4_40Dia = 0.228 * inch;
    Nut4_40Thick = 0.086 * inch;
    
    //-- Azimuth Mount
    
    AzMountDia = 12.0;
    AzMountLength = 14.0;
    
    AzFacets = 30;
    
    echo(str("Azmuth mount dia: ",AzMountDia," length: ",AzMountLength));
    
    //-- Mirror sizes
    
    MirrorShaftDia = 3.60;
    MirrorShaftOffset = -1.5;				// vertical offset from center of AzMountBody
    MirrorShoulderLen = 3*MirrorShaftDia;
    MirrorShoulderDia = min(AzMountDia,MirrorShaftDia + 6*ThreadWidth);
    
    MirrorStudDia = Tap3_48;
    MirrorStudLen = 2.0;
    
    //-- Elevation Mount / Body / Plate
    
    ElMountDia = AzMountDia;
    ElMountLength = 2.0 + ElMountDia;
    
    ElMountBase = 2.0;
    
    ElMountRounding = 2.0;
    
    ElMountFacets = AzFacets;
    
    ElBodyWidth = ElMountDia;
    ElBodyBlockLength = ElMountLength + AzMountLength/2 - MirrorShaftOffset;
    ElBodyThick = 8.0;
    
    echo(str("Elevation body overall: ",(ElBodyBlockLength + ElBodyWidth/2)," width: ",ElBodyWidth));
    
    ElPlateTall = ElBodyBlockLength + 0.70*ElBodyWidth;
    ElPlateWidth = 1.25 * ElPlateTall;
    ElPlateThick = Nut3_48Thick + 3*ThreadThick;
    
    ElPlatePlusX = ElPlateThick + (ElMountDia/2 + ElMountBase) + ElBodyThick;
    
    echo(str("Elevation plate tall: ",ElPlateTall," width: ",ElPlateWidth));
    
    ElArcRadius = (3/4) * ElBodyBlockLength;
    ElArcThick = 4*ThreadWidth;
    ElArcHeight = (1/2) * ElBodyThick;
    ElArcAngle = 35;
    ElArcFacets = 32;
    
    ElPlateFacets = 52;
    
    //-- Helmet Interface Plate
    
    HelmetCX = 60.0;
    HelmetMX = 4.0;
    HelmetRX = (pow(HelmetMX,2) + pow(HelmetCX,2)/4)/(2*HelmetMX);
    
    HelmetPlateC = max(ElPlateTall,ElPlateWidth);
    HelmetPlateTheta = atan(HelmetPlateC/HelmetRX);
    HelmetPlateM = 2*HelmetRX*pow(sin(HelmetPlateTheta/4),2);
    
    HelmetPlateThick = ThreadThick*(ceil(HelmetPlateM/ThreadThick) + 1);
    
    //-- Bearing Interfaces
    
    BearingWidth = 3*ThreadWidth;
    
    BearingOverlap = 3*ThreadThick;
    BearingClearance = 1*ThreadThick;
    
    BearingStudDia = min(AzMountDia,ElBodyWidth) - 2*BearingWidth;
    
    //-- Convenience values
    
    Protrusion = 0.1;		// make holes look good
    
    //----------------------
    // Useful routines
    
    module PolyCyl(Dia,Height) {			// based on nophead's polyholes
    
      Sides = ceil(Dia) + 2;
      FixDia = Dia / cos(180/Sides);
    
      cylinder(r=(FixDia + HoleWindage)/2,
               h=Height,
    	   $fn=Sides);
    }
    
    PegSize = 1.0;
    
    module ShowPegGrid(Size) {
    	for (x=[-5:5])
    	  for (y=[-5:5])
    		translate([x*10,y*10,Size/2])
    		  cube(Size,center=true);
    
    }
    
    //----------------------
    // Azimuth Mount
    
    module AzMount() {
    
      difference() {
    	union() {
    	  cylinder(r=AzMountDia/2,h=AzMountLength,$fn=AzFacets);		// body
    	  translate([0,0,AzMountLength/2 + MirrorShaftOffset])
    		rotate([-90,0,0])
    		  cylinder(r=MirrorShoulderDia/2,
    				   h=MirrorShoulderLen,$fn=AzFacets);				// mirror shaft shoulder
    
    	  if (Layout != "Fit")
    		for (y=[0:1])												// shoulder support
    		  translate([-AzMountDia/2,(4*y + AzMountDia/2 + ThreadWidth),0])
    			difference() {
    			  cube([AzMountDia,2*ThreadWidth,AzMountLength/6]);
    			  translate([AzMountDia/2,-Protrusion,AzMountLength/2 + MirrorShaftOffset])
    				rotate([-90,0,0])
    				  cylinder(r=MirrorShoulderDia/2,h=ThreadWidth + 2*Protrusion);
    			}
    	}
    
        translate([0,-Head3_48/2,AzMountLength/2 + MirrorShaftOffset])
          rotate([-90,0,0])
    		PolyCyl(MirrorShaftDia,(AzMountDia + MirrorShoulderLen));	// mirror shaft
    
        translate([0,-(Head3_48/2 - Protrusion),AzMountLength/2 + MirrorShaftOffset])
    	  rotate([90,0,0])
    		PolyCyl(MirrorStudDia,MirrorStudLen+Protrusion);			// mirror stud
    
        translate([0,0,
    	       Head3_48Thick - (AzMountLength - MirrorShaftDia)/2 + MirrorShaftOffset - Protrusion])
          PolyCyl(Head3_48,AzMountLength + Protrusion);					// mounting screw head
    
        translate([0,0,-Protrusion])
          cylinder(r=(Clear3_48 + HoleWindage)/2,
    	  h=(AzMountLength + 2*Protrusion),
    	  $fn=ceil(Clear3_48)+2);										// mounting screw clearance
    
    	translate([0,0,AzMountLength/2 + Head3_48Thick + MirrorShaftDia/2 + MirrorShaftOffset - Protrusion])
    	  cylinder(r1=(Head3_48/cos(180/7) + HoleWindage)/2,
    			   r2=Clear3_48/2,
    			   h=(3*ThreadThick + Protrusion),
    			   $fn=7);												// overhang support
    
        translate([0,0,AzMountLength/2 + MirrorShaftOffset])
          rotate([0,90,0])
    		PolyCyl(Tap2_56,AzMountDia/2 + Protrusion);					// setscrew hole
    
        translate([0,0,AzMountLength - (BearingOverlap + BearingClearance)])
    	  PolyCyl(BearingStudDia,
    			  BearingOverlap + BearingClearance + Protrusion);		// bearing surface
    
      }
    
    }
    
    //----------------------
    // Elevation Mount
    
    module ElMount() {
    
      difference() {
    
    	union() {
    
    	  translate([(ElMountDia/4 + ElMountBase/2),0,(ElMountLength/2 + BearingOverlap)])
    		rotate([0,90,0])
    		  cube([ElMountLength,ElMountDia,(ElMountDia/2 + ElMountBase)],
    			  center=true);											// mounting block
    
    	  translate([0,0,BearingOverlap]) {
    //		color([0.4,0.3,0.3,0.7])
    		cylinder(r=ElMountDia/2,
    				 h=ElMountLength - ElMountDia/2,
    				 $fn=ElMountFacets);								// cylinder to Az
    
    //		color([0.3,0.4,0.3,0.7])
    		translate([0,0,ElMountLength - ElMountDia/2]) {				// curved interface
    		  intersection() {
    			cylinder(r=ElMountDia/2,h=ElMountDia/2,$fn=ElMountFacets);
    			translate([0,ElMountDia/2,0])
    			  rotate([90,0,0])
    				cylinder(r=ElMountDia/2,h=ElMountDia,$fn=ElMountFacets);
    		  }
    		}
    
    	  }
    
    	  cylinder(r=(BearingStudDia - HoleWindage)/2,h=BearingOverlap);	// bearing stud
    	}
    
    	translate([0,0,-Protrusion])
    	  PolyCyl(Tap3_48,(3/4)*ElMountLength + BearingOverlap + Protrusion);	// AzMount screw
      }
    }
    
    //----------------------
    // Elevation Body
    
    module ElBody() {
    
      difference() {
    	union() {
    	  translate([-ElBodyBlockLength,-ElBodyWidth/2,0])
    		cube([ElBodyBlockLength,ElBodyWidth,ElBodyThick]);
    	  translate([0,0,ElBodyThick])
    		cylinder(r=(ElBodyWidth - 2*BearingWidth)/2,h=BearingOverlap);
    	  cylinder(r=ElBodyWidth/2,h=ElBodyThick,$fn=ElMountFacets);
    	}
    
    	PolyCyl(Clear3_48,ElBodyThick + BearingOverlap + Protrusion);
    
    	translate([0,0,-Protrusion])
    	  PolyCyl(Head3_48,Head3_48Thick);
    
    	translate([-ElArcRadius,0,ElBodyThick - ElArcHeight/2])
    	  rotate([0,-90,0])
    		PolyCyl(Tap2_56,ElBodyBlockLength - ElArcRadius + Protrusion);
    
    	translate([0,0,ElBodyThick - (ElArcHeight + BearingClearance)])
    	  difference() {
    		cylinder(r=ElArcRadius + (ElArcThick/2 + BearingClearance),
    				 h=ElArcHeight + BearingClearance + Protrusion,
    				 $fn=ElArcFacets);
    		cylinder(r=ElArcRadius - (ElArcThick/2 + BearingClearance),
    				 h=ElArcHeight + BearingClearance + Protrusion,
    				 $fn=ElArcFacets);
    	  }
    
      }
    
    }
    
    //----------------------
    // Elevation Plate
    
    module ElPlate() {
    
      union() {
    	difference() {
    	  translate([ElBodyWidth/2 - ElPlateTall/2,0,0])
    		scale([ElPlateTall,ElPlateWidth,1.0])
    		  cylinder(r=0.5,h=ElPlateThick,$fn=ElPlateFacets);
    	  translate([0,0,-Protrusion])
    		PolyCyl(Tap3_48,ElPlateThick + 2*Protrusion);
    	  translate([0,0,ElPlateThick - (BearingOverlap + BearingClearance)])
    		PolyCyl(BearingStudDia,(BearingOverlap + BearingClearance) + Protrusion);
    	  translate([0,0,-Protrusion])
    		cylinder(r=Nut3_48Dia/2,h=(1.1*Nut3_48Thick + Protrusion),$fn=6);
    	}
    
    	translate([0,0,ElPlateThick])
    	difference() {
    	  cylinder(r=ElArcRadius + ElArcThick/2,
    			   h=ElArcHeight,
    			   $fn=ElArcFacets);
    	  cylinder(r=ElArcRadius - ElArcThick/2,
    			   h=ElArcHeight + Protrusion,
    			   $fn=ElArcFacets);
    	  rotate([0,0,90 - ElArcAngle])
    	    translate([ElArcRadius + ElArcThick,0,ElArcHeight/2])
    		  cube([2*ElArcRadius + ElArcThick,
    				2*ElArcRadius + ElArcThick,
    				ElArcHeight + Protrusion],
    				center=true);
    	  rotate([0,0,-(90 - ElArcAngle)])
    	    translate([ElArcRadius + ElArcThick,0,ElArcHeight/2])
    		  cube([2*ElArcRadius + ElArcThick,
    				2*ElArcRadius + ElArcThick,
    				ElArcHeight + Protrusion],
    				center=true);
    	}
      }
    }
    
    //----------------------
    // Helmet Interface Plate
    
    module HelmetPlate() {
    
      difference() {
    	scale([ElPlateTall,ElPlateWidth,1.0])
    	  cylinder(r=0.5,h=HelmetPlateThick,$fn=ElPlateFacets);
    
    	translate([0,0,HelmetRX + HelmetPlateThick - HelmetPlateM])
    	  sphere(r=HelmetRX,$fn=256,$fs=0.1);
    
      }
    }
    
    //----------------------
    // Lash it together
    
    if (Examine == "AzMount")
      AzMount();
    
    if (Examine == "ElMount")
      ElMount();
    
    if (Examine == "ElBody")
      ElBody();
    
    if (Examine == "ElPlate")
      ElPlate();
    
    if (Examine == "HelmetPlate")
      HelmetPlate();
    
    if ((Layout == "Build" || Layout == "Show") && Examine == "None") {
      translate([-10,-20,0])
    	rotate([0,0,90])					// mis-align top fill from ElMount
    	  AzMount();
    
      translate([-10,20,ElMountLength + BearingOverlap])
    	rotate([0,180,-90])
    	  ElMount();
    
      translate([0,0,0])
    	rotate([0,0,0])
    	  ElBody();
    
      translate([10,15,0])
    	rotate([0,0,215])					// mis-align top fill from ElBody
    	  ElPlate();
    
      translate([20,-20,0])
    	rotate([0,0,-45])
    	  HelmetPlate();
    
      if (Layout == "Show")
    	ShowPegGrid(PegSize);
    
    }
    
    if ((Layout == "Fit") && Examine == "None") {
      translate([0,0,-(AzMountLength/2 + MirrorShaftOffset)])
    	color(MFG) AzMount();
    
      translate([0,0,AzMountLength/2 - MirrorShaftOffset - BearingOverlap])
    	color(DHC) ElMount();
    //	color([  0/255, 204/255, 204/255,0.5]) ElMount();
    
    	translate([ElMountDia/2 + ElMountBase,0,0])
    	  rotate([0,90,0])
    		color(DFC) ElBody();
    
    	translate([ElPlatePlusX,0,0])
    	  rotate([180,90,0])
    		color(LHC) ElPlate();
    
    	translate([ElPlatePlusX,0,ElPlateTall/2 - ElBodyWidth/2])
    	  rotate([0,90,0])
    		color(LWM) HelmetPlate();
    }