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

  • Digital Caliper Thumbwheel Holder: Another Repair

    The digital caliper on my desk has been getting a lot of use lately and, as expected, that delicate glued repair failed.

    Well, I can fix that

    Thumbwheel holder - installed
    Thumbwheel holder – installed

    That’s a somewhat chopped-up Version 1; as always, I must build one prototype to see how everything fits, then make a real part incorporating all the changes. The models  and code below have those changes and should print fine.

    This picture from the previous repair shows what broke and why:

    Broken Roller Mount
    Broken caliper thumb roller mount

    I removed the remainder of the arch, filed the stub square, made a bunch of tedious measurements, and wrote a chunk of OpenSCAD code to create a repair part that looks like this:

    Thumbwheel holder - build model
    Thumbwheel holder – build model

    There’s also a layout arrangement to confirm that it’ll fit the stub:

    Thumbwheel holder - fit model
    Thumbwheel holder – fit model

    And then I printed four so I could pick the best one. The horizontal hole and notch come out surprisingly well, although this thing is right down around the minimum size you’d want to print:

    Thumbwheel holders - as built
    Thumbwheel holders – as built

    The 1-72 screw threads itself into the hole without a nut; I simply match-drilled a hole in the stub under the hole in the part. Of course, that means I must fit the next part to that hole…

    I really wish I was printing with, say, black filament. Even dark green would be better. Heck, I’d go with yellow, but if I don’t get rid of this pink stuff I’ll have it forever.

    The OpenSCAD source code:

    // Digital Caliper thumbwheel holder
    // Ed Nisley - KE4ZNU - Apr 2011
    
    Build = true;						// set true to generate buildable layout
    
    $fn = 8;							// default for holes
    
    // Extrusion values
    // Use 0 extra shells behind the perimeter
    //     2 solid shells on the top & bottom
    
    ThreadThickness = 0.33;
    ThreadWT = 1.75;
    ThreadWidth = ThreadThickness * ThreadWT;
    
    HoleWindage = ThreadWidth;			// enlarge hole dia by extrusion width
    
    Protrusion = 0.1;					// extend holes beyond surfaces for visibility
    
    // Caliper dimensions
    
    WheelDia = 10.0;					// thumbwheel OD
    WheelRadius = WheelDia/2;
    WheelMargin = 1.0;					// 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 = 5.0;					// toward caliper head
    StubHeight = 6.0;					// perpendicular to caliper head
    StubClearance = 0.5;				// distance to caliper frame
    
    FrameLength = 50;					// for display only
    FrameHeight = 16.0;
    FrameThick = 3.0;
    
    // Repart part dimensions
    
    ForkLength = StubLength - StubClearance;	// toward caliper head around stub
    ForkHeight = StubHeight;			// perpendicular to caliper head
    ForkGap = 0.2;						// clearance to stub on all sides
    ForkBladeThick = 2.0;				// on each side of stub
    
    ShaftClearance = 0.0;				// Additional clearance around shaft
    ShaftOffset = 8.5;					// Shaft center to stub
    
    BoltHoleDia = 1.8;					// 1-72 machine screw, more or less
    BoltHoleRadius = BoltHoleDia/2;
    
    // 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,-(StubClearance + 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,h=(ShaftLength + 2*Protrusion),center=true);
    	translate([0,0,(WheelRadius - Protrusion)/2])
    	  cube([ShaftDia,(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([-(ShaftOffset + ForkLength/2),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();
    }