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.

Category: Oddities

Who’d’a thunk it?

  • Stabbing Guides

    Many of my solid models have holes for alignment pins made from filament snippets that let me glue the pieces together with near-perfect registration:

    Alignment Hole and Pin
    Alignment Hole and Pin

    A reader who designs oil-field equipment for a living pointed out that, in his world, they’re called “stabbing guides”:

    Stabbing_Point_on_Leg_1
    Stabbing_Point_on_Leg_1

    He specifies steel plate and welding instructions:

    Stabbing_Guide_Type_3
    Stabbing_Guide_Type_3

    Stabbing guides for large modules may rise 25 feet above the deck plates…

    After they install all the little bits on a “part” like this:

    Generator Module - during assembly
    Generator Module – during assembly

    It fits neatly atop the stabbing guides and gets welded to a somewhat larger structure:

    Generator Module - installed
    Generator Module – installed

    No sissy plastic for him!

    My puny pins don’t qualify as stabbing guides, but forgive me if I sneak the term in every now and then…

    Thanks, Tom!

  • 0D3 Voltage Regulator Tube

    A quartet of ceramic octal tube sockets arrived from halfway around the planet and matched up nicely with the business end of a 0D3 voltage regulator tube from the Hollow State Electronics box:

    0D3 voltage regulator tube in socket
    0D3 voltage regulator tube in socket

    If the 1-48 on the side of the tube base (facing away in the picture) means anything, then General Electric built it in January 1948.

    The pinout view in the datasheet assumes you’re looking at the bottom of the socket, which makes perfect sense given the hand-wired chassis construction techniques of the day:

    0D3 Voltage Regulator Tube - pinout
    0D3 Voltage Regulator Tube – pinout

    So the view is backwards when seen from the top, not that you’d ever need it:

    Ceramic octal tube socket - 0D3 pinout
    Ceramic octal tube socket – 0D3 pinout

    The internal jumper across pins 3-7 allows you to disconnect the downstream circuit when the regulator isn’t in the socket, which is a Very Good Idea with a shunt regulator.

    Not having a 200 V power supply ready to hand, but having recently restocked the 9 V alkaline battery box, this actually worked:

    0D3 voltage regulator test setup
    0D3 voltage regulator test setup

    That’s 16 x 9-ish V = 150 V across the battery terminals, plus a 50 V adjustable bench power supply coming in on clip leads from the upper right, with current shown on a digital panel meter across a 1 Ω sense resistor. The classic 1.5 kΩ carbon resistor emerged from from a coffee can of parts that Came With The House™ and seemed appropriate for the occasion.

    The tube conducts a few milliamps through a small plasma filament discharge at 150 V. The current ramps up to about 10 mA as the supply voltage increases to 180 V, whereupon the tube fires and the current jumps to 30 mA (which is less than the spec, but I ran the power supply in constant-current mode to avoid whoopsies).

    Reducing the current to 10 mA slightly reduces the area involved in the plasma discharge, but the tube still produces a nice display through the mica spacer / insulator atop the plate:

    0D3 voltage regulator - 10 mA current
    0D3 voltage regulator – 10 mA current

    That isn’t quite in focus, but should give you the general idea.

    I didn’t measure the operating voltages across the tube, mostly because I didn’t want more cheap clip leads cluttering the bench.

    It’d make a very low intensity nightlight that dissipates a watt or two. Boosting the current to the absolute maximum 40 mA would brighten it up a bit, but dissipating 6 W in the tube probably won’t do it any good.

    This obviously calls for an Arduino monitoring the tube current with a Hall-effect sensor and regulating it with a hulking MOSFET…

  • Documentation Always Lags the Hardware

    Found at the last rest area in Massachusetts on I-90 westbound:

    Gas Pump Instructions
    Gas Pump Instructions

    I suppose you just poke buttons until something happens…

  • Forester Load Capacity

    You never realize how big automobile tires are, until you see them out of context:

    Forester loaded with Sienna snows
    Forester loaded with Sienna snows

    The Sienna spends its days commuting near what used to be the engineering glory of Rt 128, and snow season is comin’ on strong. We hauled the snows out and the summer tires back on our way to a brief vacation on Cape Cod.

    I have no illusions that the two ratcheting straps on each pair of tires + wheels will hold them in place during an actual crash, but at least they’re not rattling around. The tiedown points next to the hatch have a 20 kg load limit, which is pretty close to the weight of a single tire + wheel. The rear seat anchors aren’t rated as tiedown points, but, hey, if they can hold the seat up during a crash, they’re good enough for me.

    We’ve always packed lightly and, these days, we bring no more than absolutely necessary. Those tires sure didn’t leave room for much else…

  • A Mystery Block of Electronics

    Back in the day, this surely represented an achievement in high-density electronics packaging:

    Electronics Block - 1
    Electronics Block – 1

    A view from the other corner suggests the layout wasn’t quite right:

    Electronics Block - 2
    Electronics Block – 2

    It has no identification, the transistors have house numbers, and the PCB looks like a prototype. As nearly as I can tell from the capacitor date codes, it dates back to the mid-1960s.

    Two pairs of electrically isolated and thermally bonded transistors suggest an analog Class-AB driver + amplifier or a pair of digital flipflops, but there’s no way to tell.

    Judging from the ugly solder and dislodged via rings, somebody had to apply extensive modifications after initial assembly; it trailed half a dozen red wires soldered to vias and components.

    One hopes it eventually worked…

  • Groundhog

    This critter may have a burrow under the stand of decorative grass beside the front door:

    Ground Hog - front
    Groundhog – front

    Mary lets it eat all the weeds it wants and, oddly, it seems to prefer broad-leaf greenery to what little grass remains in the front lawn.

    Taken with the DSC-H5 through two layers of wavy 1955-era glass from the living room.

  • Improved Gas Cartridge Fins

    A trio of N2O cartridges / capsules made their way into the Basement Laboratory and cried out to be fitted with fins:

    N2O Capsule Fins - installed
    N2O Capsule Fins – installed

    My original model tinkered up a cartridge from solid object primitives, but I’ve since discovered that cheating produces a much better and faster and easier result for cylindrical objects:

    N2O Capsule - solid model - bottom view
    N2O Capsule – solid model – bottom view

    The trick is getting an image of the original object from the side, taken from far enough away to flatten the perspective:

    N2O capsule - side view
    N2O capsule – side view

    Then overlay and scale a grid to match the actual length:

    N2O capsule - grid overlay
    N2O capsule – grid overlay

    The grid has 1 mm per minor square, centered along the cartridge’s axis, and zeroed at the tip; I rotated the cartridge image by half a degree to line it up with the grid.

    Print it out on actual paper so you can eyeball the measurements and write ’em where you need ’em:

    N2O capsule - grid overlay - printed
    N2O capsule – grid overlay – printed

    Which becomes an OpenSCAD polygon definition:

    RADIUS = 0;				// subscript for radius values
    HEIGHT = 1;				//   ... height above Z=0 at seal flange
    
    //-- N2O 8 g capsule
    
    CartridgeOutline = [			// X values = measured radius, Y as distance from tip
    	[0.0,0.0],					//  0 cartridge seal tip
    	[2.5,0.1],					//  1 seal disk
    	[3.5,0.5],[4.0,1.0],		//  2 tip end
    	[4.2,2.0],[4.3,3.0],		//  4 tip
    	[4.3,6.0],					//  6 chamfer
    	[4.5,8.0],					//  7 taper
    	[4.9,9.0],					//  8
    	[5.5,10.0],					//  9
    	[6.0,11.0],					// 10
    	[6.7,12.0],					// 11
    	[7.1,13.0],					// 12
    	[7.5,14.0],					// 13
    	[8.0,15.0],					// 14
    	[8.4,16.0],					// 15
    	[8.8,17.0],					// 16
    	[9.0,18.0],[9.0,58.0],		// 17 body
    	[0.0,65.0]					// 19 dummy end cone
    	];
    
    TipLength = CartridgeOutline[6][HEIGHT];
    TipOD = 2*CartridgeOutline[5][RADIUS];
    	
    BodyOD = 2*CartridgeOutline[17][RADIUS];
    BodyOAL = CartridgeOutline[19][HEIGHT];
    

    Because the rounded end of the cartridge doesn’t matter, I turned it into a cone.

    Twirl that around the Z axis and It Just Works:

    module Cartridge() {
    
     rotate_extrude($fn=CartridgeSides)
     polygon(points=CartridgeOutline);
    
    }
    

    Which then punches a matching dent in the fin structure:

    Gas Capsule Fins - Slic3r preview
    Gas Capsule Fins – Slic3r preview

    The lead picture doesn’t quite match the Slic3r preview, as I found the single-width diagonal fins weren’t strong enough. Making them two (nominal) threads wide lets Slic3r lay down three thinner threads in the same space:

    Gas Capsule Fins - thicker - Slic3r preview
    Gas Capsule Fins – thicker – Slic3r preview

    That’s letting Slic3r automagically determine the infill and perimeter thread width to make the answer come out right. As nearly as I can tell, the slicing algorithms have become smart enough to get the right answer nearly all of the time, so I can-and-should relinquish more control over the details.

    The OpenSCAD source code:

    // CO2 capsule tail fins
    // Ed Nisley KE4ZNU - October 2015
    
    Layout = "Build"; // Show Build FinBlock Cartridge Fit
    
    //-------
    //- Extrusion parameters must match reality!
    // Print with +0 shells and 3 solid layers
    
    ThreadThick = 0.25;
    ThreadWidth = 0.40;
    
    HoleWindage = 0.2;
    
    Protrusion = 0.1; // make holes end cleanly
    
    function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
    
    //-------
    // Capsule dimensions
    
    CartridgeSides = 12*4; // number of sides
    
    RADIUS = 0; // subscript for radius values
    HEIGHT = 1; // ... height above Z=0 at seal flange
    
    //-- N2O 8 g capsule
    
    RW = HoleWindage/2; // enlarge radius by just enough
    
    CartridgeOutline = [ // X values = measured radius, Y as distance from tip
     [0.0,0.0], // 0 cartridge seal tip
     [2.5 + RW,0.1], // 1 seal disk
     [3.5 + RW,0.5],[4.0 + RW,1.0], // 2 tip end
     [4.2 + RW,2.0],[4.3 + RW,3.0], // 4 tip
     [4.3 + RW,6.0], // 6 chamfer
     [4.5 + RW,8.0], // 7 taper
     [4.9 + RW,9.0], // 8
     [5.5 + RW,10.0], // 9
     [6.0 + RW,11.0], // 10
     [6.7 + RW,12.0], // 11
     [7.1 + RW,13.0], // 12
     [7.5 + RW,14.0], // 13
     [8.0 + RW,15.0], // 14
     [8.4 + RW,16.0], // 15
     [8.8 + RW,17.0], // 16
     [9.0 + RW,18.0],[9.0 + RW,58.0], // 17 body
     [0.0,65.0] // 19 dummy end cone
     ];
    
    TipLength = CartridgeOutline[6][HEIGHT];
    TipOD = 2*CartridgeOutline[5][RADIUS];
    
    CylinderBase = CartridgeOutline[17][HEIGHT];
    
    BodyOD = 2*CartridgeOutline[17][RADIUS];
    BodyOAL = CartridgeOutline[19][HEIGHT];
    
    //-------
    // Fin dimensions
    
    FinThick = 1.5*ThreadWidth; // outer square
    StrutThick = 2.0*ThreadWidth; // diagonal struts
    
    FinSquare = 1.25*BodyOD;
    FinTaperLength = sqrt(2)*FinSquare/2 - sqrt(2)*FinThick - ThreadWidth;
    
    FinBaseLength = 0.7 * CylinderBase;
    FinTop = 0.9*CylinderBase;
    
    //-------
    
    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);
    
    }
    
    //-------
    // CO2 cartridge outline
    
    module Cartridge() {
    
     rotate_extrude($fn=CartridgeSides)
     polygon(points=CartridgeOutline);
    
    }
    
    //-------
    // Diagonal fin strut
    
    module FinStrut() {
     intersection() {
     rotate([90,0,45])
     translate([0,0,-StrutThick/2])
     linear_extrude(height=StrutThick)
     polygon(points=[
     [0,0],
     [FinTaperLength,0],
     [FinTaperLength,FinBaseLength],
     [0,(FinBaseLength + FinTaperLength)]
     ]);
     translate([0,0,FinTop/2])
     cube([2*FinSquare,2*FinSquare,FinTop], center=true);
     }
    }
    
    //-------
    // Fin outline
    
    module FinBlock() {
     
    $fn=12;
     render(convexity = 4)
     union() {
     translate([0,0,FinBaseLength/2])
     difference() {
     intersection() {
     minkowski() {
     cube([FinSquare - 2*ThreadWidth,
     FinSquare - 2*ThreadWidth,
     FinBaseLength],center=true);
     cylinder(r=FinThick,h=Protrusion,$fn=8);
     }
     cube([2*FinSquare,2*FinSquare,FinBaseLength],center=true);
     }
     difference() {
     cube([(FinSquare - 2*FinThick),
     (FinSquare - 2*FinThick),
     (FinBaseLength + 2*Protrusion)],center=true);
     for (Index = [0:3])
     rotate(Index*90)
     translate([(FinSquare/2 - FinThick),(FinSquare/2 - FinThick),0])
     cylinder(r=2*StrutThick,h=(FinBaseLength + 2*Protrusion),center=true,$fn=16);
     }
     }
     
     for (Index = [0:3])
     rotate(Index*90)
     FinStrut();
     
     rotate(180/12)
     cylinder(d=IntegerMultiple(TipOD + 6*ThreadWidth,ThreadWidth),h=TipLength);
     }
    }
    
    //-------
    // Fins
    
    module FinAssembly() {
    
     difference() {
     FinBlock();
     translate([0,0,2*ThreadThick]) // add two layers to close base cylinder
     Cartridge();
     }
    
    }
    
    module FinFit() {
    
     translate([0,0.75*BodyBaseLength,2*ThreadThick])
     rotate([90,0,0])
     difference() {
     translate([-FinSquare/2,-2*ThreadThick,0])
     cube([IntegerMultiple(FinSquare,ThreadWidth),
     4*ThreadThick,
     1.5*BodyBaseLength]);
     translate([0,0,5*ThreadWidth])
     Cartridge();
     }
    
    
    }
    
    //-------
    // Build it!
    
    ShowPegGrid();
    
    if (Layout == "FinStrut")
     FinStrut();
    
    if (Layout == "FinBlock")
     FinBlock();
    
    if (Layout == "Cartridge")
     Cartridge();
    
    if (Layout == "Show") {
     FinAssembly();
     color("LightYellow") Cartridge();
    }
    
    if (Layout == "Fit")
     FinFit();
    
    if (Layout == "Build")
     FinAssembly();