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

  • Sonicare Essence: Re-taping the Case

    Much to my astonishment, the ordinary adhesive tape holding the Sonicare Essence power toothbrush together lasted for a bit over a year. As the tape splits along the gap in the case, the coil driving the brush head begins vibrating inside its nest, making a truly horrendous racket.

    The new fix looks a bit odd, but works fine:

    Sonicare Essence - red tape
    Sonicare Essence – red tape

    The tape comes from Mad Phil’s stash and is, I think, splicing tape for reel-to-reel 1/4 inch recording tape: it has zero stretch, infinite strength, and adhesive that’s obviously lasted forever. The inside of the spool says “NOPI Made in Germany”, which doesn’t lead anywhere useful, although the NOPI name does seem to appear in a tape context.

    After a year, the replacement NiMH cells are doing fine, still operating about once a day for three weeks from a 24 hour charge.

  • Arduino Suicide Power Switch: First Light

    This may not look like much, but it’s the first test of the p-MOSFET power switch that completely kills power to the Arduino Pro Mini board and the Hall Effect LED Blinky Light:

    Power off - 30 mA load
    Power off – 30 mA load

    The top trace is the base drive to the NPN transistor that holds the p-MOSFET on while the Arduino is running. When it’s time to shut off, the Arduino drops the base drive output, the MOSFET turns off, and the switched battery voltage in the bottom trace drops like a rock. The current is about 30 mA when the Arduino is running and immeasurably low when it’s off; the MOSFET spec says it’s less than 1 μA, which is fine with me.

    I love it when reality matches the simulation.

    That part of the schematic:

    Hall Effect LED Blinky - Battery Switching
    Hall Effect LED Blinky – Battery Switching

    The PCB has those components clustered in the upper left corner, with the Arduino Pro Mini perched on header pins to the right:

    Hall LED PCB - power switch test
    Hall LED PCB – power switch test

    The test code is a crudely hacked version of the canonical Blink sketch that waits 5 s after it starts running, then pulls the plug:

    // Modified from Arduino Blink example
    // Drives external p-MOSFET power switch
    // Ed Nisley - KE4ZNU - Sep 2013
    
    int led = 13;
    
    // HIGH to enable power supply
    int PowerOn = 4;
    
    // HIGH to light Status LED
    int Status = 10;
    
    unsigned long MillisThen;
    
    void setup() {
    
      pinMode(led, OUTPUT);
    
      pinMode(PowerOn,OUTPUT);
      digitalWrite(PowerOn,HIGH);
      pinMode(Status,OUTPUT);
      digitalWrite(Status,HIGH);
    
    MillisThen = millis();
    }
    
    void loop() {
      digitalWrite(led, HIGH);
      delay(100);
      digitalWrite(led, LOW);
      delay(500);
    
      if (((millis() - MillisThen) > 5000ul)) {
          digitalWrite(Status,LOW);
          delay(50);
          digitalWrite(PowerOn,LOW);
          digitalWrite(Status,HIGH);
      }
    }
    

    It turns out that the Arduino runtime has a several-second delay after power comes up before the setup() routine starts running, so brief pulses from a vibration switch won’t last long enough to turn the thing on. That’s not a fatal flaw for now and, in fact, having to hold the power button in for a few seconds isn’t entirely a Bad Thing.

    However, once the power turns on, a vibration switch could trigger an Arduino interrupt pin to reset a power-off timer. I’d be tempted to put the vibration switch in parallel with the button, with a pair of steering diodes that isolate the raw battery from the input pin.

    This is, of course, a pure electronic implementation of a Useless Machine…

  • 3D Printed PCB Stiffening Bracket

    The brassboard PCB for the Hall effect blinky light is too bendy for the SMD parts to survive much debugging, particularly with all the wires hanging off the edges, so I whipped up a stiff mounting bracket that captures the whole thing, with a flange that fits in the work stand arms:

    PCB Test Frame - solid model
    PCB Test Frame – solid model

    I ran some self-tapping 4-40 hex-head screws into the holes while the plastic was still warm on the M2’s platform:

    PCB stiffener with screws on M2 platform
    PCB stiffener with screws on M2 platform

    Six screws seem excessive and I’ll probably wind up using just the middle two, but there’s no harm in having more holes and fittings than you really need.

    The flange fits neatly into the board holder on the Electronics Workbench, above all the construction clutter:

    PCB stiffener in board holder
    PCB stiffener in board holder

    The nice thing about having a 3D printer: when you need an object like this, a couple of hours later you have one!

    The OpenSCAD source code, slightly improved based the results you see above:

    // Test support frame for Hall Effect LED Blinky Light
    // Ed Nisley KE4ZNU - Sept 2013
    
    ClampFlange = true;
    
    //- Extrusion parameters - must match reality!
    
    ThreadThick = 0.25;
    ThreadWidth = 0.40;
    
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    
    Protrusion = 0.1;
    
    HoleWindage = 0.2;
    
    //- Screw sizes
    
    inch = 25.4;
    
    Tap4_40 = 0.089 * inch;
    Clear4_40 = 0.110 * inch;
    Head4_40 = 0.211 * inch;
    Head4_40Thick = 0.065 * inch;
    Nut4_40Dia = 0.228 * inch;
    Nut4_40Thick = 0.086 * inch;
    Washer4_40OD = 0.270 * inch;
    Washer4_40ID = 0.123 * inch;
    
    //- PCB sizes
    
    PCBSize = [46.5,84.0,1.0];
    PCBShelf = 2.0;
    
    Clearance = 4*[ThreadWidth,ThreadWidth,0];
    
    WallThick = IntegerMultiple(4.0,ThreadWidth);
    FrameHeight = 5.0;
    
    ScrewOffset = 0.0 + Clear4_40/2;
    
    OAHeight = FrameHeight + Clearance[2] + PCBSize[2];
    
    FlangeExtension = 3.0;
    FlangeThick = IntegerMultiple(1.5,ThreadThick);
    Flange = PCBSize
    			+ 2*[ScrewOffset,ScrewOffset,0]
    			+ 2*[Washer4_40OD,Washer4_40OD,0]
    			+ [2*FlangeExtension,2*FlangeExtension,(FlangeThick - PCBSize[2])]
    			;
    
    echo("Flange: ",Flange);
    NumSides = 4*5;
    
    //- Adjust hole diameter to make the size come out right
    
    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);
    }
    
    //- Put peg grid on build surface
    
    module ShowPegGrid(Space = 10.0,Size = 1.0) {
    
      RangeX = floor(100 / Space);
      RangeY = floor(125 / Space);
    
    	for (x=[-RangeX:RangeX])
    	  for (y=[-RangeY:RangeY])
    		translate([x*Space,y*Space,Size/2])
    		  %cube(Size,center=true);
    
    }
    
    //- Build it
    
    ShowPegGrid();
    
    difference() {
    	union() {									// body block and screw bosses
    		translate([0,0,OAHeight/2])
    			color("LightBlue")
    			cube(PCBSize + Clearance + [2*WallThick,2*WallThick,FrameHeight],center=true);
    		for (x=[-1,1], y=[-1,0,1]) {
    			translate([x*(PCBSize[0]/2 + ScrewOffset),
    						y*(PCBSize[1]/2 + ScrewOffset),
    						0])
    				color("Orchid") cylinder(r=Washer4_40OD,h=OAHeight,$fn=NumSides);
    		}
    		if (ClampFlange)
    			translate([0,0,Flange[2]/2])
    			color("SeaGreen") cube(Flange,center=true);
    	}
    
    	for (x=[-1,1], y=[-1,0,1]) {				// screw holes and washer recesses
    		translate([x*(PCBSize[0]/2 + ScrewOffset),
    					y*(PCBSize[1]/2 + ScrewOffset),
    					-Protrusion])
    			rotate((x-1)*90)
    			PolyCyl(Tap4_40,(OAHeight + 2*Protrusion));
    		translate([x*(PCBSize[0]/2 + ScrewOffset),
    					y*(PCBSize[1]/2 + ScrewOffset),
    					OAHeight - PCBSize[2]])
    			PolyCyl(1.2*Washer4_40OD,(PCBSize[2] + Protrusion),NumSides);
    	}
    
    	translate([0,0,OAHeight/2])					// through hole below PCB
    		cube(PCBSize - 2*[PCBShelf,PCBShelf,0] + [0,0,2*OAHeight],center=true);
    
    	translate([0,0,(OAHeight - (PCBSize[2] + Clearance[2])/2 + Protrusion/2)])	// PCB pocket on top
    		cube(PCBSize + Clearance + [0,0,Protrusion],center=true);
    }
    
  • Monthly Science: Silica Gel Status Report

    The last of the silica gel from one bulk can went into a mesh bag:

    Silica gel beads in mesh bag
    Silica gel beads in mesh bag

    That kept a batch of fresh-baked crackers crisp during several humid days. It started out at 110 g net = 112 g gross (with bag and ties), rose to 115 g after a day, then to 117 g by the time we were done with the crackers. That’s about 5 g of water = 4.5% by weight, so those charts say the humidity should be under 10 %RH, which agrees with the fading blue dot on the humidity indicator card I dropped in the can.

    When the bag gets up to 130 g = 30 %RH, then it’ll be time for a recharge… or, more likely, a refill from one of the remaining three cans.

  • Homebrew PCB Masking: Sharpie FTW!

    This is the drilled and etched PCB for the brassboard of the Hall effect current control LED Blinky Light:

    Hall Effect Brassboard - bare front
    Hall Effect Brassboard – bare front

    The big rectangle at the top will heatsink the main p-MOSFET power switch, which shouldn’t dissipate much power at all. The two lower rectangles heatsink the n-MOSFETs, although I think they may each require a stand-up metal tab to handle the dissipation during high-duty-cycle blinkiness.

    The silver line around the edge is soldered copper foil tape connecting the top and bottom ground planes; a dozen or so additional Z wires will connect the planes at high current nodes. It’ll get a bunch of flying signal wires, too, because I’m not a fanatic gotta-embed-all-the-wires kind of guy on stuff like this.

    The PCB is 30 mil FR4, which (once again, I make this mistake over and over again) seems a bit bendy for surface-mount parts; I must print a simple nest to stabilize the poor thing. Some of the drilled holes look white, because I hadn’t rinsed out the remains of the silver plating powder; the surfaces are a lot more silvery in person.

    Before I etched the back side, I realized I’d made a classic layout blunder: the high-current return path from the center MOSFET flows around the Hall effect sensor near the center of the board. So I filled in the grid pour with a fat point black Sharpie to get more copper in that area:

    Hall Effect Brassboard - added etch masking
    Hall Effect Brassboard – added etch masking

    I think it probably wouldn’t matter either way, but nothing exceeds like excess. FWIW, I use the grid pattern as a way to verify the end of the board etching: when all the holes in the ground pour come clear, all the traces are done, too.

    The etched backside came out OK, although with a few etched squares sprinkled in the Sharpie masking:

    Hall Effect Brassboard - bare back
    Hall Effect Brassboard – bare back

    The three leads for the Hall effect sensor are just to the right of the center, with the middle lead connected to the ground pour. Given the millivolt-level signals, this isn’t a good place for ground bounce

    It’s etched with ferric chloride, rubbed with a sponge, and took under ten minutes on each side. That’s less than the usual time, which suggests the PCB is plated with half-ounce copper (that’s 0.5 ounce / ft2), rather than the one-ounce copper on the other boards I’ve done recently; just one of the hazards of buying surplus PCB stock. Doesn’t really matter, as the peak currents will be under half an amp and now I know not to use this batch of raw board stock for high current circuits.

    All in all, it looks good enough. Now, for some component soldering.

  • Mouse Nest Location: Bad Decisionmaking

    It’s always a good idea to open the barby lid before firing the burners: sometimes unexpected things appear:

    Mouse nest in grill - foundation
    Mouse nest in grill – foundation

    The mouse being out and about at the time, I dumped the nest (which was just a foundation) over the patio railing into the flower garden, burned out the remainder at full throttle, and continued the mission.

    A week later, the mouse had not only returned, but finished off a substantial nest in the same spot, topped with a jaunty bird feather. The entrance tunnel is on the right, opening into a comfy mouse-sized pocket inside:

    Mouse nest in grill - finished
    Mouse nest in grill – finished

    Once again, I dumped the nest over the railing, burned out the rest, and continued the mission.

    As of three weeks later, the mouse hasn’t returned; I trust it found a hollow log somewhere out back.

    As nearly as I can tell, the mouse climbed up a square steel leg, scampered through the grease catch pan, leaped up through the drain hole, wriggled through three layers of crossed bars, and then deposited a single mouthful of building material.

    I really need a critter camera…

  • Parsley Worm on Dill

    Four of these ferocious Parsley Worms were chowing down on a volunteer dill plant along the garden fence:

    Parsley Worm Caterpillar on Dill
    Parsley Worm Caterpillar on Dill

    Amazingly, they turn into Black Swallowtail butterflies that sometimes visit the Butterfly Bush outside our living room window. Well, maybe not this one, but certainly some of its relatives.

    We don’t hassle them; they have a fearsome threat display that apparently works wonders on their natural predators.