2 Commits

Author SHA1 Message Date
Edward Kisiel
64f3500e70 added NopSCADlib models fan, pillar, iec, fuseholder, pin_header and led 2022-10-19 19:27:05 -04:00
Edward Kisiel
b8cfc50426 added NopSCADlib submodule 2022-10-15 17:17:51 -04:00
9 changed files with 308 additions and 5186 deletions

3
.gitmodules vendored
View File

@@ -1,3 +1,6 @@
[submodule "SBC_Model_Framework"]
path = SBC_Model_Framework
url = https://github.com/hominoids/SBC_Model_Framework.git
[submodule "NopSCADlib"]
path = NopSCADlib
url = https://github.com/hominoids/NopSCADlib

1
NopSCADlib Submodule

Submodule NopSCADlib added at d95e1e64ed

View File

@@ -3,9 +3,9 @@
## Introduction
This project is about autonomous SBC case creation. It utilizes the SBC Model Framework project to automatically generate cases based on the data for any of the 51 current SBC contained within the framework. This allows legacy, current and future SBC to have multiple cases available on day one of their inclusion in the framework. There are multiple base case designs(shell, panel, stacked, tray, tray-sides, round, hex, snap, fitted) available and each allows for different styles within the design.
This project is about autonomous SBC case creation. It utilizes the SBC Model Framework project to automatically generate cases based on the data for any given SBC contained within the framework. This allows legacy, current and future SBC to have multiple cases available on day one of their inclusion in the framework. There are multiple base case designs(shell, panel, stacked, tray, round, hex, snap, fitted) available and each allows for different styles within the design.
All case openings are created automatically based on SBC data and the dimensions of any case design can be expanded in any axis allowing for the creation of larger cases. If you reposition the SBC in a case, you will see i/o openings created or removed appropriately based on its proximity to the case geometry. These cases might be useful for prototypes or other in house uses to quickly and easily create standard, specialized and custom SBC cases thru different case designs, styles and accessories.
All case openings are created automatically based on SBC data and, the dimensions of any case design can be expanded in any axis allowing for the creation of larger cases. If you reposition the SBC in a case, you will see i/o openings created or removed appropriately based on its proximity to the case geometry. These cases might be useful for prototypes or other in house uses to quickly and easily create standard, specialized and custom SBC cases thru different case designs, styles and accessories.
License: GPLv3.
@@ -21,9 +21,9 @@ License: GPLv3.
```
### SBC Case Builder Features:
- Autonomous Multi-SBC, Multi-Case Parametric Generation
- Autonomous Multi-SBC, Parametric Multi-Case Generation
- Autonomous Case Standoffs with Variable Height
- Extended Standoff SBC collision detection
- Extended Standoff sbc collision detection
- Accessory Customization Framework
- Accessory Multi-Associative Parametric Positioning
- Absolute Location
@@ -47,7 +47,6 @@ License: GPLv3.
- Sliding
- Cylinder
- Rack
- 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.
@@ -89,7 +88,7 @@ The SBC that I do not own have been created using manufacturer supplied mechanic
There are a few more ideas for base cases to be worked on as well as a host of supporting accessory models that need to be created. It would also be nice to have all of the OEM accessories for each SBC in the library as well. Im still looking for a better way to create accessory entries and groups, and continue to expand and verify as many SBC as possible. With that and the obvious benefit of autonomously making SBC cases, this project has also been helping fulfill another personal goal.
Computer aided design(CAD) has been around along time but I have been interested in exploring approaches to the next step, computer autonomous design. Regardless of the current or future object creation method, whether it be manufactured or materialized, I believe a universal approach to autonomous design will be needed to advance the human condition. This application has helped me explore and think about practical approaches that might be possible right now in autonomous design and I hope to continue this work by developing new tools and techniques for the new CAD, Computer Autonomous Design.
Computer aided design(CAD) has been around along time but I have been interested in exploring approaches to the next step, computer autonomous design. Regardless of the current or future object creation method, whether it be manufactured or materialized, I believe a universal approach to autonomous design will be needed to advance the human condition. This application has helped me explore and think about practical approaches that might be possible right now in autonomous design and I hope to continue this work by developing new tools and techniques for the new CAD, computer autonomous design.
### Notes
@@ -103,7 +102,7 @@ Template creation and i/o panel layouts in a dxf format can be easily created an
### Case Designs and Styles
The case naming convention for standard cases in the configuration file follow the basic form of “sbc”_”design”_”style” e.g. c4_shell or c4_tray_vu5.
#### Current Case Count 395
#### Current Case Count 377
##### Hardkernel
@@ -129,9 +128,7 @@ c4_tray_vu7, c4_shell_boombox, c4_panel_boombox, c4_deskboom_lcd3.5, c4_tray_boo
**Odorid-XU4Q cases** - 11 : xu4q_shell, xu4q_panel, xu4q_stacked, xu4q_tray, xu4q_tray_sides, xu4q_tray_vu5, xu4q_tray_vu7, xu4q_round, xu4q_hex, xu4q_snap, xu4q_fitted
**Odroid-H2 cases** - 17 : h2_shell, h2_lowboy, h2_lowboy_router, h2_shell_router, h2_shell_routerssd, h2_panel, h2_stacked, h2_tray, h2_tray_sides, h2_tray_vu5, h2_tray_vu7, h2_tray_router, h2_router_station, h2_round, h2_hex, h2_snap, h2_fitted
**Odroid-H3 cases** - 18 : h3_shell, h3_shell-internalfan, h3_lowboy, h3_lowboy_router, h3_shell_router, h3_shell_routerssd, h3_panel, h3_stacked, h3_tray, h3_tray_sides, h3_tray_vu5, h3_tray_vu7, h3_tray_router, h3_router_station, h3_round, h3_hex, h3_snap, h3_fitted
**Odroid-H2 and H3 cases** - 17 : h2_shell, h2_lowboy, h2_lowboy_router, h2_shell_router, h2_shell_routerssd, h2_panel, h2_stacked, h2_tray, h2_tray_sides, h2_tray_vu5, h2_tray_vu7, h2_tray_router, h2_router_station, h2_round, h2_hex, h2_snap, h2_fitted
**Odroid-Show2** cases - 1 : show2_shell

View File

@@ -1,9 +1,9 @@
// 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:83`
// list of SBC boards in `sbc_case_builder.scad:80`
// Also copy the output from the second Echo command into the list of case acceessory
// sets in `sbc_case_builder.scad:164`
// sets in `sbc_case_builder.scad:160`
include <./SBC_Model_Framework/sbc_models.cfg>;
include <./sbc_case_builder_accessories.cfg>;
@@ -14,4 +14,4 @@ echo(boards);
accessory_sets = [for(i=[0:1:len(accessory_data)-1]) accessory_data[i][0]];
echo("Copy the following to `sbc_case_builder.scad` for the `accessory_name` variable");
echo(accessory_sets);
echo(accessory_sets);

