initial commit
This commit is contained in:
Binary file not shown.
4
README.md
Normal file
4
README.md
Normal file
@@ -0,0 +1,4 @@
|
||||
Snap together case for Orange Pi 5 with fan mount
|
||||
=================================================
|
||||
|
||||
cribbed from [Printables](https://www.printables.com/model/448089-snap-together-case-for-orange-pi-5-with-fan-mount/files)
|
||||
49
case-bottom.scad
Normal file
49
case-bottom.scad
Normal file
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
|
||||
* http://creativecommons.org/licenses/by-nc-sa/4.0/
|
||||
*
|
||||
* Author: Isaac Foraker
|
||||
*/
|
||||
|
||||
include <common.scad>
|
||||
|
||||
$fn=32;
|
||||
|
||||
module base() {
|
||||
difference() {
|
||||
cube([l, w, t]);
|
||||
for (i = [1:7]) {
|
||||
translate([t+5, 7.75*i+t, 0]) slat();
|
||||
}
|
||||
}
|
||||
translate([t+post_offset,t+post_offset,t]) post();
|
||||
translate([l-t-post_offset,t+post_offset,t]) post();
|
||||
translate([t+post_offset,w-t-post_offset,t]) post();
|
||||
translate([l-t-post_offset,w-t-post_offset,t]) post();
|
||||
translate([0,0,t]) {
|
||||
difference() {
|
||||
cube([l,t,post_height+1.5]);
|
||||
// Ribbon port
|
||||
translate([t+62,-0.01,t+post_height-3.5])
|
||||
cube([21,t+0.02,4]);
|
||||
}
|
||||
difference() {
|
||||
cube([t,w,post_height+1.5]);
|
||||
translate([-0.01, w/2-4, post_height-0.5]) cube([t+0.02, 8, 5]);
|
||||
}
|
||||
translate([0,w-t,0]) cube([l,t,post_height+1.5]);
|
||||
difference() {
|
||||
// Cut notches to make it easier to remove the board with a tool
|
||||
translate([l-t,0,0]) cube([t,w,post_height+1.5]);
|
||||
translate([l-t-0.01, w/2-4, post_height-0.5]) cube([t+0.02, 8, 5]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module post() {
|
||||
cylinder(h=post_height, r=2.5);
|
||||
cylinder(h=post_height+3, r=1.33);
|
||||
translate([0,0,post_height+3]) sphere(r=1.33);
|
||||
}
|
||||
|
||||
base();
|
||||
BIN
case-bottom.stl
Normal file
BIN
case-bottom.stl
Normal file
Binary file not shown.
146
case-top.scad
Normal file
146
case-top.scad
Normal file
@@ -0,0 +1,146 @@
|
||||
/*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
|
||||
* http://creativecommons.org/licenses/by-nc-sa/4.0/
|
||||
*
|
||||
* Author: Isaac Foraker
|
||||
*/
|
||||
|
||||
include <common.scad>
|
||||
|
||||
$fn=32;
|
||||
|
||||
wall_height = 20;
|
||||
|
||||
//fan_middle_x = l - t - fan_side/2;
|
||||
//fan_middle_y = w - t*6 - fan_side/2;
|
||||
fan_middle_x = l/2;
|
||||
fan_middle_y = w/2;
|
||||
|
||||
module top1() {
|
||||
difference() {
|
||||
cube([l, w, t]);
|
||||
for (i = [1:7]) {
|
||||
translate([t+5, 7.75*i+t, 0]) slat();
|
||||
}
|
||||
}
|
||||
translate([0,0,t]) {
|
||||
// bottom wall
|
||||
difference() {
|
||||
cube([l,t,wall_height]);
|
||||
// Ribbon connector
|
||||
translate([t+17.5,-0.01,wall_height-2.5])
|
||||
cube([21,t+0.02,5]);
|
||||
// USB-C
|
||||
translate([t+40.5,-0.01,wall_height-4])
|
||||
cube([9.25,t+0.02,5]);
|
||||
// HDMI
|
||||
translate([t+54.75,-0.01,wall_height-6.5])
|
||||
cube([15.5,t+0.02,7]);
|
||||
// Audio
|
||||
translate([t+74.5,-0.01,wall_height-5.6])
|
||||
cube([6.4,t+0.02,7]);
|
||||
// USB-C
|
||||
translate([t+84,-0.01,wall_height-4])
|
||||
cube([9.25,t+0.02,5]);
|
||||
}
|
||||
// left wall
|
||||
difference() {
|
||||
cube([t,w,wall_height]);
|
||||
// Vertical USB-A
|
||||
translate([-0.01,t+7.75,wall_height-15])
|
||||
cube([t+0.02,6.5,16]);
|
||||
// Ethernet
|
||||
translate([-0.01,t+19.2,wall_height-14])
|
||||
cube([t+0.02,16.5,15]);
|
||||
// Stacked USB-A
|
||||
translate([-0.01,t+40,wall_height-16.5])
|
||||
cube([t+0.02,15,18]);
|
||||
}
|
||||
// top wall
|
||||
translate([0,w-t,0]) cube([l,t,wall_height]);
|
||||
// right wall
|
||||
difference() {
|
||||
translate([l-t,0,0]) cube([t,w,wall_height]);
|
||||
// Reset button
|
||||
translate([l-t-0.01,t+14,wall_height-2.25]) {
|
||||
cube([t+0.02,3,5]);
|
||||
translate([0,1.5,0]) rotate([0,90,0]) cylinder(h=t+0.02, r=1.5);
|
||||
}
|
||||
// MicroSD
|
||||
translate([l-t-0.01,t+39.5,wall_height-2.5])
|
||||
cube([t+0.02,15,5]);
|
||||
}
|
||||
}
|
||||
|
||||
color("red") {
|
||||
// bottom left
|
||||
translate([t+post_offset,t+post_offset,t]) post();
|
||||
// top left
|
||||
translate([l-t-post_offset,t+post_offset,t]) post();
|
||||
// bottom right
|
||||
translate([t+post_offset,w-t-post_offset,t]) post();
|
||||
// top right
|
||||
translate([l-t-post_offset,w-t-post_offset,t]) post();
|
||||
}
|
||||
}
|
||||
|
||||
module post() {
|
||||
difference() {
|
||||
cylinder(h=wall_height-0.4, r=2.65);
|
||||
translate([0,0,wall_height-6])
|
||||
cylinder(h=6.01, r=1.45);
|
||||
}
|
||||
}
|
||||
|
||||
module top2() {
|
||||
// Take the basic top case and build a spot for a fan
|
||||
fw = 4.5;
|
||||
difference() {
|
||||
union() {
|
||||
top1();
|
||||
// Create a solid square for the fan before cutting out
|
||||
// the opening for the fan, then cut holes in it for
|
||||
// optional screws
|
||||
translate([fan_middle_x-fan_side/2-t, fan_middle_y-fan_side/2-t-1, 0])
|
||||
cube([fan_side+t*2, fan_side+t*2+3, t]);
|
||||
color("yellow") translate([fan_middle_x-fan_side/2-t, fan_middle_y-fan_side/2-t, t]) {
|
||||
cube([fan_side+t, t, fw]);
|
||||
difference(){
|
||||
cube([t, fan_side+t*2, fw]);
|
||||
// Cut channel for wires
|
||||
translate([-0.01, fan_side+t-fan_wire_offset-fan_wire_width, 0])
|
||||
cube([t+0.02, fan_wire_width, fan_thickness]);
|
||||
}
|
||||
translate([fan_side+t, 0, 0]) cube([t, fan_side+t*2, fw]);
|
||||
translate([0,fan_side+t,0])
|
||||
cube([fan_side+t, t, fw]);
|
||||
}
|
||||
}
|
||||
// Cut out the big opening for fan airflow
|
||||
translate([fan_middle_x, fan_middle_y, -0.01]) {
|
||||
cylinder(h=t+0.02, r=fan_opening/2+0.5);
|
||||
}
|
||||
}
|
||||
// Build the fan screen
|
||||
color("green") translate([fan_middle_x, fan_middle_y, -0.01]) {
|
||||
cylinder(h=1.5, r=7.5);
|
||||
for (x = [0:2]) rotate([0,0,120*x+30]) {
|
||||
translate([0,-1,0]) cube([fan_side/2, t, 1.5]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module top3() {
|
||||
// Cut screw holes into the top
|
||||
difference() {
|
||||
top2();
|
||||
translate([fan_middle_x, fan_middle_y, -0.01]) {
|
||||
for (i = [0:3]) rotate([0,0,90*i]) {
|
||||
translate([fan_side/2-2.8, fan_side/2-2.8, 0])
|
||||
cylinder(h=t+0.02, r=1.5); // m3 x 10 probably will work
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
top3();
|
||||
BIN
case-top.stl
Normal file
BIN
case-top.stl
Normal file
Binary file not shown.
49
m.2-riser.scad
Normal file
49
m.2-riser.scad
Normal file
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
|
||||
* http://creativecommons.org/licenses/by-nc-sa/4.0/
|
||||
*
|
||||
* Author: Isaac Foraker
|
||||
*/
|
||||
|
||||
// A simple riser to install an M.2 2242 NVMe drive
|
||||
|
||||
$fn=32;
|
||||
|
||||
opening = 3.2; // Hole in board
|
||||
board_depth = 1.4; // How thick is the board?
|
||||
riser_height = 1; // How tall should the riser be?
|
||||
nvme_thickness = 1.5; // How thick is the NVMe drive?
|
||||
|
||||
height = board_depth + riser_height + nvme_thickness + 2;
|
||||
|
||||
module part1() {
|
||||
difference() {
|
||||
union() {
|
||||
// Draw board clip
|
||||
resize([3.6,3.6,2.8]) sphere(r=3);
|
||||
// Draw main post
|
||||
translate([0,0,0.65]) cylinder(h = height, r = opening/2);
|
||||
}
|
||||
// Cut a slot in the post to allow it to flex through the board
|
||||
translate([-0.5,-2,-1.5]) cube([1,4,4]);
|
||||
}
|
||||
translate([0,0,0.65]) {
|
||||
// Board rest
|
||||
translate([0, 0, board_depth]) cylinder(h=riser_height, r=3.5);
|
||||
}
|
||||
translate([0,0,0.65+height-2]) {
|
||||
// NVMe drive clip
|
||||
intersection() {
|
||||
cylinder(h=2,r=3.5);
|
||||
translate([-opening/2,-8,0]) cube([opening, 8, 2]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Now turn the model on its side, slightly sunken beneath the plain, and wrap it in a bounding box to flatten the bottom so it can print without supports.
|
||||
intersection() {
|
||||
translate([0,-1,1.25]) rotate([-90,0,0]) {
|
||||
part1();
|
||||
}
|
||||
translate([-4,-3,0]) cube([8,10,6]);
|
||||
}
|
||||
BIN
m.2-riser.stl
Normal file
BIN
m.2-riser.stl
Normal file
Binary file not shown.
Reference in New Issue
Block a user