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

  • HP 7475A Plotter: Ceramic-Tip Pen Refill

    The ceramic-tip green pen I’ve been using finally ran dry and, having nothing to lose, I tried refilling it.

    Grabbing the metal ferrule in the drill press chuck provided enough traction to twist / pull it off, revealing the pen nib assembly inside:

    HP 7475A Ceramic-tip pen - ferrule
    HP 7475A Ceramic-tip pen – ferrule

    A pin vise provided enough traction to remove the nib, which had the expected fiber cylinder extending into the ink reservoir:

    HP 7475A Ceramic-tip pen - disassembly
    HP 7475A Ceramic-tip pen – disassembly

    I injected 0.5 ml of yellow ink from my lifetime supply of bulk inkjet ink (*), then tried to inject 0.5 ml of cyan, which promptly overflowed. In retrospect, allowing a few minutes for the new ink to seep into whatever’s inside the reservoir would be prudent.

    After wiping the mess off the pen and reassembling it in reverse order, it works just like new:

    HP 7475A Ceramic-tip pen - C-Y refill
    HP 7475A Ceramic-tip pen – C-Y refill

    During the course of the first plot, the trace went from green to deep blue-green to a different green, which suggests the yellow ink took a while to make its presence known. No problem; whatever comes out of that tip is all good with me.

    The stain around the rim of the pen body above the flange suggests a cap that might come off with sufficient persuasion. If it’s firmly fused to the flange, which would make perfect sense, injecting ink through a small hole drilled in the end might produce better results than ripping the nib out yet again.

    (*) This leftover came from the never-sufficiently-to-be-damned HP2000C inkjet printer. ‘Nuff said.

  • HP 7475A Plotter: Superformula Demo

    Setting n2=n3=1.5 generates smoothly rounded shapes, rather than the spiky ones produced by n2=n3=1.0, so I combined the two into a single demo routine:

    HP 7475A - SuperFormula patterns
    HP 7475A – SuperFormula patterns

    A closer look shows all the curves meet at the points, of which there are 37:

    HP 7475A - SuperFormula patterns - detail
    HP 7475A – SuperFormula patterns – detail

    The spikes suffer from limited resolution: each curve has 10 k points, but if the extreme end of a spike lies between two points, then it gets blunted on the page. Doubling the number of points would help, although I think this has already gone well beyond the, ah, point of diminishing returns.

    I used the three remaining “disposable” liquid ink pens for the spiked curves; the black pen was beyond repair. They produce gorgeous lines, although the magenta ink seems a bit thinned out by the water I used to rinse the remains of the last refill out of the spiral vent channel.

    I modified the Chiplotle supershape() function to default to my choices for point_count and travel, then copied the superformula() function and changed it to return polar coordinates, because I’ll eventually try scaling the linear value as a function of the total angle, which is much easier in polar coordinates.

    The demo code produces the patterns in the picture by iterating over interesting values of n1 and n2=n3, stepping through the pen carousel for each pattern. As before, m should be prime/10 to produce a prime number of spikes / bumps. You could add more iteration values, but six of ’em seem entirely sufficient.

    A real demo should include a large collection of known-good parameter sets, from which it can pick six sets to make a plot. A legend documenting the parameters for each pattern, plus the date & time, would bolster the geek cred.

    The Python source code with the modified Chiplotle routines:

    from chiplotle import *
    from math import *
    
    def superformula_polar(a, b, m, n1, n2, n3, phi):
       ''' Computes the position of the point on a
       superformula curve.
       Superformula has first been proposed by Johan Gielis
       and is a generalization of superellipse.
       see: http://en.wikipedia.org/wiki/Superformula
       Tweaked to return polar coordinates
       '''
    
       t1 = cos(m * phi / 4.0) / a
       t1 = abs(t1)
       t1 = pow(t1, n2)
    
       t2 = sin(m * phi / 4.0) / b
       t2 = abs(t2)
       t2 = pow(t2, n3)
    
       t3 = -1 / float(n1)
       r = pow(t1 + t2, t3)
       if abs(r) == 0:
          return (0,0)
       else:
     #     return (r * cos(phi), r * sin(phi))
         return (r,phi)
    
    def supershape(width, height, m, n1, n2, n3,
       point_count=10*1000, percentage=1.0, a=1.0, b=1.0, travel=None):
       '''Supershape, generated using the superformula first proposed
       by Johan Gielis.
    
       - `points_count` is the total number of points to compute.
       - `travel` is the length of the outline drawn in radians.
          3.1416 * 2 is a complete cycle.
       '''
       travel = travel or (10*2*pi)
    
       ## compute points...
       phis = [i * travel / point_count
          for i in range(1 + int(point_count * percentage))]
       points = [superformula_polar(a, b, m, n1, n2, n3, x) for x in phis]
    
       ## scale and transpose...
       path = [ ]
       for r, a in points:
          x = width * r * cos(a)
          y = height * r * sin(a)
          path.append(Coordinate(x, y))
    
       return Path(path)
    
    ## RUN DEMO CODE
    
    if __name__ == '__main__':
       paperx = 8000
       papery = 5000
       if  not False:
         plt=instantiate_plotters()[0]
         plt.set_origin_center()
         plt.write(hpgl.VS(10))
         pen = 1
         for m in [3.7]:
            for n1 in [0.20, 0.60, 0.8]:
              for n2 in [1.0, 1.5]:
                  n3 = n2
                  e = supershape(paperx, papery, m, n1, n2, n3)
                  plt.select_pen(pen)
                  if pen < 6:
                     pen += 1
                  else:
                     pen = 1
                  plt.write(e)
         plt.select_pen(0)
       else:
         e = supershape(paperx, papery, 1.9, 0.8, 3, 3)
         io.view(e)
    
  • HP 7475A Plotter: Exploring SuperFormula Parameters

    Although the Superformula can produce a bewildering variety of patterns, I wanted to build an automated demo that plotted interesting sets of similar results. Herewith, some notes after an evening of fiddling around with the machinery.

    Starting with the original Chiplotle formula, tweaked for B size paper:

    ss=geometry.shapes.supershape(8000,5000,5.3,0.4,1,1,point_count=1+10*1000,travel=10.001*2*math.pi)

    The first two parameters set the more-or-less maximum X and Y values in plotter units; the plot is centered at zero and will extend that far in both the positive and negative directions. For US paper:

    • A = Letter = 11 x 8½ inch → 4900 x 3900
    • B = 17 x 11 inch → 8000 x 5000

    The point_count parameter defines the number of points to be plotted for the entire figure. They’re uniformly distributed in angle, not in distance, so some parts of the figure will plot very densely and others sparsely, but the plotter will connect all of the points with straight lines and it’ll look reasonably OK. For the figures below, 10*1000 works well.

    The travel value defines the number of full cycles that the figure will make, in units of 2π. Ten cycles seems about right.

    The four parameters in between those are the m, n1, n2, and n3 values plugged directly into the basic Superformula. The latter two are exponents of the trig terms; 1.0 seems less bizarre than anything else.

    Sooo, that leaves only two knobs…

    With travel set for 10 full cycles, m works best when set to a value that’s equal to prime/10, which produces prime points around the figure. Thus, if you want 11 points, use m=1.1 and for 51 points, use m=5.1. Some non-prime numbers produce useful patterns (as below), others collapse into just a few points.

    The n1 parameter is an overall exponent for the whole formula in the form -1/n1. Increasing values, from 0.1 to about 2.0, expand the innermost points of the pattern outward and turn the figure into more of a ring and less of a lattice.

    So, for example, with m=3.1, setting n1= 0.15, 0.30, 0.60 produces this pattern with 31 points:

    HP 7475A - Superformula - m 3.1 vary n1
    HP 7475A – Superformula – m 3.1 vary n1

    Varying both at once, thusly:
    (m,n1) = (1.9,0.20)=green (3.7,0.30)=red (4.9,0.40)=blue
    produces this pattern:

    HP 7475A - Superformula - m 1.9 3.7 4.9 n1 0.2 0.3 0.4
    HP 7475A – Superformula – m 1.9 3.7 4.9 n1 0.2 0.3 0.4

    Yeah, 49 isn’t a prime number. It’s interesting, though.

    Note that n1 doesn’t set the absolute location of the innermost points; you must see how it interacts with m before leaping to any conclusions.

    It’s still not much in the way of Art, but it does keep the plotter chugging along for quite a while and that’s the whole point. I must yank the functions out of the Chiplotle library, set my default values, add one point to automagically close the last vertex, and maybe convert them to polar coordinates to adjust the magnitude as a function of angle.

    Yes, that poor green ceramic-tip pen is running out of ink after all these decades.

  • Ionization Chamber: Resistor Noise Calculations

    Given the ionization chamber’s tiny currents and the huge resistors required to turn them into voltages, reviewing the thermal noise I generally ignore seems in order…

    The RMS noise voltage of an ordinary resistor:

    vn = √ (4 kT R Δf)

    The constants:

    • kB – Boltzman’s Constant = 1.38×10-23 J/K
    • T – temperature in kelvin = 300 K (close enough)

    Mashing them together:

    vn = √ (16.6x10-21 R Δf)

    vn = 129x10-12 √ (R Δf)

    For a (generous) pulse current of 20 fA, a 10 GΩ resistor produces a mere 200 μV, so wrap a gain of 100 around the op amp to get 20 mV. An LMC6081 has a GBW just over 1 MHz, giving a 10 kHz bandwidth:

    vn = 129x10-12 √ (10x109 10x103) = 1.3 mV

    Which says the noise will be loud, but not deafening.

    A 100 GΩ resistor increases the voltage by a factor of 10, so you can decrease the gain by a factor of ten for the same 20 mV output, which increases the bandwidth by a factor of ten, which increases the noise by a factor of … ten.

    Ouch.

    With the same gain of 100 (and therefore 10 kHz bandwidth) after the 100 GΩ resistor, the output increases by a factor of ten to 200 mV, but the noise increases by only √10 to 4 mV.

    The LMC6081 has 22 nV/√Hz and 0.2 fA/√Hz input-referred noise, neither of which will rise above the grass from the resistor.

    With 10 kHz bandwidth, the pulse rise time is:

    tr = 0.34 / BW = 0.34 / 10 kHz = 34 μs

    The LMC6081 has a 1 V/μs slew rate that poses no limitation at all for these tiddly signals.

    That’s significantly better than the stacked Darlingtons and might be Good Enough for my simple needs.

  • 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…

  • 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();
    
    }
    
  • HP 7475A Plotter: LED Lighting

    If white LED strips had existed in the early 1980s, the engineers responsible for the HP 7475A plotter would surely have done this:

    HP 7475A Plotter - LED paper illumination
    HP 7475A Plotter – LED paper illumination

    Not, that’s not stretched vertically: I bought a ream of B-size paper (11×17 inches) just for plotter demos.

    Although the power supply does have a +12 V output, it comes from a TO220 transistor without a heatsink. The +5 V supply uses a robust TO3 transistor on a huge quad heatsink that can surely dissipate another watt or two without getting any sweatier.

    I powered the LEDs from a dirt-cheap boost converter that provides a convenient brightness adjustment; it’s set to 10.5 V and that’s plenty bright enough. The converter attaches to pair of wires soldered across VR1, which is probably a crowbar that blows F3 (not shown) in the event the regulator fails hot:

    HP 7475A - LED power tap - schematic
    HP 7475A – LED power tap – schematic

    They don’t make power supplies like that any more.

    The part locations (“O9” looks like a typo):

    HP 7475A - LED power tap
    HP 7475A – LED power tap

    The PCB has holes in exactly the right spot for a zip tie anchoring the wires exiting to the bottom:

    HP 7475A Plotter - LED power tap - PCB top
    HP 7475A Plotter – LED power tap – PCB top

    This vertiginous view shows the inside of the case atop the chassis, with the boost converter affixed to the galvanized steel pan with foam tape and the LED wires stuck down with Gorilla Tape:

    HP 7475A Plotter - LED strip and boost converter
    HP 7475A Plotter – LED strip and boost converter

    Red silicone tape around a PCB-mount coax jack rounds out a true hack job.

    Although I didn’t bring the plotter to the CNC Workshop, that venue’s dim light reminded me that you can never have enough light when you’re showing off your toys: the LED panels on the M2 and the LED light bars on the Model 158 sewing machine were the brightest spots to be seen.