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

  • Victoreen 710-104 Ionization Chamber: Shield Enclosure

    Lining the shield support box with copper foil tape turned out to be surprisingly easy:

    Electrometer amp - shield - end view
    Electrometer amp – shield – end view

    The flat surface is two overlapping strips of 2 inch wide copper tape. I traced the exterior of the support box on the tape, cut neatly along the lines, slit the corners, bent the edges upward, peeled off the backing paper, stuck the tape into the box, pressed the edges into the corners, and didn’t cut myself once.

    Applying 1 inch wide tape to the wall went just as smoothly, after I realized that I should cut it into strips just slightly longer than the hexagon’s sides.

    The tape along the rim is adhesive copper mesh that’s springy enough to make contact all around the edge. I cut the 1 inch wide tape in half, which was just barely wide enough to reach::

    Electrometer amp - shield - mesh soldering
    Electrometer amp – shield – mesh soldering

    Although you’re supposed to join the entire length of each seam for best RF-proofing, I tacked the corners and the middle of the long edge, then hoped for the best. The copper mesh seems to be plated on plastic threads that requires a fast hand to solder without melting, but I’m getting better at it. The adhesive is said to be conductive, but I loves me some good solder blob action.

    The resistance from the flat bottom to the side panels and the fabric on the edge started out at a few ohms before soldering and dropped to 0.0 Ω after soldering, so I’ll call it a success. Didn’t even melt the outside of the PETG box, but I admit I didn’t take it apart to see what the copper-to-PETG surface looks like.

    Covering the foil on the sides with 1 inch Kapton tape completed the decoration. I didn’t bother to cover the flat surface, because none of the circuitry should reach that far, and didn’t worry about covering the fabric tape for similar reasons. As madbodger pointed out, this violates the no-plastic-on-the-inside rule, but I’m still hoping for better results than having the entire plastic structure with all its charges on the inside.

    A strip of horribly clashing orange plastic tape (which might be splicing tape for reel-to-reel recording tape) covers the outside edges of the fabric, prevents fraying, and gives the black electrical tape that holds the box down a solid grip:

    Electrometer amp - shield - exterior
    Electrometer amp – shield – exterior

    Yeah, like you’d notice mismatched colors around here.

    Using black tape as an anchor seemed easier and better than messing with nesting pins & sockets. The copper fabric tape makes good contact with the rim of the PCB all the way around the perimeter and the black tape holds it firmly in place.

    Early reports suggest the shield works pretty well…

  • Monthly Image: Sunset Over Lake Erie

    We spent a pleasant evening hour walking & sitting on the town beach in North East PA on our way back from Detroit:

    Sunset over Lake Erie - North East PA
    Sunset over Lake Erie – North East PA

    The entire area smells strongly of the grapes that grow well in the hilly terrain south of Lake Erie. A local expert said that Welch’s (a major local employer) moved its CHQ to Concord MA to put a better hometown name on the company’s letterhead; being based in North East evidently didn’t have the same ring.

  • Action Cameras: Night Performance

    The Sony HDR-AS30V camera takes surprisingly good pictures in low light conditions, at least if you’re not too fussy about details like license plates…

    At dusk, on our way to the City of Poughkeepsie’s Independence Day fireworks show:

    Night Ride 2015-07-04 - AS30V - 0
    Night Ride 2015-07-04 – AS30V – 0

    Returning in full dark:

    Night Ride 2015-07-04 - AS30V - 1
    Night Ride 2015-07-04 – AS30V – 1

    A light fog set in as we got out of the city:

    Night Ride 2015-07-04 - AS30V - 2
    Night Ride 2015-07-04 – AS30V – 2

    The Cycliq Fly6 faces a major challenge from in-its-face headlights, even with some background streetlighting:

    Night Ride 2015-07-04 - Fly6 - 1
    Night Ride 2015-07-04 – Fly6 – 1

    In full dark, it’s enough for mood-setting:

    Night Ride 2015-07-04 - Fly6 - 2
    Night Ride 2015-07-04 – Fly6 – 2

    That ride marks the annual exception to our general Don’t Bike After Dark rule. We set our blinky taillights to the legally required steady mode, although I think a low-power blink mode would be more conspicuous. Perhaps an occulting light (constant bright with dim pulses) would be better, but I’m not sure that’s legal.

    Yeah, checkitout: I’d be occulting in the dark on my ‘bent! Them Wiccans ain’t got nothing on me…

    We have reflective tires, tape along the inside of the wheels, retroreflective packs, brilliant LED taillights, mediocre LED headlights (admittedly behind scuffed fairings), and look like UFOs in the dark.

    A roadie on a fancy bike, riding dark without lights and reflectors, passed us. Watching him dodge a car that entered an intersection without seeing him once again demonstrated that cyclists are, in general, their own worst enemy.

  • Victoreen 710-104 Ionization Chamber: Shield Support

    Although I’d thought of a Mu-metal shield, copper foil tape should be easier and safer to shape into a simple shield. The general idea is to line the interior with copper tape, solder the joints together, cover with Kapton tape to reduce the likelihood of shorts, then stick it in place with some connector pin-and-socket combinations. Putting the tape on the outside would be much easier, but that would surround the circuitry with a layer of plastic that probably carries enough charge to throw things off.

    Anyhow, the hexagonal circuit board model now sports a hexagonal cap to support the shield:

    Victoreen 710-104 Ionization Chamber Fittings - Show with shield
    Victoreen 710-104 Ionization Chamber Fittings – Show with shield

    The ad-hoc openings fit various switches, wires, & twiddlepots:

    Victoreen 710-104 Ionization Chamber Fittings - Shield
    Victoreen 710-104 Ionization Chamber Fittings – Shield

    Ya gotta start somewhere.

    The OpenSCAD source code:

    // Victoreen 710-104 Ionization Chamber Fittings
    // Ed Nisley KE4ZNU July 2015
    
    Layout = "Show";
    					// Show - assembled parts
    					// Build - print can parts + shield
    					// BuildShield - print just the shield
    					// CanCap - PCB insulator for 6-32 mounting studs
    					// CanBase - surrounding foot for ionization chamber
    					// CanLid - generic surround for either end of chamber
    					// PCB - template for cutting PCB sheet
    					// PCBBase - holder for PCB atop CanCap
    					// Shield - electrostatic shield shell
    
    //- Extrusion parameters must match reality!
    //  Print with 2 shells and 3 solid layers
    
    ThreadThick = 0.25;
    ThreadWidth = 0.40;
    
    HoleWindage = 0.2;
    
    Protrusion = 0.1;			// make holes end cleanly
    
    AlignPinOD = 1.75;			// assembly alignment pins = filament dia
    
    inch = 25.4;
    
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    
    //- Screw sizes
    
    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;
    
    //----------------------
    // Dimensions
    
    OD = 0;											// name the subscripts
    LENGTH = 1;
    
    Chamber = [91.0 + HoleWindage,38];				// Victoreen ionization chamber dimensions
    
    Stud = [										// stud welded to ionization chamber lid
    	[6.5,IntegerMultiple(0.8,ThreadThick)],		// flat head -- generous clearance
    	[4.0,9.5],									// 6-32 screw -- ditto
    ];
    NumStuds = 3;
    StudSides = 6;									// for hole around stud
    
    BCD = 2.75 * inch;								// mounting stud bolt circle diameter
    
    PlateThick = 3.0;								// layer atop and below chamber ends
    RimHeight = 4.0;								// extending up along chamber perimeter
    WallHeight = RimHeight + PlateThick;
    WallThick = 5.0;								// thick enough to be sturdy & printable
    CapSides = 8*6;									// must be multiple of 4 & 3 to make symmetries work out right
    
    PCBFlatsOD = 85.0;								// hex dia across flats + clearance
    PCBClearance = ThreadWidth;						// clearance on each flat
    PCBThick = 1.1;
    PCBActual = [PCBFlatsOD/cos(30),PCBThick];
    PCBCutter = [(PCBFlatsOD + 2*PCBClearance)/cos(30),PCBThick - ThreadThick];		// OD = tip-to-tip dia with clearance
    
    echo(str("Actual PCB across flats: ",PCBFlatsOD));
    echo(str(" ... tip-to-tip dia: ",PCBActual[OD]));
    echo(str(" ... thickness: ",PCBActual[LENGTH]));
    
    HolderHeight = 11.0 + PCBCutter[LENGTH];		// thick enough for PCB to clear studs
    HolderShelf = 2.0;								// shelf under PCB edge
    PinAngle = 15;									// alignment pin angle on either side of holder screw
    
    echo(str("PCB holder across flats: ",PCBCutter[OD]*cos(30)));
    echo(str(" ... height: ",HolderHeight));
    
    ShieldInset = 1.0;								// shield inset from actual PCB flat
    ShieldWall = 2.0;								// wall thickness
    Shield = [(PCBFlatsOD - 2*ShieldInset)/ cos(30),35.0];		// electrostatic shield shell shape
    
    //----------------------
    // 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);
    }
    
    //- Locating pin hole with glue recess
    //  Default length is two pin diameters on each side of the split
    
    module LocatingPin(Dia=AlignPinOD,Len=0.0) {
    
    	PinLen = (Len != 0.0) ? Len : (4*Dia);
    
    	translate([0,0,-ThreadThick])
    		PolyCyl((Dia + 2*ThreadWidth),2*ThreadThick,4);
    
    	translate([0,0,-2*ThreadThick])
    		PolyCyl((Dia + 1*ThreadWidth),4*ThreadThick,4);
    
    	translate([0,0,-Len/2])
    		PolyCyl(Dia,Len,4);
    
    }
    
    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);
    }
    
    //-----
    
    module CanLid() {
    
    	difference() {
    		cylinder(d=Chamber[OD] + 2*WallThick,h=WallHeight,$fn=CapSides);
    		translate([0,0,PlateThick])
    			PolyCyl(Chamber[OD],Chamber[1],CapSides);
    	}
    
    }
    
    module CanCap() {
    
    	difference() {
    		CanLid();
    
    		translate([0,0,-Protrusion])											// central cutout
    			rotate(180/6)
    				cylinder(d=BCD,h=Chamber[LENGTH],$fn=6);						//  ... reasonable size
    
    		for (i=[0:(NumStuds - 1)])												// stud clearance holes
    			rotate(i*360/NumStuds)
    				translate([BCD/2,0,0])
    					rotate(180/StudSides) {
    						translate([0,0,(PlateThick - (Stud[0][LENGTH] + 2*ThreadThick))])
    							PolyCyl(Stud[0][OD],2*Stud[0][LENGTH],StudSides);
    						translate([0,0,-Protrusion])
    							PolyCyl(Stud[1][OD],2*Stud[1][LENGTH],StudSides);
    					}
    
    		for (i=[0:(NumStuds - 1)], j=[-1,1])									// PCB holder alignment pins
    			rotate(i*360/NumStuds + j*PinAngle + 60)
    				translate([Chamber[OD]/2,0,0])
    					rotate(180/4 - j*PinAngle)
    						LocatingPin(Len=2*PlateThick - 2*ThreadThick);
    	}
    
    }
    
    module CanBase() {
    
    	difference() {
    		CanLid();
    		translate([0,0,-Protrusion])
    			PolyCyl(Chamber[OD] - 2*5.0,Chamber[1],CapSides);
    	}
    }
    
    module PCBTemplate() {
    
    	difference() {
    		cylinder(d=PCBActual[OD],h=max(PCBActual[LENGTH],3.0),$fn=6);		// actual PCB size, overly thick
    		translate([0,0,-Protrusion])
    			cylinder(d=10,h=10*PCBActual[LENGTH],$fn=12);
    	}
    }
    
    module PCBBase() {
    
    	difference() {
    		cylinder(d=Chamber[OD] + 2*WallThick,h=HolderHeight,$fn=CapSides);		// outer rim
    
    		rotate(30) {
    			translate([0,0,-Protrusion])										// central hex
    				cylinder(d=(PCBActual[OD] - HolderShelf/cos(30)),h=2*HolderHeight,$fn=6);
    
    			translate([0,0,HolderHeight - PCBCutter[LENGTH]])					// hex PCB recess
    				cylinder(d=PCBCutter[OD],h=HolderHeight,$fn=6);
    
    			for (i=[0:NumStuds - 1])											// PCB retaining screws
    				rotate(i*120 + 30)
    					translate([(PCBCutter[OD]*cos(30)/2 + Clear4_40/2 + ThreadWidth),0,-Protrusion])
    						rotate(180/6)
    							PolyCyl(Tap4_40,2*HolderHeight,6);
    
    			for (i=[0:(NumStuds - 1)], j=[-1,1])								// PCB holder alignment pins
    				rotate(i*360/NumStuds + j*PinAngle + 30)
    					translate([Chamber[OD]/2,0,0])
    						rotate(180/4 - j*PinAngle)
    							LocatingPin(Len=PlateThick);
    		}
    
    		for (i=[0:NumStuds - 1])												// segment isolation
    			rotate(i*120 - 30)
    				translate([0,0,-Protrusion]) {
    					linear_extrude(height=2*HolderHeight)
    						polygon([[0,0],[Chamber[OD],0],[Chamber[OD]*cos(60),Chamber[OD]*sin(60)]]);
    				}
    	}
    }
    
    //-- Electrostatic shield
    //		the cutouts are completely ad-hoc
    
    module ShieldShell() {
    
    CutHeight = 7.0;
    
    	difference() {
    		cylinder(d=Shield[OD],h=Shield[LENGTH],$fn=6);
    		translate([0,0,-ShieldWall])
    			cylinder(d=(Shield[OD] - 2*ShieldWall/cos(30)),h=Shield[LENGTH],$fn=6);
    
    		translate([Shield[OD]/4 - 20/2,Shield[OD]/2,(CutHeight - Protrusion)/2])
    			rotate(90)
    				cube([Shield[OD],20,CutHeight + Protrusion],center=true);
    
    		translate([-Shield[OD]/4 + 5/2,Shield[OD]/2,(CutHeight - Protrusion)/2])
    			rotate(90)
    				cube([Shield[OD],5,CutHeight + Protrusion],center=true);
    
    		translate([-Shield[OD]/2,0,(CutHeight - Protrusion)/2])
    				cube([Shield[OD],5,CutHeight + Protrusion],center=true);
    
    	}
    
    }
    
    //----------------------
    // Build it
    
    ShowPegGrid();
    
    if (Layout == "CanLid") {
    	CanLid();
    }
    
    if (Layout == "CanCap") {
    	CanCap();
    }
    
    if (Layout == "CanBase") {
    	CanBase();
    }
    
    if (Layout == "PCBBase") {
    	PCBBase();
    }
    
    if (Layout == "PCB") {
    	PCBTemplate();
    }
    
    if (Layout == "Shield") {
    	ShieldShell();
    }
    
    if (Layout == "Show") {
    	CanBase();
    	color("Orange",0.5)
    		translate([0,0,PlateThick + Protrusion])
    			cylinder(d=Chamber[OD],h=Chamber[LENGTH],$fn=CapSides);
    	translate([0,0,(2*PlateThick + Chamber[LENGTH] + 2*Protrusion)])
    		rotate([180,0,0])
    			CanCap();
    	translate([0,0,(2*PlateThick + Chamber[LENGTH] + 5.0)])
    		PCBBase();
    	color("Green",0.5)
    		translate([0,0,(2*PlateThick + Chamber[LENGTH] + 7.0 + HolderHeight)])
    			rotate(30)
    				PCBTemplate();
    	translate([0,0,(2*PlateThick + Chamber[LENGTH] + 15.0 + HolderHeight)])
    		rotate(30)
    			ShieldShell();}
    
    if (Layout == "Build") {
    
    	translate([-0.50*Chamber[OD],-0.60*Chamber[OD],0])
    		CanCap();
    
    	translate([0.55*Chamber[OD],-0.60*Chamber[OD],0])
    		rotate(30)
    			translate([0,0,Shield[LENGTH]])
    				rotate([0,180,0])
    					ShieldShell();
    
    	translate([-0.25*Chamber[OD],0.60*Chamber[OD],0])
    		CanBase();
    	translate([0.25*Chamber[OD],0.60*Chamber[OD],0])
    		PCBBase();
    }
    
    if (Layout == "BuildShield") {
    
    	translate([0,0,Shield[LENGTH]])
    		rotate([0,180,0])
    				ShieldShell();
    
    }
    
  • These Are Not the Book Drops You Are Looking For

    The Vassar Library could be a model for J.K. Rowling’s work:

    Vassar Library - front
    Vassar Library – front

    A closer look at the jarringly contemporary containers along the mid-left edge of that picture:

    Vassar Library - Trash and recycling containers
    Vassar Library – Trash and recycling containers

    Pop quiz: How many books did they find in the trash before they added the placards?

    Bonus: How much did that reduce the burn rate? It’s surely still nonzero, because nobody reads instructions. Right?

    Double bonus: Does the real book drop sport a “This is NOT a trash can” placard?

  • Bird Encounter

    At this instant, neither of us realized the other was present:

    Starling-0145
    Starling-0145

    Despite what it looks like, the blackbird (maybe a starling) passed just beyond arm’s reach directly ahead of the bike at eye level:

    Starling-0167
    Starling-0167

    And away!

    Starling-0173
    Starling-0173

    At 60 frames per second, that’s 466 ms of elapsed time.

    Stepping through the video, frame by frame, the bird’s wings flap at a consistent three frames per stroke = 50 ms/stroke = 20 stroke/s = 1200 stroke/min. A bit of rummaging produces a study suggesting a starling’s normal rate is 10 stroke/s, so the critter had the throttles firewalled at war emergency power.

    It makes my pedal pushing seem downright inconsequential…

  • Sony 64 GB MicroSDXC Card: Speed Failure Redux

    After about 1 TB of data spread over three months and maybe 100 bike rides, the second Sony SR-64UY 64 GB MicroSDXC card I bought last summer has failed… barely two weeks inside the one year warranty.

    As with the first card, this one works fine except for the speed: it cannot record at 1920x1080p @ 60 fps. The only indication comes from aiming another camera at the display to capture the failure as it happens.

    Just before the failure:

    HDR-AS30V - MicroSDXC failure - 1
    HDR-AS30V – MicroSDXC failure – 1

    It’s taking stock of the situation:

    HDR-AS30V - MicroSDXC failure - 2
    HDR-AS30V – MicroSDXC failure – 2

    Presumably, it’s patching up the abruptly terminated file:

    HDR-AS30V - MicroSDXC failure - 3
    HDR-AS30V – MicroSDXC failure – 3

    Another box is on its way to Sony Media Services…

    Over the last year, the price of an almost certainly genuine Sony SR-64UY Class 10 UHS-1 MicroSDXC card has dropped by 2.2 dB: $40 to $24. Now, however, the SR-64UY is the “old model”, so you can pay $30 (-1.3 dB) for an SR-64UY2 rated at 70 MB/s transfer speed (up from 40 MB/s), albeit with no change in the card’s speed class.

    Huh.

    Both cards failed after writing 1 TB of data (give or take maybe 20%) in 4 GB chunks over the course of 100 recording sessions. The cards still work, in the sense that they can store and accurately retrieve data, just not at the Class 4 (not Class 10) speed rating required by the HDR-AS30V at 1920x1080p @ 60 fps.

    The table in the Wikipedia Secure Digital article says Class 4 = 4 MB/s, which is slightly faster than the camera produces 4 GB files in 22:43 min:sec = 3 MB/s. A Class 10 card should write at a sustained 10 MB/s, so the SR-64UY write speed has dropped by at least a factor of 3 from the spec. I’d expect the root problem to be the error correction / block remapping / spare pool handling time has grown as the number of failed blocks eats into the card’s overcapacity, but I have no inside information.

    When the replacements slow down, I’ll see how they work as Raspberry Pi memory…