Improving the crystal tester’s (nonexistent) grounding requires a band of copper tape around the inside of the proto board holder. Rather than cut the tape lengthwise to fit the holder, a new one will be just tall enough:

While I was at it, I deleted the washer recesses, because those didn’t work out well, and fiddled the screw holes to put the inserts in from the bottom:

Although the overhang inside the holes will be ugly, I’ll epoxy the inserts flush with the bottom and nobody will ever know.
The copper tape now makes a tidy ground strap:

With a gap in the front to eliminate the obvious loop:

The OpenSCAD source code as a GitHub Gist:
| // Test support frame for proto boards | |
| // Ed Nisley KE4ZNU – Jan 2017 | |
| // June 2017 – Add side-mount bracket, inserts into bottom | |
| Layout = "Frame"; | |
| ClampFlange = true; | |
| Channel = false; | |
| //- Extrusion parameters – must match reality! | |
| ThreadThick = 0.25; | |
| ThreadWidth = 0.40; | |
| function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit); | |
| Protrusion = 0.1; | |
| HoleWindage = 0.2; | |
| //- Screw sizes | |
| inch = 25.4; | |
| 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; | |
| ID = 0; | |
| OD = 1; | |
| LENGTH = 2; | |
| Insert = [3.9,4.6,5.8]; | |
| //- PCB sizes | |
| PCBSize = [80.0,120.0,1.6]; | |
| PCBShelf = 1.0; // support rim under PCB | |
| Clearance = 2*[ThreadWidth,ThreadWidth,0]; | |
| WallThick = 4.0; | |
| FrameHeight = IntegerMultiple(3/8 * inch,1.0); | |
| echo(str("Inner height: ",FrameHeight)); | |
| ScrewOffset = 0.0 + Clear4_40/2; | |
| ScrewSites = [[-1,1],[-1,1]]; // -1/0/+1 = left/mid/right and bottom/mid/top | |
| OAHeight = FrameHeight + Clearance[2] + PCBSize[2]; | |
| echo(str("OAH: ",OAHeight)); | |
| FlangeExtension = 3.0; | |
| FlangeThick = IntegerMultiple(2.0,ThreadThick); | |
| Flange = PCBSize | |
| + 2*[ScrewOffset,ScrewOffset,0] | |
| + 2*[Washer4_40OD,Washer4_40OD,0] | |
| + [2*FlangeExtension,2*FlangeExtension,(FlangeThick – PCBSize[2])] | |
| ; | |
| echo(str("Flange: ",Flange)); | |
| NumSides = 4*5; | |
| WireChannel = [Flange[0],15.0,3.0 + PCBSize[2]]; | |
| WireChannelOffset = [Flange[0]/2,25.0,(FrameHeight + PCBSize[2] – WireChannel[2]/2)]; | |
| //- Adjust hole diameter to make the size come out right | |
| 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); | |
| } | |
| //- Build things | |
| if (Layout == "Frame") | |
| difference() { | |
| union() { // body block | |
| translate([0,0,OAHeight/2]) | |
| cube(PCBSize + Clearance + [2*WallThick,2*WallThick,FrameHeight],center=true); | |
| for (x=[-1,1], y=[-1,1]) { // screw bosses | |
| translate([x*(PCBSize[0]/2 + ScrewOffset), | |
| y*(PCBSize[1]/2 + ScrewOffset), | |
| 0]) | |
| cylinder(r=Washer4_40OD,h=OAHeight,$fn=NumSides); | |
| } | |
| if (ClampFlange) // flange for work holder | |
| linear_extrude(height=Flange[2]) | |
| hull() | |
| for (i=[-1,1], j=[-1,1]) { | |
| translate([i*(Flange[0]/2 – Washer4_40OD/2),j*(Flange[1]/2 – Washer4_40OD/2)]) | |
| circle(d=Washer4_40OD,$fn=NumSides); | |
| } | |
| } | |
| for (x=[-1,1], y=[-1,1]) { // screw position indexes | |
| translate([x*(PCBSize[0]/2 + ScrewOffset), | |
| y*(PCBSize[1]/2 + ScrewOffset), | |
| -Protrusion]) | |
| rotate(x*y*180/(2*6)) | |
| PolyCyl(Clear4_40,(OAHeight + 2*Protrusion),6); // screw clearance holes | |
| translate([x*(PCBSize[0]/2 + ScrewOffset), | |
| y*(PCBSize[1]/2 + ScrewOffset), | |
| -Protrusion]) | |
| rotate(x*y*180/(2*6)) | |
| PolyCyl(Insert[OD],OAHeight – PCBSize[2] – 3*ThreadThick + Protrusion,6); // inserts | |
| if (false) | |
| translate([x*(PCBSize[0]/2 + ScrewOffset), | |
| y*(PCBSize[1]/2 + ScrewOffset), | |
| OAHeight – PCBSize[2]]) | |
| PolyCyl(1.2*Washer4_40OD,(PCBSize[2] + Protrusion),NumSides); // washer recess | |
| } | |
| translate([0,0,OAHeight/2]) // through hole below PCB | |
| cube(PCBSize – 2*[PCBShelf,PCBShelf,0] + [0,0,2*OAHeight],center=true); | |
| translate([0,0,(OAHeight – (PCBSize[2] + Clearance[2])/2 + Protrusion/2)]) // PCB pocket on top | |
| cube(PCBSize + Clearance + [0,0,Protrusion],center=true); | |
| if (Channel) | |
| translate(WireChannelOffset) // opening for wires from bottom side | |
| cube(WireChannel + [0,0,Protrusion],center=true); | |
| } | |
| // Add-on bracket to hold smaller PCB upright at edge | |
| PCB2Insert = [3.0,4.9,4.1]; | |
| PCB2OC = 45.0; | |
| if (Layout == "Bracket") | |
| difference() { | |
| hull() // frame body block | |
| for (x=[-1,1]) // bosses around screws | |
| translate([x*(PCBSize[0]/2 + ScrewOffset),0,0]) | |
| cylinder(r=Washer4_40OD,h=OAHeight,$fn=NumSides); | |
| for (x=[-1,1]) // frame screw holes | |
| translate([x*(PCBSize[0]/2 + ScrewOffset),0,-Protrusion]) | |
| rotate(x*180/(2*6)) | |
| PolyCyl(Clear4_40,(OAHeight + 2*Protrusion),6); | |
| for (x=[-1,1]) // PCB insert holes | |
| translate([x*PCB2OC/2,(Washer4_40OD + Protrusion),OAHeight/2]) | |
| rotate([90,0,0]) | |
| cylinder(d=PCB2Insert[OD],h=2*(Washer4_40OD + Protrusion),$fn=6); | |
| } | |
Comments
2 responses to “Proto Board Holder: Revised Screw Mounts”
I know you don’t care about looks, especially on an internal feature, but I did successfully incorporate one of nophead’s ideas for printing holes in midair (http://hydraraptor.blogspot.com/2014/03/buried-nuts-and-hanging-holes.html) in a design once. It requires three layers; the summary of the idea is you build up an using only bridges. Rectangular gap in the first layer, to a square in the second layer bridging transversely, to the final octagon in the final layer by cutting off the corners. You can do something similar for a hexagon, just bridging pairs of opposite sides at a time.
[…] So, turning off the OLED should help a lot, which is feasible in this situation. If you must run the display while caring deeply about signal quality, you must devote considerably more attention to circuit construction quality. […]