Computer aided design

Jetson nano case

Jetson nano case

Sometime ago I acquired a jetson nano 2gb SBC (Single board Computer) and after using it a bit I felt I needed 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 case should stand in a way that the heat from the heat sink takes advantage of the natural convection. Also it should look good, because it will be on the tv rack.

I used again cadquery to model the case and cover. It was easy to dial in the dimensions this way. The idea here was to use the self tapping screws and the silicone mounts that came with the fan, so I didn’t need to buy any extra hardware.

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_cover_1

I liked the way it turned out. If I ever need to use any GPIO I can easily remove that side of the cover, also.

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.