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();

}

3 thoughts on “Victoreen 710-104 Ionization Chamber: Shield Support

  1. You’re not worried about the charge from Kapton tape? I know when you peel the tape, it becomes charged due to triboelectrification, and it’s a good insulator, so might maintain that charge even when applied to a conductive surface.

    1. I probably should be, given that I didn’t like the idea of a plastic-on-the-inside shield. The only thing in my favor is that the charge on the tape should be pretty anchored, so it’ll be part of the DC offset; touching the plastic housing probably rearranges its charge every time.

      When all this settles down, I should peel the tape off and very carefully put the shield back in place to see whether it matters.

Comments are closed.