rack case design branch merge and sbcmf update
This commit is contained in:
116
README.md
116
README.md
@@ -56,14 +56,15 @@ NOTE: The submodule *SBC Model Framework* needs to be updated anytime SBC Case B
|
||||
- Paper, Folded - complete
|
||||
- Standard MB SBC Adapters & io plates - completed
|
||||
+ SSI-EEB, SSI-CEB, ATX, Micro-ATX, DTX, Flex-ATX, Mini-DTX, Mini-Itx, Mini-ITX Thin, Mini-STX, Mini-STX Thin
|
||||
- Standard MB Cases - completed
|
||||
- Standard MB Cases - complete
|
||||
+ SSI-EEB, SSI-CEB, ATX, Micro-ATX, DTX, Flex-ATX, Mini-DTX, Mini-ITX, Mini-ITX Thin, Mini-STX, Mini-STX Thin, Nano-ITX, NUC, Pico-ITX
|
||||
- Sheet Metal, Folded
|
||||
- NAS - panel_nas complete
|
||||
- Rack - 1U and 2U complete
|
||||
- Stacked Levels
|
||||
- Sliding
|
||||
- Cylinder
|
||||
- Free Form
|
||||
- NAS
|
||||
- Rack
|
||||
- Sheet Metal, Folded
|
||||
- CNC Cases
|
||||
|
||||
All case data is stored in the json file sbc_case_builder.json with the accessory data stored in a separate file structure in sbc_case_builder_accessories.cfg. An accessory group name for a given case is stored as part of the case data in the json file. This allows for the reuse or sharing of an accessory set by different cases and can be used to manage groups of accessories.
|
||||
@@ -88,6 +89,10 @@ This tab exclusively deals with folded cases. At this time the bend allowance e
|
||||
Both standard motherboard adapters and cases can be generated with SBC Case Builder and this tab controls the specific settings. Since it is not possible to know the motherboard thickness it is set to 2mm and the *standard motherboard thickness* setting is used to add or subtract thickness for an accurate representation of the user provided PCB. The *rear io shield* setting is only used when generating full cases and is not needed when generating adapters and io shields. Most of the adjustments in the *3D Case Adjustments* tab also work for motherboard adapters which allows for the SBC or other device to be repositioned on the adapter while providing the full use of the accessory subsystem. Any accessory entries in the sbc_case_builder_accessories.cfg file should reference the bottom face. The *bottom cover pattern* in the *Fan and Vent Openings* tab and the *SBC Bottom Standoff* tabs also apply to motherboard adapters. There are predefined example cases and adapters available in the GUI for further reference.
|
||||
|
||||
|
||||
### Rack Mount Case Adjustments Tab
|
||||
Both 1U and 2U, 10" and 19", rack cases are configured in this tab. The first entry *rack width* selects if 10" or 19" rack cases are being created. The *rack size* sets wether 1U or 2U. The remaining tab is divided into six groups of settings each representing a virtual bay. Each bay group specifies the SBC thru the pickbox *Rack Bay1* respectively. With *rack bay1 xyz loc* and *rack bay1 rotation determining the position and z-axis rotation. The type of bay is set in the *rack bay1 face* pickbox followed by two checkboxes for the internal dividing wall, rear fan and a bay conduit selection pickbox.
|
||||
|
||||
|
||||
### 3D Case Adjustments Tab
|
||||
The *3D Case Adjustments* tab makes up the bulk of the possible case adjustments for 3D printed cases. Most of the entries in this tab are self explanatory. The *pcb loc* adjustments allow the selected device model to be moved in the case design, the *case offset* adjustments increase the selected case design dimensions. The *wallthick*, *floorthick* and *sidethick* adjust their respective areas. Do note that the *floorthick* adjustment also determines the ceiling thickness for all case designs and the *sidethick* only affects the tray_sides, tray_vu5, tray_vu7 case designs. The *gap* entry is the distance between the device PCB and the sidewall of the case design. The *tol* adjustment, located at the bottom of the tab, is a tolerance fitment adjustment for the snap, fitted, round and hex case design tops. Adjust accordingly if the tops are too tight or loose.
|
||||
|
||||
@@ -214,12 +219,12 @@ Multi-associative parametric positioning of accessories is implemented and allow
|
||||
|
||||
### classes: add1, sub, suball, add2, model, platter
|
||||
|
||||
Class *add1* and *add2* are used to add geometry to the case. The difference is when the addition occurs. *add1* happens at the beginning when the core case geometry is created before any subtractions and *add2* happens at the end after all subtractions have occurred. *suball* is used to affect all faces of a case, not just a single face. The “face” is the case piece that will be effected by the addition or subtraction. The *model* class is for placing supporting accessories in the model view. e.g. hard drives, fans. The *platter* class is for adding supporting accessories, that are not part of the core case geometry, to the print platter for printing e.g. an access panel cover.
|
||||
Class *add1* and *add2* are used to add geometry to the case. The difference is when the addition occurs. *add1* happens at the beginning when the core case geometry is created before any subtractions and *add2* happens at the end after all subtractions have occurred. *suball* is used to affect all faces of a case, not just a single face. The “face” is the case piece that will be effected by the addition or subtraction. The *model* class is for placing supporting accessories in the model view. e.g. hard drives, fans. The *platter* class is for adding supporting accessories, that are not part of the core case geometry, to the print platter for printing e.g. a fan cover or access panel cover.
|
||||
|
||||
|
||||
**additive type:**
|
||||
|
||||
art, access_panel, batt_holder, button, button_assembly, fan_cover, feet, hd_holder, hk_boom_grill, hk_boom_speaker_holder, hk_boom_vring, hk_h3_port_extender_holder, hk_hc4_oled_holder, hk_uart_holder, hk_uart_strap, keyhole, nut_holder, pcb_holder, rectangle, round, slot, sphere, standoff, text, vent_panel_hex, uart_holder, hc4_oled_holder, button, pcb_holder
|
||||
art, access_panel, batt_holder, button, button_assembly, fan_cover, feet, grommet, hd_holder, hk_boom_grill, hk_boom_speaker_holder, hk_boom_vring, hk_h3_port_extender_holder, hk_hc4_oled_holder, hk_uart_holder, hk_uart_strap, keyhole, nut_holder, panel_clamp, pcb_holder, rectangle, round, slot, sphere, standoff, text, vent_panel_hex, uart_holder, hc4_oled_holder, button, pcb_holder
|
||||
|
||||
|
||||
**subtractive type:**
|
||||
@@ -234,7 +239,7 @@ access_cover, adafruit_lcd, dsub, fan, hd25, hd35, hk_boom, hk_boom_speaker, hk_
|
||||
|
||||
**platter type:**
|
||||
|
||||
access_cover, button_assembly, fan_cover, feet, hk_boom_vring, hk_h3_port_extender_holder, hk_uart_strap, vent_panel_hex
|
||||
access_cover, button_assembly, fan_cover, feet, grommet, hk_boom_vring, hk_h3_port_extender_holder, hk_uart_strap, vent_panel_hex
|
||||
|
||||
|
||||
## Accessory Reference Manual
|
||||
@@ -459,6 +464,35 @@ DESCRIPTION: creates case feet.
|
||||
```
|
||||
|
||||
|
||||
### grommet
|
||||
|
||||
```
|
||||
CLASSES: add1, add2, platter
|
||||
DESCRIPTION: creates different groumet styles.
|
||||
MASK: yes
|
||||
USAGE: "class", "grommet", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
|
||||
|
||||
class = "add1", "add2", "platter"
|
||||
type = "grommet"
|
||||
loc_x = x location placement
|
||||
loc_y = y location placement
|
||||
loc_z = z location placement
|
||||
face = "top", "bottom", "right", "left", "front", "rear"
|
||||
rotation[] = object rotation
|
||||
parametric[] = "case", "sbc", "sbc-case_z"
|
||||
size[0] = od outside diameter of grommet body
|
||||
size[1] = id inside hole diameter of grommet body
|
||||
size[2] = wall thickness of installation
|
||||
data[0] = "top","bottom","front","rear","left","right"
|
||||
data[1] = "sleeve"
|
||||
data[2] = assembled true, false
|
||||
mask[0] = true enables component mask
|
||||
mask[1] = mask length
|
||||
mask[2] = mask setback
|
||||
mask[3] = mstyle "default"
|
||||
```
|
||||
|
||||
|
||||
### hd_holder
|
||||
|
||||
```
|
||||
@@ -771,6 +805,35 @@ DESCRIPTION: creates nut holder of various styles.
|
||||
```
|
||||
|
||||
|
||||
### panel_clamp
|
||||
|
||||
```
|
||||
CLASSES: add1, add2
|
||||
DESCRIPTION: creates clamps to join two panels.
|
||||
MASK: yes
|
||||
USAGE: "class", "panel_clamp", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
|
||||
|
||||
class = "add1", "add2"
|
||||
type = "panel_clamp"
|
||||
loc_x = x location placement
|
||||
loc_y = y location placement
|
||||
loc_z = z location placement
|
||||
face = "top", "bottom", "right", "left", "front", "rear"
|
||||
rotation[] = object rotation
|
||||
parametric[] = "case", "sbc", "sbc-case_z"
|
||||
size[0] = top diameter or x size in mm
|
||||
size[1] = bottom diameter or y size in mm
|
||||
size[2] = clamp height in mm
|
||||
data[0] = orientation "top","bottom","rear","front","left","right"
|
||||
data[1] = "sloped"
|
||||
data[2] = "m2", "m2.5", "m3", "m4"
|
||||
mask[0] = false
|
||||
mask[1] = length
|
||||
mask[2] = set back
|
||||
mask[3] = mstyle "default", "holes"
|
||||
```
|
||||
|
||||
|
||||
### pcb_holder
|
||||
|
||||
```
|
||||
@@ -2088,6 +2151,35 @@ DESCRIPTION: creates case feet.
|
||||
```
|
||||
|
||||
|
||||
### grommet
|
||||
|
||||
```
|
||||
CLASSES: add1, add2, platter
|
||||
DESCRIPTION: creates different groumet styles.
|
||||
MASK: yes
|
||||
USAGE: "class", "grommet", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
|
||||
|
||||
class = "add1", "add2", "platter"
|
||||
type = "grommet"
|
||||
loc_x = x location placement
|
||||
loc_y = y location placement
|
||||
loc_z = z location placement
|
||||
face = "top", "bottom", "right", "left", "front", "rear"
|
||||
rotation[] = object rotation
|
||||
parametric[] = "case", "sbc", "sbc-case_z"
|
||||
size[0] = od outside diameter of grommet body
|
||||
size[1] = id inside hole diameter of grommet body
|
||||
size[2] = wall thickness of installation
|
||||
data[0] = "top","bottom","front","rear","left","right"
|
||||
data[1] = "sleeve"
|
||||
data[2] = assembled true, false
|
||||
mask[0] = true enables component mask
|
||||
mask[1] = mask length
|
||||
mask[2] = mask setback
|
||||
mask[3] = mstyle "default"
|
||||
```
|
||||
|
||||
|
||||
### hk_boom_speaker_holder
|
||||
|
||||
```
|
||||
@@ -2220,6 +2312,16 @@ DESCRIPTION: creates hex pattern covers for vent openings.
|
||||
```
|
||||
|
||||
|
||||
## Case Build Notes
|
||||
This area covers specific build notes for specific cases. Hardware used or other relavent information is list by case design name.
|
||||
|
||||
### panel_nas Case Design
|
||||
The panel_nas design can be CNC cut or 3D printed. By changing the top and bottom standoff type to "none" in the *SBC Standoff Global Settings* tabs respectively, only a hole is generated for CNC cutting support. Panels can be exported in DXF or SVG by selecting the *part" view under the *view* tab, then the indivual part and select the *section part* checkbox. After the projection has been generated render it by pressing F7 or by selecting render from the user interface. Exported DXF and SVG file formats are available under the File->Export menu.
|
||||
|
||||
### rack Case Design
|
||||
This case is divided into 3 pieces for the 19" cases and 2 pieces for the 10" cases. They can be selected in the *part* view for STL export under the *view* tab by selecting the left, bottom or right individual part. The peices are held together using M2x8mm screws and nuts. The 10 inch cases requires 5 sets of screws and nuts and the 19" rack case takes 10 sets.
|
||||
|
||||
|
||||
## Accuracy
|
||||
|
||||
In the past there was been no way of validating whether a SBC Model Framework model and its components were dimensionaly accurate in their size and placement other then trial and error. Along with producing cases this project provides a much needed model validation tool to assure model accuracy thru the use of test cases. It works on the very simple premise that if the real SBC fits the test case then the virtual model is accurate or otherwise shows were corrections are needed. This will further increased the overall accuracy of models over time.
|
||||
|
||||
Submodule SBC_Model_Framework updated: ad4ba818a7...0128dd7014
@@ -1,10 +1,11 @@
|
||||
// Gets a list of SBCs from the SBC Model Framework and Accessory sets
|
||||
// for use with SBC Case Builder.
|
||||
// After running this script, copy the output from the first Echo command into the
|
||||
// list of SBC boards in `sbc_case_builder.scad:32`
|
||||
// Also copy the output from the second Echo command into the list of case acceessory
|
||||
// sets in `sbc_case_builder.scad:196`
|
||||
|
||||
/* Gets a list of SBCs from the SBC Model Framework and Accessory sets
|
||||
for use with SBC Case Builder.
|
||||
After running this script, copy the output from the first Echo command into the
|
||||
list of SBC boards in `sbc_case_builder.scad:32` and `sbc_case_builder.scad`
|
||||
6 locations line 82,90,98,106,114,122 for the sbc selection for the rack case design.
|
||||
Also copy the output from the second Echo command into the list of case acceessory
|
||||
sets in `sbc_case_builder.scad:196`
|
||||
*/
|
||||
include <./SBC_Model_Framework/sbc_models.cfg>;
|
||||
include <./sbc_case_builder_accessories.cfg>;
|
||||
echo(" ");
|
||||
|
||||
109
lib/grommet.scad
Normal file
109
lib/grommet.scad
Normal file
@@ -0,0 +1,109 @@
|
||||
/*
|
||||
This file is part of SBC Case Builder https://github.com/hominoids/SBC_Case_Builder
|
||||
Copyright 2022,2023,2024,2025 Edward A. Kisiel hominoid@cablemi.com
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
Code released under GPLv3: http://www.gnu.org/licenses/gpl.html
|
||||
|
||||
grommet(face, style, od, id, wall, assembly, mask)
|
||||
grommet_clip(style, od, id, wall)
|
||||
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
NAME: grommet
|
||||
DESCRIPTION: creates different groumet styles
|
||||
TODO: none
|
||||
|
||||
USAGE: grommet(face, style, od, id, wall, assembly, mask)
|
||||
|
||||
data[0] = "top","bottom","front","rear","left","right"
|
||||
data[1] = "sleeve"
|
||||
size[0] = od outside diameter of grommet body
|
||||
size[1] = id inside hole diameter of grommet body
|
||||
size[2] = wall thickness of installation
|
||||
data[3] = assembled true, false
|
||||
mask[0] = true enables component mask
|
||||
mask[1] = mask length
|
||||
mask[2] = mask setback
|
||||
mask[3] = mstyle "default"
|
||||
*/
|
||||
|
||||
|
||||
module grommet(face = "bottom", style = "sleeve", od, id, wall, assembly, mask) {
|
||||
|
||||
height = 4.5+(2*wall);
|
||||
enablemask = mask[0];
|
||||
mlength = height+mask[1];
|
||||
msetback = mask[2];
|
||||
mstyle = mask[3];
|
||||
cut = .25;
|
||||
lip_od = od+4;
|
||||
lip_thick = 2.5;
|
||||
|
||||
adj = .01;
|
||||
$fn = 90;
|
||||
|
||||
rotx = face == "rear" ? 270 : face == "front" || face == "left" || face == "right" ? 90 : face == "top" ? 180 : 0;
|
||||
roty = 0;
|
||||
rotz = face == "left" ? 90 : face == "right" ? 270 : 0;
|
||||
|
||||
rx = face == "left" ? -lip_thick : face == "right" ? lip_thick : 0;
|
||||
ry = face == "front" ? lip_thick : face == "rear" ? -lip_thick : 0;
|
||||
rz = face == "bottom" ? -lip_thick : face == "top" ? lip_thick : 0;
|
||||
|
||||
translate([rx,ry,rz]) rotate([rotx,roty,rotz]) {
|
||||
if(enablemask == true && mstyle == "default") {
|
||||
if(style == "sleeve") {
|
||||
translate([0, 0, -adj-msetback]) cylinder(d = od+.5, h = mlength);
|
||||
}
|
||||
}
|
||||
if(enablemask == false) {
|
||||
if(style == "sleeve") {
|
||||
difference() {
|
||||
union() {
|
||||
cylinder(d=od, h=height);
|
||||
cylinder(d=lip_od, h=2.5);
|
||||
}
|
||||
translate([0,0,-adj]) cylinder(d=id, h=height+(2*adj));
|
||||
translate([-lip_od/2,-cut/2,-adj]) cube([lip_od+(2*adj),cut,height+(2*adj)]);
|
||||
translate([0,0,2.5+wall]) grommet_clip(style,od,id,wall);
|
||||
}
|
||||
if(assembly == true) {
|
||||
translate([0,0,2.5+wall]) grommet_clip(style,od,id,wall);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module grommet_clip(style,od,id,wall) {
|
||||
|
||||
height = 2.5+wall;
|
||||
lip_od = od+4;
|
||||
adj = .01;
|
||||
$fn = 90;
|
||||
|
||||
if(style == "sleeve") {
|
||||
difference() {
|
||||
cylinder(d=lip_od, h=2.5);
|
||||
difference() {
|
||||
translate([0,0,-adj]) cylinder(d=od, h=wall+2*adj);
|
||||
translate([-lip_od/2,-od/2,-adj]) cube([lip_od+(2*adj),2,height-2]);
|
||||
translate([-lip_od/2,-2+od/2,-adj]) cube([lip_od+(2*adj),2,height-2]);
|
||||
}
|
||||
translate([-lip_od,-(od-6)/2,-adj]) cube([lip_od+(2*adj),od-6,wall+(2*adj)]);
|
||||
}
|
||||
}
|
||||
}
|
||||
118
lib/panel_clamp.scad
Normal file
118
lib/panel_clamp.scad
Normal file
@@ -0,0 +1,118 @@
|
||||
/*
|
||||
NAME: panel_clamp
|
||||
DESCRIPTION: creates various clamps to join two panels
|
||||
TODO: none
|
||||
|
||||
USAGE: panel_clamp(face, style, screw, dia_x, dia_y, height, mask)
|
||||
|
||||
data[0] = "top","bottom","rear","front","left","right"
|
||||
data[1] = "sloped"
|
||||
data[2] = "m2", "m2.5", "m3", "m4"
|
||||
size_x = top diameter or x size in mm
|
||||
size_y = bottom diameter or y size in mm
|
||||
size_z = clamp height in mm
|
||||
mask[0] = true enables component mask
|
||||
mask[1] = mask length
|
||||
mask[2] = mask setback
|
||||
mask[3] = mstyle "default", "holes"
|
||||
|
||||
*/
|
||||
|
||||
|
||||
module panel_clamp(face, style, screw, dia_x, dia_y, height, mask) {
|
||||
|
||||
nuts = [[2,4,1.6], // m2 size, diameter, height
|
||||
[2.5,5,2], // m2.5 size, diameter, height
|
||||
[3,5.5,2.4], // m3 size, diameter, height
|
||||
[4,7,3.2]]; // m4 size, diameter, height
|
||||
|
||||
enablemask = mask[0];
|
||||
mlength = mask[1];
|
||||
msetback = mask[2];
|
||||
mstyle = mask[3];
|
||||
adj = .01;
|
||||
$fn = 90;
|
||||
|
||||
rotx = face == "rear" ? 270 : face == "front" || face == "left" || face == "right" ? 90 : face == "top" ? 180 : 0;
|
||||
roty = 0;
|
||||
rotz = face == "left" ? 90 : face == "right" ? 270 : 0;
|
||||
|
||||
if(enablemask == true) {
|
||||
rotate([rotx,roty,rotz]) {
|
||||
if(mstyle == "default") {
|
||||
cylinder(d=dia_y, h=height);
|
||||
}
|
||||
if(screw == "m2" && mstyle == "holes") {
|
||||
translate([(-dia_y-(nuts[2][0]+.5)/2)/2, 0, 2.25]) rotate([0,90,0])
|
||||
cylinder(d=nuts[0][0]+.5, h=dia_y+2);
|
||||
translate([-(dia_y/2), 0, 2.25]) rotate([0,90,0])
|
||||
cylinder(d=nuts[0][1]*2/sqrt(3), h=dia_y*.375, $fn=6);
|
||||
translate([nuts[0][0]+.5, 0, 2.25]) rotate([0,90,0])
|
||||
cylinder(d=nuts[0][1]+.5, h=dia_y*.375);
|
||||
}
|
||||
if(screw == "m2.5" && mstyle == "holes") {
|
||||
translate([(-dia_y-(nuts[2][0]+.5)/2)/2, 0, 3]) rotate([0,90,0])
|
||||
cylinder(d=nuts[1][0]+.5, h=dia_y+2);
|
||||
translate([-(dia_y/2), 0, 3]) rotate([0,90,0])
|
||||
cylinder(d=nuts[1][1]*2/sqrt(3), h=dia_y*.375, $fn=6);
|
||||
translate([nuts[1][0]+.5, 0, 3]) rotate([0,90,0])
|
||||
cylinder(d=nuts[1][1]+.5, h=dia_y*.375);
|
||||
}
|
||||
if(screw == "m3" && mstyle == "holes") {
|
||||
translate([(-dia_y-(nuts[2][0]+.5)/2)/2, 0, 3]) rotate([0,90,0])
|
||||
cylinder(d=nuts[2][0]+.5, h=dia_y+2);
|
||||
translate([-(dia_y/2), 0, 3]) rotate([0,90,0])
|
||||
cylinder(d=nuts[2][1]*2/sqrt(3), h=dia_y*.375, $fn=6);
|
||||
translate([nuts[2][0]+.5, 0, 3]) rotate([0,90,0])
|
||||
cylinder(d=nuts[2][1]+.5, h=dia_y*.375);
|
||||
}
|
||||
if(screw == "m4" && mstyle == "holes") {
|
||||
translate([(-dia_y-(nuts[2][0]+.5)/2)/2, 0, 3]) rotate([0,90,0])
|
||||
cylinder(d=nuts[3][0]+.5, h=dia_y+2);
|
||||
translate([-(dia_y/2), 0, 3]) rotate([0,90,0])
|
||||
cylinder(d=nuts[3][1]*2/sqrt(3), h=dia_y*.375, $fn=6);
|
||||
translate([nuts[3][0]+.5, 0, 3]) rotate([0,90,0])
|
||||
cylinder(d=nuts[3][1]+.5, h=dia_y*.375);
|
||||
}
|
||||
}
|
||||
}
|
||||
if(enablemask == false) {
|
||||
rotate([rotx,roty,rotz]) {
|
||||
difference() {
|
||||
cylinder(d2=dia_x, d1=dia_y, h=height);
|
||||
if(screw == "m2") {
|
||||
translate([(-dia_y-(nuts[2][0]+.5)/2)/2, 0, 2.25]) rotate([0,90,0])
|
||||
cylinder(d=nuts[0][0]+.5, h=dia_y+2);
|
||||
translate([-(dia_y/2), 0, 2.25]) rotate([0,90,0])
|
||||
cylinder(d=nuts[0][1]*2/sqrt(3), h=dia_y*.375, $fn=6);
|
||||
translate([nuts[0][0]+.5, 0, 2.25]) rotate([0,90,0])
|
||||
cylinder(d=nuts[0][1]+.5, h=dia_y*.375);
|
||||
}
|
||||
if(screw == "m2.5") {
|
||||
translate([(-dia_y-(nuts[2][0]+.5)/2)/2, 0, 3]) rotate([0,90,0])
|
||||
cylinder(d=nuts[1][0]+.5, h=dia_y+2);
|
||||
translate([-(dia_y/2), 0, 3]) rotate([0,90,0])
|
||||
cylinder(d=nuts[1][1]*2/sqrt(3), h=dia_y*.375, $fn=6);
|
||||
translate([nuts[1][0]+.5, 0, 3]) rotate([0,90,0])
|
||||
cylinder(d=nuts[1][1]+.5, h=dia_y*.375);
|
||||
}
|
||||
if(screw == "m3") {
|
||||
translate([(-dia_y-(nuts[2][0]+.5)/2)/2, 0, 3]) rotate([0,90,0])
|
||||
cylinder(d=nuts[2][0]+.5, h=dia_y+2);
|
||||
translate([-(dia_y/2), 0, 3]) rotate([0,90,0])
|
||||
cylinder(d=nuts[2][1]*2/sqrt(3), h=dia_y*.375, $fn=6);
|
||||
translate([nuts[2][0]+.5, 0, 3]) rotate([0,90,0])
|
||||
cylinder(d=nuts[2][1]+.5, h=dia_y*.375);
|
||||
}
|
||||
if(screw == "m4") {
|
||||
translate([(-dia_y-(nuts[2][0]+.5)/2)/2, 0, 3]) rotate([0,90,0])
|
||||
cylinder(d=nuts[3][0]+.5, h=dia_y+2);
|
||||
translate([-(dia_y/2), 0, 3]) rotate([0,90,0])
|
||||
cylinder(d=nuts[3][1]*2/sqrt(3), h=dia_y*.375, $fn=6);
|
||||
translate([nuts[3][0]+.5, 0, 3]) rotate([0,90,0])
|
||||
cylinder(d=nuts[3][1]+.5, h=dia_y*.375);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
84
lib/rack.scad
Normal file
84
lib/rack.scad
Normal file
@@ -0,0 +1,84 @@
|
||||
/*
|
||||
This file is part of SBC Case Builder https://github.com/hominoids/SBC_Case_Builder
|
||||
Copyright 2022,2023,2024,2025 Edward A. Kisiel hominoid@cablemi.com
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
Code released under GPLv3: http://www.gnu.org/licenses/gpl.html
|
||||
|
||||
rack_end_bracket(side, size, thick)
|
||||
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
NAME: rack_end_bracket
|
||||
DESCRIPTION: creates rack mounting ears
|
||||
TODO: none
|
||||
|
||||
USAGE: rack_end_bracket(side, size, thick)
|
||||
|
||||
side = "left", "right"
|
||||
size = "1u", "2u", "3u", "4u"
|
||||
thick = thickness of bracket
|
||||
|
||||
*/
|
||||
|
||||
|
||||
module rack_end_bracket(side, size, thick) {
|
||||
|
||||
depth = size == "1u" ? 44.45 : size == "1u+" ? 59.26 : size == "1u++" ? 74.07 : size == "2u" ? 2*44.45 : size == "3u" ? 3*44.45 : 4*44.45;
|
||||
c_fillet = 2;
|
||||
hole = 3.2;
|
||||
rack_hole = 6;
|
||||
tab_width = 15.875+thick;
|
||||
b_width = thick;
|
||||
b_depth = depth;
|
||||
b_height = thick;
|
||||
b_loc = [-thick,0,0];
|
||||
|
||||
adjust = .01;
|
||||
$fn=90;
|
||||
|
||||
if(side == "left") {
|
||||
translate([thick,-thick,depth]) rotate([270,0,0])
|
||||
difference() {
|
||||
union() {
|
||||
translate([(-tab_width/2),(depth/2),thick/2])
|
||||
cube_fillet_inside([tab_width,depth,thick],
|
||||
vertical=[0,c_fillet,c_fillet,0],top=[0,0,0,0],bottom=[0,0,0,0], $fn=90);
|
||||
translate([(b_width/2)+b_loc[0],(b_depth/2)+b_loc[1],(b_height/2)+b_loc[2]])
|
||||
cube_fillet_inside([b_width,b_depth,b_height],
|
||||
vertical=[0,0,0,0],top=[c_fillet,0,c_fillet,0],bottom=[0,0,0,0], $fn=90);
|
||||
}
|
||||
for (c=[7.5:15:depth]) {
|
||||
translate([(3-thick)-9-(15.875-9)/2,c,-adjust]) slot(rack_hole,3,thick+(adjust*2));
|
||||
}
|
||||
}
|
||||
}
|
||||
if(side == "right") {
|
||||
translate([-thick,-thick,0]) rotate([270,180,0])
|
||||
difference() {
|
||||
union() {
|
||||
translate([(-tab_width/2),(depth/2),thick/2])
|
||||
cube_fillet_inside([tab_width,depth,thick],
|
||||
vertical=[0,c_fillet,c_fillet,0],top=[0,0,0,0],bottom=[0,0,0,0], $fn=90);
|
||||
translate([(b_width/2)+b_loc[0],(b_depth/2)+b_loc[1],(b_height/2)+b_loc[2]])
|
||||
cube_fillet_inside([b_width,b_depth,b_height],
|
||||
vertical=[0,0,0,0],top=[c_fillet,0,c_fillet,0],bottom=[0,0,0,0], $fn=90);
|
||||
}
|
||||
for (c=[7.5:15:depth]) {
|
||||
translate([(3-thick)-9-(15.875-9)/2,c,-adjust]) slot(rack_hole,3,thick+(adjust*2));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -82,6 +82,9 @@ module add(type, loc_x, loc_y, loc_z, face, rotation, size, data, mask) {
|
||||
if(type == "feet") {
|
||||
translate([loc_x,loc_y,loc_z]) rotate(rotation) feet(size_x, size_z);
|
||||
}
|
||||
if(type == "grommet") {
|
||||
translate([loc_x,loc_y,loc_z]) rotate(rotation) grommet(data[0], data[1], size_x, size_y, size_z, data[2], mask);
|
||||
}
|
||||
if(type == "hd_holder") {
|
||||
translate([loc_x,loc_y,loc_z]) rotate(rotation) hd_mount(data[0],data[1],data[2],data[3]);
|
||||
}
|
||||
@@ -112,6 +115,9 @@ module add(type, loc_x, loc_y, loc_z, face, rotation, size, data, mask) {
|
||||
if(type == "nut_holder") {
|
||||
translate([loc_x,loc_y,loc_z]) rotate(rotation) nut_holder(data[0], data[1], size_x, size_y, size_z, mask);
|
||||
}
|
||||
if(type == "panel_clamp") {
|
||||
translate([loc_x,loc_y,loc_z]) rotate(rotation) panel_clamp(data[0], data[1], data[2], size_x, size_y, size_z, mask);
|
||||
}
|
||||
if(type == "pcb_holder") {
|
||||
translate([loc_x,loc_y,loc_z]) rotate(rotation) pcb_holder([size_x,size_y,size_z],data[0]);
|
||||
}
|
||||
|
||||
@@ -408,19 +408,39 @@ echo(pcb_depth+case_offset_y-10);
|
||||
|
||||
if (class == "pcbhole" && id == 0 && pcbhole_pos == "left_rear" &&
|
||||
bottom_rear_left_enable == true && bottom_standoff[6] != "blind") {
|
||||
translate([pcbhole_x,pcbhole_y,-adj]) cylinder(d=bottom_standoff[4]-.2, h=floorthick+(2*adj));
|
||||
ahpx = sbc_model == "n2" ? 7 : sbc_model == "n2+" ? 9.25 :
|
||||
sbc_model == "m1" ? 9.25 : pcbhole_x;
|
||||
ahpy = sbc_model == "n2" ? 15 : sbc_model == "n2+" ? 9.25 :
|
||||
sbc_model == "m1" ? 9.25 : pcbhole_y;
|
||||
translate([ahpx,ahpy,-adj])
|
||||
cylinder(d=bottom_standoff[4]-.2, h=floorthick+(2*adj));
|
||||
}
|
||||
if (class == "pcbhole" && id == 0 && pcbhole_pos == "left_front" &&
|
||||
bottom_front_left_enable == true && bottom_standoff[6] != "blind") {
|
||||
translate([pcbhole_x,pcbhole_y,-adj]) cylinder(d=bottom_standoff[4]-.2, h=floorthick+(2*adj));
|
||||
ahpx = sbc_model == "n2" ? 8 : sbc_model == "n2+" ? 9.25 :
|
||||
sbc_model == "m1" ? 9.25 : pcbhole_x;
|
||||
ahpy = sbc_model == "n2" ? 75 : sbc_model == "n2+" ? 80.75 :
|
||||
sbc_model == "m1" ? 112.75 : pcbhole_y;
|
||||
translate([ahpx,ahpy,-adj])
|
||||
cylinder(d=bottom_standoff[4]-.2, h=floorthick+(2*adj));
|
||||
}
|
||||
if (class == "pcbhole" && id == 0 && pcbhole_pos == "right_rear" &&
|
||||
bottom_rear_right_enable == true && bottom_standoff[6] != "blind") {
|
||||
translate([pcbhole_x,pcbhole_y,-adj]) cylinder(d=bottom_standoff[4]-.2, h=floorthick+(2*adj));
|
||||
ahpx = sbc_model == "n2" ? 82 : sbc_model == "n2+" ? 80.75 :
|
||||
sbc_model == "m1" ? 80.75 : pcbhole_x;
|
||||
ahpy = sbc_model == "n2" ? 6 : sbc_model == "n2+" ? 9.25 :
|
||||
sbc_model == "m1" ? 9.25 : pcbhole_y;
|
||||
translate([ahpx,ahpy,-adj])
|
||||
cylinder(d=bottom_standoff[4]-.2, h=floorthick+(2*adj));
|
||||
}
|
||||
if (class == "pcbhole" && id == 0 && pcbhole_pos == "right_front" &&
|
||||
bottom_front_right_enable == true && bottom_standoff[6] != "blind") {
|
||||
translate([pcbhole_x,pcbhole_y,-adj]) cylinder(d=bottom_standoff[4]-.2, h=floorthick+(2*adj));
|
||||
ahpx = sbc_model == "n2" ? 82 : sbc_model == "n2+" ? 80.75 :
|
||||
sbc_model == "m1" ? 80.75 : pcbhole_x;
|
||||
ahpy = sbc_model == "n2" ? 75 : sbc_model == "n2+" ? 80.75 :
|
||||
sbc_model == "m1" ? 112.75 : pcbhole_y;
|
||||
translate([ahpx,ahpy,-adj])
|
||||
cylinder(d=bottom_standoff[4]-.2, h=floorthick+(2*adj));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -445,6 +465,7 @@ echo(pcb_depth+case_offset_y-10);
|
||||
pcbhole_size = sbc_data[s[0]][i+9][0];
|
||||
pcbhole_state = sbc_data[s[0]][i+10][0];
|
||||
pcbhole_pos = sbc_data[s[0]][i+10][4];
|
||||
|
||||
if(id == pcbid && id != 0 && pcbclass == "pcbhole") {
|
||||
if (pcbclass == "pcbhole" && pcbhole_pos == "left_rear" &&
|
||||
multipcb_bottom_rear_left_enable == true &&
|
||||
@@ -599,13 +620,15 @@ echo(pcb_depth+case_offset_y-10);
|
||||
pcbhole_z = sbc_data[s[0]][i+6];
|
||||
pcbhole_size = sbc_data[s[0]][i+9][0];
|
||||
pcbhole_pos = sbc_data[s[0]][i+10][4];
|
||||
pcbadj_z = sbc_model == "n2" || sbc_model == "m1" ? -6 :
|
||||
sbc_model == "n2+" ? -4.5 : 0;
|
||||
|
||||
if(class == "pcbhole" && id == pcb_id) {
|
||||
if (pcbhole_pos == "left_rear" && bottom_rear_left_enable == true) {
|
||||
bottom_support = bottom_sidewall_support == true ? bottom_rear_left_support : "none";
|
||||
pcb_standoff = [bottom_standoff[0],
|
||||
bottom_standoff[1],
|
||||
bottom_height-pcb_z+pcb_loc_z+bottom_rear_left_adjust,
|
||||
bottom_height-pcb_z+pcb_loc_z+bottom_rear_left_adjust+pcbadj_z,
|
||||
bottom_standoff[3],
|
||||
bottom_standoff[4],
|
||||
bottom_standoff[5],
|
||||
@@ -616,13 +639,18 @@ echo(pcb_depth+case_offset_y-10);
|
||||
bottom_standoff[10],
|
||||
bottom_standoff[11],
|
||||
bottom_standoff[12]];
|
||||
translate([pcbhole_x,pcbhole_y,0]) standoff(pcb_standoff,[false,10,2,"default"]);
|
||||
ahpx = sbc_model == "n2" ? 7 : sbc_model == "n2+" ? 9.25 :
|
||||
sbc_model == "m1" ? 9.25 : pcbhole_x;
|
||||
ahpy = sbc_model == "n2" ? 15 : sbc_model == "n2+" ? 9.25 :
|
||||
sbc_model == "m1" ? 9.25 : pcbhole_y;
|
||||
translate([ahpx,ahpy,0])
|
||||
standoff(pcb_standoff,[false,10,2,"default"]);
|
||||
}
|
||||
if (pcbhole_pos == "left_front" && bottom_front_left_enable == true) {
|
||||
bottom_support = bottom_sidewall_support == true ? bottom_front_left_support : "none";
|
||||
pcb_standoff = [bottom_standoff[0],
|
||||
bottom_standoff[1],
|
||||
bottom_height-pcb_z+pcb_loc_z+bottom_front_left_adjust,
|
||||
bottom_height-pcb_z+pcb_loc_z+bottom_front_left_adjust+pcbadj_z,
|
||||
bottom_standoff[3],
|
||||
bottom_standoff[4],
|
||||
bottom_standoff[5],
|
||||
@@ -633,13 +661,18 @@ echo(pcb_depth+case_offset_y-10);
|
||||
bottom_standoff[10],
|
||||
bottom_standoff[11],
|
||||
bottom_standoff[12]];
|
||||
translate([pcbhole_x,pcbhole_y,0]) standoff(pcb_standoff,[false,10,2,"default"]);
|
||||
ahpx = sbc_model == "n2" ? 8 : sbc_model == "n2+" ? 9.25 :
|
||||
sbc_model == "m1" ? 9.25 : pcbhole_x;
|
||||
ahpy = sbc_model == "n2" ? 75 : sbc_model == "n2+" ? 80.75 :
|
||||
sbc_model == "m1" ? 112.75 : pcbhole_y;
|
||||
translate([ahpx,ahpy,0])
|
||||
standoff(pcb_standoff,[false,10,2,"default"]);
|
||||
}
|
||||
if (pcbhole_pos == "right_rear" && bottom_rear_right_enable == true) {
|
||||
bottom_support = bottom_sidewall_support == true ? bottom_rear_right_support : "none";
|
||||
pcb_standoff = [bottom_standoff[0],
|
||||
bottom_standoff[1],
|
||||
bottom_height-pcb_z+pcb_loc_z+bottom_rear_right_adjust,
|
||||
bottom_height-pcb_z+pcb_loc_z+bottom_rear_right_adjust+pcbadj_z,
|
||||
bottom_standoff[3],
|
||||
bottom_standoff[4],
|
||||
bottom_standoff[5],
|
||||
@@ -650,13 +683,18 @@ echo(pcb_depth+case_offset_y-10);
|
||||
bottom_standoff[10],
|
||||
bottom_standoff[11],
|
||||
bottom_standoff[12]];
|
||||
translate([pcbhole_x,pcbhole_y,0]) standoff(pcb_standoff,[false,10,2,"default"]);
|
||||
ahpx = sbc_model == "n2" ? 82 : sbc_model == "n2+" ? 80.75 :
|
||||
sbc_model == "m1" ? 80.75 : pcbhole_x;
|
||||
ahpy = sbc_model == "n2" ? 6 : sbc_model == "n2+" ? 9.25 :
|
||||
sbc_model == "m1" ? 9.25 : pcbhole_y;
|
||||
translate([ahpx,ahpy,0])
|
||||
standoff(pcb_standoff,[false,10,2,"default"]);
|
||||
}
|
||||
if (pcbhole_pos == "right_front" && bottom_front_right_enable == true) {
|
||||
bottom_support = bottom_sidewall_support == true ? bottom_front_right_support : "none";
|
||||
pcb_standoff = [bottom_standoff[0],
|
||||
bottom_standoff[1],
|
||||
bottom_height-pcb_z+pcb_loc_z+bottom_front_right_adjust,
|
||||
bottom_height-pcb_z+pcb_loc_z+bottom_front_right_adjust+pcbadj_z,
|
||||
bottom_standoff[3],
|
||||
bottom_standoff[4],
|
||||
bottom_standoff[5],
|
||||
@@ -667,7 +705,12 @@ echo(pcb_depth+case_offset_y-10);
|
||||
bottom_standoff[10],
|
||||
bottom_standoff[11],
|
||||
bottom_standoff[12]];
|
||||
translate([pcbhole_x,pcbhole_y,0]) standoff(pcb_standoff,[false,10,2,"default"]);
|
||||
ahpx = sbc_model == "n2" ? 82 : sbc_model == "n2+" ? 80.75 :
|
||||
sbc_model == "m1" ? 80.75 : pcbhole_x;
|
||||
ahpy = sbc_model == "n2" ? 75 : sbc_model == "n2+" ? 80.75 :
|
||||
sbc_model == "m1" ? 112.75 : pcbhole_y;
|
||||
translate([ahpx,ahpy,0])
|
||||
standoff(pcb_standoff,[false,10,2,"default"]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
1352
mod/case_rack.scad
Normal file
1352
mod/case_rack.scad
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -31,7 +31,7 @@ individual_part = "bottom"; // [top, bottom, right, left, front, rear, io_shield
|
||||
// section individual parts for panel cases
|
||||
section_part = false; // [true,false]
|
||||
// single board computer model
|
||||
sbc_model = "c1+"; // ["c1+", "c2", "c4", "hc4", "xu4", "xu4q", "mc1", "hc1", "n1", "n2", "n2+", "n2l", "n2lq", "m1", "m1s", "m2", "h2", "h2+", "h3", "h3+", "h4", "h4+", "h4_ultra", "show2", "rpipico", "rpipicow", "rpicm4+ioboard", "rpicm1", "rpicm3", "rpicm3l", "rpicm3+", "rpicm4s", "rpicm4", "rpicm4l", "rpizero", "rpizerow", "rpizero2w", "rpi1a+", "rpi1b+", "rpi2b", "rpi3a+", "rpi3b", "rpi3b+", "rpi4b", "rpi5", "a64", "a64lts", "rock64", "rockpro64", "quartz64a", "quartz64b", "h64b", "star64", "soedge_a-baseboard", "soedge_rk1808", "rock4a", "rock4b", "rock4a+", "rock4b+", "rock4c", "rock4c+", "rock5b-v1.3", "rock5b", "rock5bq", "rock5b+", "nio12l", "vim1", "vim2", "vim3", "vim3l", "vim4", "tinkerboard", "tinkerboard-s", "tinkerboard-2", "tinkerboard-2s", "tinkerboard-r2", "tinkerboard-r2s", "opizero", "opizero2", "opir1plus_lts", "opir1", "opi5", "opi5max", "jetsonnano", "lepotato", "sweetpotato", "tritium-h2+", "tritium-h3", "tritium-h5", "solitude", "alta", "atomicpi", "visionfive2", "visionfive2q", "bpif3", "milk-v_duos", "licheerv+dock", "rak19007", "cnano-avr128da48", "nodemcu-32s", "cs-solarmeter", "feather-m0_express", "feather-m0_wifi", "feather-m4_express", "ssi-eeb", "ssi-ceb", "atx", "micro-atx", "dtx", "flex-atx", "mini-dtx", "mini-itx", "mini-itx_thin", "mini-stx", "mini-stx_thin", "nano-itx", "nuc", "pico-itx"]
|
||||
sbc_model = "c1+"; // ["c1+", "c2", "c4", "hc4", "c5", "xu4", "xu4q", "mc1", "hc1", "n1", "n2", "n2+", "n2l", "n2lq", "m1", "m1s", "m2", "h2", "h2+", "h3", "h3+", "h4", "h4+", "h4_ultra", "show2", "rpipico", "rpipicow", "rpicm4+ioboard", "rpicm1", "rpicm3", "rpicm3l", "rpicm3+", "rpicm4s", "rpicm4", "rpicm4l", "rpizero", "rpizerow", "rpizero2w", "rpi1a+", "rpi1b+", "rpi2b", "rpi3a+", "rpi3b", "rpi3b+", "rpi4b", "rpi5", "a64", "a64lts", "rock64", "rockpro64", "quartz64a", "quartz64b", "h64b", "star64", "soedge_a-baseboard", "soedge_rk1808", "rock4a", "rock4b", "rock4a+", "rock4b+", "rock4c", "rock4c+", "rock5b-v1.3", "rock5b", "rock5bq", "rock5b+", "nio12l", "vim1", "vim2", "vim3", "vim3l", "vim4", "tinkerboard", "tinkerboard-s", "tinkerboard-2", "tinkerboard-2s", "tinkerboard-r2", "tinkerboard-r2s", "opizero", "opizero2", "opir1plus_lts", "opir1", "opi5", "opi5max", "jetsonnano", "lepotato", "sweetpotato", "tritium-h2+", "tritium-h3", "tritium-h5", "solitude", "alta", "atomicpi", "visionfive2", "visionfive2q", "bpif3", "milk-v_duos", "licheerv+dock", "rak19007", "cnano-avr128da48", "nodemcu-32s", "cs-solarmeter", "feather-m0_express", "feather-m0_wifi", "feather-m4_express", "ssi-eeb", "ssi-ceb", "atx", "micro-atx", "dtx", "flex-atx", "mini-dtx", "mini-itx", "mini-itx_thin", "mini-stx", "mini-stx_thin", "nano-itx", "nuc", "pico-itx"]
|
||||
|
||||
// sbc off in model view
|
||||
sbc_off = false;
|
||||
@@ -42,7 +42,7 @@ sbc_highlight = false;
|
||||
// enable highlight for accessory subtractive geometry
|
||||
accessory_highlight = false;
|
||||
// base case design
|
||||
case_design = "shell"; // [shell,panel,panel_nas,stacked,tray,tray_sides,tray_vu5,tray_vu7,round,hex,snap,fitted,paper_split-top,paper_full-top,adapter_ssi-eeb,adapter_ssi-ceb,adapter_atx,adapter_micro-atx,adapter_dtx,adapter_flex-atx,adapter_mini-dtx,adapter_mini-itx,adapter_mini-itx_thin,adapter_mini-stx,adapter_mini-stx_thin]
|
||||
case_design = "shell"; // [shell,panel,panel_nas,stacked,tray,tray_sides,tray_vu5,tray_vu7,round,hex,snap,fitted,rack,paper_split-top,paper_full-top,adapter_ssi-eeb,adapter_ssi-ceb,adapter_atx,adapter_micro-atx,adapter_dtx,adapter_flex-atx,adapter_mini-dtx,adapter_mini-itx,adapter_mini-itx_thin,adapter_mini-stx,adapter_mini-stx_thin]
|
||||
|
||||
// raises top mm in model view or < 0 = off
|
||||
raise_top = 0; // [-1:100]
|
||||
@@ -73,6 +73,59 @@ standard_motherboard_thickness = 0; //[-3:.01:3]
|
||||
// rear io plate opening for standard form motherboards
|
||||
rear_io_shield = false;
|
||||
|
||||
/* [Rack Mount Case Adjustments] */
|
||||
// size of rack 10" or 19" //
|
||||
rack_width = 19; //[10,19]
|
||||
// size of rack mount cases 1U or 2U //
|
||||
rack_size = "1u"; //["1u","1u+","1u++","2u"]
|
||||
// enable rack io plate opening for sbc
|
||||
Rack_Bay1 = "none"; // ["none", "c1+", "c2", "c4", "hc4", "c5", "xu4", "xu4q", "mc1", "hc1", "n1", "n2", "n2+", "n2l", "n2lq", "m1", "m1s", "m2", "h2", "h2+", "h3", "h3+", "h4", "h4+", "h4_ultra", "show2", "rpipico", "rpipicow", "rpicm4+ioboard", "rpicm1", "rpicm3", "rpicm3l", "rpicm3+", "rpicm4s", "rpicm4", "rpicm4l", "rpizero", "rpizerow", "rpizero2w", "rpi1a+", "rpi1b+", "rpi2b", "rpi3a+", "rpi3b", "rpi3b+", "rpi4b", "rpi5", "a64", "a64lts", "rock64", "rockpro64", "quartz64a", "quartz64b", "h64b", "star64", "soedge_a-baseboard", "soedge_rk1808", "rock4a", "rock4b", "rock4a+", "rock4b+", "rock4c", "rock4c+", "rock5b-v1.3", "rock5b", "rock5bq", "rock5b+", "nio12l", "vim1", "vim2", "vim3", "vim3l", "vim4", "tinkerboard", "tinkerboard-s", "tinkerboard-2", "tinkerboard-2s", "tinkerboard-r2", "tinkerboard-r2s", "opizero", "opizero2", "opir1plus_lts", "opir1", "opi5", "opi5max", "jetsonnano", "lepotato", "sweetpotato", "tritium-h2+", "tritium-h3", "tritium-h5", "solitude", "alta", "atomicpi", "visionfive2", "visionfive2q", "bpif3", "milk-v_duos", "licheerv+dock", "rak19007", "cnano-avr128da48", "nodemcu-32s", "cs-solarmeter", "feather-m0_express", "feather-m0_wifi", "feather-m4_express"]
|
||||
rack_bay1_xyz_loc = [0,0,0]; // [0:.5:450]
|
||||
rack_bay1_rotation = 0; // [0:90:270]
|
||||
rack_bay1_face = "fixed"; //["open","fixed","removable","vent"]
|
||||
rack_bay1_wall = false; // [true,false]
|
||||
rack_bay1_rear_fan = false; //[true,false]
|
||||
rack_bay1_rear_conduit = "none"; //["none","conduit","grommet","grommets-vertical"]
|
||||
|
||||
Rack_Bay2 = "none"; // ["none", "c1+", "c2", "c4", "hc4", "c5", "xu4", "xu4q", "mc1", "hc1", "n1", "n2", "n2+", "n2l", "n2lq", "m1", "m1s", "m2", "h2", "h2+", "h3", "h3+", "h4", "h4+", "h4_ultra", "show2", "rpipico", "rpipicow", "rpicm4+ioboard", "rpicm1", "rpicm3", "rpicm3l", "rpicm3+", "rpicm4s", "rpicm4", "rpicm4l", "rpizero", "rpizerow", "rpizero2w", "rpi1a+", "rpi1b+", "rpi2b", "rpi3a+", "rpi3b", "rpi3b+", "rpi4b", "rpi5", "a64", "a64lts", "rock64", "rockpro64", "quartz64a", "quartz64b", "h64b", "star64", "soedge_a-baseboard", "soedge_rk1808", "rock4a", "rock4b", "rock4a+", "rock4b+", "rock4c", "rock4c+", "rock5b-v1.3", "rock5b", "rock5bq", "rock5b+", "nio12l", "vim1", "vim2", "vim3", "vim3l", "vim4", "tinkerboard", "tinkerboard-s", "tinkerboard-2", "tinkerboard-2s", "tinkerboard-r2", "tinkerboard-r2s", "opizero", "opizero2", "opir1plus_lts", "opir1", "opi5", "opi5max", "jetsonnano", "lepotato", "sweetpotato", "tritium-h2+", "tritium-h3", "tritium-h5", "solitude", "alta", "atomicpi", "visionfive2", "visionfive2q", "bpif3", "milk-v_duos", "licheerv+dock", "rak19007", "cnano-avr128da48", "nodemcu-32s", "cs-solarmeter", "feather-m0_express", "feather-m0_wifi", "feather-m4_express"]
|
||||
rack_bay2_xyz_loc = [0,0,0]; // [0:.5:450]
|
||||
rack_bay2_rotation = 0; // [0:90:270]
|
||||
rack_bay2_face = "fixed"; //["open","fixed","removable","vent"]
|
||||
rack_bay2_wall = false; // [true,false]
|
||||
rack_bay2_rear_fan = false; //[true,false]
|
||||
rack_bay2_rear_conduit = "none"; //["none","conduit","grommet","grommets-vertical"]
|
||||
|
||||
Rack_Bay3 = "none"; // ["none", "c1+", "c2", "c4", "hc4", "c5", "xu4", "xu4q", "mc1", "hc1", "n1", "n2", "n2+", "n2l", "n2lq", "m1", "m1s", "m2", "h2", "h2+", "h3", "h3+", "h4", "h4+", "h4_ultra", "show2", "rpipico", "rpipicow", "rpicm4+ioboard", "rpicm1", "rpicm3", "rpicm3l", "rpicm3+", "rpicm4s", "rpicm4", "rpicm4l", "rpizero", "rpizerow", "rpizero2w", "rpi1a+", "rpi1b+", "rpi2b", "rpi3a+", "rpi3b", "rpi3b+", "rpi4b", "rpi5", "a64", "a64lts", "rock64", "rockpro64", "quartz64a", "quartz64b", "h64b", "star64", "soedge_a-baseboard", "soedge_rk1808", "rock4a", "rock4b", "rock4a+", "rock4b+", "rock4c", "rock4c+", "rock5b-v1.3", "rock5b", "rock5bq", "rock5b+", "nio12l", "vim1", "vim2", "vim3", "vim3l", "vim4", "tinkerboard", "tinkerboard-s", "tinkerboard-2", "tinkerboard-2s", "tinkerboard-r2", "tinkerboard-r2s", "opizero", "opizero2", "opir1plus_lts", "opir1", "opi5", "opi5max", "jetsonnano", "lepotato", "sweetpotato", "tritium-h2+", "tritium-h3", "tritium-h5", "solitude", "alta", "atomicpi", "visionfive2", "visionfive2q", "bpif3", "milk-v_duos", "licheerv+dock", "rak19007", "cnano-avr128da48", "nodemcu-32s", "cs-solarmeter", "feather-m0_express", "feather-m0_wifi", "feather-m4_express"]
|
||||
rack_bay3_xyz_loc = [0,0,0]; // [0:.5:450]
|
||||
rack_bay3_rotation = 0; // [0:90:270]
|
||||
rack_bay3_face = "fixed"; //["open","fixed","removable","vent"]
|
||||
rack_bay3_wall = false; // [true,false]
|
||||
rack_bay3_rear_fan = false; //[true,false]
|
||||
rack_bay3_rear_conduit = "none"; //["none","conduit","grommet","grommets-vertical"]
|
||||
|
||||
Rack_Bay4 = "none"; // ["none", "c1+", "c2", "c4", "hc4", "c5", "xu4", "xu4q", "mc1", "hc1", "n1", "n2", "n2+", "n2l", "n2lq", "m1", "m1s", "m2", "h2", "h2+", "h3", "h3+", "h4", "h4+", "h4_ultra", "show2", "rpipico", "rpipicow", "rpicm4+ioboard", "rpicm1", "rpicm3", "rpicm3l", "rpicm3+", "rpicm4s", "rpicm4", "rpicm4l", "rpizero", "rpizerow", "rpizero2w", "rpi1a+", "rpi1b+", "rpi2b", "rpi3a+", "rpi3b", "rpi3b+", "rpi4b", "rpi5", "a64", "a64lts", "rock64", "rockpro64", "quartz64a", "quartz64b", "h64b", "star64", "soedge_a-baseboard", "soedge_rk1808", "rock4a", "rock4b", "rock4a+", "rock4b+", "rock4c", "rock4c+", "rock5b-v1.3", "rock5b", "rock5bq", "rock5b+", "nio12l", "vim1", "vim2", "vim3", "vim3l", "vim4", "tinkerboard", "tinkerboard-s", "tinkerboard-2", "tinkerboard-2s", "tinkerboard-r2", "tinkerboard-r2s", "opizero", "opizero2", "opir1plus_lts", "opir1", "opi5", "opi5max", "jetsonnano", "lepotato", "sweetpotato", "tritium-h2+", "tritium-h3", "tritium-h5", "solitude", "alta", "atomicpi", "visionfive2", "visionfive2q", "bpif3", "milk-v_duos", "licheerv+dock", "rak19007", "cnano-avr128da48", "nodemcu-32s", "cs-solarmeter", "feather-m0_express", "feather-m0_wifi", "feather-m4_express"]
|
||||
rack_bay4_xyz_loc = [0,0,0]; // [0:.5:450]
|
||||
rack_bay4_rotation = 0; // [0:90:270]
|
||||
rack_bay4_face = "fixed"; //["open","fixed","removable","vent"]
|
||||
rack_bay4_wall = false; // [true,false]
|
||||
rack_bay4_rear_fan = false; //[true,false]
|
||||
rack_bay4_rear_conduit = "none"; //["none","conduit","grommet","grommets-vertical"]
|
||||
|
||||
Rack_Bay5 = "none"; // ["none", "c1+", "c2", "c4", "hc4", "c5", "xu4", "xu4q", "mc1", "hc1", "n1", "n2", "n2+", "n2l", "n2lq", "m1", "m1s", "m2", "h2", "h2+", "h3", "h3+", "h4", "h4+", "h4_ultra", "show2", "rpipico", "rpipicow", "rpicm4+ioboard", "rpicm1", "rpicm3", "rpicm3l", "rpicm3+", "rpicm4s", "rpicm4", "rpicm4l", "rpizero", "rpizerow", "rpizero2w", "rpi1a+", "rpi1b+", "rpi2b", "rpi3a+", "rpi3b", "rpi3b+", "rpi4b", "rpi5", "a64", "a64lts", "rock64", "rockpro64", "quartz64a", "quartz64b", "h64b", "star64", "soedge_a-baseboard", "soedge_rk1808", "rock4a", "rock4b", "rock4a+", "rock4b+", "rock4c", "rock4c+", "rock5b-v1.3", "rock5b", "rock5bq", "rock5b+", "nio12l", "vim1", "vim2", "vim3", "vim3l", "vim4", "tinkerboard", "tinkerboard-s", "tinkerboard-2", "tinkerboard-2s", "tinkerboard-r2", "tinkerboard-r2s", "opizero", "opizero2", "opir1plus_lts", "opir1", "opi5", "opi5max", "jetsonnano", "lepotato", "sweetpotato", "tritium-h2+", "tritium-h3", "tritium-h5", "solitude", "alta", "atomicpi", "visionfive2", "visionfive2q", "bpif3", "milk-v_duos", "licheerv+dock", "rak19007", "cnano-avr128da48", "nodemcu-32s", "cs-solarmeter", "feather-m0_express", "feather-m0_wifi", "feather-m4_express"]
|
||||
rack_bay5_xyz_loc = [0,0,0]; // [0:.5:450]
|
||||
rack_bay5_rotation = 0; // [0:90:270]
|
||||
rack_bay5_face = "fixed"; //["open","fixed","removable","vent"]
|
||||
rack_bay5_wall = false; // [true,false]
|
||||
rack_bay5_rear_fan = false; //[true,false]
|
||||
rack_bay5_rear_conduit = "none"; //["none","conduit","grommet","grommets-vertical"]
|
||||
|
||||
Rack_Bay6 = "none"; // ["none", "c1+", "c2", "c4", "hc4", "c5", "xu4", "xu4q", "mc1", "hc1", "n1", "n2", "n2+", "n2l", "n2lq", "m1", "m1s", "m2", "h2", "h2+", "h3", "h3+", "h4", "h4+", "h4_ultra", "show2", "rpipico", "rpipicow", "rpicm4+ioboard", "rpicm1", "rpicm3", "rpicm3l", "rpicm3+", "rpicm4s", "rpicm4", "rpicm4l", "rpizero", "rpizerow", "rpizero2w", "rpi1a+", "rpi1b+", "rpi2b", "rpi3a+", "rpi3b", "rpi3b+", "rpi4b", "rpi5", "a64", "a64lts", "rock64", "rockpro64", "quartz64a", "quartz64b", "h64b", "star64", "soedge_a-baseboard", "soedge_rk1808", "rock4a", "rock4b", "rock4a+", "rock4b+", "rock4c", "rock4c+", "rock5b-v1.3", "rock5b", "rock5bq", "rock5b+", "nio12l", "vim1", "vim2", "vim3", "vim3l", "vim4", "tinkerboard", "tinkerboard-s", "tinkerboard-2", "tinkerboard-2s", "tinkerboard-r2", "tinkerboard-r2s", "opizero", "opizero2", "opir1plus_lts", "opir1", "opi5", "opi5max", "jetsonnano", "lepotato", "sweetpotato", "tritium-h2+", "tritium-h3", "tritium-h5", "solitude", "alta", "atomicpi", "visionfive2", "visionfive2q", "bpif3", "milk-v_duos", "licheerv+dock", "rak19007", "cnano-avr128da48", "nodemcu-32s", "cs-solarmeter", "feather-m0_express", "feather-m0_wifi", "feather-m4_express"]
|
||||
rack_bay6_xyz_loc = [0,0,0]; // [0:.5:450]
|
||||
rack_bay6_rotation = 0; // [0:90:270]
|
||||
rack_bay6_face = "fixed"; //["open","fixed","removable","vent"]
|
||||
rack_bay6_rear_fan = false; //[true,false]
|
||||
rack_bay6_rear_conduit = "none"; //["none","conduit","grommet","grommets-vertical"]
|
||||
|
||||
/* [3D Case Adjustments] */
|
||||
// sbc location x axis
|
||||
pcb_loc_x = 0; //[0:.01:300]
|
||||
@@ -153,7 +206,7 @@ hd_y_position = 25; // [0:300]
|
||||
hd_z_position = 40; // [0:300]
|
||||
|
||||
// case accessory group to load
|
||||
accessory_name = "none"; // ["none", "hk_uart", "c4_shell_boombox", "c4_desktop_lcd3.5", "c4_deskboom_lcd3.5", "c4_panel_boombox", "c4_panel_lcd3.5", "c4_tray_boombox", "c4_round", "c4_hex", "xu4_shifter_shield", "xu4_keyhole", "hc4_panel_nas", "hc4_shell_drivebox2.5", "hc4_shell_drivebox2.5v", "hc4_shell_drivebox3.5", "hc4_tray_drivebox2.5", "m2_shell", "m2_eyespi_eink1.54", "m2_eyespi_lcd2.8", "m1s_shell_nvme", "m1s_shell_ups", "m1s_tray_nvme", "m1_tray_ssd", "m1_fitted_pizzabox2.5", "m1_fitted_pizzabox3.5", "h3_shell", "h3_shell_router", "h3_lowboy", "h3_lowboy_router", "h3_panel_nas", "h3_ultimate", "h3_ultimate2", "h4_panel_nas", "h4_panel_nas-bottom_sbc", "show2_shell", "rpi5_m2hat", "rpi5_bottom_m2hat", "rock5b", "adapter_mini-stx_m1s", "nas", "cs_solarmeter", "n2l_env_sensors", "avr_env_sensors", "adafruit_solar_charger"]
|
||||
accessory_name = "none"; // ["none", "hk_uart", "c4_shell_boombox", "c4_desktop_lcd3.5", "c4_deskboom_lcd3.5", "c4_panel_boombox", "c4_panel_lcd3.5", "c4_tray_boombox", "c4_round", "c4_hex", "xu4_shifter_shield", "xu4_keyhole", "hc4_panel_nas", "hc4_shell_drivebox2.5", "hc4_shell_drivebox2.5v", "hc4_shell_drivebox3.5", "hc4_tray_drivebox2.5", "n-series_rack19-1u", "n1_rack10-1u", "m2_shell", "m2_eyespi_eink1.54", "m2_eyespi_lcd2.8", "m1s_shell_nvme", "m1s_shell_ups", "m1s_tray_nvme", "m1_tray_ssd", "m1_fitted_pizzabox2.5", "m1_fitted_pizzabox3.5", "h3_shell", "h3_shell_router", "h3_lowboy", "h3_lowboy_router", "h3_panel_nas", "h3_ultimate", "h3_ultimate2", "h4_panel_nas", "show2_shell", "rpi5_m2hat", "rpi5_bottom_m2hat", "rock5b", "adapter_mini-stx_m1s", "nas", "cs_solarmeter", "n2l_env_sensors", "avr_env_sensors", "adafruit_solar_charger"]
|
||||
|
||||
// sbc information text color
|
||||
text_color = "Green"; // [Green, Black, Dimgrey, White, Yellow, Orange, Red, DarkbBlue]
|
||||
@@ -372,6 +425,7 @@ multipcb_bottom_front_right_enable = true;
|
||||
multipcb_bottom_front_right_adjust = 0; //[-20:.01:20]
|
||||
multipcb_bottom_front_right_support = "front"; //[none,left,rear,front,right]
|
||||
|
||||
/* [Hidden] */
|
||||
a = search([accessory_name],accessory_data);
|
||||
s = search([sbc_model],sbc_data);
|
||||
|
||||
@@ -385,19 +439,16 @@ pcb_color = sbc_data[s[0]][11][1];
|
||||
pcb_radius = sbc_data[s[0]][11][0];
|
||||
|
||||
pcb_z = sbc_model == "ssi-eeb" || sbc_model == "ssi-ceb" || sbc_model == "atx" || sbc_model == "micro-atx" || sbc_model == "dtx" || sbc_model == "flex-atx" || sbc_model == "mini-dtx" || sbc_model == "mini-itx" || sbc_model == "mini-itx_thin" || sbc_model == "mini-stx" || sbc_model == "mini-stx_thin" || sbc_model == "nano-itx" || sbc_model == "nuc" || sbc_model == "pico-itx" ? pcb_z_orig + standard_motherboard_thickness : pcb_z_orig;
|
||||
width = case_design == "panel_nas" && pcb_width <= 100 ? pcb_width+2*(sidethick+gap)+case_offset_x+(101.6-pcb_width) : case_design == "panel_nas" && pcb_width > 100 ? pcb_width+2*(sidethick+gap)+case_offset_x : pcb_width+(2*(wallthick+gap))+case_offset_x;
|
||||
depth = case_design == "panel_nas" ? pcb_depth+2*(wallthick+gap)+case_offset_y + 147-pcb_depth+hd_y_position : pcb_depth+2*(wallthick+gap)+case_offset_y;
|
||||
width = case_design == "panel_nas" && pcb_width <= 100 ? pcb_width+2*(sidethick+gap)+case_offset_x+(101.6-pcb_width) : case_design == "panel_nas" && pcb_width > 100 ? pcb_width+2*(sidethick+gap)+case_offset_x : case_design == "rack" && rack_width == 19 ? 450 : case_design == "rack" && rack_width == 10 ? 221.5 : pcb_width+(2*(wallthick+gap))+case_offset_x;
|
||||
depth = case_design == "panel_nas" ? pcb_depth+2*(wallthick+gap)+case_offset_y + 147-pcb_depth+hd_y_position : case_design == "rack" ? 100+case_offset_y : pcb_depth+2*(wallthick+gap)+case_offset_y;
|
||||
top_height = pcb_tmaxz+floorthick+case_offset_tz+pcb_loc_z;
|
||||
bottom_height = (case_design == "tray" || case_design == "tray_vu5" || case_design == "tray_vu7" || case_design == "tray_sides") ? pcb_z+pcb_bmaxz+floorthick+case_offset_bz+4 : pcb_z+pcb_bmaxz+floorthick+case_offset_bz;
|
||||
case_z = case_design == "panel_nas" ? bottom_height+top_height+hd_z_position+(hd_bays * (hd_space + 26.1)) : bottom_height+top_height;
|
||||
case_z = case_design == "panel_nas" ? bottom_height+top_height+hd_z_position+(hd_bays * (hd_space + 26.1)) : case_design == "rack" && rack_size == "1u" ? 44.45+floorthick : case_design == "rack" && rack_size == "1u+" ? 59.26+floorthick : case_design == "rack" && rack_size == "1u++" ? 74.07+floorthick : case_design == "rack" && rack_size == "2u" ? 88.90+floorthick : bottom_height+top_height;
|
||||
case_diameter = sqrt(pow(width-wallthick-gap,2)+pow(depth-wallthick-gap,2));
|
||||
hex_diameter = sqrt(pow(width+2*(wallthick+gap),2)+pow(depth+2*(wallthick+gap),2));
|
||||
//hd_spacer = case_design == "panel_nas" && pcb_width > 100 ? (pcb_width+case_offset_x+2*gap)-101.6 :
|
||||
// case_design == "panel_nas" && pcb_width <= 100 ? (width-2*(sidethick+gap)-101.6) : 0;
|
||||
hd_spacer = case_design == "panel_nas" && pcb_width > 100 ? (pcb_width+case_offset_x+2*gap)-101.6 :
|
||||
case_design == "panel_nas" && pcb_width <= 100 ? (width-2*(sidethick+gap)-101.6) : 0;
|
||||
|
||||
/* [Hidden] */
|
||||
top_standoff = [top_standoff_size,
|
||||
top_standoff_diameter,
|
||||
18,
|
||||
@@ -482,6 +533,25 @@ multipcb_bottom_standoff = [multipcb_bottom_standoff_size,
|
||||
multipcb_bottom_standoff_insert_dia,
|
||||
multipcb_bottom_standoff_insert_height];
|
||||
|
||||
rack_bay_sbc = [Rack_Bay1,Rack_Bay2,Rack_Bay3,Rack_Bay4,Rack_Bay5,Rack_Bay6];
|
||||
|
||||
rack_bay_xyz_loc = [[rack_bay1_xyz_loc[0],rack_bay1_xyz_loc[1],rack_bay1_xyz_loc[2]],
|
||||
[rack_bay2_xyz_loc[0],rack_bay2_xyz_loc[1],rack_bay2_xyz_loc[2]],
|
||||
[rack_bay3_xyz_loc[0],rack_bay3_xyz_loc[1],rack_bay3_xyz_loc[2]],
|
||||
[rack_bay4_xyz_loc[0],rack_bay4_xyz_loc[1],rack_bay4_xyz_loc[2]],
|
||||
[rack_bay5_xyz_loc[0],rack_bay5_xyz_loc[1],rack_bay5_xyz_loc[2]],
|
||||
[rack_bay6_xyz_loc[0],rack_bay6_xyz_loc[1],rack_bay6_xyz_loc[2]]];
|
||||
|
||||
rack_bay_rotation = [rack_bay1_rotation, rack_bay2_rotation, rack_bay3_rotation, rack_bay4_rotation, rack_bay5_rotation, rack_bay6_rotation];
|
||||
rack_bay_face = [rack_bay1_face, rack_bay2_face, rack_bay3_face, rack_bay4_face, rack_bay5_face, rack_bay6_face];
|
||||
rack_bay_wall = [rack_bay1_wall, rack_bay2_wall, rack_bay3_wall, rack_bay4_wall, rack_bay5_wall, false];
|
||||
rack_bay_rear_fan = [rack_bay1_rear_fan, rack_bay2_rear_fan, rack_bay3_rear_fan, rack_bay4_rear_fan, rack_bay5_rear_fan, rack_bay6_rear_fan];
|
||||
rack_bay_rear_conduit = [rack_bay1_rear_conduit, rack_bay2_rear_conduit, rack_bay3_rear_conduit, rack_bay4_rear_conduit, rack_bay5_rear_conduit, rack_bay6_rear_conduit];
|
||||
baysize = (450-(2*wallthick))/6;
|
||||
bay_height = rack_size == "1u" ? 44.45-floorthick :
|
||||
rack_size == "1u+" ? (44.45/3)+44.45-floorthick :
|
||||
rack_size == "1u++" ? 2*(44.45/3)+44.45-floorthick : (2 * 44.45)-floorthick;
|
||||
|
||||
adj = .01;
|
||||
$fn=90;
|
||||
|
||||
@@ -541,6 +611,43 @@ if (view == "platter") {
|
||||
case_bottom(case_design);
|
||||
translate([0,(2*depth)+20,case_z+floorthick]) rotate([180,0,0]) case_top(case_design);
|
||||
}
|
||||
if(case_design == "rack") {
|
||||
case_rack(case_design,"bottom");
|
||||
translate([0,(2*depth)+20,case_z+floorthick]) rotate([180,0,0]) case_rack(case_design,"top");
|
||||
// rear fan covers
|
||||
ucount = rack_width == 10 ? 3 : len(rack_bay_sbc)-1;
|
||||
for(r = [0:ucount-1]) {
|
||||
fan_offset = -75+(75-rear_fan_size)/2;
|
||||
if(rack_bay_rear_fan[r] == true) {
|
||||
translate([-gap-wallthick-1+.125+75*(r+1)+fan_offset+8,
|
||||
-80,(case_z-rear_fan_size)/2])
|
||||
fan_cover(rear_fan_size, wallthick, rear_cooling);
|
||||
}
|
||||
}
|
||||
// rear grommets
|
||||
for(r = [0:len(rack_bay_sbc)-1]) {
|
||||
grommet_offset = -75+11;
|
||||
if(rack_bay_rear_conduit[r] == "grommet") {
|
||||
translate([0,-50,0]) rotate([270,0,0]) difference() {
|
||||
translate([-gap-wallthick-1+.125+75*(r+1)+grommet_offset,0,0])
|
||||
grommet("bottom", "sleeve", 10, r+2, wallthick, false, [false,10,0,"default"]);
|
||||
translate([-gap-wallthick-1+.125+75*(r+1)+grommet_offset-10,-.125,-3]) cube([20,10,20]);
|
||||
}
|
||||
translate([0,-30,0]) rotate([270,0,0]) difference() {
|
||||
translate([-gap-wallthick-1+.125+75*(r+1)+grommet_offset,0,0])
|
||||
grommet("bottom", "sleeve", 10, r+2, wallthick, false, [false,10,0,"default"]);
|
||||
translate([-gap-wallthick-1+.125+75*(r+1)+grommet_offset-10,-.125,-3]) cube([20,10,20]);
|
||||
}
|
||||
translate([-gap-wallthick-1+.125+75*(r+1)+grommet_offset,-70,0])
|
||||
grommet_clip("sleeve", 10, r+2, wallthick);
|
||||
}
|
||||
}
|
||||
for(r = [0:ucount-1]) {
|
||||
if(rack_bay_face[r] == "removable") {
|
||||
translate([-gap-wallthick-1+(75*(r))+8,-300,0]) bay_tray(depth, r);
|
||||
}
|
||||
}
|
||||
}
|
||||
if(case_design == "adapter_mini-stx_thin" || case_design == "adapter_mini-stx" || case_design == "adapter_mini-itx_thin" || case_design == "adapter_mini-itx" || case_design == "adapter_flex-atx" || case_design == "adapter_mini-dtx" || case_design == "adapter_dtx" || case_design == "adapter_micro-atx" || case_design == "adapter_atx" || case_design == "adapter_ssi-ceb" || case_design == "adapter_ssi-eeb") {
|
||||
color("dimgrey",1) case_adapter(case_design);
|
||||
color("dimgrey",1) translate([-180, 0, 4]) rotate([270,0,0]) io_shield();
|
||||
@@ -1011,6 +1118,125 @@ if (view == "model") {
|
||||
sbc(sbc_model, cooling, fan_size, gpio_opening, uart_opening, false);
|
||||
}
|
||||
}
|
||||
if(case_design == "rack") {
|
||||
if(lower_bottom >= 0) {
|
||||
difference() {
|
||||
color("dimgrey",1) translate([0,0,-lower_bottom]) case_rack(case_design,"bottom");
|
||||
if(move_rear < 0) {
|
||||
translate([-gap-wallthick-1,-gap-wallthick-1,-lower_bottom-1])
|
||||
cube([width+2,gap+wallthick+1.01,case_z+2]);
|
||||
}
|
||||
if(move_front < 0) {
|
||||
translate([-gap-wallthick-1,depth-2*(gap+wallthick),-lower_bottom-1])
|
||||
cube([width+2,gap+wallthick+1.01,case_z+2]);
|
||||
}
|
||||
if(move_leftside < 0) {
|
||||
translate([-gap-wallthick-1,-gap-wallthick-1,-lower_bottom-1])
|
||||
cube([gap+wallthick+1.01,depth+2,case_z+2]);
|
||||
}
|
||||
if(move_rightside < 0) {
|
||||
translate([width-2*(gap+wallthick),-gap-wallthick-1,-lower_bottom-1])
|
||||
cube([gap+wallthick+1,depth+2,case_z+2]);
|
||||
}
|
||||
}
|
||||
}
|
||||
if(raise_top >= 0) {
|
||||
difference() {
|
||||
color("dimgrey",1) translate([0,0,raise_top]) case_rack(case_design,"top");
|
||||
if(move_rear < 0) {
|
||||
translate([-gap-wallthick-1,-gap-wallthick-1,-lower_bottom-1])
|
||||
cube([width+2,gap+wallthick+1.01,case_z+2]);
|
||||
}
|
||||
if(move_front < 0) {
|
||||
translate([-gap-wallthick-1,depth-2*(gap+wallthick),-lower_bottom-1])
|
||||
cube([width+2,gap+wallthick+1.01,case_z+2]);
|
||||
}
|
||||
if(move_leftside < 0) {
|
||||
translate([-gap-wallthick-1,-gap-wallthick-1,-lower_bottom-1])
|
||||
cube([gap+wallthick+1.01,depth+2,case_z+2]);
|
||||
}
|
||||
if(move_rightside < 0) {
|
||||
translate([width-2*(gap+wallthick),-gap-wallthick-1,-lower_bottom-1])
|
||||
cube([gap+wallthick+1,depth+2,case_z+2]);
|
||||
}
|
||||
}
|
||||
}
|
||||
ucount = rack_width == 10 ? 2 : len(rack_bay_sbc)-1;
|
||||
// rear fan covers
|
||||
for(r = [0:ucount]) {
|
||||
fan_offset = -75+(75-rear_fan_size)/2;
|
||||
if(rack_bay_rear_fan[r] == true) {
|
||||
translate([-gap-wallthick-1+.125+75*(r+1)+fan_offset+8,
|
||||
depth-gap,(case_z-rear_fan_size)/2])
|
||||
rotate([90,0,0]) fan_cover(rear_fan_size, wallthick, rear_cooling);
|
||||
}
|
||||
// rear grommets
|
||||
grommet_offset = -75+11;
|
||||
if(rack_bay_rear_conduit[r] == "grommet" || rack_bay_rear_conduit[r] == "grommets-vertical") {
|
||||
translate([-gap-wallthick-1+.125+75*(r+1)+grommet_offset+4,depth-wallthick-gap,13])
|
||||
color("lightgrey") grommet("front", "sleeve", 10, 4, wallthick, true, [false,10,0,"default"]);
|
||||
}
|
||||
if(rack_bay_rear_conduit[r] == "grommets-vertical") {
|
||||
translate([-gap-wallthick-1+.125+75*(r+1)+grommet_offset+4,depth-wallthick-gap,30])
|
||||
color("lightgrey") grommet("front", "sleeve", 10, 4, wallthick, true, [false,10,0,"default"]);
|
||||
}
|
||||
|
||||
// bay inserts
|
||||
bayadj = r == 0 ? -75.5 : r == 5 ? -74.75: -75;
|
||||
if(rack_bay_face[r] == "removable" && r ==0 && rack_bay_sbc[r] != "none") {
|
||||
color("gray") translate([bayadj+75*(r+1),0,floorthick])
|
||||
bay_tray(depth-2*wallthick-gap-.5-tol,r);
|
||||
}
|
||||
if(rack_bay_face[r] == "removable" && r !=0 && rack_bay_sbc[r] != "none") {
|
||||
color("gray") translate([bayadj+75*(r+1),0,floorthick])
|
||||
bay_tray(depth-2*wallthick-gap-.5-tol,r);
|
||||
}
|
||||
}
|
||||
// sbc placement
|
||||
if(sbc_off == false) {
|
||||
for(i = [0:len(rack_bay_sbc)-1]) {
|
||||
if(rack_bay_sbc[i] != "none" && rack_bay_face[i] != "removable") {
|
||||
s = search([rack_bay_sbc[i]],sbc_data);
|
||||
pcb_id = sbc_data[s[0]][4];
|
||||
pcb_width = sbc_data[s[0]][10][0];
|
||||
pcb_depth = sbc_data[s[0]][10][1];
|
||||
pcb_z_orig = sbc_data[s[0]][10][2];
|
||||
pcb_tmaxz = sbc_data[s[0]][11][5];
|
||||
pcb_bmaxz = sbc_data[s[0]][11][6];
|
||||
|
||||
pcb_loc_x = rack_bay_rotation[i] == 90 ? rack_bay_xyz_loc[i][0] + pcb_width : rack_bay_rotation[i] == 180 ? rack_bay_xyz_loc[i][0] + pcb_width : rack_bay_xyz_loc[i][0];
|
||||
pcb_loc_y = rack_bay_rotation[i] == 270 ? rack_bay_xyz_loc[i][1]+pcb_width : rack_bay_rotation[i] == 180 ? rack_bay_xyz_loc[i][1]+pcb_depth : rack_bay_xyz_loc[i][1];
|
||||
pcb_loc_z = rack_bay_sbc[i] == "n2+" ? rack_bay_xyz_loc[i][2]+1.5 : rack_bay_xyz_loc[i][2];
|
||||
|
||||
translate([pcb_loc_x ,pcb_loc_y,pcb_bmaxz+floorthick+case_offset_bz+pcb_loc_z])
|
||||
rotate([0,0,rack_bay_rotation[i]])
|
||||
sbc(rack_bay_sbc[i], cooling, fan_size, gpio_opening, uart_opening, false);
|
||||
}
|
||||
if(rack_bay_sbc[i] != "none" && rack_bay_face[i] == "removable") {
|
||||
bayadj = i == 0 ? -75.5 : i == 5 ? -74.75: -75;
|
||||
s = search([rack_bay_sbc[i]],sbc_data);
|
||||
pcb_id = sbc_data[s[0]][4];
|
||||
pcb_width = sbc_data[s[0]][10][0];
|
||||
pcb_depth = sbc_data[s[0]][10][1];
|
||||
pcb_z_orig = sbc_data[s[0]][10][2];
|
||||
pcb_tmaxz = sbc_data[s[0]][11][5];
|
||||
pcb_bmaxz = sbc_data[s[0]][11][6];
|
||||
|
||||
pcb_loc_x = rack_bay_rotation[i] == 90 ? rack_bay_xyz_loc[i][0] + pcb_width :
|
||||
rack_bay_rotation[i] == 180 ? rack_bay_xyz_loc[i][0] + pcb_width :
|
||||
rack_bay_xyz_loc[i][0];
|
||||
pcb_loc_y = rack_bay_rotation[i] == 270 ? rack_bay_xyz_loc[i][1]+pcb_width :
|
||||
rack_bay_rotation[i] == 180 ? rack_bay_xyz_loc[i][1]+pcb_depth :
|
||||
rack_bay_xyz_loc[i][1];
|
||||
pcb_loc_z = rack_bay_xyz_loc[i][2];
|
||||
|
||||
translate([pcb_loc_x+bayadj+75*(i+1) ,pcb_loc_y+wallthick+gap,
|
||||
pcb_bmaxz+floorthick+case_offset_bz+pcb_loc_z+1]) rotate([0,0,rack_bay_rotation[i]])
|
||||
sbc(rack_bay_sbc[i], cooling, fan_size, gpio_opening, uart_opening, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(case_design == "adapter_mini-stx_thin" || case_design == "adapter_mini-stx" || case_design == "adapter_mini-itx_thin" || case_design == "adapter_mini-itx" || case_design == "adapter_flex-atx" || case_design == "adapter_mini-dtx" || case_design == "adapter_dtx" || case_design == "adapter_micro-atx" || case_design == "adapter_atx" || case_design == "adapter_ssi-ceb" || case_design == "adapter_ssi-eeb") {
|
||||
color("dimgrey",1) case_adapter(case_design);
|
||||
if(sbc_off == false) {
|
||||
@@ -1118,10 +1344,24 @@ if (view == "part") {
|
||||
}
|
||||
}
|
||||
if(individual_part == "bottom") {
|
||||
if(case_design == "shell" || case_design == "stacked" || case_design == "round" || case_design == "hex"
|
||||
|| case_design == "round" || case_design == "snap" || case_design == "fitted") {
|
||||
case_bottom(case_design);
|
||||
}
|
||||
if(case_design == "tray" || case_design == "tray_vu5" || case_design == "tray_vu7" || case_design == "tray_sides") {
|
||||
translate([0,depth,case_z]) rotate([180,0,0]) case_top(case_design);
|
||||
}
|
||||
if(case_design == "adapter_mini-stx_thin" || case_design == "adapter_mini-stx" || case_design == "adapter_mini-itx_thin" || case_design == "adapter_mini-itx" || case_design == "adapter_flex-atx" || case_design == "adapter_mini-dtx" || case_design == "adapter_dtx" || case_design == "adapter_micro-atx" || case_design == "adapter_atx" || case_design == "adapter_ssi-ceb" || case_design == "adapter_ssi-eeb") {
|
||||
case_adapter(case_design);
|
||||
}
|
||||
else {
|
||||
if(case_design == "rack") {
|
||||
difference() {
|
||||
translate([-150,0,-lower_bottom]) case_rack(case_design,"bottom");
|
||||
translate([-gap-wallthick-450,-gap-wallthick-1,-adj]) cube([450,depth+2,case_z+2*adj]);
|
||||
translate([150-gap-wallthick,-gap-wallthick-1,-adj]) cube([450,depth+2,case_z+2*adj]);
|
||||
}
|
||||
}
|
||||
if(case_design == "panel" || case_design == "panel_nas") {
|
||||
if(section_part == false) {
|
||||
case_bottom(case_design);
|
||||
}
|
||||
@@ -1167,6 +1407,18 @@ if (view == "part") {
|
||||
if(case_design == "tray_vu5" || case_design == "tray_vu7" || case_design == "tray_sides") {
|
||||
translate([depth,0,width-gap]) rotate([0,90,90]) case_side(case_design,"right");
|
||||
}
|
||||
if(case_design == "rack" && rack_width == 19) {
|
||||
difference() {
|
||||
translate([-300,0,-lower_bottom]) case_rack(case_design,"bottom");
|
||||
translate([-gap-wallthick-450,-gap-wallthick-1,-adj]) cube([450,depth+2,case_z+2*adj]);
|
||||
}
|
||||
}
|
||||
if(case_design == "rack" && rack_width == 10) {
|
||||
difference() {
|
||||
translate([-150,0,-lower_bottom]) case_rack(case_design,"bottom");
|
||||
translate([-gap-wallthick-450,-gap-wallthick-1,-adj]) cube([450,depth+2,case_z+2*adj]);
|
||||
}
|
||||
}
|
||||
}
|
||||
if(individual_part == "left") {
|
||||
if(case_design == "panel" || case_design == "panel_nas") {
|
||||
@@ -1184,6 +1436,13 @@ if (view == "part") {
|
||||
translate([gap,0,2*sidethick+gap]) rotate([0,-90,-90])
|
||||
case_side(case_design,"left");
|
||||
}
|
||||
if(case_design == "rack") {
|
||||
difference() {
|
||||
translate([0,0,-lower_bottom]) case_rack(case_design,"bottom");
|
||||
translate([150-gap-wallthick,-gap-wallthick-1,-adj]) cube([450,depth+2,case_z+2*adj]);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
if(individual_part == "io_shield") {
|
||||
if(case_design == "adapter_mini-stx_thin" || case_design == "adapter_mini-stx" || case_design == "adapter_mini-itx_thin" || case_design == "adapter_mini-itx" || case_design == "adapter_flex-atx" || case_design == "adapter_mini-dtx" || case_design == "adapter_dtx" || case_design == "adapter_micro-atx" || case_design == "adapter_atx" || case_design == "adapter_ssi-ceb" || case_design == "adapter_ssi-eeb") {
|
||||
@@ -1195,6 +1454,40 @@ if (view == "part") {
|
||||
if(case_design == "panel_nas" && (pcb_width > 100 || width > 101.6)) {
|
||||
rotate([270,0,0]) cableholder_spacer(hd_spacer-9.4);
|
||||
}
|
||||
if(case_design == "rack") {
|
||||
// rear fan covers
|
||||
ucount = rack_width == 10 ? 3 : len(rack_bay_sbc)-1;
|
||||
for(r = [0:ucount-1]) {
|
||||
fan_offset = -75+(75-rear_fan_size)/2;
|
||||
if(rack_bay_rear_fan[r] == true) {
|
||||
translate([-gap-wallthick-1+.125+75*(r+1)+fan_offset+8,0,0])
|
||||
fan_cover(rear_fan_size, wallthick, rear_cooling);
|
||||
}
|
||||
}
|
||||
// rear grommets
|
||||
for(r = [0:len(rack_bay_sbc)-1]) {
|
||||
grommet_offset = -75+11;
|
||||
if(rack_bay_rear_conduit[r] == "grommet") {
|
||||
translate([0,0,0]) rotate([270,0,0]) difference() {
|
||||
translate([-gap-wallthick-1+.125+75*(r+1)+grommet_offset,0,0])
|
||||
grommet("bottom", "sleeve", 10, r+2, wallthick, false, [false,10,0,"default"]);
|
||||
translate([-gap-wallthick-1+.125+75*(r+1)+grommet_offset-10,-.125,-3]) cube([20,10,20]);
|
||||
}
|
||||
translate([0,20,0]) rotate([270,0,0]) difference() {
|
||||
translate([-gap-wallthick-1+.125+75*(r+1)+grommet_offset,0,0])
|
||||
grommet("bottom", "sleeve", 10, r+2, wallthick, false, [false,10,0,"default"]);
|
||||
translate([-gap-wallthick-1+.125+75*(r+1)+grommet_offset-10,-.125,-3]) cube([20,10,20]);
|
||||
}
|
||||
translate([-gap-wallthick-1+.125+75*(r+1)+grommet_offset,-20,0])
|
||||
grommet_clip("sleeve", 10, r+2, wallthick);
|
||||
}
|
||||
}
|
||||
for(r = [0:ucount-1]) {
|
||||
if(rack_bay_face[r] == "removable") {
|
||||
translate([-gap-wallthick-1+(75*(r))+8,-300,0]) bay_tray(depth, r);
|
||||
}
|
||||
}
|
||||
}
|
||||
// ui access panel
|
||||
if(bottom_access_panel_enable == true) {
|
||||
if(access_panel_rotation == 0) {
|
||||
|
||||
@@ -255,6 +255,16 @@ accessory_data = [
|
||||
"model","fan_cover",37,-4,7,"bottom",[90,0,0],["case",true,false,false],[40,0,3],["fan_1"],[false,10,2,"default"],
|
||||
"platter","fan_cover",-50,50,0,"bottom",[0,0,0],["case",false,false,false],[40,0,3],["fan_1"],[false,10,2,"default"]],
|
||||
|
||||
// Odroid-N2
|
||||
["n-series_rack19-1u",
|
||||
"add2","hd_holder",229,102,1.99,"bottom",[0,0,180],["case",false,false,false],[0,0,0],[2.5,"portrait"],[false,10,2,"default"],
|
||||
"model","hd25",229,102,3,"bottom",[0,0,180],["case",false,false,false],[0,0,0],["portrait",15],[true,10,2,"both"],
|
||||
"model","hd25",229,102,20.5,"bottom",[0,0,180],["case",false,false,false],[0,0,0],["portrait",15],[true,10,2,"default"]],
|
||||
["n1_rack10-1u",
|
||||
"add2","hd_holder",1,10,1.99,"bottom",[0,0,0],["case",false,false,false],[0,0,0],[2.5,"landscape"],[false,10,2,"default"],
|
||||
"model","hd25",1,10,3,"bottom",[0,0,0],["case",false,false,false],[0,0,0],["landscape",15],[true,20,2,"both"],
|
||||
"model","hd25",1,10,20.5,"bottom",[0,0,0],["case",false,false,false],[0,0,0],["landscape",15],[true,20,2,"default"]],
|
||||
|
||||
// Odroid-M2
|
||||
["m2_shell",
|
||||
"add2","button",5.5,56,24,"top",[0,0,180],["sbc-case_z",false,false,true],[12,8,1.5],["cutout",[2,2,2,2],2.25],[true,10,2,"default"]],
|
||||
|
||||
@@ -25,6 +25,7 @@ use <./SBC_Model_Framework/sbc_models_library.scad>
|
||||
include <./mod/add.scad>;
|
||||
include <./mod/case_adapter.scad>;
|
||||
include <./mod/case_bottom.scad>;
|
||||
include <./mod/case_rack.scad>;
|
||||
include <./mod/case_side.scad>;
|
||||
include <./mod/case_top.scad>;
|
||||
include <./mod/case_folded.scad>;
|
||||
@@ -44,11 +45,14 @@ include <./lib/dsub.scad>;
|
||||
include <./lib/fans.scad>;
|
||||
include <./lib/fastener.scad>;
|
||||
include <./lib/feet.scad>;
|
||||
include <./lib/grommet.scad>;
|
||||
include <./lib/hd.scad>;
|
||||
include <./lib/holder.scad>;
|
||||
include <./lib/keyhole.scad>;
|
||||
include <./lib/oem_adafruit.scad>;
|
||||
include <./lib/oem_hk.scad>;
|
||||
include <./lib/oem_rpi.scad>;
|
||||
include <./lib/panel_clamp.scad>;
|
||||
include <./lib/rack.scad>;
|
||||
include <./lib/standoff.scad>;
|
||||
include <./lib/vent.scad>;
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
|
||||
/* find correct tolerance and use for respective entry's data_1 value within sbc_case_builder.cfg */
|
||||
|
||||
use <./sbc_case_builder_library.scad>;
|
||||
|
||||
battery_tolerance = 0;
|
||||
speaker_tolerance = 0;
|
||||
volume_tolerance = 0;
|
||||
|
||||
$fn = 90;
|
||||
|
||||
translate([-33,0,0]) batt_holder(battery_tolerance);
|
||||
difference() {
|
||||
translate([-17,-17,0]) cube([34,34,2]);
|
||||
translate([0,0,-1]) cylinder(d=24, h=4);
|
||||
}
|
||||
translate([0,0,1.99]) boom_speaker_holder("friction",speaker_tolerance);
|
||||
|
||||
translate([30,0,0]) boom_vring(volume_tolerance);
|
||||
|
||||
Reference in New Issue
Block a user