Complete dimensional spec for the 3D-printed car enclosure housing a KrakenSDR and an official-cased Raspberry Pi 5, plus a 12 V power bay. Modelled parametrically in Fusion 360; every number here is a literal from the CONFIG block of build_carbox.py.
For Agents
The source of truth is /Users/levander/Documents/sdr/KrakenPi_CarBox/build_carbox.py, not this note. Edit its CONFIG block, re-run in Fusion, and it wipes the design, rebuilds, self-checks and re-exports. This note is the human-readable mirror. Input dimensions come from krakensdr-pi5-reference-dimensions.
This is v2 — a three-part split. The v1 one-piece design is kept as build_carbox_v1_onepiece.py; its exports moved to old_onepiece/. Anything describing a “box + lid” two-part design is v1 and superseded.
v2 at a Glance — What Changed From v1
v1 (one-piece)
v2 (three-part)
Printed parts
box + lid
floor + frame + lid
WALL
3.0
2.5
LID_T
3.0
2.4
FLOOR
3.0
3.0 (unchanged — structural)
Material
384 cm³
291.6 cm³ (−23 %)
Longest single print
~15 h
~2.5 h (floor) + frame + lid
LED opening
24.4 × 6.5 rectangular window
Ø6.6 bore + Ø14 × 4 collar
SOCKET_Y
115
108
RIB_Y0
92
88
Back cable corridor
blocked by ribs and mid posts
clear — CABLE_Y = 131, rib notch, posts sunk into the wall
Self-checks
158
102 + a 1 260-point corridor line scan
Why split it
The printer has only a 0.4 mm hotend, so the one-piece box was a ~15 hour single print — one failure loses the whole thing. Splitting also parallelises assembly: the floor comes off the plate in ~2.5 h carrying every mount boss, so the KrakenSDR, the Pi and the wiring can be bolted in and wired while the frame is still printing.
Coordinate System
X = long axis, 0 … 312
Y = short axis, 0 … 145 (mount ears extend this to −14 … 159)
Z = up, 0 at the outside of the floor
Interior clear volume is X 2.5…309.5, Y 2.5…142.5, Z 3…47.
Overall
Item
Value
Outer envelope, assembled
312 × 145 × 49.4 mm (BOX_H 47 + LID_T 2.4)
WALL (frame)
2.5 mm
FLOOR (floor plate)
3.0 mm
LID_T
2.4 mm
Outer corner radius
4.0 mm
With car-mount ears
Y span −14 … 159 (173 mm)
Total printed volume
291.6 cm³
Why FLOOR stays at 3.0 while WALL and LID_T shrank
The floor is the structural member — it carries every mount boss and takes the whole load of the Kraken and Pi through the car-mount ears. It also has to be thick enough for the M3 button heads to recess into it (6.5 × 1.8 counterbores) so nothing protrudes below the box. The wall and lid carry only themselves; the LED and switch grip through collars and screws, not through panel thickness, so 2.5 mm is enough.
The Three Parts
Part
Footprint
Height
Z span as built
Carries
floor
312 × 145
3 mm plate, bosses to Z = 7
0 … 7
all mount bosses, zip anchors, lightening grid, mount ears
frame
312 × 145
44 mm
3 … 47
walls, lid posts, socket ribs, LED collar, every panel cutout
lid
312 × 145
2.4 mm (4.4 with the lip)
45 … 49.4
grilles + register lip
The frame is its own body, not a split box
Build order matters
The frame is built as an independent block → fillet → shell, where the shell removes BOTH the top and the bottom face. It is not produced by slicing a shelled box in half.
frame = build(sk, 'frame_block', NEW, None, dist=BOX_H - FLOOR).bodies.item(0)fillet_verticals(frame, CORNER_R)shell(frame, [FLOOR, BOX_H], WALL) # both Z faces removed
This decouples WALL from FLOOR. A shelled box forces one thickness on all six faces; here the floor can stay 3.0 mm while the walls drop to 2.5 mm, which is where most of the 23 % material saving comes from.
Floor ↔ frame joint — 10× M3
Bosses sit inside the frame; screws go up through the floor into them.
Item
Value
JOINT_BOSS
10 × 8 × 7 mm (W × D × H), Z 3 … 10
Pilot in boss
Ø2.5 mm, 7 mm deep
Hole in floor
Ø3.4 through
Counterbore in floor
Ø6.5 × 1.8 mm from the bottom face — M3 button head sits flush
Positions (10):
Run
Coordinates
Front (Y = 6.5)
X 60, 120, 200, 270
Back (Y = 138.5)
X 50, 110, 180, 260
Sides (Y = 72)
X 6.5 and 305.5
Back bosses are placed around the cable corridor
The back bosses occupy Y 134.5 … 142.5, deliberately outboard of CABLE_Y ± 2. The build asserts this: chk('corridor clears the back joint bosses', CABLE_Y + 2.0 < BOX_W - WALL - JOINT_BOSS_D).
Internal Layout
Everything is laid out along X.
Region
X
Y
Standoff
KrakenSDR
13 … 190.3
13 … 126.5
4 mm (KRAKEN_LIFT)
Pi 5 (in its official case)
201 … 299.5
13 … 83.3
3 mm (PI_LIFT)
12 V power bay
remaining L-shaped region
—
—
Back cable corridor
full length
centreline CABLE_Y = 131
—
Front cable channel
full length
2.5 … 13
—
The Back Cable Corridor
This is the thing v1 got wrong
Building the wiring mockup is what exposed it. In v1 the socket ribs walled off the back channel and the mid-span lid posts sat directly in it, so the Kraken’s PWR and DATA leads had no route to the adaptor or the Pi. The box would have printed, assembled, and then been unwireable.
CABLE_Y = 131.0 is now a named constant — the centreline of the back cable run, from the Kraken’s rear connector face to the power bay. Three coordinated changes clear it:
1. Lid posts sink 2 mm INTO the wall
_PC = WALL + POST_D / 2.0 - 2.0 # = 4.75
Posts are no longer tangent to the inside wall face — they are pulled 2 mm outboard, embedded in it.
Two independent reasons:
Structural — once the box is split, the frame has no floor for a post to stand on. Merging the post into the wall gives it something to be attached to.
Clearance — pulling the posts outboard is what keeps the back corridor open. The back mid post at X 141.5 now spans Y 136 … 144.5, so it starts exactly where the rib notch ends.
Post positions become (4.75, 4.75) · (141.5, 4.75) · (307.25, 4.75) · (4.75, 140.25) · (141.5, 140.25) · (307.25, 140.25).
A Y 125 … 136 × Z 8 … 32 notch cut through both socket ribs, straddling CABLE_Y = 131. It sits in the gap between the socket bore (ends Y 122) and the mid lid post (starts Y 136) — the corridor threads the needle between them.
Verified by line scan, not by spot-check
A spot check passed; the line scan is what would have caught it
The corridor is now scanned X 40 → 250 in 0.5 mm steps at three Y offsets (CABLE_Y − 2, CABLE_Y, CABLE_Y + 2) at the Kraken’s connector height, and the build fails if any point is solid:
for dy in (-2.0, 0.0, 2.0): x = 40.0 while x <= 250.0: if not is_open(frame, x, CABLE_Y + dy, kz_probe): blocked.append((round(x, 1), CABLE_Y + dy)) x += 0.5chk('back cable corridor clear (%d blocked pts)' % len(blocked), not blocked)
Plus two geometric asserts: the corridor clears the Kraken body (CABLE_Y − 2 > 126.5) and clears the back joint bosses (CABLE_Y + 2 < 134.5).
Wiring Topology
The electrical intent the corridor exists to serve:
12V female inlet ──┬── POSITIVE ─────────────────────────► adaptor (+)
└── GROUND ──► switch ─────────────────► adaptor (−)
│
└── status LED (tapped BEFORE the adaptor,
so it follows the switch)
adaptor ──► Pi 5 power (USB)
adaptor ──► KrakenSDR power (USB)
Pi 5 ◄────► KrakenSDR data (USB)
Wire
Colour in the mockup
Route
12 V +, direct to adaptor
red
inlet → CABLE_Y → socket axis → adaptor in
12 V −, inlet → switch
black
inlet → Y 139 → switch
switch → adaptor GND
black
switch → Y 137 → X 212 → adaptor in
LED + / LED −
red / black, Ø1.6
tapped off the inlet and switch side
adaptor → Pi power
white, Ø3.6
adaptor out → X 258 → Pi back face
adaptor → Kraken power
white, Ø3.6
adaptor out → X 250 → CABLE_Y → X 117.45
Kraken ↔ Pi data
blue, Ø3.6
X 69.65 → CABLE_Y → X 266 → Pi back face
The status LED is tapped ahead of the adaptor
It is wired before the adaptor, on the switched side, so it indicates switch state rather than adaptor output. Wiring it after the adaptor would make it an adaptor-health light instead.
Component Fixing (all on the floor part)
KrakenSDR — 8× M3, heads flush
8 bosses Ø9 mm, 4 mm tall (Z 3 → 7), at X 20.35 / 182.95 (162.6 pitch) × Y 25.35 / 46.90 / 92.60 / 114.15 (88.8 span)
Ø3.4 mm through-holes
Ø6.5 × 1.8 mm counterbore in the bottom face — M3 button head sits flush with the outside of the box, nothing protrudes to rock on a car floor
M3×16, not the stock M3×12
These holes reuse the Kraken’s own case-assembly screws. Adding a 3 mm enclosure floor means the stock M3×12 no longer reaches. Buy M3×16 button head before printing.
Raspberry Pi 5 — 4× M2.5, slotted
4 bosses Ø8 mm, 3 mm tall (Z 3 → 6), at X 221.25 / 279.25 (58 pitch) × Y 23.65 / 72.65 (49 pitch)
Obround holes 2.8 × 6.8 mm — slotted ±2 mm along X
Head recess: stadium 6.0 × 10.0 × 1.8 mm in the bottom face
Fastener M2.5×8
Why slotted
The Pi 5 board’s 58 × 49 hole pattern is exact, but where that board sits inside the official case is not published. The ±2 mm slot absorbs the uncertainty without a second print. See Raspberry Pi 5 Board.
Power Bay
12 V socket cradle (on the frame)
Twin ribs at X 205 … 208.5 and X 223 … 226.5, each spanning Y 88 … 142.5, 39 mm tall (Z 3 … 42)
Each rib carries a Ø28 mm bore centred at Y 108, Z 22 → bore spans Y 94 … 122
Adaptor modelled as Ø28 × 40.5 mm, entering at X 205 and exiting at X 245.5
RIB_NOTCH cut through both ribs at Y 125 … 136, Z 8 … 32 — see the corridor section
Two ribs, not one
A single rib would let a cylindrical 12 V adaptor pivot in its bore. Two spaced bores constrain it in two planes with no extra hardware.
12 V wire entry
Stadium (obround) slot, 3.4 × 6.7 mm, vertical, in the back wall at X 197, Z 30
3.2 mm finished + 0.2 mm print allowance
Bare wire first — a connector will not pass
The slot is deliberately sized for bare conductor only. Thread the wire through before crimping or fitting any connector. Getting this backwards means cutting the wire.
Switch cutout
15.5 × 7.3 mm opening at X 240, Z 24
Two Ø1.9 mm screw holes, 18 mm apart (±9 from centre)
Weakest point of the whole print
The cutout half-width is 7.75 mm and each screw hole’s inner edge lands at 8.05 mm — leaving only a 0.3 mm web between the switch cutout and each screw hole. This is thinner than a typical extrusion width, and the wall is now 2.5 mm rather than 3 mm. Handle the back wall gently during post-processing; if it breaks, widen SWITCH_SCREW_PITCH in CONFIG and reprint rather than gluing.
The self-check explicitly asserts this web is solid (switch web L), so a CONFIG edit that eats it fails loudly.
Status LED — changed in v2
Value
Bore
Ø6.6 mm straight through the back wall, no step
Collar
Ø14 × 4 mm, round, on the inside face at Y 138.5 … 142.5
Total grip
6.5 mm = 2.5 mm wall + 4 mm collar
Position
X 275, Z 24
v1 misread the LED datum — the 24.4 mm was not a panel dimension
v1 modelled a 24.4 × 6.5 mm rectangular window with a rectangular collar. That was wrong: the part is a singular pre-wired 12 V LED with a 6.5 mm sleeve, and 24.4 mm was its overall length including the leads, not anything that touches the panel.
The correct feature is a plain Ø6.6 mm bore (6.5 sleeve + 0.1 clearance) with a round Ø14 × 4 mm collar behind the wall to give the sleeve enough grip. If a future note or export mentions a 24.4 mm LED window, it is v1 and wrong.
Cable Exits
Wall
Opening
Front
5× SMA slots, 14 mm wide × Z 10 … 30, at X 44.1572.0599.95127.85155.75 — the Kraken’s own 27.9 mm pitch, offset −1.7 mm from its body centre
Front
2× Pi port slots: X 206 … 245 and X 252 … 294, Z 7 … 27
Back
NOISE / aux slot, X 158 … 183, Z 10 … 30
Airflow and Lightening
No fans in the box beyond the Kraken’s own.
Feature
Detail
End-wall vents
14 per end, 3 mm wide, 8 mm pitch, Z 10 … 34, Y 20 … 124
Back-wall vents
14, same profile, X 20 … 130
Lid grilles
6 mm slots at 10 mm pitch, 22 slots across three zones (below)
Floor lightening grid
doubles as under-unit airflow, hidden by the devices from above (below)
Lid grilles — enlarged in v2
Zone
X span
Y centres
Slots
Over the Kraken fan
30 … 175
22, 32 … 112
10
Over the Pi
205 … 295
18, 28 … 78
7
Over the power bay
205 … 295
92, 102 … 132
5
v1 used 4 mm slots; v2 uses 6 mm (GRILLE_W). Wider slots remove more material and vent better — the lid gains nothing structurally from the extra plastic.
Floor lightening grid — new in v2
Zone
Geometry
Under the Kraken
10 slots, 8 mm wide at 14 mm pitch, X 37 … 163, spanning Y 22 … 112
Under the Pi
3 slots, 8 mm wide, X 205 … 295, at Y centres 32 / 44 / 56
Three jobs from one feature
The grid removes mass, admits airflow under both units, and is invisible in the finished build because it sits directly beneath the Kraken and the Pi. It also replaces v1’s separate “floor drains”.
Cable Management
Zip-tie anchors — paired 3 mm slots with a 4 mm bridge between them (so each anchor is a pair at x and x + 7), all in the floor:
Run
Y span
X positions
Back corridor
130 … 140
30, 60, 90, 120, 240, 270
Front channel
4 … 12
20, 168, 250, 285
Power bay
88 … 98
240, 270
The back run straddles CABLE_Y = 131, so the Kraken’s power and data leads tie down along the corridor they run in.
Lid
Item
Value
Thickness
2.4 mm
Fasteners
6× M3 self-tapping into Ø8.5 mm posts, 44 mm tall, Ø2.5 mm pilot
Ø3.4 through + Ø6.2 × 1.0 mm counterbore from the top face
Register lip
2 mm tall, 2 mm wide, sitting 0.4 mm inboard of the interior wall
The register lip is four straight segments, not a loop
X 25 … 287 at Y 2.9 … 4.9 (front)
X 25 … 287 at Y 140.1 … 142.1 (back)
Y 25 … 120 at X 2.9 … 4.9 (left)
Y 25 … 120 at X 307.1 … 309.1 (right)
Two reasons the lip stops short
A continuous loop would run into the corner lid posts.
It would also collide with the frame’s interior fillet, where there is no flat wall to register against.
Where the lip crosses the two mid posts at X 141.5, a matching relief cut is taken out of the frame (a 2.4 mm-deep cut from Z 44.8) so the lip still seats.
Car Mount Ears (on the floor)
2 pairs at X 60 and X 252, each 30 mm long × 14 mm out × 3 mm thick (EAR_H = FLOOR)
Stadium slots 5.5 × 12 mm in each ear, centred at Y −7 and Y 152
Print
Parts
3 — floor, frame, lid, each printed flat with no supports
Hotend
0.4 mm — the constraint that forced the split
Print order
floor first (~2.5 h) so hardware can be bolted in and wired while frame prints
Fits
Bambu Lab H2S (340 × 320 × 340) with no diagonal trick — 312 < 340
Material
⛔ ASA, PETG or PC only
Volume
291.6 cm³ total, down 23 % from v1’s 384 cm³
PLA will fail in a parked car
A dashboard or parcel shelf reaches 70–80 °C in the sun, at or above PLA’s glass transition. A PLA box will sag and drop the hardware. Use ASA, PETG or PC.
ASA and PC are the safer picks on heat; PETG’s HDT is the marginal one of the three. Note the drying constraint from bambu-h2s-material-reference: the AMS 2 Pro’s 65 °C ceiling cannot dry ASA or PC — only an AMS HT can.
Exports sit flat on Z = 0
The script moves each body onto the plate before exporting, then deletes the move features so the parametric model is untouched:
Part
As modelled
As exported
floor
Z 0 … 7
Z 0 … 7 (already flat)
frame
Z 3 … 47
translated −3 → Z 0 … 44
lid
Z 45 … 49.4
rotated 180° about X so the top face is on the plate → Z 0 … 4.4
Flipping the lid puts the grille slots and counterbores facing down and the flat inner face up, so the lip prints upward with no bridging.
Verification
The build script does not trust the render. 102 body.pointContainment() assertions, plus a dense line scan of the cable corridor:
every SMA slot open, and the wall between two of them still solid
12 V wire slot, switch cutout, both switch screw holes open — and the 0.3 mm web solid
LED bore open through both the wall and the collar, and the collar material around it solid
both socket bores open, the rib notch open, and the rib between the bore and the notch still solid
the whole back cable corridor: X 40 → 250 in 0.5 mm steps at three Y offsets = 1 260 probes, all must be open
all 8 Kraken holes open with their boss bodies solid; all 4 Pi slots probed at x + 2 to prove they are really slotted
for each of the 10 joint screws: hole open in the floor, pilot open in the frame, boss material solid
for each of the 6 posts: pilot open, post body solid, lid screw hole open, counterbore floor solid
floor grid slot open and its rib solid; lid grille slot open and its rib solid; lip present at the front, absent mid-span
Result: 102 run, 0 failed.
Never verify an enclosure by looking at a screenshot
A render sees straight through an opening to the far wall, so a hole in the near wall and a hole in the far wall look identical, and a hole that is 2 mm off looks fine. Point containment and line scans are what actually caught the errors.
And a spot-check is not a scan. The v1 corridor collision passed spot-checks and was only found by building the wiring mockup and then re-verifying with a full line scan. See fusion360-mcp-scripting.