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 project here is a jetson nano case with fan support. The 4 main goals of this design:
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))
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.