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:

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

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