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

  • RCA Alarm Clock Dimming

    Mary prefers dim digits on the bedroom alarm clock, far below what the usual DIM switch setting provides. I’d slipped a two-stop neutral density filter in front of our old clock’s VFD tube, but the new one has nice green LED digits that ought to have a tweakable current-setting resistor behind the switch. Indeed, a bit of surgery revealed the switch & resistors:

    RCA clock - DIM switch and resistors
    RCA clock – DIM switch and resistors

    It turns out that the 220 Ω resistors set the DIM current, with the 100 Ω resistors in parallel to set the BRIGHT current. Weirdly, the display operates in two halves: one resistor for the lower and middle segments, the other for the top segments. The resistor numbers give a hint of what the schematic might look like:

    RCA clock - LED current-set resistors
    RCA clock – LED current-set resistors

    The current control isn’t all that good, because the brightness varies with the number of active segments. With 470 Ω resistors (yes, from that assortment) in place, the variation became much more obvious; the LEDs are operating far down on their exponential I-vs-V curve. We defined the result to be Good Enough for the purpose.

    Four short screws hold the circuit board in place, but one of them arrived loosely held in a pre-stripped hole. I cut eight lengths of black Skirt filament, anointed them with solvent adhesive, dropped two apiece into each screw hole, and ran the screws back in place. I likely won’t be back in there, so it should be a lifetime fix:

    RCA clock - ABS filament in screw hole
    RCA clock – ABS filament in screw hole

    Done!

    As with all the trade names you remember from back in the Old Days, the present incarnation of “RCA” has nothing whatosever to do with the original Radio Corporation of America:

    RCA clock - data plate
    RCA clock – data plate
  • Mindless Entertainment

    Sometimes I need a task that doesn’t require a lot of thinking, like reducing the entropy of a bag of mixed SMD resistors…

    Sorting SMD Resistors
    Sorting SMD Resistors

    I’ve heard tell of  a TV-thing that serves the same purpose. Dunno when you’d have time to sort your resistors, though.

    Resistors being marked, I didn’t need those SMD tweezers.

    (Yes, this makes no sense. It’s mindless. Sometimes, ya just gotta do this stuff. OK?)

  • SMD Measurement Tweezers

    While fiddling around with those SMD capacitors, it occurred to me that I really needed some SMD tweezers: small forceps with isolated jaws, connected to the capacitance meter’s terminals. In the nature of a proof-of-concept, I sacrificed a (surplus) Tektronix banana plug cable and an old plain-steel tweezer (stamped Made in Japan back in the day when that had the same quality connotations as does Made in Pakistan right about now) and lashed them together:

    SMD tweezers - overview
    SMD tweezers – overview

    I chopped off the tweezer joint with a bolt cutter, scuffed up the steel with a file, soldered the cable wires, cut a small wood block to fit, and epoxied the whole mess together:

    SMD tweezers - epoxy joint
    SMD tweezers – epoxy joint

    When the epoxy cured, a generous wrap of silicone tape hid most of the hackage. Two lengths of clear heatstink tubing insulate the handles from my sweaty fingers:

    SMD tweezers - joint detail
    SMD tweezers – joint detail

    Part of the reason for picking this victim was its cheap-and-bendy steel: more easily soldered than stainless, no regrets about filing the jaws to suit. They’re flattened on the bottom and filed to grip SMD chips along their length:

    SMD tweezers - tip shape
    SMD tweezers – tip shape

    That’s on the top panel of my indispensable AADE LC meter. The stray capacitance of that cable is around 50 pF, but the meter can null it to a fraction of a pF. At least as long as I don’t change my grip, that is, which isn’t too severe a restriction. [Update: got the link right this time.]

    That gorgeous Tek cable turned out to be entirely too stiff and the natural curve doesn’t lie in the correct direction. The next version will probably use a length of RG-174 mini coax and a dual banana plug. I think I’d like angled jaws, too, so as to attack the chips from the top down.

    But even this version works wonderfully well, as I sorted out a few hundred random SMD caps in two half-hour sessions that I’d been putting off for far too long. This is the last batch; I’ve learned the hard way that it pays to transfer batches of chips to their storage bins long before I think I should:

    Sorting SMD caps
    Sorting SMD caps

    Yeah, it’s false economy, but it keeps me off the streets at night. OK?

  • Canon SX230HS Close-up Adapter: Up-amped LED Ring

    Paralleling a 510 Ω resistor with each of the 180 Ω resistors on the LED ring light around the macro lens holder boosted the LED string current from 15 to 20 mA:

    LED ring light - paralleled resistors
    LED ring light – paralleled resistors

    The complete botch job in the lower right is what you get when you don’t wipe the soldering iron tip first.

    LED brightness being pretty nearly linearly proportional to current, the exposure gets another 0.4 EV that probably doesn’t matter in the least.

    A hand-held picture of the pile of SMD resistors (which willingly produced four of the five resistors and required enhanced interrogation to extract the last one):

    SX230HS - macro lens - 15 x 20 mA ring light
    SX230HS – macro lens – 15 x 20 mA ring light

    That’s pretty much overhead at f/8, so the depth of field is as good as it gets.

  • Harbor Freight Digital Thickness Gauge: Lubrication Thereof

    Picked up a Harbor Freight thickness gauge to measure Thing-O-Matic filaments and suchlike; it has a plastic piston and anvil, so it’s not well-suited to measure anything other than plastic parts. In fact, it’s all plastic and the various sliding surfaces produced a remarkable amount of friction.

    Fortunately, the back cover pops off without too much of a struggle:

    Harbor Freight Digital Thickness Gauge - cover removed
    Harbor Freight Digital Thickness Gauge – cover removed

    Dabs of silicone lube at all the contact points considerably improved its disposition.

    The display offers 0.01 mm resolution, but I don’t believe that rightmost digit for an instant. The stated accuracy is ±0.1 mm, which is probably closer to the truth, and it agrees reasonably well with my considerably better quality digital caliper.

  • Thing-O-Matic: Large Hole Calibration

    Flushed with success on the small-hole front, I conjured up a large hole testpiece using the same HoleAdjust function that proved unnecessary with the little ones:

    Circle Calibration - solid model
    Circle Calibration – solid model

    The first version didn’t have the cross bars, which turned out to be a mistake, because the individual rings distorted even under minimal pressure from the calipers:

    Large circle cal - unlinked rings
    Large circle cal – unlinked rings

    However, measuring as delicately as I could, the holes seemed a scant 0.20 mm too small, more or less, kinda-sorta:

    Nominal Nom+0.0
    10 9.83
    20 19.75
    30 29.85
    40 39.84
    50 49.84
    60 59.72
    70 64.76
    80 79.28
    90 89.77

    So I fed in HoleFinagle = 0.20 and the second iteration looks like it’d make a great, albeit leaky, coaster:

    Large Circle Calibration object - HoleFinagle 0.20
    Large Circle Calibration object – HoleFinagle 0.20

    Measuring those holes across the center with the calipers on facets (rather than vertices), produced somewhat more stable results:

    Nominal Nom+0.20
    10 10.08
    20 20.17
    30 30.08
    40 40.08
    50 50.00
    60 60.02
    70 70.05
    80 79.98
    90 90.07

    Frankly, I don’t believe those two least-significant digits, either, because a different set of measurements across different facets looked like this:

    Nominal Nom+0.20
    10 10.13
    20 20.11
    30 29.84
    40 39.90
    50 49.88
    60 59.90
    70 69.84
    80 79.82
    90 89.66

    I also printed a testpiece with HoleFinagle = 0.25 that averaged, by in-the-head computation, about 0.05 larger than that, so the hole diameter compensation does exactly what it should.

    Applying the calipers to the 10.0 mm hole in the small-hole testpiece gives about the same result as in this one. The fact that HoleFinagle is different poses a bit of a mystery…

    The only thing I can conclude is that the measurement variation and the printing variation match up pretty closely: the actual diameter depends more on where it’s measured than anything else. The holes are pretty nearly the intended size and, should the exact size matter, you (well, I) must print at least one to throw away.

    All in all, a tenth of a millimeter is Good Enough. Selah.

    Oh. The ODs are marginally too small, even using PolyCyl.

    The OpenSCAD source, with both adjustments set to neutral:

    // Large circle diameter calibration
    // Ed Nisley KE4ZNU - Nov 2011
    
    //-------
    //- Extrusion parameters must match reality!
    //  Print with +1 shells, 3 solid layers, 0.2 infill
    
    ThreadThick = 0.33;
    ThreadWidth = 2.0 * ThreadThick;
    
    HoleFinagle = 0.00;
    HoleFudge = 1.00;
    
    function HoleAdjust(Diameter) = HoleFudge*Diameter + HoleFinagle;
    
    Protrusion = 0.1;			// make holes end cleanly
    
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    
    //-------
    // Dimensions
    
    Width = 2.5;
    Thickness = IntegerMultiple(2.0,ThreadThick);
    
    DiaStep = 10.0;
    
    NumCircles = 9;
    
    echo(str("Width: ",Width));
    echo(str("Thickness: ",Thickness));
    
    BarLength = (NumCircles + 1)*DiaStep;
    
    //-------
    
    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=HoleAdjust(FixDia)/2,h=Height,$fn=Sides);
    }
    
    module ShowPegGrid(Space = 10.0,Size = 1.0) {
    
      Range = floor(50 / Space);
    
    	for (x=[-Range:Range])
    	  for (y=[-Range:Range])
    		translate([x*Space,y*Space,Size/2])
    		  %cube(Size,center=true);
    
    }
    
    //------
    
    module Ring(RingID,Width,Thick) {
    
      difference() {
    	PolyCyl((RingID + 2*Width),Thick);
    	translate([0,0,-Protrusion])
    	  PolyCyl(RingID,(Thick + 2*Protrusion));
      }
    }
    
    //------
    
    ShowPegGrid();
    
    union () {
      for (Index = [1:NumCircles])
    	Ring(Index*DiaStep,Width,Thickness);
      for (Index = [-1,1])
    	rotate(Index*45)
    	  translate([-BarLength/2,-Width/2,0])
    		cube([BarLength,Width,Thickness]);
    }
    
  • Thing-O-Matic: Small Hole Calibration

    The macro lens & microscope adapters for the Canon SX230HX camera required a bunch of large and fairly precise circles. The first-pass prints of the main tube and snouts came out with diameters about 2% too small, so I changed the hole diameter compensation to include a first-order Fudge Factor as well as the simple zero-order HoleWindage Finagle Constant I’d been using. In the process, I cooked up a simple OpenSCAD function with new coefficient names reflecting their order:

    HoleFinagle = 0.20;
    HoleFudge = 1.02;
    function HoleAdjust(Diameter) = HoleFudge*Diameter + HoleFinagle;
    

    That solved the immediate issue, but I wondered whether I was working on the right problem.

    In the past, nophead’s polyholes testpiece showed the need for the 0.2 mm HoleWindage adder to make small holes turn out correctly. I rewrote his code to:

    • Use my HoleAdjust function
    • Lay the two rows out nose-to-tail
    • Add a bit more clearance between the holes

    Which came out like this:

    Small Hole Calibration - solid model
    Small Hole Calibration – solid model

    To find out where I’m starting from, I printed it (0.33 mm x 0.66 mm, 30 mm/s, 200 °C / 110 °C) with both correction factors set to “no change” and got a nice-looking plate that didn’t require any cleanup at all:

    Small Hole Calibration object - HoleFinagle 0.00
    Small Hole Calibration object – HoleFinagle 0.00

    Note that the similar-looking holes in the two rows aren’t the same size: the row with the tiny triangle has *.0 mm holes, the tiny square marks the *.5 mm holes.

    The Skirt thread thickness was 0.31 to 0.38 mm, so this object’s size should be about as good as it gets.

    The point of the game is to circumscribe polygonal holes around a cylinder of a given diameter. I don’t have a set of metric drills (or drill rods), so I bracketed the holes with the nearest sizes of hard-inch number and letter drills:

    Nominal Free fit Snug fit
    1.00 0.98 1.04
    2.00 2.05 2.18
    3.00 2.93 3.03
    4.00 3.99 4.04
    5.00 5.06 5.13
    6.00 6.21 6.23 no-go
    7.00 6.98 7.12
    8.00 7.50 8.19
    9.00 8.77 9.05
    10.00 9.92 10.19 tight

    The “snug fit” column means the holes are definitely smaller than that measurement, so the maximum hole size comes out just about spot on; an error of 0.1 mm or so seems too small to quibble over.

    So, for whatever reason, my previous Finagle Constant of 0.20 seems no longer necessary and, for sure, the Fudge Factor doesn’t bring anything to the table at this scale.

    It’s definitely true that the height of the first layer affects the hole size for the next few layers, even with the Z-minimum switch measuring the build plate height. The Skirt threads generally measure within ±0.05 mm of the nominal 0.33 mm and I think much of that variation comes from residual snot on the nozzle when it touches the switch. I have no idea what the firmware’s resolution might be.

    Given that I’ve been adding 0.2 mm to small-hole diameters all along, I suspect all these errors are now of the same general size:

    • Print-to-print variation (layer thickness, ABS variations)
    • Hole tolerance (size vs plastic vs speed)
    • Measurement error (digital caliper vs drills vs objects)

    All in all, it’s pretty good.

    The OpenSCAD source code, with the hole adjustment factors set to neutral:

    // Small circle diameter calibration
    // Adapted from Nophead's polyholes testpiece
    // Ed Nisley - KE4ZNU - Nov 2011
    
    //-------
    //- Extrusion parameters must match reality!
    //  Print with +1 shells, 3 solid layers, 0.2 infill
    
    ThreadThick = 0.33;
    ThreadWidth = 2.0 * ThreadThick;
    
    HoleFinagle = 0.00;
    HoleFudge = 1.00;
    
    function HoleAdjust(Diameter) = HoleFudge*Diameter + HoleFinagle;
    
    Protrusion = 0.1;			// make holes end cleanly
    
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    
    //-------
    // Dimensions
    
    DiaStep = 1.0;
    
    NumHoles = 10;
    
    Border = 5*ThreadWidth;
    
    AllHoleLength = DiaStep*(NumHoles*(NumHoles + 1)/2) +	// total hole dia
    				(NumHoles + 1)*Border +					// total border size
    				DiaStep*NumHoles/2;						// radius of largest hole
    
    BlockLength = AllHoleLength + 2*Border;
    BlockWidth = 2*NumHoles*DiaStep + 2*Border;
    BlockThick = IntegerMultiple(1.0,ThreadThick);
    
    //-------
    
    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=HoleAdjust(FixDia)/2,h=Height,$fn=Sides);
    }
    
    module ShowPegGrid(Space = 10.0,Size = 1.0) {
    
      Range = floor(50 / Space);
    
    	for (x=[-Range:Range])
    	  for (y=[-Range:Range])
    		translate([x*Space,y*Space,Size/2])
    		  %cube(Size,center=true);
    
    }
    
    //------
    
    module HoleRow(DiaDelta) {
    
      translate([-AllHoleLength/2,
    			  0,0])
    	for (Index = [1:NumHoles])
    	  translate([(DiaStep*(Index*(Index + 1)/2) + Index*Border),0,-Protrusion])
    		PolyCyl((Index*DiaStep + DiaDelta),(BlockThick + 2*Protrusion));
    }
    
    //------
    
    ShowPegGrid();
    
    rotate(90)
      difference() {
    	translate([-BlockLength/2,-BlockWidth/2,0])
    	  cube([BlockLength,BlockWidth,BlockThick]);
    	for (Index = [0,1])
    	  translate([0,((2*Index - 1)*DiaStep*NumHoles/2),0])
    		rotate(Index*180)
    		  HoleRow(Index*0.5);
      }