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.

The New Hotness

  • Thing-O-Matic: Caliper Repair Perfection

    With only two feet of Barbie Filament left, I ran some Reversal tests leading up to printing another replacement part for that digital caliper. The end result, printed in red ABS, turned out to be perfect:

    Caliper Part - Installed
    Caliper Part – Installed

    Quite literally, I snapped the part off the build platform, lined it up in the caliper, ran that 1-72 screw through it, and It Just Worked. No cleanup, no trimming, no fiddling around, no problems!

    Unlike the previous part, I printed this one as a singleton in the middle of the plate in order to concentrate on the other parameters:

    Finished caliper repair part
    Finished caliper repair part

    I set the Cool plugin to 15 s/layer, which meant the top few layers printed very very slowly and the tip of the hook took forever. That’s fine with me: notice the total lack of overshoot and oscillation, compared with those Companion Cubes printed at much higher speeds.

    Side view:

    Caliper Part - Side
    Caliper Part – Side

    Bottom (the side against the caliper frame) view:

    Caliper Part - Bottom
    Caliper Part – Bottom

    Top view:

    Caliper Part - Top
    Caliper Part – Top

    The fill orientation is 0° for the first layer with 90° rotation, which lines it up neatly with the sides. There’s not enough room for anything fancy; the interior layers came out nearly solid even with the usual 0.25 fill ratio for the hex shapes.

    The fill isn’t quite as solid as you might like, but given the overall size & shape, I think it’s just about as good as it can be expected.

    Isn’t that just the cutest little thing you’ve ever seen?

    The OpenSCAD code that built it:

    // Digital Caliper thumbwheel holder
    // Ed Nisley - KE4ZNU - May 2011
    
    Build = true;						// set true to generate buildable layout
    
    $fn = 8;							// default for holes
    
    // Extrusion values
    // Use 0 extra shells
    //     2 solid shells on the top & bottom
    
    ThreadThickness = 0.33;
    ThreadWT = 2.00;
    ThreadWidth = ThreadThickness * ThreadWT;
    
    HoleWindage = 0.0;					// enlarge hole dia by small Finagle Constant
    
    Protrusion = 0.1;					// extend holes beyond surfaces for visibility
    
    // Caliper dimensions
    
    WheelDia = 10.0;					// thumbwheel OD
    WheelRadius = WheelDia/2;
    WheelMargin = 1.5;					// space around wheel
    WheelRimThick = 2.5;				// subtract from repair block
    
    ShaftDia = 2.90;					// axle between knurled wheels
    ShaftRadius = ShaftDia/2;
    ShaftLength = 2.7;
    ShaftRetainer = 3.0;				// thickness around shaft
    
    StubThick = 2.45;					// stub of holder on caliper head
    StubLength = 6.0;					// toward caliper head
    StubHeight = 7.0;					// perpendicular to caliper head
    StubClearanceX = 0.0;				// distance to caliper head
    StubClearanceZ = 0.75;				// distance to caliper frame
    
    FrameLength = 50;					// for display only
    FrameHeight = 16.0;
    FrameThick = 3.0;
    
    // Repart part dimensions
    
    ForkLength = StubLength - StubClearanceX;	// toward caliper head around stub
    ForkHeight = StubHeight;			// perpendicular to caliper head
    ForkGap = 0.3;						// clearance to stub on all sides
    ForkBladeThick = 3 * ThreadWidth;	// on each side of stub
    
    ShaftClearance = 0.1;				// Additional clearance around shaft
    ShaftOffset = 8.5;					// Shaft center to stub
    
    BoltHoleDia = 1.8;					// 1-72 machine screw, more or less
    BoltHoleRadius = BoltHoleDia/2;
    BoltHoleOffset = 3.5;				// offset from caliper frame to hole center
    
    // Convenient sizes and shapes
    
    FrameBlock = [FrameLength,FrameThick,FrameHeight];
    
    StubBlock = [StubLength,StubThick,StubHeight];
    StubMargin = [ForkGap,2*ForkGap,ForkGap];
    
    RepairBlockLength = ForkLength + ShaftOffset;
    RepairBlockThick = 2*ForkBladeThick + StubThick;
    RepairBlockHeight = WheelRadius + ShaftRadius + ShaftRetainer;
    
    RepairBlock = [RepairBlockLength,RepairBlockThick,RepairBlockHeight];
    
    // Caliper parts to show how repair fits in
    
    module CaliperParts() {
      union() {
    	translate([0,0,-(StubClearanceZ + FrameHeight/2)])
    	  cube(FrameBlock,center=true);
    	translate([-(StubLength/2 + ShaftOffset),0,(StubHeight/2)])
    	  cube(StubBlock,center=true);
      }
    }
    
    // Repair block with origin below wheel shaft
    
    module RepairPart() {
    
      difference() {
    
    // Body of repair part
    	union() {
    	  translate([-RepairBlockLength/2,0,RepairBlockHeight/2])
    		cube(RepairBlock,center=true);
    	  translate([0,0,WheelRadius])
    		rotate([90,0,0])
    		  cylinder(r=ShaftRadius+ShaftRetainer,h=ShaftLength,center=true,$fn=12);
    	}
    
    // wheels
    	translate([0,(ShaftLength + WheelRimThick)/2,WheelRadius])
    	  rotate([90,0,0])
    		cylinder(r=(WheelRadius + WheelMargin),h=WheelRimThick,center=true,$fn=16);
    	translate([-(WheelRadius + WheelMargin)/2,
    			  (ShaftLength + WheelRimThick)/2,
    			  (WheelRadius - Protrusion)/2])
    	  cube([(WheelRadius + WheelMargin),WheelRimThick,(WheelRadius + Protrusion)],
    			center=true);
    	translate([0,-(ShaftLength + WheelRimThick)/2,WheelRadius])
    	  rotate([90,0,0])
    		cylinder(r=(WheelRadius + WheelMargin),h=WheelRimThick,center=true,$fn=16);
    	translate([-(WheelRadius + WheelMargin)/2,
    			  -(ShaftLength + WheelRimThick)/2,
    			  (WheelRadius - Protrusion)/2])
    	  cube([(WheelRadius + WheelMargin),WheelRimThick,(WheelRadius + Protrusion)],
    			center=true);
    
    // axle clearance
    	translate([0,0,WheelRadius])
    	  rotate([90,0,0])
    		cylinder(r=(ShaftRadius + 2*ShaftClearance),	// hack clearance to match octagon to cube
    				 h=(ShaftLength + 2*Protrusion),
    				 center=true);
    	translate([0,0,(WheelRadius - Protrusion)/2])
    	  cube([(ShaftDia + 2*ShaftClearance),
    		    (ShaftLength + 2*Protrusion),
    		    (WheelRadius + Protrusion)],
    		    center=true);
    
    // stub of previous wheel holder
    	translate([-(ShaftOffset + (ForkLength - ForkGap)/2 + Protrusion),
    			  0,
    			  (StubHeight + ForkGap - Protrusion)/2])
    	  cube([(ForkLength + ForkGap + Protrusion),
    		   (StubThick + 2*ForkGap),
    		   (StubHeight + ForkGap + Protrusion)],
    		   center=true);
    
    // mounting screw hole
    	translate([-(RepairBlockLength - BoltHoleOffset),0,StubHeight/2])
    	  rotate([90,0,0])
    		cylinder(r=(BoltHoleDia + HoleWindage)/2,
    				 h=(RepairBlockThick + 2*Protrusion),
    				 center=true,$fn=6);
      }
    }
    
    // Build it!
    
    if (!Build) {
      CaliperParts();
      RepairPart();
    }
    
    if (Build) {
      translate([-RepairBlockLength/2,0,RepairBlockHeight])
    	rotate([0,180,0])
    	  RepairPart();
    }