File diff suppressed because it is too large Load Diff

View File

@@ -40,17 +40,15 @@
added components and masks, added multi-associative parametric positioning for accessories,
added individual variable height sbc standoffs, added cutaway view when case face
is not movable, finished indents for select components and orientations.
20221011 Version 2.0.1 adjusted cases and accessories, updated README.md and SBC_Case_Builder_Cases.gif
20221101 Version 2.0.2 updated sbc model framework, h3/h3+ model and rockpi5b adjustments
see https://github.com/hominoids/SBC_Case_Builder
*/
include <./NopSCADlib/lib.scad>;
include <./SBC_Model_Framework/sbc_models.cfg>;
include <./sbc_case_builder_accessories.cfg>;
use <./SBC_Model_Framework/sbc_models.scad>;
use <./sbc_case_builder_library.scad>;
use <./lib/fillets.scad>;
include <./SBC_Model_Framework/sbc_models.cfg>;
include <./sbc_case_builder_accessories.cfg>;
/* [View] */
// viewing mode "platter", "model", "debug"
@@ -80,7 +78,7 @@ case_design = "shell"; // [shell,panel,stacked,tray,round,hex,snap,fitted]
// base case style
case_style = "none"; // ["none","vu5","vu7","sides"]
// single board computer model
sbc_model = "c1+"; // ["c1+", "c2", "c4", "xu4", "xu4q", "mc1", "hc1", "n1", "n2", "n2+", "n2+_noheatsink", "m1", "m1_noheatsink", "h2", "h3", "hc4", "show2", "rpizero", "rpizero2w", "rpi1a+", "rpi1b+", "rpi3a+", "rpi3b", "rpi3b+", "rpi4b", "a64", "rock64", "rockpro64", "quartz64a", "quartz64b", "h64b", "atomicpi", "jetsonnano", "rockpi4b+", "rockpi4c", "rockpi4c+", "rockpi5b", "vim1", "vim2", "vim3", "vim3l", "vim4", "tinkerboard", "tinkerboard-s", "tinkerboard-2", "tinkerboard-r2", "opizero", "opizero2", "opir1plus_lts", "test"]
sbc_model = "c1+"; // ["c1+", "c2", "c4", "xu4", "xu4q", "mc1", "hc1", "n1", "n2", "n2+", "n2+_noheatsink", "m1", "m1_noheatsink", "h2", "hc4", "show2", "rpizero", "rpizero2w", "rpi1a+", "rpi1b+", "rpi3a+", "rpi3b", "rpi3b+", "rpi4b", "a64", "rock64", "rockpro64", "quartz64a", "quartz64b", "h64b", "atomicpi", "jetsonnano", "rockpi4b+", "rockpi4c", "rockpi4c+", "rockpi5b", "vim1", "vim2", "vim3", "vim3l", "vim4", "tinkerboard", "tinkerboard-s", "tinkerboard-2", "tinkerboard-r2", "opizero", "opizero2", "opir1plus_lts", "test"]
// sbc location x axis
pcb_loc_x = 0; //[0:.5:200]
// sbc location y axis
@@ -161,7 +159,7 @@ cooling = "fan"; // [none,vents,fan,custom]
exhaust_vents = "vent"; // [none,vent]
// case accessory group to load
accessory_name = "none"; // ["none", "c1+_shell_boombox", "c1+_panel_boombox", "c1+_panel_lcd3.5", "c1+_desktop_lcd3.5", "c1+_deskboom_lcd3.5", "c1+_tray_boombox", "c1+_round", "c1+_hex", "c2_shell_boombox", "c2_panel_boombox", "c2_panel_lcd3.5", "c2_desktop_lcd3.5", "c2_deskboom_lcd3.5", "c2_tray_boombox", "c2_round", "c2_hex", "c4_shell_boombox", "c4_panel_lcd3.5", "c4_desktop_lcd3.5", "c4_deskboom_lcd3.5", "c4_panel_boombox", "c4_tray_boombox", "c4_round", "c4_hex", "hc4_tray_drivebox2.5", "hc4_shell_drivebox2.5", "hc4_shell_drivebox2.5v", "hc4_shell_drivebox3.5", "n1_round", "n1_hex", "n2+_tray_vu7_fan", "m1_panel", "m1_tray", "m1_tray_drive", "m1_tray_sides", "m1_tray_vu5", "m1_tray_vu7", "h2_shell", "h2_shell_router", "h2_shell_router-ssd", "h2_lowboy", "h2_lowboy_router", "h2_tray", "h2_tray_sides", "h2_tray_router", "h2_router_station", "h2_round", "h2_hex", "h3_shell", "h3_shell-internalfan", "h3_lowboy", "h3_lowboy_router", "jetsonnano_shell", "jetsonnano_panel", "jetsonnano_stacked", "jetsonnano_tray", "jetsonnano_tray_sides", "jetsonnano_round", "jetsonnano_hex", "jetsonnano_snap", "jetsonnano_fitted", "rock64_shell", "rock64_panel", "rock64_stacked", "rock64_tray", "rock64_tray_sides", "rock64_round", "rock64_hex", "rock64_snap", "rock64_fitted", "rockpro64_shell", "rockpro64_panel", "rockpro64_stacked", "rockpro64_tray", "rockpro64_tray_sides", "rockpro64_round", "rockpro64_hex", "rockpro64_snap", "rockpro64_fitted", "quartz64b_stacked_poe_hat", "show2_shell", "rpi1a+_shell", "rpi1a+_panel", "rpi1a+_stacked", "rpi1a+_tray", "rpi1a+_tray_sides", "rpi1a+_round", "rpi1a+_hex", "rpi1a+_snap", "rpi1a+_fitted", "rpi1b+_shell", "rpi1b+_panel", "rpi1b+_stacked", "rpi1b+_tray", "rpi1b+_tray_sides", "rpi1b+_round", "rpi1b+_hex", "rpi1b+_snap", "rpi1b+_fitted", "rpi3a+_shell", "rpi3a+_panel", "rpi3a+_stacked", "rpi3a+_tray", "rpi3a+_tray_sides", "rpi3a+_round", "rpi3a+_hex", "rpi3a+_snap", "rpi3a+_fitted", "rpi3b_shell", "rpi3b_panel", "rpi3b_stacked", "rpi3b_tray", "rpi3b_tray_sides", "rpi3b_round", "rpi3b_hex", "rpi3b_snap", "rpi3b_fitted", "rpi3b+_shell", "rpi3b+_panel", "rpi3b+_stacked", "rpi3b+_tray", "rpi3b+_tray_sides", "rpi3b+_round", "rpi3b+_hex", "rpi3b+_snap", "rpi3b+_fitted", "rpi4b_shell", "rpi4b_shell_geeekpi_poe_hat", "rpi4b_panel", "rpi4b_stacked", "rpi4b_stacked_geeekpi_poe_hat", "rpi4b_tray", "rpi4b_tray_sides", "rpi4b_round", "rpi4b_hex", "rpi4b_snap", "rpi4b_fitted", "rockpi4b+_shell", "rockpi4b+_panel", "rockpi4b+_stacked", "rockpi4b+_tray", "rockpi4b+_tray_sides", "rockpi4b+_round", "rockpi4b+_hex", "rockpi4b+_snap", "rockpi4b+_fitted", "rockpi4c_shell", "rockpi4c_panel", "rockpi4c_stacked", "rockpi4c_tray", "rockpi4c_tray_sides", "rockpi4c_round", "rockpi4c_hex", "rockpi4c_snap", "rockpi4c_fitted", "rockpi4c+_shell", "rockpi4c+_panel", "rockpi4c+_stacked", "rockpi4c+_tray", "rockpi4c+_tray_sides", "rockpi4c+_round", "rockpi4c+_hex", "rockpi4c+_snap", "rockpi4c+_fitted", "rockpi5b_adjustments", "vim1_shell", "vim1_panel", "vim1_stacked", "vim1_tray", "vim1_tray_sides", "vim1_round", "vim1_hex", "vim1_snap", "vim1_fitted", "vim2_shell", "vim2_panel", "vim2_stacked", "vim2_tray", "vim2_tray_sides", "vim2_round", "vim2_hex", "vim2_snap", "vim2_fitted", "vim3l_shell", "vim3l_panel", "vim3l_stacked", "vim3l_tray", "vim3l_tray_sides", "vim3l_round", "vim3l_hex", "vim3l_snap", "vim3l_fitted", "vim3_shell", "vim3_panel", "vim3_stacked", "vim3_tray", "vim3_tray_sides", "vim3_round", "vim3_hex", "vim3_snap", "vim3_fitted", "vim4_shell", "vim4_panel", "vim4_stacked", "vim4_tray", "vim4_tray_sides", "vim4_round", "vim4_hex", "vim4_snap", "vim4_fitted", "tinkerboard_shell", "tinkerboard_panel", "tinkerboard_stacked", "tinkerboard_tray", "tinkerboard_tray_sides", "tinkerboard_round", "tinkerboard_hex", "tinkerboard_snap", "tinkerboard_fitted", "tinkerboard-s_shell", "tinkerboard-s_panel", "tinkerboard-s_stacked", "tinkerboard-s_tray", "tinkerboard-s_tray_sides", "tinkerboard-s_round", "tinkerboard-s_hex", "tinkerboard-s_snap", "tinkerboard-s_fitted", "tinkerboard-2_shell", "tinkerboard-2_panel", "tinkerboard-2_stacked", "tinkerboard-2_tray", "tinkerboard-2_tray_sides", "tinkerboard-2_round", "tinkerboard-2_hex", "tinkerboard-2_snap", "tinkerboard-2_fitted", "tinkerboard-r2_shell", "tinkerboard-r2_panel", "tinkerboard-r2_stacked", "tinkerboard-r2_tray", "tinkerboard-r2_tray_sides", "tinkerboard-r2_round", "tinkerboard-r2_hex", "tinkerboard-r2_snap", "tinkerboard-r2_fitted", "hk_uart"]
accessory_name = "none"; // ["none", "NopSCADlib", "c1+_shell_boombox", "c1+_panel_boombox", "c1+_panel_lcd3.5", "c1+_desktop_lcd3.5", "c1+_deskboom_lcd3.5", "c1+_tray_boombox", "c1+_round", "c1+_hex", "c2_shell_boombox", "c2_panel_boombox", "c2_panel_lcd3.5", "c2_desktop_lcd3.5", "c2_deskboom_lcd3.5", "c2_tray_boombox", "c2_round", "c2_hex", "c4_shell_boombox", "c4_panel_lcd3.5", "c4_desktop_lcd3.5", "c4_deskboom_lcd3.5", "c4_panel_boombox", "c4_tray_boombox", "c4_round", "c4_hex", "hc4_tray_drivebox2.5", "hc4_shell_drivebox2.5", "hc4_shell_drivebox2.5v", "hc4_shell_drivebox3.5", "n1_round", "n1_hex", "n2+_tray_vu7_fan", "m1_panel", "m1_tray", "m1_tray_drive", "m1_tray_sides", "m1_tray_vu5", "m1_tray_vu7", "h2_shell", "h2_shell_router", "h2_shell_router-ssd", "h2_lowboy", "h2_lowboy_router", "h2_tray", "h2_tray_sides", "h2_tray_router", "h2_router_station", "h2_round", "h2_hex", "jetsonnano_shell", "jetsonnano_panel", "jetsonnano_stacked", "jetsonnano_tray", "jetsonnano_tray_sides", "jetsonnano_round", "jetsonnano_hex", "jetsonnano_snap", "jetsonnano_fitted", "rock64_shell", "rock64_panel", "rock64_stacked", "rock64_tray", "rock64_tray_sides", "rock64_round", "rock64_hex", "rock64_snap", "rock64_fitted", "rockpro64_shell", "rockpro64_panel", "rockpro64_stacked", "rockpro64_tray", "rockpro64_tray_sides", "rockpro64_round", "rockpro64_hex", "rockpro64_snap", "rockpro64_fitted", "quartz64b_stacked_poe_hat", "show2_shell", "rpi1a+_shell", "rpi1a+_panel", "rpi1a+_stacked", "rpi1a+_tray", "rpi1a+_tray_sides", "rpi1a+_round", "rpi1a+_hex", "rpi1a+_snap", "rpi1a+_fitted", "rpi1b+_shell", "rpi1b+_panel", "rpi1b+_stacked", "rpi1b+_tray", "rpi1b+_tray_sides", "rpi1b+_round", "rpi1b+_hex", "rpi1b+_snap", "rpi1b+_fitted", "rpi3a+_shell", "rpi3a+_panel", "rpi3a+_stacked", "rpi3a+_tray", "rpi3a+_tray_sides", "rpi3a+_round", "rpi3a+_hex", "rpi3a+_snap", "rpi3a+_fitted", "rpi3b_shell", "rpi3b_panel", "rpi3b_stacked", "rpi3b_tray", "rpi3b_tray_sides", "rpi3b_round", "rpi3b_hex", "rpi3b_snap", "rpi3b_fitted", "rpi3b+_shell", "rpi3b+_panel", "rpi3b+_stacked", "rpi3b+_tray", "rpi3b+_tray_sides", "rpi3b+_round", "rpi3b+_hex", "rpi3b+_snap", "rpi3b+_fitted", "rpi4b_shell", "rpi4b_shell_geeekpi_poe_hat", "rpi4b_panel", "rpi4b_stacked", "rpi4b_stacked_geeekpi_poe_hat", "rpi4b_tray", "rpi4b_tray_sides", "rpi4b_round", "rpi4b_hex", "rpi4b_snap", "rpi4b_fitted", "rockpi4b+_shell", "rockpi4b+_panel", "rockpi4b+_stacked", "rockpi4b+_tray", "rockpi4b+_tray_sides", "rockpi4b+_round", "rockpi4b+_hex", "rockpi4b+_snap", "rockpi4b+_fitted", "rockpi4c_shell", "rockpi4c_panel", "rockpi4c_stacked", "rockpi4c_tray", "rockpi4c_tray_sides", "rockpi4c_round", "rockpi4c_hex", "rockpi4c_snap", "rockpi4c_fitted", "rockpi4c+_shell", "rockpi4c+_panel", "rockpi4c+_stacked", "rockpi4c+_tray", "rockpi4c+_tray_sides", "rockpi4c+_round", "rockpi4c+_hex", "rockpi4c+_snap", "rockpi4c+_fitted", "vim1_shell", "vim1_panel", "vim1_stacked", "vim1_tray", "vim1_tray_sides", "vim1_round", "vim1_hex", "vim1_snap", "vim1_fitted", "vim2_shell", "vim2_panel", "vim2_stacked", "vim2_tray", "vim2_tray_sides", "vim2_round", "vim2_hex", "vim2_snap", "vim2_fitted", "vim3l_shell", "vim3l_panel", "vim3l_stacked", "vim3l_tray", "vim3l_tray_sides", "vim3l_round", "vim3l_hex", "vim3l_snap", "vim3l_fitted", "vim3_shell", "vim3_panel", "vim3_stacked", "vim3_tray", "vim3_tray_sides", "vim3_round", "vim3_hex", "vim3_snap", "vim3_fitted", "vim4_shell", "vim4_panel", "vim4_stacked", "vim4_tray", "vim4_tray_sides", "vim4_round", "vim4_hex", "vim4_snap", "vim4_fitted", "tinkerboard_shell", "tinkerboard_panel", "tinkerboard_stacked", "tinkerboard_tray", "tinkerboard_tray_sides", "tinkerboard_round", "tinkerboard_hex", "tinkerboard_snap", "tinkerboard_fitted", "tinkerboard-s_shell", "tinkerboard-s_panel", "tinkerboard-s_stacked", "tinkerboard-s_tray", "tinkerboard-s_tray_sides", "tinkerboard-s_round", "tinkerboard-s_hex", "tinkerboard-s_snap", "tinkerboard-s_fitted", "tinkerboard-2_shell", "tinkerboard-2_panel", "tinkerboard-2_stacked", "tinkerboard-2_tray", "tinkerboard-2_tray_sides", "tinkerboard-2_round", "tinkerboard-2_hex", "tinkerboard-2_snap", "tinkerboard-2_fitted", "tinkerboard-r2_shell", "tinkerboard-r2_panel", "tinkerboard-r2_stacked", "tinkerboard-r2_tray", "tinkerboard-r2_tray_sides", "tinkerboard-r2_round", "tinkerboard-r2_hex", "tinkerboard-r2_snap", "tinkerboard-r2_fitted", "hk_uart"]
a = search([accessory_name],accessory_data);
s = search([sbc_model],sbc_data);
@@ -1753,7 +1751,6 @@ module case_side(case_design,case_style,side) {
union() {
translate([-gap,-wallthick-gap,-floorthick])
cube([width-2*wallthick,wallthick,case_z+2*floorthick]);
// right hook
difference() {
translate([width-(2*wallthick)-gap-adjust,-wallthick-gap,
((case_z)/2)-4])
@@ -1762,9 +1759,8 @@ module case_side(case_design,case_style,side) {
((case_z)/2)-4-adjust])
cube([wallthick+.25,wallthick+(2*adjust),4.25]);
}
// left hook
difference() {
translate([-(2*wallthick)-gap-adjust-.25,-wallthick-gap,
translate([-(2*wallthick)-gap-adjust,-wallthick-gap,
((case_z)/2)-4])
cube([(2*wallthick)+.5,wallthick,8]);
translate([-wallthick-gap-adjust-.25,-wallthick-gap-adjust,
@@ -1791,7 +1787,6 @@ module case_side(case_design,case_style,side) {
union() {
translate([-gap,depth-2*(wallthick)-gap,-floorthick])
cube([width-2*wallthick,wallthick,case_z+2*floorthick]);
// right hook
difference() {
translate([width-(2*wallthick)-gap-adjust,depth-2*(wallthick)-gap-adjust,
((case_z)/2)-4])
@@ -1800,9 +1795,8 @@ module case_side(case_design,case_style,side) {
depth-2*(wallthick)-adjust-gap-adjust,((case_z)/2)-4-adjust])
cube([wallthick+.25,wallthick+(2*adjust),4.25]);
}
// left hook
difference() {
translate([-(2*wallthick)-gap-adjust-.25,depth-2*(wallthick)-gap-adjust,(
translate([-(2*wallthick)-gap-adjust,depth-2*(wallthick)-gap-adjust,(
(case_z)/2)-4])
cube([(2*wallthick)+.5,wallthick,8]);
translate([-wallthick-gap-adjust-.25,depth-2*(wallthick)-adjust-gap-adjust,
@@ -2105,7 +2099,7 @@ module open_io() {
}
}
// top cooling openings
if(side == "top" && cooling == "fan" && class == "heatsink" && type != "h3_oem"
if(side == "top" && cooling == "fan" && class == "heatsink"
&& type != "h2_oem" && type != "n2_oem" && type != "n2+_oem") {
translate([loc_x+6,loc_y-28,case_z-(floorthick+adjust)-5])
fan_mask(40,floorthick+(2*adjust)+8,2);
@@ -2124,10 +2118,6 @@ module open_io() {
translate([loc_x-28,loc_y-28,case_z-(floorthick+adjust)])
fan_mask(90,floorthick+6,2);
}
if(side == "top" && cooling == "fan" && class == "heatsink" && type == "h3_oem" ) {
translate([loc_x-5,loc_y-16,case_z-(floorthick+adjust)])
fan_mask(90,floorthick+6,2);
}
if(side == "top" && cooling == "vents" && class == "heatsink") {
for(r=[loc_x+7:4:48+loc_x]) {
translate([r,loc_y-20,case_z-(floorthick+adjust)-6])

File diff suppressed because it is too large Load Diff

View File

@@ -44,9 +44,7 @@
printer friendly punchout(),added remaining mask() entries, standardized mask()
20221005 version 2.0.0 increased mask projection for ir_1, added mask for usb2 and usb3 single_horizontal_a, hdmi_micro,
video-hdmi_mini,microsdcard,momentary_7x3x3_90,rj45_single_short, added subtraction microusb and sphere
20221011 Version 2.0.1 adjusted cases and accessories, updated README.md and SBC_Case_Builder_Cases.gif
20221101 version 2.0.2 added hdmi_a_vertical mask, increased jack_3.5 mask dia.to 6mm, lowered hdmi_a_vertical mask by 2mm,
added mask for microsdcard2
2022xxxx version 2.0.x added hdmi_a_vertical mask
see https://github.com/hominoids/SBC_Case_Builder
@@ -118,7 +116,8 @@
*/
use <./lib/fillets.scad>;
include <./NopSCADlib/lib.scad>
use <./lib/fillets.scad>
/* placement module *must be first* for children() */
module place(x,y,z,size_x,size_y,rotation,side) {
@@ -255,6 +254,9 @@ module add(type,loc_x,loc_y,loc_z,face,rotation,size_x,size_y,size_z,data_1,data
if(type == "fan_cover") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) fan_cover(size_x, size_z);
}
if(type == "fan") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) fan(data_4);
}
if(type == "feet") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) feet(size_x, size_z);
}
@@ -267,6 +269,32 @@ module add(type,loc_x,loc_y,loc_z,face,rotation,size_x,size_y,size_z,data_1,data
if(type == "boom_vring") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) boom_vring(data_1);
}
if(type == "screw") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) screw(data_4);
}
if(type == "nut") {
length = screw_head_type(data_4) == hs_grub ? screw_radius(data_4) * 4
: screw_radius(data_4) <= 1.5 ? 10
: screw_max_thread(data_4) ? screw_longer_than(screw_max_thread(data_4) + 5)
: 30;
translate([loc_x,loc_y,loc_z]) rotate(rotation) screw(data_4, length);
}
if(type == "pillar") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) pillar(data_4);
}
if(type == "iec") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) iec(data_4);
}
if(type == "fuseholder") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) fuseholder(data_1);
}
if(type == "pin_header") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) pin_header(data_4, size_x, size_y, size_z, data_1, data_2, data_3);
}
if(type == "led") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) led(data_4,data_3,data_1);
}
}
@@ -306,7 +334,7 @@ module sub(type,loc_x,loc_y,loc_z,face,rotation,size_x,size_y,size_z,data_1,data
if(type == "punchout") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) punchout(size_x,size_y,data_1,size_z,data_2,data_3);
}
if(type == "fan") {
if(type == "fan_mask") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) fan_mask(size_x, size_z, data_1);
}
if(type == "vent") {
@@ -2266,7 +2294,7 @@ module access_port(size,orientation) {
translate([.5,6,-adjust]) cube([size[0]-1.15,size[1]-17,floorthick+(adjust*2)]);
translate([(size[0]/2)-5,size[1]-12,-adjust]) slab([10.5,5.5,floorthick],5.5);
translate([(size[0]/2)+.25,size[1]-6.5,floorthick+2])
cylinder(r=3.2,h=floorthick+(adjust*2)+5,$fn=6);
cylinder(r=3.3,h=floorthick+(adjust*2)+5,$fn=6);
translate([(size[0]/2)+.25,size[1]-6.5,-adjust])
cylinder(d=3.2,h=floorthick+(adjust*2)+5);
translate([4,2+adjust,floorthick]) cube([7.75,3,2.75]);
@@ -2281,15 +2309,15 @@ module access_port(size,orientation) {
union() {
translate([0,-1,0]) cube([size[0],size[1],size[2]]);
// access panel support
translate([size[0]-6.5,(size[1]/2)-.5,0]) cylinder(d=9,h=floorthick+(adjust*2)+5);
translate([size[0]-11,(size[1]/2)-10.5,floorthick-adjust]) cube([9.5,20,floorthick]);
translate([size[0]-6.5,(size[1]/2)-.75,0]) cylinder(d=9,h=floorthick+(adjust*2)+5);
translate([size[0]-11,(size[1]/2)-10,floorthick-adjust]) cube([9.5,20,floorthick]);
translate([0,0,floorthick-adjust]) cube([5,size[1]-2,4.5]);
}
// access opening
translate([6,-.5,-adjust]) cube([size[0]-17,size[1]-1.15,floorthick+(adjust*3)]);
translate([size[0]-12,(size[1]/2)-6,-adjust]) slab([5.5,10.5,floorthick],5.5);
translate([size[0]-6.5,(size[1]/2)-.5,floorthick+2]) rotate([0,0,30])
cylinder(r=3.2,h=floorthick+(adjust*2)+5,$fn=6);
cylinder(r=3.3,h=floorthick+(adjust*2)+5,$fn=6);
translate([size[0]-6.5,(size[1]/2)-.5,-adjust])
cylinder(d=3.2,h=floorthick+(adjust*2)+5);
translate([2+adjust,3,floorthick]) cube([3,8.25,2.75]);
@@ -2329,8 +2357,8 @@ module access_cover(size,orientation) {
if(orientation == "landscape") {
difference() {
union() {
translate([6.25,0,0]) cube([size[0]-17.75,size[1]-2,floorthick]);
translate([size[0]-12.25,(size[1]/2)-5.75,0]) slab([5,10,floorthick], 5);
translate([6.25,-.25,0]) cube([size[0]-17.5,size[1]-2,floorthick]);
translate([size[0]-12.25,(size[1]/2)-6,0]) slab([5,10,floorthick], 5);
translate([6.25,0,floorthick-adjust]) cube([6,size[1]-2.15,floorthick]);
translate([3.5+adjust,3.25,floorthick]) cube([4,7.25,2]);
translate([3.5+adjust,size[1]-12.75,floorthick]) cube([4,7.25,2]);
@@ -2566,16 +2594,16 @@ module mask(loc_x,loc_y,loc_z,rotation,side,class,type,wallthick,gap,floorthick,
}
// hdmi vertical opening
if(type == "hdmi_a_vertical" && side == "top" && rotation == 0) {
place(loc_x-.5,loc_y,loc_z,15,11.5,rotation,side) translate([-.25,0,15.4]) rotate([0,90,0]) hdmi_open("hdmi_a");
place(loc_x-.5,loc_y,loc_z,15,11.5,rotation,side) translate([-.25,0,17.4]) rotate([0,90,0]) hdmi_open("hdmi_a");
}
if(type == "hdmi_a_vertical" && side == "top" && rotation == 90) {
place(loc_x-1,loc_y,loc_z,15,11.5,rotation,side) translate([-.25,0,15.4]) rotate([0,90,0]) hdmi_open("hdmi_a");
place(loc_x-1,loc_y,loc_z,15,11.5,rotation,side) translate([-.25,0,17.4]) rotate([0,90,0]) hdmi_open("hdmi_a");
}
if(type == "hdmi_a_vertical" && side == "top" && rotation == 180) {
place(loc_x,loc_y+1,loc_z,15,11.5,rotation,side) translate([-.25,0,15.4]) rotate([0,90,0]) hdmi_open("hdmi_a");
place(loc_x,loc_y+1,loc_z,15,11.5,rotation,side) translate([-.25,0,17.4]) rotate([0,90,0]) hdmi_open("hdmi_a");
}
if(type == "hdmi_a_vertical" && side == "top" && rotation == 270) {
place(loc_x+1,loc_y-.5,loc_z,15,11.5,rotation,side) translate([-.25,0,15.4]) rotate([0,90,0]) hdmi_open("hdmi_a");
place(loc_x+1,loc_y-.5,loc_z,15,11.5,rotation,side) translate([-.25,0,17.4]) rotate([0,90,0]) hdmi_open("hdmi_a");
}
// hdmi micro opening
if(class == "video" && type == "hdmi_micro" && rotation == 0 && side == "top") {
@@ -2824,38 +2852,6 @@ module mask(loc_x,loc_y,loc_z,rotation,side,class,type,wallthick,gap,floorthick,
place(loc_x-12.1,loc_y+.125,loc_z-pcb_z,13.2,14.1,rotation,side)
cube([13.5,14.1,2]);
}
if(type == "microsdcard2" && side == "bottom" && rotation == 0) {
place(loc_x-1,loc_y-15,loc_z-pcb_z,12,15.5,rotation,side)
cube([13,15.5,2]);
}
if(type == "microsdcard2" && side == "bottom" && rotation == 90) {
place(loc_x+5,loc_y,loc_z-pcb_z,12,15.5,rotation,side)
cube([12,15.5,2]);
}
if(type == "microsdcard2" && side == "bottom" && rotation == 180) {
place(loc_x,loc_y+5,loc_z-pcb_z,12,15.5,rotation,side)
cube([12,15.5,2]);
}
if(type == "microsdcard2" && side == "bottom" && rotation == 270) {
place(loc_x+5,loc_y-18,loc_z-pcb_z,12,15.5,rotation,side)
cube([12,15.5,2]);
}
if(type == "microsdcard2" && side == "top" && rotation == 0) {
place(loc_x,loc_y-15,loc_z+1.75,12,15.5,rotation,side)
cube([12,15.5,2]);
}
if(type == "microsdcard2" && side == "top" && rotation == 90) {
place(loc_x-15,loc_y-.5,loc_z+1.75,12,15.5,rotation,side)
cube([12,15.5,2]);
}
if(type == "microsdcard2" && side == "top" && rotation == 180) {
place(loc_x-.5,loc_y+5,loc_z+1.75,12,15.5,rotation,side)
cube([12,15.5,2]);
}
if(type == "microsdcard2" && side == "top" && rotation == 270) {
place(loc_x+5,loc_y,loc_z+1.75,12,15.5,rotation,side)
cube([12,15.5,2]);
}
// rj45 opening
if(type == "rj45_single" && rotation == 0) {
place(loc_x,loc_y-6,loc_z,16,17.5,rotation,side)
@@ -3139,56 +3135,56 @@ module mask(loc_x,loc_y,loc_z,rotation,side,class,type,wallthick,gap,floorthick,
if(type == "jack_3.5" && rotation == 0 && side == "top") {
place(loc_x,loc_y,loc_z,7.5,7.5,rotation,side)
union() {
translate([3.15,2,2]) rotate([90,0,0]) cylinder(d=6, h=8);
translate([3.15,2,2]) rotate([90,0,0]) cylinder(d=5, h=8);
translate([-.5,-.5,0]) cube([7.5,2.5,4.5]);
}
}
if(type == "jack_3.5" && rotation == 90 && side == "top") {
place(loc_x,loc_y,loc_z,7.5,7.5,rotation,side)
union() {
translate([4.1,2,2]) rotate([90,0,0]) cylinder(d=6, h=8);
translate([4.1,2,2]) rotate([90,0,0]) cylinder(d=5, h=8);
translate([.5,-.5,0]) cube([7.5,2.5,4.5]);
}
}
if(type == "jack_3.5" && rotation == 180 && side == "top") {
place(loc_x,loc_y,loc_z,7.5,7.5,rotation,side)
union() {
translate([4.1,-2.5,2]) rotate([90,0,0]) cylinder(d=6, h=8);
translate([4.1,-2.5,2]) rotate([90,0,0]) cylinder(d=5, h=8);
translate([.5,-5,0]) cube([7.5,2.5,4.5]);
}
}
if(type == "jack_3.5" && rotation == 270 && side == "top") {
place(loc_x,loc_y,loc_z,7.5,7.5,rotation,side)
union() {
translate([3.15,-2.5,2]) rotate([90,0,0]) cylinder(d=6, h=8);
translate([3.15,-2.5,2]) rotate([90,0,0]) cylinder(d=5, h=8);
translate([-.5,-5,0]) cube([7.5,2.5,4.5]);
}
}
if(type == "jack_3.5" && rotation == 0 && side == "bottom") {
place(loc_x-1,loc_y,loc_z-1.5,7.5,7.5,rotation,side)
union() {
translate([3.15,2,2]) rotate([90,0,0]) cylinder(d=6, h=8);
translate([3.15,2,2]) rotate([90,0,0]) cylinder(d=5, h=8);
translate([-.5,-.5,0]) cube([7.5,2.5,4.5]);
}
}
if(type == "jack_3.5" && rotation == 90 && side == "bottom") {
place(loc_x+4.1,loc_y,loc_z-1.5,7.5,7.5,rotation,side)
union() {
translate([4.1,2,2]) rotate([90,0,0]) cylinder(d=6, h=8);
translate([4.1,2,2]) rotate([90,0,0]) cylinder(d=5, h=8);
translate([.5,-.5,0]) cube([7.5,2.5,4.5]);
}
}
if(type == "jack_3.5" && rotation == 180 && side == "bottom") {
place(loc_x-1,loc_y,loc_z-1.5,7.5,7.5,rotation,side)
union() {
translate([4.1,-2.5,2]) rotate([90,0,0]) cylinder(d=6, h=8);
translate([4.1,-2.5,2]) rotate([90,0,0]) cylinder(d=5, h=8);
translate([.5,-5,0]) cube([7.5,2.5,4.5]);
}
}
if(type == "jack_3.5" && rotation == 270 && side == "bottom") {
place(loc_x+4.1,loc_y,loc_z-1.5,7.5,7.5,rotation,side)
union() {
translate([3,-2.5,2]) rotate([90,0,0]) cylinder(d=6, h=8);
translate([3,-2.5,2]) rotate([90,0,0]) cylinder(d=5, h=8);
translate([-.5,-5,0]) cube([7.5,2.5,4.5]);
}
}