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();
}

5 thoughts on “Thing-O-Matic: Caliper Repair Perfection

  1. Ed,

    Definitely a part to be proud of and a really good moment of satisfaction!

    Now, I know, your thumb will be very happy each and every time that tool is used.

Comments are closed.