-
Raspberry Pi HQ Camera Mount
As far as I can tell, Raspberry Pi cases are a solved problem, so 3D printing an intricate widget to stick a Pi on the back of an HQ camera seems unnecessary unless you really, really like solid modeling, which, admittedly, can be a thing. All you really need is a simple adapter between the camera PCB and the case of your choice:

HQ Camera Backplate – OpenSCAD model A quartet of 6 mm M2.5 nylon spacers mount the adapter to the camera PCB:

RPi HQ Camera – nylon standoffs The plate has recesses to put the screw heads below the surface. I used nylon screws, but it doesn’t really matter.
The case has all the right openings, slots in the bottom for a pair of screws, and costs six bucks. A pair of M3 brass inserts epoxied into the plate capture the screws:

RPi HQ Camera – case adapter plate – screws Thick washers punched from an old credit card go under the screws to compensate for the case’s silicone bump feet. I suppose Doing the Right Thing would involve 3D printed spacers matching the cross-shaped case cutouts.
Not everyone agrees with my choice of retina-burn orange PETG:

RPi HQ Camera – 16 mm lens – case adapter plate Yes, that’s a C-mount TV lens lurking in the background, about which more later.
The OpenSCAD source code as a GitHub Gist:
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters// Raspberry Pi HQ Camera Backplate // Ed Nisley KE4ZNU 2020-09 //– Extrusion parameters /* [Hidden] */ ThreadThick = 0.25; ThreadWidth = 0.40; HoleWindage = 0.2; function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit); function IntegerLessMultiple(Size,Unit) = Unit * floor(Size / Unit); Protrusion = 0.1; // make holes end cleanly inch = 25.4; ID = 0; OD = 1; LENGTH = 2; //- Basic dimensions CamPCB = [39.0,39.0,1.5]; // Overall PCB size, plus a bit CornerRound = 3.0; // … has rounded corners CamScrewOC = [30.0,30.0,0]; // … mounting screw layout CamScrew = [2.5,5.0,2.2]; // … LENGTH = head thickness Standoff = [2.5,5.5,6.0]; // nylon standoffs Insert = [3.0,4.0,4.0]; WallThick = IntegerMultiple(2.0,ThreadWidth); PlateThick = Insert[LENGTH]; CamBox = [CamPCB.x + 2*WallThick, CamPCB.y + 2*WallThick, Standoff.z + PlateThick + CamPCB.z + 1.0]; PiPlate = [90.0,60.0,PlateThick]; PiPlateOffset = [0.0,(PiPlate.y – CamBox.y)/2,0]; PiSlotOC = [0.0,40.0]; PiSlotOffset = [3.5,3.5]; NumSides = 2*3*4; TextDepth = 2*ThreadThick; //———————- // 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); } //———————- // Build it difference() { union() { hull() // camera enclosure for (i=[-1,1], j=[-1,1]) translate([i*(CamBox.x/2 – CornerRound),j*(CamBox.y/2 – CornerRound),0]) cylinder(r=CornerRound,h=CamBox.z,$fn=NumSides); translate(PiPlateOffset) hull() for (i=[-1,1], j=[-1,1]) // Pi case plate translate([i*(PiPlate.x/2 – CornerRound),j*(PiPlate.y/2 – CornerRound),0]) cylinder(r=CornerRound,h=PiPlate.z,$fn=NumSides); } hull() // camera PCB space for (i=[-1,1], j=[-1,1]) translate([i*(CamPCB.x/2 – CornerRound),j*(CamPCB.y/2 – CornerRound),PlateThick]) cylinder(r=CornerRound,h=CamBox.z,$fn=NumSides); translate([0,-CamBox.y/2,PlateThick + CamBox.z/2]) cube([CamScrewOC.x – Standoff[OD],CamBox.y,CamBox.z],center=true); for (i=[-1,1], j=[-1,1]) // camera screws with head recesses translate([i*CamScrewOC.x/2,j*CamScrewOC.y/2,-Protrusion]) { PolyCyl(CamScrew[ID],2*CamBox.z,6); PolyCyl(CamScrew[OD],CamScrew[LENGTH] + Protrusion,6); } for (j=[-1,1]) // Pi case screw inserts translate([0,j*PiSlotOC.y/2 + PiSlotOffset.y,-Protrusion] + PiPlateOffset) PolyCyl(Insert[OD],2*PiPlate.z,6); translate([-PiPlate.x/2 + (PiPlate.x – CamBox.x)/4,0,PlateThick – TextDepth/2] + PiPlateOffset) cube([15.0,30.0,TextDepth + Protrusion],center=true); } translate([-PiPlate.x/2 + (PiPlate.x – CamBox.x)/4 + 3,0,PlateThick – TextDepth – Protrusion] + PiPlateOffset) linear_extrude(height=TextDepth + Protrusion,convexity=2) rotate(-90) text("Ed Nisley",font="Arial:style=Bold",halign="center",valign="center",size=4,spacing=1.05); translate([-PiPlate.x/2 + (PiPlate.x – CamBox.x)/4 – 3,0,PlateThick – TextDepth – Protrusion] + PiPlateOffset) linear_extrude(height=TextDepth + Protrusion,convexity=2) rotate(-90) text("KE4ZNU",font="Arial:style=Bold",halign="center",valign="center",size=4,spacing=1.05);