Ed Nisley's Blog: Shop notes, electronics, firmware, machinery, 3D printing, laser cuttery, and curiosities. Contents: 100% human thinking, 0% AI slop.
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
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
They don’t make power supplies like that any more.
The part locations (“O9” looks like a typo):
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
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
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.
I soldered up the simplest possible “electrometer amplifier” at Squidwrench, based on Charles Wenzel’s writeup:
Electrometer Amp – MPSA14 NPN Darlington
It’s an MPSA14 NPN Darlington transistor, with the base soldered directly to the Victoreen 710-104 ionization chamber collector pin. The flying leads connect to an ordinary digital voltmeter set to read voltage, rather than current, so that you see the voltage created by the transistor’s collector current through the meter’s input resistance.
The MPSA14 data sheet specifies DC current gain hFE > 10 k for low collector currents, with a graph suggesting it might be somewhat larger. Alas, all those are for “ordinary” currents, not the countably finite number of electrons coming from an ionization chamber, but let’s assume 10 k is close.
I used a Radio Shack 22-805 DMM, set to auto-ranging DC volts. The specs say the input “impedance” is 10 MΩ for all voltage ranges, so let’s run with that, too.
With 24 V (actually 24.6 V) applied to both the chamber (through the red wire) and the DMM (through the yellow wire), it read 250 mV: a mere 25 nA through the 10 MΩ meter resistance.
Assuming a transistor gain of 10 k, that’s a chamber current of 2.5 pA.
The ionization chamber specs say it produces 5 pA at 0.5 röentgen/hour → 100 mR/h produces 1 pA.
No, I do not believe the Squidwrench Operating Table is bathed in gamma radiation at 250 mR/h.
I should wipe down the transistor to see if that reduces the external leakage, then try a few others, but obviously the signal will remain lost in the noise.
We replaced the DMM with an oscilloscope and 10 MΩ probe, which conclusively demonstrated that unshielded high-impedance circuits make excellent 60 Hz receivers.
Just to have something to work with, I cut a hex from a sheet of double-sided PCB stock and bonded the edges with copper foil:
Victoreen 710-104 – Hex PCB – top
Slightly wider tape on three edges will clear the board supports:
Victoreen 710-104 – Hex PCB – bottom
For unknown reasons, the PCB has arrays of plated-through holes firmly bonding the top and bottom copper, so that’s pretty much solid copper with a glass-epoxy core. I think somebody (else) harvested it from a locally important company many, many decades ago, but it arrived with no provenance.
The first pass at the electrometer circuitry will be air-wired for low leakage, which is pretty much the only way I have to actually get low leakage; the holes should help glue the parts to that copper plane.
I’m not at all convinced the big hole in the middle is strictly necessary. The chamber has 10 pF from pin to can that should swamp any stray capacitance unless I do something really stupid.
Given my weak origami-fu and the need for hexagonality, I should print a 3D template.
It’s worth remembering that both the hex and the shield will be at the can’s +24 V potential, not “ground”. That makes no difference to the external circuitry, but will certainly cause me to blow a few junctions along the way.
The general idea is to put the electrometer circuitry directly atop the Victoreen 710-104 ionization chamber, so as to minimize the distance from the center collector electrode to the electrometer input. After a few false starts, this looked promising:
Victoreen 710-104 Ionization Chamber Fittings – Show layout
The hexagonal circuit board fits the can so nicely that I’ll run with it, despite the over-the-top twee factor. Because it’s so hard to freehand a hex, I printed the green object as a tracing template, despite having the Slic3r preview show the parts just barely fitting on the M2 platform:
The skirt measures 0.25±0.05 around the entire perimeter, with a slight positive bias (platform too low) along the left side and a corresponding negative bias on the right. Both sides look just fine to me.
A pair of alignment pegs hold each board support in place while gluing:
Victoreen 710-104 Fittings – clamping
Next time around, I’ll glue the supports with the circuit board template laid in place to ensure the edges have the proper orientation, but they came out surprisingly close just by matching the outer perimeters. Of course, I probably bandsawed / belt sanded the carefully traced hex just slightly off-kilter.
The outer perimeter has 48 sides. Making it a multiple of three means each board support has the same pattern of sides and all will be interchangeable. Making it a multiple of four means each quadrant has the same pattern of sides and the ring looks pleasingly symmetrical. The factor-of-three is most important: you want interchangeable supports. Trust me on this.
The bottom ring keeps the solder dimple that seals the can base off the desk, but I also stuck a quartet of rubber feet on the can for better traction.
Here’s what it looks like with the two A23 12 V bias batteries in their holders, affixed to the can with foam tape:
Victoreen 710-104 Fittings – assembled
The OpenSCAD source code includes a few more tweaks:
// Victoreen 710-104 Ionization Chamber Fittings
// Ed Nisley KE4ZNU July 2015
Layout = "Show";
// Show - assembled parts
// Build - print them out!
// 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
BuildTemplate = false; // true to build PCB template along with everything else
//- 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 + 2*ThreadWidth; // hex dia across flats + clearance
PCBThick = 1.1;
PCB = [PCBFlatsOD / cos(30),PCBThick - ThreadThick]; // OD = tip-to-tip dia
echo(str("Actual PCB across flats: ",PCBFlatsOD - 2*ThreadWidth));
echo(str(" ... tip-to-tip dia: ",(PCBFlatsOD - 2*ThreadWidth)/cos(30)));
echo(str(" ... thickness: ",PCBThick));
HolderHeight = 11.0 + PCB[LENGTH]; // thick enough for PCB to clear studs
HolderShelf = 2.0; // shelf under PCB edge
echo(str("PCB holder height: ",HolderHeight));
echo(str(" ... across flats: ",PCBFlatsOD));
//----------------------
// 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
// cylinder(d=(BCD - 2*5.0),h=Chamber[LENGTH],$fn=CapSides);
rotate(180/6)
cylinder(d=BCD,h=Chamber[LENGTH],$fn=6);
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*15 + 60)
translate([Chamber[OD]/2,0,0])
rotate(180/4)
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=((PCBFlatsOD - 2*ThreadWidth)/cos(30)),h=max(PCB[LENGTH],3.0),$fn=6); // actual PCB size, overly thick
translate([0,0,-Protrusion])
cylinder(d=10,h=10*PCB[LENGTH],$fn=12);
}
}
module PCBBase() {
difference() {
cylinder(d=Chamber[OD] + 2*WallThick,h=HolderHeight,$fn=CapSides);
rotate(30) {
translate([0,0,-Protrusion]) // central hex
cylinder(d=(PCBFlatsOD - 2*HolderShelf)/cos(30),h=2*HolderHeight,$fn=6);
translate([0,0,HolderHeight - PCB[LENGTH]]) // hex PCB recess
cylinder(d=PCB[OD],h=HolderHeight,$fn=6);
for (i=[0:NumStuds - 1]) // PCB retaining screws
rotate(i*120 + 30)
translate([(PCBFlatsOD/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*15 + 30)
translate([Chamber[OD]/2,0,0])
rotate(180/4)
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)]]);
}
}
}
//----------------------
// 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 == "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();
}
if (Layout == "Build") {
if (BuildTemplate) {
translate([-0.50*Chamber[OD],-0.60*Chamber[OD],0])
CanCap();
translate([0.55*Chamber[OD],-0.60*Chamber[OD],0])
rotate(30)
PCBTemplate();
}
else {
translate([-0.25*Chamber[OD],-0.60*Chamber[OD],0])
CanCap();
}
translate([-0.25*Chamber[OD],0.60*Chamber[OD],0])
CanBase();
translate([0.25*Chamber[OD],0.60*Chamber[OD],0])
PCBBase();
}
I embossed the studs into a pad of Geek Scratch Paper, eyeballed the stud-to-stud spacing from a cheap ruler, back-calculated the BCD, rounded it from 2.742 to the obvious 2.75, then fed that into the first BCD calculator that appeared in the obvious search.
The can is just over 3.5 inch OD and stands 1.5 inch tall.
The can will run at +24 V in relation to the rest of the circuitry, so the studs must be insulated from the PCB’s copper pours. That, most likely, will require some 3D printed doodads.
The circuitry must live inside a grounded metallic can that excludes random electric fields. Somewhere in the pile, I have a few sheets of Mu-metal that, while grossly overqualified for the task (even without heat treatment), should solder up nicely…
Armed with bags of electronic parts and boxes of meters, I’ll be helping folks at the CNC Workshop understand the electrical limitations of the Arduino microcontrollers they’re building into projects.
That might be rosin left over from soldering, but you’d think they would have rinsed it off to reduce the leakage. Some cleaning will be in order.
A picture in The Fine Manual for the CD-V-710 Model 5 Radiation Survey Meter showed that the circuit board used point-to-point wiring, with the range switch soldered directly to that bent metal contact:
Another page gave some useful values and a simplified schematic:
Victoreen CD-V-710 Model 5 Manual – Page 5
Never fear, the manual also has the full schematic; they don’t write manuals like that any more.
The chamber bias voltage was +22.5, from one carbon-zinc battery available back in the 1950s. You can still get 22.5 V batteries at about ten bucks a pop, but 24 V from a pair of cheap & readily available 12 V A23 alkaline batteries should be close enough. There’s no current drain, so the batteries should last their entire shelf life.
The “HI-MEG” resistor represents a trio of glass-body resistors selected by the range switch:
R5 = 100 GΩ → 0.5 R/h
R6 = 10 GΩ→ 5 R/h
R7 = 1 GΩ→ 50 R/h
As the saying goes, if you must select R7 in an actual emergency, you should sit down, put your head between your legs, and kiss your ass goodbye.
The steel-wall chamber responds only to gamma radiation, with a nominal current of 5 pA at 0.5 R/h. However, given an op amp like the LMC6081 with 10 fA bias current, maybe building an electrometer-style amplifier that can respond to background gamma radiation or maybe secondary gamma rays from cosmic ray air showers would be feasible; I haven’t done anything like that in a while and even a faceplant would be interesting.
Alas, radium-226 and its progeny, including radon-222 decay through alpha and beta emission that’s specifically excluded by the can.
This is not a new idea, by any means, as shown by some extensive discussion and well-done circuitry. Any amplifier that works with the Victoreen can will certainly work with a homebrew ionization chamber.