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.

Author: Ed

  • Monthly Image: Vertical Caterpillar

    Caterpillar 1680x1050
    Caterpillar 1680×1050

    This critter lived at the Cary Institute for Ecosystems Studies in Millbrook, back in 2006. I have no idea what it grew up to be, but the picture is one of my all-time favorite portrait-mode monitor backgrounds.

    Hand-held with the little Casio EX-Z850 camera (which is now with our Larval Engineer), ruthlessly cropped from a much larger image, and resized to fit the monitor…

  • Improved OXO Can Opener Knob

    We recently replaced a defunct can opener with an OXO opener that removes can lids without creating razor-sharp edges. Unfortunately, the knob doesn’t agree well with Mary’s hand, so I laid out a prototype doorknob-shaped cap (and also removed all the can lids that confronted her):

    OXO Can Opener Knob
    OXO Can Opener Knob

    It prints in four parts: the flat cover and three pillars, with two filament snippets aligning each pillar. The internal openings of this model do not fit the OXO knob’s lobes correctly; a Dremel sanding drum worked wonderfully well to make it fit. The next version should have much smaller pillar bases with a bit more clearance at the top: measurements from the as-adapted pillars will be in order.

    Gluing everything together once again justifies having Too Many Clamps:

    OXO Can Opener - gluing knob cover
    OXO Can Opener – gluing knob cover

    I intended to secure cap to knob with 2-56 screws in those recessed holes and even went so far as to flatten the top of the knob’s lobes in preparation for drilling:

    OXO Can Opener - knob flats
    OXO Can Opener – knob flats

    However, Dragorn of Kismet gave me a few packets of only slightly outdated Sugru (a great idea that’s far too spendy and short-lived for my shop) that solved the problem:

    OXO Can Opener - knob cover with silicone tape
    OXO Can Opener – knob cover with silicone tape

    The silicone tape wrap greatly improves the griptitude.

    Early returns indicate this works reasonably well, but the top should be more rounded and tapered. It goes without saying that black filament would be much less ugly…

    The OpenSCAD source code, with the caveat that the as-printed knob won’t fit without considerable abrasive adjustment:

    // OXO Softworks Can Opener
    //  Enlarged & rounded knob
    // Ed Nisley KE4ZNU December 2012
    
    include </mnt/bulkdata/Project Files/Thing-O-Matic/MCAD/units.scad>
    include </mnt/bulkdata/Project Files/Thing-O-Matic/Useful Sizes.scad>
    
    // Layout options
    
    Layout = "Cap";
                        // Overall layout: Build1 Build2
                        // Parts: Cap Knob
    
    //- Extrusion parameters must match reality!
    //  Print with +1 shells and 3 solid layers
    
    ThreadThick = 0.25;
    ThreadWidth = 2.0 * ThreadThick;
    
    HoleWindage = 0.2;
    
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    
    Protrusion = 0.1;           // make holes end cleanly
    
    //----------------------
    // Dimensions
    
    TriLobeRad = 37.5;					// radius: center to end of lobe
    TriLobeOD = 2*TriLobeRad;
    TriLobePeakRad = 23.0;				// radius: center to peak height
    TriLobeHeight = 22.5;
    
    WingArcRad2 = 48;					// Arc between knob lobes, top
    WingArcRad1 = WingArcRad2 - 5;		//
    WingArcOffset = 14.0;				// Knob center to arc2 radius
    
    KnobOD1 = 70;						// maximum dia without chamfer
    KnobOD2 = 65;						// top dia
    
    KnobSides = 3*4;					// maintain 3-side symmetry
    
    DomeHeight = 8;						// dome shape above lobes
    
    KnobHeight = DomeHeight + TriLobeHeight;
    
    DomeOD = KnobOD2 + (KnobOD1 - KnobOD2)*(DomeHeight/KnobHeight);
    
    DomeArcRad = (pow(KnobHeight,2) + pow(DomeOD,2)/4) / (2*DomeHeight);
    
    ScrewDia = Tap2_56;
    ScrewHeadDia = Head2_56;
    ScrewBase = 0.6*DomeHeight - Head2_56Thick;
    
    AlignPinDia = 3.0;
    AlignPinCircleRad = 0.55*(WingArcOffset + KnobOD2/2);
    AlignPinDepth = 3.0;
    
    //----------------------
    // 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);
    }
    
    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);
    
    }
    
    //-------------------
    // Component parts
    
    module TriKnob() {
    	intersection() {
    		difference(convexity=3) {
    			translate([0,0,-Protrusion])
    				cylinder(r=TriLobeRad,h=(TriLobeHeight + 2*Protrusion));
    			for (i=[-1:1])
    				rotate(i*120)
    					translate([(WingArcOffset + WingArcRad2),0,-TriLobeHeight/2])
    						cylinder(r1=WingArcRad1,r2=WingArcRad2,h=2*TriLobeHeight);
    		}
    		translate([0,0,TriLobeHeight/2])
    		cube([2*KnobOD1,2*KnobOD2,TriLobeHeight],center=true);
    	}
    }
    
    module KnobCap() {
    	difference() {
    		intersection() {
    			translate([0,0,(KnobHeight-DomeArcRad)])
    				rotate(180/KnobSides)
    					sphere(r=DomeArcRad,$fa=180/KnobSides);
    			difference(convexity=4) {
    				rotate(180/KnobSides)
    					cylinder(r1=KnobOD1/2,r2=KnobOD2/2,h=KnobHeight,$fn=KnobSides);
    				TriKnob();
    			}
    			rotate(180/KnobSides)
    				cylinder(r1=KnobOD2/2,r2=KnobOD1/2,h=KnobHeight,$fn=KnobSides);
    		}
    		for (i=[-1:1])
    			rotate(i*120) {
    				translate([-TriLobePeakRad,0,0]) {
    					PolyCyl(ScrewDia,KnobHeight);
    					translate([0,0,TriLobeHeight + ScrewBase])
    						PolyCyl(ScrewHeadDia,KnobHeight);
    				}
    			}
    		for (i=[-1:1]) for (j=[-1,1])
    			rotate(i*120 + j*(270/KnobSides))
    				translate([AlignPinCircleRad,0,(TriLobeHeight - AlignPinDepth - Protrusion)])
    					PolyCyl(AlignPinDia,2*(AlignPinDepth + Protrusion));
    	}
    }
    
    //----------------------
    // Build it!
    
    ShowPegGrid();
    
    if (Layout == "Cap")
    	difference() {
    		KnobCap();
    		cylinder(r=KnobOD1,h=Protrusion/2,center=true);
    	}
    
    if (Layout == "Knob")
    	TriKnob();
    
    if (Layout == "Build1")
    	translate([0,0,-TriLobeHeight])
    		difference() {
    			KnobCap();
    			translate([0,0,(TriLobeHeight - Protrusion)/2])
    				cube([2*KnobOD1,2*KnobOD2,TriLobeHeight+Protrusion],center=true);
    		}
    
    if (Layout == "Build2")
    	translate([0,0,TriLobeHeight])
    		rotate([180,0,0])
    			difference() {
    				KnobCap();
    				translate([0,0,(TriLobeHeight + TriLobeHeight/2)])
    					cube([2*KnobOD1,2*KnobOD2,TriLobeHeight],center=true);
    			}
    
  • Logic Probe Tip Covers

    Our Larval Engineer received a logic probe / pulser set for Christmas:

    RSR Logic Probe Pulser Set - with formed covers
    RSR Logic Probe Pulser Set – with formed covers

    They’re the low-cost RSR-611 and -620 from the usual eBay vendor, not my ancient HP10525/10526 set, but they should suffice. Perhaps nobody uses logic probes these days, what with most of the parts being too small for even a needle tip, but …

    Anyhow, they didn’t have caps over the sharp probe tips, so I rummaged around until I found the stash of cigar tubes (some of which went into that air flow straightener) that were about the right size. I thought about 3D printing an adapter between tubes and probes:

    RSR Probe Cap Adapter - solid model
    RSR Probe Cap Adapter – solid model

    It’s actually a subtractive kind of thing, with a model of the probe tip subtracted from a suitable cylindrical object:

    RSR Logic Probe - solid model
    RSR Logic Probe – solid model

    But then I realized the tubes were thermoplastic, held each one over a stove burner until the open end went transparent and droopy, rammed it down over the probe tip, and trimmed off the ragged edge. Worked fine, fits securely, and even looks pretty good:

    RSR Covers - detail
    RSR Covers – detail

    I’ll never print the adapters, but maybe one of us will tweak the model to do something else…

    The OpenSCAD source code:

    // RSR Logic Probe / Pulser Cap
    // Ed Nisley KE4ZNU December 2012
    
    // Adapts cigar tube to probe body
    
    // Layout options
    
    Layout = "Build";
                        // Overall layout: Show Build
    			// Parts: Probe
    
    //- Extrusion parameters must match reality!
    //  Print with +1 shells and 3 solid layers
    
    ThreadThick = 0.25;
    ThreadWidth = 2.0 * ThreadThick;
    
    HoleWindage = 0.2;
    
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    
    Protrusion = 0.1;           // make holes end cleanly
    
    //----------------------
    // Dimensions
    
    ProbeDia = 18.0;				// dia of main body
    ProbeTipDia = 6.8;				// dia at end of plastic cone
    ProbeTipLen = 30.0;				// length of metal ferrule + tip
    ProbeConeLen = 17.5;			// cone taper length
    
    TubeOD = 17.25;
    TubeWall = 0.50;
    TubeID = TubeOD - 2*TubeWall;
    
    TubeLen = 15;					// slip fit over tube body
    
    BodyLen = 20;					// slip fit over probe body
    
    WallThick = 3.5*ThreadWidth;		// basic adapter wall thickness
    
    AdapterLen = TubeLen + BodyLen;
    AdapterOD = ProbeDia + 2*WallThick;
    AdapterSides = 4*4;
    
    //----------------------
    // 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);
    }
    
    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 Probe() {
    	union() {
    		cylinder(r=((ProbeDia + HoleWindage)/2),
    				 h=(BodyLen + 1.2*Protrusion),$fn=2*AdapterSides);
    		translate([0,0,(BodyLen + Protrusion)])
    			cylinder(r1=(ProbeDia + HoleWindage)/2,
    					 r2=ProbeTipDia/2,
    					 h=ProbeConeLen,$fn=2*AdapterSides);
    		cylinder(r=ProbeTipDia/2,h=(BodyLen + ProbeConeLen + ProbeTipLen),$fn=2*AdapterSides);
    	}
    }
    
    module ProbeSleeve() {
    
    	difference() {
    		cylinder(r=AdapterOD/2,h=AdapterLen);
    		translate([0,0,-Protrusion])
    			Probe();
    		PolyCyl((TubeOD + HoleWindage),(AdapterLen + Protrusion),2*AdapterSides);
    	}
    }
    
    //----------------------
    // Build it!
    
    ShowPegGrid();
    
    if (Layout == "Show")
        ProbeSleeve();
    
    if (Layout == "Build")
        translate([0,0,AdapterLen])
    		rotate([180,0,0])
    			ProbeSleeve();
    
    if (Layout == "Probe")
    	Probe();
    
  • Cheap LED Flashlight Switch Disassembly

    The pushbutton switch on the end cap of a cheap LED flashlight became intermittent, for reasons that should be obvious:

    LED Flashlight switch - intact
    LED Flashlight switch – intact

    Pulling the spring contact out revealed the usual situation inside:

    LED Flashlight switch - spring removed
    LED Flashlight switch – spring removed

    I thought that the discolorations around the central plug indicated a solder joint between the two, but the scratches showed that the plug was actually a press-fit plastic cylinder. Having nothing to lose, I pried the rubber dome off the outside of the switch, balanced the cap’s outer rim on the bench vise, centered an aluminum cylinder over the switch post, and gave it a hammer shot:

    LED Flashlight switch - guts
    LED Flashlight switch – guts

    It appears the Basement Warehouse Wing inventory lacks a push-on switch that fits the cap, so this one goes on the pile of potentially useful parts. If a suitable switch appears, I know what to do with it, but if I should need a nice aluminum cylinder that fits a trio of AA cells before then, well …

  • Tektronix 2215A Oscilloscope Power Switch Rebuild

    My trusty Tek 2215A oscilloscope might be useful for a Larval Engineer engaged in late-night debugging away from the lab, but the power switch has become flaky: sometimes the ‘scope didn’t turn on at all, sometimes the switch required multiple pokes, sometimes everything worked fine. Removing the cover revealed there’s a long plastic bar connecting the power button on the front panel (to the right in the picture) to the power switch near the rear panel AC line socket, tucked under the EMI filter with the red sticker:

    Tek2215A - internal top view
    Tek2215A – internal top view

    Removing the high voltage shield below the PCB reveals the switch has DPDT terminals, but it’s wired as DPST:

    Tek2215A power switch - PCB terminals
    Tek2215A power switch – PCB terminals

    This knowledge will come in handy later…

    Unsoldering the switch and wriggling the bar out of the front panel puts the switch on the bench, solder terminals upward. A plastic shell snapped around the actual switch insulates the top of the six terminals from prying fingers:

    Tek2215A power switch - bottom
    Tek2215A power switch – bottom

    Remove the shell, remove the toggle-action U-shaped steel pin, release the spring, and pull off the top plate:

    Tek2215A power switch - internal
    Tek2215A power switch – internal

    Remove the plunger hardware, remove the rocker arms and their springs:

    Tek2215A power switch - disassembled
    Tek2215A power switch – disassembled

    One contact on each rocker shows signs of distress, but the other button remains pristine (having never seen any voltage differential):

    Tek2215A power switch - rockers
    Tek2215A power switch – rockers

    Pull out the fixed contact tabs and note that they’ve been scorched a bit. The one on the right corresponds to the bottom rocker above:

    Tek2215A power switch - contact tabs
    Tek2215A power switch – contact tabs

    I cleaned everything with a fiber wipe wetted in DeoxIT, then decided that I’d take the easy way out. The tabs have heavy silver plate on both sides, so I flipped them over and reinstalled them with the unused side facing the rockers. The rockers went back in with their unused contact buttons facing the flipped tabs, so we now have fresh, shiny new contact surfaces. Reassemble the switch, soldered it in place, button up the case, and a firm push on the button lights the ‘scope exactly the way it should.

    While I had the cover off, I measured the ESR of all those electrolytic capacitors: they’re in fine shape!

    The next time the switch needs repair, in another couple of decades, someone can swap in the completely unused tabs from the other end of the switch, then pick whichever contact buttons look best… [grin]

  • 5 mW Laser Module

    A trio of 5 mW laser modules arrived with a bunch of other surplus gear after an end-of-year sale:

    5 mW Laser Module
    5 mW Laser Module

    It runs on 5 V at 20 mA, determined by the 91 Ω SMD resistor soldered across the terminals at the back of the PCB. That suggests the laser diode itself runs at about 3.2 V: 5 V – 0.020 A * 91 Ω.

    The brass case connects to the red (positive) wire, so you must insulate the laser module from the usual grounded metal chassis.

    Two of the three lasers arrived badly defocused, but a twist of the brass barrel broke the sealing glue and a bit more twiddling found the sweet spot.

    Running one of these from an Arduino would be just like the UV LED: redefine a bit in the shift register bitfield and drive the laser with a MOSFET switch.

    I’d be tempted to bypass the SMD resistor and run it from an LM317-style current regulator hitched directly to the raw battery; I’m pretty sure I have some LM317 regulators in TO-92 packages. The sense resistor would be 62.5 Ω = 1.25 V / 0.02 A, dissipating 25 mW = 1.25 V * 20 mA. From a freshly charged 7.2 V Li-ion battery at 8.5 V, the regulator would dissipate something like 80 mW =(8.5 – 1.25 – 3.2 V) * 20 mA.

    Or just add more series resistance and ignore the brightness variation?

  • Traffic Signals: Green LED Failures

    Traffic Signal - dead green LEDs - 2012
    Traffic Signal – dead green LEDs – 2012

    In our (admittedly limited) travels around New York State during the last half decade or so, I’ve seen many (as in, dozens of) traffic signals with this failure:

    Apparently the topmost LED string burns out first, leaving the other two (?) strings intact. The earliest picture I have dates back to 2008, so this is a problem of long standing that’s probably wiped out any projected maintenance cost reduction for the entire purchase. The most recent failure I spotted, a few weeks after taking this picture, has a flickering upper string that means it’s not long for this world.

    Somewhere up around Albany, I recently saw a green signal with only that string lit up and the other two (?) strings dead, but that’s the sole exception to the pattern.

    Of late, NYS DOT has been installing a different green lamp with the LEDs in each string scattered over the entire surface and no diffuser. That means a failed string, of which I’ve already seen several examples in the area, darkens a few spots without being particularly obvious; a less common failure has a few flickering “pixels” that will eventually go dark. While that’s a net win, I wonder why only green lamps have this problem: we very rarely see red or amber lamps with any failed LEDs.

    One red LED lamp down the road did fail spectacularly: the whole thing flashed, slowly and somewhat irregularly. Not a flicker, but a flash: long off and short on.

    It’s hard to get pictures of failed traffic signals…

    While I suppose I should report them, previous attempts to do so have only led to requests for the ID number of the traffic control box, which generally can’t be seen from the traffic lane. I am not stopping at an intersection, getting out, finding the box (perhaps crossing the intersection to get there), finding the ID number, and taking a picture for later reference; you know what happens to people who take pictures of infrastructure. You’d think the signals could phone home on their own, but they’re likely not connected.