Computer aided design

Jetson Nano Case

Jetson Nano Case

Sometime ago I acquired a jetson nano 2gb SBC and after using it a bit I felt the need to overclock it. The problem is that it runs hot even at default clock speeds, so I needed a fan. But the fan needs to be mounted somewhere right?

Yes there is some holes on the big heatsink that comes with the board but the silicone screws that come with the noctua fan don’t fit. Maybe a 3d printed case with fan mounts will do it, I thought to myself.

Unfortunately, none of the 3d printed cases I found on the web could sit on standing up position as I wanted, So I decided to make my own.

The 3d printed case

The project here is a jetson nano case with fan support. The 4 main goals of this design:

  • The case should allow flat and upright orientation, as the former takes advantage of natural convection.
  • It should look good, because it will be on the tv rack.
  • Access to the GPIO pins should be easy (that’s the reason for the split dust cover).
  • The fan should mount on the case, allowing the use of the silicone mounts that comes in the box of the noctua fan. The reason for this is to avoid the need of extra hardware.

I used cadquery to model the case and cover. It was easy to dial in the dimensions this way.

import cadquery as cq 

# board cover
board_length = 102.0
board_width = 81.0
height = 13.0
shell_thickness = 0.9
mount_holes_offset_x =4.8
mount_holes_offset_y =18.0

usbc_offset = 1.8
usbc_width = 10.0
usbc_height = 5.0

hdmi_offset = 16.0
hdmi_width = 16.5
hdmi_height = 9.0

singleusb_offset = 35.0
singleusb_width = 16.0
singleusb_height = 10.0

doubleusb_offset = 53.0
doubleusb_width = 16.0
doubleusb_height = 18.0

ether_offset = 68.0
ether_width = 18.0
ether_height = 18.0

usbb_offset = 88.0
usbb_width = 9.0
usbb_height = 5.0

cover = cq.Workplane("front").box(board_length, board_width, height, centered=False) .\
    faces("<Z").shell(shell_thickness) .\
    faces(">Z").workplane().move(18.0, 40.0).rect(61.0, 48.0, centered=False).cutThruAll() .\
    faces(">Z").workplane().move(65.0, 0).rect(14.0, board_width, centered=False).cutThruAll() .\
    faces(">Z[-2]").workplane().move(mount_holes_offset_x, -mount_holes_offset_y).rect(86.0, -58.0, centered=False, forConstruction=True).vertices().circle(2.0).extrude(height-3.0) .\
    faces(">Z[-2]").workplane().move(mount_holes_offset_x, -mount_holes_offset_y).rect(86.0, -58.0, centered=False, forConstruction=True).vertices().circle(1.25).extrude(height) .\
    faces("<Y[-2]").workplane().rect(-board_length,-height, centered=False).extrude(10.0) .\
    faces("<Z").workplane().move(usbc_offset, -10.0).rect(usbc_width, 10.0+shell_thickness, centered=False).cutBlind(-usbc_height) .\
    faces("<Z").workplane().move(hdmi_offset, -10.0).rect(hdmi_width ,10.0+shell_thickness, centered=False).cutBlind(-hdmi_height) .\
    faces("<Z").workplane().move(singleusb_offset, -10.0).rect(singleusb_width ,10.0+shell_thickness, centered=False).cutBlind(-singleusb_height) .\
    faces("<Z").workplane().move(doubleusb_offset, -18.2).rect(doubleusb_width ,24.0, centered=False).cutBlind(-doubleusb_height) .\
    faces("<Z").workplane().move(ether_offset, -22.5).rect(ether_width ,24.0, centered=False).cutBlind(-ether_height) .\
    faces("<Z").workplane().move(usbb_offset, -10.0).rect(usbb_width ,10.0+shell_thickness, centered=False).cutBlind(-usbb_height) .\
    faces("<Z").workplane().move(0, -1.0).rect(board_length, -10.0, centered=False).cutBlind(-3.0)

cover = cover.translate((3, shell_thickness, 3))

# case
case_length = 105
case_height = 52
case_thickness = 1.5
top_thickness = 3.0
holes_offset_x = -2.0
holes_offset_y = 18.0

case_back = cq.Workplane("front").box(case_length+case_thickness, board_width+shell_thickness*2, shell_thickness, centered=False) .\
    faces("<Z").workplane().rect(case_thickness/2.0, -40.0, centered=False).extrude(-case_height-case_thickness) .\
    faces("<Z").workplane().move(case_length+case_thickness/2.0, 0).rect(case_thickness/2.0, -board_width-shell_thickness*2, centered=False).extrude(-case_height-case_thickness) .\
    faces(">Z").workplane().rect(10.0, 40.0, centered=False).extrude(-10.0) .\
    faces(">Z").workplane().move(case_length+case_thickness/2.0, 0).rect(-10.0, +board_width+shell_thickness*2, centered=False).extrude(-10.0) .\
    faces(">Z").workplane().pushPoints([(5.0, 20.0 ), (100.0+case_thickness, 10.0), (100.0+case_thickness, 71.0)]).hole(4.6, 10.0)

case_top = cq.Workplane("front").box(case_length+case_thickness, board_width+shell_thickness*2, top_thickness, centered=False) .\
    faces(">Z").workplane().pushPoints([(5.0, 20.0 ), (100.0+case_thickness, 10.0), (100.0+case_thickness, 71.0)]).cskHole(5.8, 8.0, 82.0) .\
    faces(">Z").workplane().move(0, 40).lineTo(34.0, board_width+shell_thickness*2).lineTo(0, board_width+shell_thickness*2).close().cutThruAll() .\
    faces(">Z").workplane(centerOption="CenterOfBoundBox").move(holes_offset_x, holes_offset_y).rect(32.0, 32.0, forConstruction=True).vertices().hole(5.6) .\
    faces(">Z").workplane(centerOption="CenterOfBoundBox").move(holes_offset_x, holes_offset_y).hole(38.5)

case_top = case_top.translate((0,0, 54.0))
Jetson Nano

I liked the way it turned out.

If I ever need to use any GPIO I can easily remove only that specific cover and that’s it.

I have to mention that mounted this way, with the silicone mounts from noctua, this setup is absolutely silent. I really can’t hear the fan under 60% PWM, not even very close to it.

That’s about it for today, 🤘🏽

Thanks for reading.