added io masks, updated sbc_models, rockpro64 and jetsonnano cases, other cleanup

This commit is contained in:
Edward Kisiel
2022-05-14 21:10:28 -04:00
parent c9e9acf10a
commit 511c8929e8
6 changed files with 953 additions and 663 deletions

View File

@@ -1,6 +1,5 @@
/*
SBC Library Copyright 2016,2017,2018,2019,2020 Edward A. Kisiel
hominoid @ www.forum.odroid.com
SBC Library Copyright 2016,2017,2018,2019,2020,2021,2022 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
@@ -50,6 +49,37 @@
20220413 Version 1.0.6 adjusted slide_4x9, adjust m.2_header, rj45-usb2_double, rj45-usb3_double, out-in-spdif,
momentary_6x6x4, fixed color for usb2 micro otg, adjust all header heights,
added mipi_csi, mipi_dsi, m.2_stud
see https://github.com/hominoids/SBC_Case_Builder
place(x,y,size_x,size_y,rotation,side,type,pcbsize_z)
pcb_add(size_x,size_y,loc_x,loc_y,rotation,side,type,pcbsize_z,data_1,data_2) - "square","round"
pcb_sub(size_x,size_y,loc_x,loc_y,rotation,side,type,pcbsize_z,data_1,data_2) - "square","round","art"
pcb_art(scale_d1,type,dxf_file) - "dxf"
pcb(size, radius)
memory(x,y,rotation,side,type,pcbsize_z) - "emmc","emmc_plug","sodimm_5.2","sodimm_9.2"
switch(x,y,rotation,side,type,pcbsize_z) - "slide_4x9"
button(x,y,rotation,side,type,pcbsize_z) - "momentary_6x6x9","momentary_6x6x4","momentary_6x6x4_90","momentary_4x2x1"
plug(x,y,rotation,side,type,pcbsize_z) - "pwr2.5_5x7.5","pwr5.5_7.5x11.5","pwr5.5_10x10","rtc_micro","audio_micro","uart_micro","molex_4x1","small_encl_satapwr"
usb2(x,y,rotation,side,type,pcbsize_z) - "single_vert_a","double_stacked_a","micro"
usb3(x,y,rotation,side,type,pcbsize_z) - "double_stacked_a"
network(x,y,rotation,side,type,pcbsize_z) - "rj45_single"
video(x,y,rotation,side,type,pcbsize_z - "hdmi_a","dp-hdmi_a","mipi_csi","mipi_dsi"
fan(x,y,rotation,side,type,pcbsize_z) - "micro","encl_pmw","encl_pmw_h"
gpio(x,y,rotation,side,type,pcbsize_z) - "encl_header_30","encl_header_12","header_40","header_20"
ic(x,y,rotation,side,type,pcbsize_z) - "ic_2.8x2.8","ic_3x3","ic_3.7x3.7","ic_4x4","ic_4.7x4.7","ic_5x5","ic_5.75x5.75","ic_6x6","ic_6.4x6.4",ic_6.75x6.75",
"ic_7x7","ic_4.3x5.1","ic_5.4x5.3","ic_6.7x8.4","ic_9x9","ic_11x8","ic_13x8","ic_13x9","ic_16x10"
audio(x,y,rotation,side,type,pcbsize_z) - "out-in-spdif","jack_3.5"
storage(x,y,rotation,side,type,pcbsize_z) - "sdcard","sdcard_i","sata_header","sata_power_vrec","sata_encl_power","sata_encl_header","m.2_header","m.2_stud"
combo(x,y,rotation,side,type,pcbsize_z) - "rj45-usb2_double","rj45-usb3_double"
jumper(x,y,rotation,side,type,pcbsize_z) - "header_2x1","header_3x2","header_5x1","header_6x1","header_7x1"
misc(x,y,rotation,side,type,pcbsize_z) - "ir_1","led_3x1.5","lcd_2.2","bat_hold_1"
heatsink(x,y,rotation,side,type,pcbsize_z,soc1size_z) - "hc4_oem","c4_oem","c2_oem","c1+_oem","xu4_oem","n1_oem","xu4q_oem","n2_oem","n2+_oem","m1_oem","h2_oem"
pcie(x,y,rotation,side,type,pcbsize_z) - "x4"
jst_ph(x,y,rotation,side,type,pcbsize_z) - type is #pins
cm_holder(x,y,rotation,side,type,pcbsize_z) - jetsonnano
cm(x,y,rotation,side,type,pcbsize_z) - jetsonnano
*/
module place(x,y,size_x,size_y,rotation,side,type,pcbsize_z) {
@@ -220,12 +250,12 @@ module memory(x,y,rotation,side,type,pcbsize_z) {
module switch(x,y,rotation,side,type,pcbsize_z) {
// boot selector switch
if(type=="slide_4x9") {
size_x = 3.75;
size_y = 9.1;
size_x = 9;
size_y = 3.75;
place(x,y,size_x,size_y,rotation,side,type,pcbsize_z)
union() {
color("silver") translate([0,0,.5]) cube([size_x, size_y, 3.5]);
color("white") translate([3.75,4.5,1.75]) cube([3, 2, 1.5]);
color("white") translate([3.75,-1.99,1.75]) cube([3, 2, 1.5]);
}
}
}
@@ -1489,19 +1519,19 @@ module heatsink(x,y,rotation,side,type,pcbsize_z,soc1size_z) {
if(type=="n2_oem") {
size_x = 90;
size_y = 90;
place(x,y,size_x,size_y,rotation,side,type,(pcbsize_z-pcbsize_z-3))
place(x,y,size_x,size_y,rotation,side,type,-3)
color("gray") import("Odroid-N2_Heatsink.stl", convexity=3);
}
if(type=="n2+_oem") {
size_x = 90;
size_y = 90;
place(x,y,size_x,size_y,rotation,side,type,(pcbsize_z-pcbsize_z-3))
place(x,y,size_x,size_y,rotation,side,type,-3)
color("gray") import("Odroid-N2+_Heatsink.stl", convexity=3);
}
if(type=="m1_oem") {
size_x = 90;
size_y = 122;
place(x,y,size_x,size_y,rotation,side,type,(pcbsize_z-pcbsize_z-3))
place(x,y,size_x,size_y,rotation,side,type,-3)
color("gray") translate([-.5,0,3]) rotate([0,0,0]) import("Odroid-M1_Heatsink.stl", convexity=3);
}
if(type=="h2_oem") {

View File

@@ -1,6 +1,5 @@
/*
SBC Data Library Copyright 2018,2019,2020 Edward A. Kisiel
hominoid @ www.forum.odroid.com
SBC Data Library Copyright 2018,2019,2020,2021,2022 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
@@ -30,6 +29,8 @@
raised C4 hdmi, updated Odroid-XU4Q, add type sdcard_i, adjusted C2 usb
20220413 Version 1.06 Added Odroid-M1 as m1, adjustments h2, c4 gpio
see https://github.com/hominoids/SBC_Case_Builder
Instructions: All measurements from lower left corner of PCB to lower left
corner of component or opening, holes measured to center. All measurements in mm.
PCB orientation is long side of board along the x axis.
@@ -50,31 +51,32 @@
component_x, component_y, component_rotation, "component_side", "component_class","component_type"
component classes and types:
memory - emmc, emmc_plug, sodimm_5.2, sodimm_9.2
memory - "emmc","emmc_plug","sodimm_5.2","sodimm_9.2"
switch - slide_4x9
button - momentary_6x6x9, momentary_6x6x4, momentary_6x6x4_90
plug - pwr5.5_7.5x11.5, pwr2.5_5x7.5, rtc_micro, uart_micro, molex_4x1, small_encl_satapwr
usb2 - single_vert_a, double_stacked_a, micro
button - "momentary_6x6x9","momentary_6x6x4","momentary_6x6x4_90","momentary_4x2x1"
plug - "pwr2.5_5x7.5","pwr5.5_7.5x11.5","pwr5.5_10x10","rtc_micro","audio_micro","uart_micro","molex_4x1","small_encl_satapwr"
usb2 - "single_vert_a","double_stacked_a","micro"
usb3 - double_stacked_a
network - rj45_single
video - hdmi_a, dp-hdmi_a
fan - micro, encl_pmw, encl_pmw_h
gpio - encl_header_30, encl_header_12, header_40, header_20
ic - ic_2.8x2.8, ic_4.7x4.7, ic_5x5, ic_5.75x5.75, ic_6x6, ic_6.75x6.75, ic_7x7, ic_6.7x8.4, ic_11x8, ic_13x8
ic_3x3, ic_6.4x6.4, ic_3.7x3.7, ic_4.3x5.1, ic_5.4x5.3, ic_13x9, ic_9x9
audio - out-in-spdif, jack_3.5
storage - sata_header, sata_encl_power, sata_encl_header, sata_power_vrec, m.2_header, sdcard, sdcard_i
combo - rj45-usb2_double, rj45-usb3_double
jumper - header_2x1, header_5x1, header_7x1
misc - ir_1, batt_hold_1
heatsink - xu4_oem, xu4q_oem, c1+_oem, c2_oem, c4_oem, hc4_oem, n2_oem, h2_oem
pcie - x4
video - "hdmi_a","dp-hdmi_a","mipi_csi","mipi_dsi"
fan - "micro","encl_pmw","encl_pmw_h"
gpio - "encl_header_30","encl_header_12","header_40","header_20"
ic - "ic_2.8x2.8","ic_3x3","ic_3.7x3.7","ic_4x4","ic_4.7x4.7","ic_5x5","ic_5.75x5.75","ic_6x6","ic_6.4x6.4",ic_6.75x6.75",
"ic_7x7","ic_4.3x5.1","ic_5.4x5.3","ic_6.7x8.4","ic_9x9","ic_11x8","ic_13x8","ic_13x9","ic_16x10"
audio - "out-in-spdif","jack_3.5"
storage - "sdcard","sdcard_i","sata_header","sata_power_vrec","sata_encl_power","sata_encl_header","m.2_header","m.2_stud"
combo - "rj45-usb2_double","rj45-usb3_double"
jumper - "header_2x1","header_3x2","header_5x1","header_6x1","header_7x1"
misc - "ir_1","led_3x1.5","lcd_2.2","bat_hold_1"
heatsink - "hc4_oem","c4_oem","c2_oem","c1+_oem","xu4_oem","n1_oem","xu4q_oem","n2_oem","n2+_oem","m1_oem","h2_oem"
pcie - "x4"
jst_ph - number of pins from 2-16
sbc models "c1+","c2","c4","xu4","xu4q","mc1","hc1","hc4","n1","n2","n2+","h2","rpi3b+","a64","rock64","rockpro64","atomicpi","jetsonnano"
*/
sbc_data = [
// Hard Kernel Odroids
["c1+",85,56,1,3.5,17,6, // sbc model, pcb size and component height
3.5,3.5,3,3.5,52.5,3, // pcb holes 1 and 2 location and pcb hole size
@@ -382,6 +384,43 @@ sbc_data = [
77.03,51.92,0,"top","ic","ic_3x3", // component, location, rotation, side, class and type
1,-.5,0,"top","heatsink","n2+_oem"], // heatsink location, rotation, side, class and type
["n2+_noheatsink",90,90,1.7,.2,17,14, // sbc model, pcb size and component height
3,28.5,3.3,86.5,28.5,3.3, // pcb holes 1 and 2 location and pcb hole size
3,86.5,3.3,86.5,86.5,3.3, // pcb holes 3 and 4 location and pcb hole size
0,0,0,0,0,0, // pcb holes 5 and 6 location and pcb hole size
0,0,0,0,0,0, // pcb holes 7 and 8 location and pcb hole size
0,0,0,0,0,0, // pcb holes 9 and 10 location and pcb hole size
14.5,16.25,1.51,37.78,50.88,0,0,"bottom", // soc1 size, location, rotation and side
0,0,0,0,0,0,0,"", // soc4 size, location, rotation and side
0,0,0,0,0,0,0,"", // soc4 size, location, rotation and side
0,0,0,0,0,0,0,"", // soc4 size, location, rotation and side
2.35,-1,0,"top","plug","pwr5.5_7.5x11.5", // power plug location, rotation, side, class and type
18,0,0,"top","usb3","double_stacked_a", // usb3 location, rotation, side, class and type
36,0,0,"top","usb3","double_stacked_a", // usb3 location, rotation, side, class and type
54.5,-1,0,"top","video","hdmi_a", // hdmi location, rotation, side, class and type
71.75,0,0,"top","network","rj45_single", // ethernet location, rotation, side, class and type
83.96,32.1,90,"top","gpio","header_40", // gpio location, rotation, side, class and type
17.61,39.73,0,"top","jumper","header_7x1", // jumper location, rotation, side, class and type
.2,69.05,270,"top","plug","uart_micro", // uart location, rotation, side, class and type
53,35,0,"top","misc","bat_hold_1", // battery holder, location, rotation, side, class and type
68.5,68.8,90,"top","fan","micro", // fan location, rotation, side, class and type
7.2,76.82,180,"top","storage","sdcard", // sdcard location, rotation, side, class and type
59.35,85.4,180,"top","usb2","micro", // usb2 otg location, rotation, side, class and type
35.85,85.62,0,"top","memory","emmc_plug", // emmc plug location, rotation, side, class and type
33.5,72,0,"top","memory","emmc", // emmc location, rotation, side, class and type
22.4,86.6,180,"top","misc","ir_1", // ir location, rotation, side, class and type
48.45,86.7,270,"top","switch","slide_4x9", // switch location, rotation, side, class and type
73.67,78.95,180,"top","audio","jack_3.5", // switch location, rotation, side, class and type
18.95,46.23,0,"top","ic","ic_13x8", // memory top size, location, rotation and side
19.04,64.24,0,"top","ic","ic_13x8", // memory top size, location, rotation and side
18.95,46.23,0,"bottom","ic","ic_13x8", // memory bottom size, location, rotation and side
19.04,64.24,0,"bottom","ic","ic_13x8", // memory bottom size, location, rotation and side
45.74,27.51,0,"top","ic","ic_6.4x6.4", // component, location, rotation, side, class and type
75.08,25,0,"top","ic","ic_3.7x3.7", // component, location, rotation, side, class and type
74.3,69.54,0,"top","ic","ic_4.3x5.1", // component, location, rotation, side, class and type
50.8,77.25,0,"top","ic","ic_5.4x5.3", // component, location, rotation, side, class and type
77.03,51.92,0,"top","ic","ic_3x3"], // component, location, rotation, side, class and type
["m1",90,122,1.7,.2,17,14, // sbc model, pcb size and component height
3,28.5,3,3,118.5,3, // pcb holes 1 and 2 location and pcb hole size
86.5,118.5,3,,86.5,28.5,3, // pcb holes 3 and 4 location and pcb hole size
@@ -421,6 +460,44 @@ sbc_data = [
.5,0,0,"top","heatsink","m1_oem", // heatsink location, rotation, side, class and type
86.5,47,0,"top","storage","m.2_stud"], // m2 stud location, rotation, side, class and type
["m1_noheatsink",90,122,1.7,.2,17,14, // sbc model, pcb size and component height
3,28.5,3,3,118.5,3, // pcb holes 1 and 2 location and pcb hole size
86.5,118.5,3,,86.5,28.5,3, // pcb holes 3 and 4 location and pcb hole size
3,67,3,66,25,3, // pcb holes 5 and 6 location and pcb hole size
86.5,47,3,0,0,0, // pcb holes 7 and 8 location and pcb hole size
0,0,0,0,0,0, // pcb holes 9 and 10 location and pcb hole size
19,19,1.51,45,43.5,0,45,"bottom", // soc1 size, location, rotation and side
0,0,0,0,0,0,0,"", // soc4 size, location, rotation and side
0,0,0,0,0,0,0,"", // soc4 size, location, rotation and side
0,0,0,0,0,0,0,"", // soc4 size, location, rotation and side
2.35,-1,0,"top","plug","pwr5.5_7.5x11.5", // power plug location, rotation, side, class and type
18,0,0,"top","usb3","double_stacked_a", // usb3 location, rotation, side, class and type
36,0,0,"top","usb2","double_stacked_a", // usb3 location, rotation, side, class and type
54.5,-1,0,"top","video","hdmi_a", // hdmi location, rotation, side, class and type
71.75,0,0,"top","network","rj45_single", // ethernet location, rotation, side, class and type
84.375,62.25,90,"top","gpio","header_40", // gpio location, rotation, side, class and type
.2,101,270,"top","plug","uart_micro", // uart location, rotation, side, class and type
21,88,120,"top","misc","bat_hold_1", // battery holder, location, rotation, side, class and type
61,118,0,"top","plug","audio_micro", // micro location, rotation, side, class and type
7.2,108.82,180,"top","storage","sdcard", // sdcard location, rotation, side, class and type
20,0,0,"bottom","usb2","micro", // usb2 otg location, rotation, side, class and type
35.85,117,0,"top","memory","emmc_plug", // emmc plug location, rotation, side, class and type
33.5,103,0,"top","memory","emmc", // emmc location, rotation, side, class and type
22.4,118.58,180,"top","misc","ir_1", // ir location, rotation, side, class and type
73.73,111.5,180,"top","audio","jack_3.5", // audio jack location, rotation, side, class and type
0,88.2,270,"top","plug","small_encl_satapwr", // pwrplug location, rotation, side, class and type
.25,72,270,"top","storage","sata_header", // sata location, rotation, side, class and type
50,115.65,0,"top","button","momentary_6x6x4", // spi button location, rotation, side, class and type
7,101,0,"top","jumper","header_2x1", // jumper location, rotation, side, class and type
7,103.5,0,"top","jumper","header_2x1", // jumper location, rotation, side, class and type
3.5,35.87,270,"top","storage","m.2_header", // m2 socket location, rotation, side, class and type
36.28,73,0,"bottom","ic","ic_16x10", // memory bottom size, location, rotation and side
75.75,25,0,"top","ic","ic_5x5", // ic bottom size, location, rotation and side
50.5,109.22,0,"top","ic","ic_5x5", // ic bottom size, location, rotation and side
58,72,0,"top","video","mipi_csi", // mipi csi size, location, rotation and side
65,93,0,"top","video","mipi_dsi", // mipi dsi size, location, rotation and side
86.5,47,0,"top","storage","m.2_stud"], // m2 stud location, rotation, side, class and type
["h2",110,110,2,3.5,38,11, // sbc model, pcb size and component height
3.81,17.78,3.5,3.81,106.19,3.5, // pcb holes 1 and 2 location and pcb hole size
106.04,24.77,3.5,106.04,106.2,3.5, // pcb holes 3 and 4 location and pcb hole size
@@ -635,45 +712,5 @@ sbc_data = [
0,0,0,0,0,0,0,"", // soc2 size, location, rotation and side
0,0,0,0,0,0,0,"", // soc3 size, location, rotation and side
0,0,0,0,0,0,0,"", // soc4 size, location, rotation and side
10, -1.5, 0, "top", "video", "hdmi_a", // hdmi port
-1.5, 30, 90, "top", "video", "hdmi_a", // hdmi port
10, 69, 180, "top", "video", "hdmi_a", // hdmi port
117, 30, 270, "top", "video", "hdmi_a", // hdmi port
30, -1, 0, "top", "usb2", "micro", // usb2 micro port
-1, 10, 90, "top", "usb2", "micro", // usb2 micro port
30, 75.5, 180, "top", "usb2", "micro", // usb2 micro port
123.5, 10, 270, "top", "usb2", "micro", // usb2 micro port
// 50, -1, 0, "top", "plug", "pwr5.5_7.5x11.5", // pwr5.5_7.5x11.5
// -1, 2, 90, "top", "plug", "pwr5.5_7.5x11.5", // pwr5.5_7.5x11.5
// 50, 69, 180, "top", "plug", "pwr5.5_7.5x11.5", // pwr5.5_7.5x11.5
// 116.5, 2, 270, "top", "plug", "pwr5.5_7.5x11.5", // pwr5.5_7.5x11.5
// 50, -1, 0, "top", "plug", "pwr2.5_5x7.5", // pwr5.5_7.5x11.5
// -1, 2, 90, "top", "plug", "pwr2.5_5x7.5", // pwr5.5_7.5x11.5
// 50, 72.5, 180, "top", "plug", "pwr2.5_5x7.5", // pwr5.5_7.5x11.5
// 120.5, 2, 270, "top", "plug", "pwr2.5_5x7.5", // pwr5.5_7.5x11.5
// 50, -1, 0, "top", "plug", "pwr5.5_10x10", // pwr5.5_10x10
// -1, 2, 90, "top", "plug", "pwr5.5_10x10", // pwr5.5_10x10
// 50, 67, 180, "top", "plug", "pwr5.5_10x10", // pwr5.5_10x10
// 114.5, 2, 270, "top", "plug", "pwr5.5_10x10", // pwr5.5_10x10
// 60, -1, 0, "top", "network", "rj45_single", // rj45_single
// -1, 47, 90, "top", "network", "rj45_single", // rj45_single
// 60, 59, 180, "top", "network", "rj45_single", // rj45_single
// 107, 50, 270, "top", "network", "rj45_single", // rj45_single
// 80, -1, 0, "top", "usb2", "double_stacked_a", // double_stacked_a
// -1, 47, 90, "top", "usb2", "double_stacked_a", // double_stacked_a
// 80, 63, 180, "top", "usb2", "double_stacked_a", // double_stacked_a
// 110.5, 50, 270, "top", "usb2", "double_stacked_a", // double_stacked_a
100, -1, 0, "top", "usb2", "single_vert_a", // single_vert_a
-1, 67, 90, "top", "usb2", "single_vert_a", // single_vert_a
60, 61, 180, "top", "usb2", "single_vert_a", // single_vert_a
108.5, 67, 270, "top", "usb2", "single_vert_a", // single_vert_a
0,0,0,"","",""] // component, location, rotation, side, class and type
];

View File

@@ -1,6 +1,5 @@
/*
SBC Models Copyright 2016,2017,2018,2019,2020 Edward A. Kisiel
hominoid @ www.forum.odroid.com
SBC Models Copyright 2016,2017,2018,2019,2020,2021,2022 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
@@ -29,6 +28,8 @@
20220202 Version 1.0.5 Added HK Show2 as "show2"
20220413 Version 1.0.6 Added Odroid-M1 as "m1"
see https://github.com/hominoids/SBC_Case_Builder
USE: sbc(model)
model = "c1+","c2","c4","xu4","xu4q","mc1","hc1","hc4","n1","n2","n2+","h2"
"rpi3b+","a64","rock64","rockpro64","atomicpi","jetsonnano","show2"

View File

@@ -1,6 +1,5 @@
/*
SBC Case Builder Copyright 2022 Edward A. Kisiel
hominoid @ www.forum.odroid.com
SBC Case Builder Copyright 2022 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
@@ -28,6 +27,7 @@
c4_shell_boombox, c4_panel_boombox, c4_deskboom_lcd3.5, c4_tray_boombox
20220406 Version 1.2.2 various case adjustments
see https://github.com/hominoids/SBC_Case_Builder
*/
/* Instructions: All measurements from lower left corner of PCB to lower left
@@ -1388,7 +1388,40 @@ case_data = [
[6.75,11.4,3.6,10,4,1,0,0,0,4.5,5.1], // bottom_pcb_standoff
[6.75,15,2.5,10,4,4,0,1,1,4.5,5.1], // top_ext_standoff
[6.75,11.4,3.6,10,4,2,0,0,0,4.5,5.1], // bottom_ext_standoff
"sub","rectangle",17.5,36,28.5,"top",[0,0,0],62,43,4,0,0,"",[1,1,1,1]], // sub heatsink opening
"sub","rectangle",17.5,36.375,28.5,"top",[0,0,0],62,43,4,0,0,"",[1,1,1,1]], // sub heatsink opening
["jetsonnano_panel","jetsonnano","panel","none", // case_name, sbc_model, case_design, case_style
0,0,0,0,0,-5,3, // pcb_loc_x,pcb_loc_y,pcb_loc_z,case_offset_x,case_offset_y,case_offset_tz,case_offset_bz,
2,2,2,1.5,[3,0], // wallthick,floorthick,sidethick,gap,fillet
false,false,false,true,true, // indents,sidewall_support,sbc_top_standoffs,sbc_bottom_standoffs,case_ext_standoffs
false,"vent","fan","vent","true", // sata_punchout,gpio_opening,cooling,exhaust_vents,mode
[6.75,15,2.5,10,4,4,0,1,0,4.5,5.1], // top_pcb_standoff
[6.75,11.4,3.6,10,4,1,0,0,0,4.5,5.1], // bottom_pcb_standoff
[6.75,15,2.5,10,4,4,0,1,1,4.5,5.1], // top_ext_standoff
[6.75,11.4,3.6,10,4,2,0,0,0,4.5,5.1], // bottom_ext_standoff
"sub","rectangle",17.5,36.375,28.5,"top",[0,0,0],62,43,4,0,0,"",[1,1,1,1]], // sub heatsink opening
["jetsonnano_stacked","jetsonnano","stacked","none", // case_name, sbc_model, case_design, case_style
0,0,0,0,0,-5,3, // pcb_loc_x,pcb_loc_y,pcb_loc_z,case_offset_x,case_offset_y,case_offset_tz,case_offset_bz,
2,2,2,1.5,[3,0], // wallthick,floorthick,sidethick,gap,fillet
false,false,true,true,true, // indents,sidewall_support,sbc_top_standoffs,sbc_bottom_standoffs,case_ext_standoffs
false,"vent","fan","vent","true", // sata_punchout,gpio_opening,cooling,exhaust_vents,mode
[6.75,15,2.5,10,4,4,0,1,0,4.5,5.1], // top_pcb_standoff
[6.75,11.4,3.6,10,4,1,0,0,0,4.5,5.1], // bottom_pcb_standoff
[6.75,15,2.5,10,4,4,0,1,1,4.5,5.1], // top_ext_standoff
[6.75,11.4,3.6,10,4,2,0,0,0,4.5,5.1], // bottom_ext_standoff
"sub","rectangle",17.5,36.375,28.5,"top",[0,0,0],62,43,4,0,0,"",[1,1,1,1]], // sub heatsink opening
["jetsonnano_tray","jetsonnano","tray","none", // case_name, sbc_model, case_design, case_style
0,0,0,0,0,-5,3, // pcb_loc_x,pcb_loc_y,pcb_loc_z,case_offset_x,case_offset_y,case_offset_tz,case_offset_bz,
2,2,2,1.5,[3,0], // wallthick,floorthick,sidethick,gap,fillet
false,false,false,true,true, // indents,sidewall_support,sbc_top_standoffs,sbc_bottom_standoffs,case_ext_standoffs
false,"vent","fan","vent","true", // sata_punchout,gpio_opening,cooling,exhaust_vents,mode
[6.75,15,2.5,10,4,4,0,1,0,4.5,5.1], // top_pcb_standoff
[6.75,11.4,3.6,10,4,1,0,0,0,4.5,5.1], // bottom_pcb_standoff
[6.75,15,2.5,10,4,4,0,1,1,4.5,5.1], // top_ext_standoff
[6.75,11.4,3.6,10,4,2,0,0,0,4.5,5.1], // bottom_ext_standoff
"sub","rectangle",17.5,36.375,28.5,"top",[0,0,0],62,43,8,0,0,"",[1,1,1,1]], // sub heatsink opening
["rockpro64_shell","rockpro64","shell","none", // case_name, sbc_model, case_design, case_style
0,0,0,0,0,0,0, // pcb_loc_x,pcb_loc_y,pcb_loc_z,case_offset_x,case_offset_y,case_offset_tz,case_offset_bz,
@@ -1399,8 +1432,45 @@ case_data = [
[6.75,11.4,3.6,10,4,1,0,0,0,4.5,5.1], // bottom_pcb_standoff
[6.75,15,2.5,10,4,4,0,1,1,4.5,5.1], // top_ext_standoff
[6.75,11.4,3.6,10,4,2,0,0,0,4.5,5.1], // bottom_ext_standoff
"sub","fan",43,26,25,"top",[0,0,0],40,0,6,2,0,"",0, // sub fan opening
"sub","rectangle",43,0,25,"top",[0,0,0],40,10,6,0,0,"",[1,1,1,1]], // sub pcie opening
["rockpro64_panel","rockpro64","panel","none", // case_name, sbc_model, case_design, case_style
0,0,0,0,0,0,0, // pcb_loc_x,pcb_loc_y,pcb_loc_z,case_offset_x,case_offset_y,case_offset_tz,case_offset_bz,
2,2,2,1.5,[3,3], // wallthick,floorthick,sidethick,gap,fillet
false,false,false,true,true, // indents,sidewall_support,sbc_top_standoffs,sbc_bottom_standoffs,case_ext_standoffs
false,"vent","fan","vent","true", // sata_punchout,gpio_opening,cooling,exhaust_vents,mode
[6.75,15,2.5,10,4,4,0,1,0,4.5,5.1], // top_pcb_standoff
[6.75,11.4,3.6,10,4,1,0,0,0,4.5,5.1], // bottom_pcb_standoff
[6.75,15,2.5,10,4,4,0,1,1,4.5,5.1], // top_ext_standoff
[6.75,11.4,3.6,10,4,2,0,0,0,4.5,5.1], // bottom_ext_standoff
"sub","fan",43,26,24,"top",[0,0,0],40,0,6,2,0,"",0, // sub fan opening
"sub","rectangle",43,0,24.5,"top",[0,0,0],40,10,6,0,0,"",[1,1,1,1]], // sub pcie opening
["rockpro64_stacked","rockpro64","stacked","none", // case_name, sbc_model, case_design, case_style
0,0,0,0,0,0,0, // pcb_loc_x,pcb_loc_y,pcb_loc_z,case_offset_x,case_offset_y,case_offset_tz,case_offset_bz,
2,2,2,1.5,[3,3], // wallthick,floorthick,sidethick,gap,fillet
false,true,true,true,true, // indents,sidewall_support,sbc_top_standoffs,sbc_bottom_standoffs,case_ext_standoffs
false,"vent","fan","vent","true", // sata_punchout,gpio_opening,cooling,exhaust_vents,mode
[6.75,15,2.5,10,4,4,0,1,0,4.5,5.1], // top_pcb_standoff
[6.75,11.4,3.6,10,4,1,0,0,0,4.5,5.1], // bottom_pcb_standoff
[6.75,15,2.5,10,4,4,0,1,1,4.5,5.1], // top_ext_standoff
[6.75,11.4,3.6,10,4,2,0,0,0,4.5,5.1], // bottom_ext_standoff
"sub","fan",43,26,24,"top",[0,0,0],40,0,6,2,0,"",0, // sub fan opening
"sub","rectangle",43,0,24.5,"top",[0,0,0],40,10,6,0,0,"",[1,1,1,1]], // sub pcie opening
["rockpro64_tray","rockpro64","tray","none", // case_name, sbc_model, case_design, case_style
0,0,0,0,0,0,0, // pcb_loc_x,pcb_loc_y,pcb_loc_z,case_offset_x,case_offset_y,case_offset_tz,case_offset_bz,
2,2,2,1.5,[3,3], // wallthick,floorthick,sidethick,gap,fillet
false,true,false,true,true, // indents,sidewall_support,sbc_top_standoffs,sbc_bottom_standoffs,case_ext_standoffs
false,"vent","fan","vent","true", // sata_punchout,gpio_opening,cooling,exhaust_vents,mode
[6.75,15,2.5,10,4,4,0,1,0,4.5,5.1], // top_pcb_standoff
[6.75,11.4,3.6,10,4,1,0,0,0,4.5,5.1], // bottom_pcb_standoff
[6.75,15,2.5,10,4,4,0,1,1,4.5,5.1], // top_ext_standoff
[6.75,11.4,3.6,10,4,2,0,0,0,4.5,5.1], // bottom_ext_standoff
"sub","fan",43,26,25,"top",[0,0,0],40,0,6,2,0,"",0, // sub fan opening
"sub","rectangle",43,0,24.5,"top",[0,0,0],40,10,8,0,0,"",[1,1,1,1]], // sub pcie opening
["test","test","shell","none", // case_name, sbc_model, case_design, case_style
0,0,0,0,0,0,0, // pcb_loc_x,pcb_loc_y,pcb_loc_z,case_offset_x,case_offset_y,case_offset_tz,case_offset_bz,

View File

@@ -1,6 +1,5 @@
/*
SBC Case Builder Copyright 2022 Edward A. Kisiel
hominoid @ www.forum.odroid.com
SBC Case Builder Copyright 2022 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
@@ -33,6 +32,7 @@
enabled pcb_z, added tabs and fixed tray case top, other fixes and maintenance
20220406 Version 1.2.2 added vu7c, vu8m and weatherboard2 models, other additions, fixes and maintenance
see https://github.com/hominoids/SBC_Case_Builder
*/
use <./lib/sbc_models.scad>;

View File

@@ -1,5 +1,5 @@
/*
SBC Case Builder Library Copyright 2022 Edward A. Kisiel, hominoid @ www.forum.odroid.com
SBC Case Builder Library Copyright 2022 Edward A. Kisiel hominoid@cablemi.com
Contributions:
hk_vu8m(brackets),u_bracket(),screw(),m1_hdmount() Copyright 2022 Tomek Szczęsny, mctom @ www.forum.odroid.com
@@ -42,10 +42,11 @@
adjusted access_port(), access_cover(), added @mctom's hk_vu8m(bracket), u_bracket(), spacer()
2022xxxx version 1.2.x removed spacer(); added screw(); modified hk_vu8m(); added m1_hdmount(); added hdd35_25holder(length)
see https://github.com/hominoids/SBC_Case_Builder
place(x,y,z,size_x,size_y,rotation,side)
add(type,loc_x,loc_y,loc_z,size_x,size_y,size_z,rotation,face,side,case_z,data_1,data_2,data_3,data_4)
sub(type,loc_x,loc_y,loc_z,size_x,size_y,size_z,rotation,face,side,case_z,data_1,data_2,data_3,data_4)
art(scale_d1,type,size_z)
screw(screw[d, l, style])
slab(size, radius)
@@ -110,7 +111,6 @@
mask(loc_x,loc_y,rotation,side,class,type,case_z,wallthick,gap,floorthick,pcb_z)
punchout(width,depth,gap,thick,fillet,shape)
*/
use <./lib/fillets.scad>;
@@ -2541,42 +2541,70 @@ module mask(loc_x,loc_y,loc_z,rotation,side,class,type,wallthick,gap,floorthick,
}
// emmc storage
if(type == "emmc" && side == "bottom" && rotation == 0) {
place(loc_x-.5,loc_y,floorthick+adjust,14.5,19,rotation,side)
cube([14.5,19,floorthick+(2*adjust)]);
place(loc_x-.5,loc_y-.5,floorthick+adjust,14.5,19.5,rotation,side)
cube([14.5,19.5,floorthick+(2*adjust)]);
}
if(type == "emmc" && side == "bottom" && rotation == 90) {
place(loc_x,loc_y-.5,floorthick+adjust,14.5,19,rotation,side)
cube([14.5,19,floorthick+(2*adjust)]);
place(loc_x-.5,loc_y-.5,floorthick+adjust,14.5,19.5,rotation,side)
cube([14.5,19.5,floorthick+(2*adjust)]);
}
if(type == "emmc" && side == "bottom" && rotation == 180) {
place(loc_x-.5,loc_y-.5,floorthick+adjust,14.5,19.5,rotation,side)
cube([14.5,19.5,floorthick+(2*adjust)]);
}
if(type == "emmc" && side == "bottom" && rotation == 270) {
place(loc_x-.5,loc_y-.5,floorthick+adjust,14.5,19.5,rotation,side)
cube([14.5,19.5,floorthick+(2*adjust)]);
}
// sd storage
if(type == "sdcard" && side == "bottom" && rotation == 0) {
place(loc_x,loc_y,loc_z,12,15.5,rotation,side)
place(loc_x,loc_y-5,loc_z,12,15.5,rotation,side)
translate([-1,-10,3.5]) cube([13,15.5,2]);
}
if(type == "sdcard" && side == "bottom" && rotation == 90) {
place(loc_x+(2*(wallthick+gap+adjust)),loc_y,loc_z-2.75,12,15.5,rotation,side)
place(loc_x+5,loc_y,loc_z-2.75,12,15.5,rotation,side)
cube([12,15.5,2]);
}
if(type == "sdcard" && side == "bottom" && rotation == 180) {
place(loc_x,loc_y+(2*(wallthick+gap+adjust)),loc_z-2.75,12,15.5,rotation,side)
place(loc_x,loc_y+5,loc_z-2.75,12,15.5,rotation,side)
cube([12,15.5,2]);
}
if(type == "sdcard_i" && side == "bottom" && rotation == 180) {
place(loc_x,loc_y+(2*(wallthick+gap+adjust)),floorthick+adjust+4,12,18.5,rotation,side)
cube([12,18.5,floorthick+(2*adjust)+4]);
}
if(type == "sdcard" && side == "bottom" && rotation == 270) {
place(loc_x,loc_y,loc_z,12,15.5,rotation,side)
place(loc_x+5,loc_y,loc_z,12,15.5,rotation,side)
translate([0,-18,2.75]) cube([12,15.5,2]);
}
if(type == "sdcard" && side == "top" && rotation == 0) {
place(loc_x,loc_y-17,loc_z,12,15.5,rotation,side)
place(loc_x,loc_y-15,loc_z,12,15.5,rotation,side)
translate([0,0,1.75]) cube([12,15.5,2]);
}
if(type == "sdcard" && side == "top" && rotation == 90) {
place(loc_x-15,loc_y-.5,loc_z,12,15.5,rotation,side)
translate([0,0,1.75]) cube([12,15.5,2]);
}
if(type == "sdcard" && side == "top" && rotation == 180) {
place(loc_x,loc_y+4,loc_z,12,15.5,rotation,side)
place(loc_x-.5,loc_y+5,loc_z,12,15.5,rotation,side)
translate([0,0,1.75]) cube([12,15.5,2]);
}
if(type == "sdcard" && side == "top" && rotation == 270) {
place(loc_x+5,loc_y,loc_z,12,15.5,rotation,side)
translate([0,0,1.75]) cube([12,15.5,2]);
}
if(type == "sdcard_i" && side == "bottom" && rotation == 0) {
place(loc_x,loc_y-18.5,floorthick+adjust+4,12,18.5,rotation,side)
cube([12,18.5,floorthick+(2*adjust)+4]);
}
if(type == "sdcard_i" && side == "bottom" && rotation == 90) {
place(loc_x+5.5,loc_y-.25,floorthick+adjust+4,12,18.5,rotation,side)
cube([12,18.5,floorthick+(2*adjust)+4]);
}
if(type == "sdcard_i" && side == "bottom" && rotation == 180) {
place(loc_x,loc_y+5.5,floorthick+adjust+4,12,18.5,rotation,side)
cube([12,18.5,floorthick+(2*adjust)+4]);
}
if(type == "sdcard_i" && side == "bottom" && rotation == 270) {
place(loc_x-18.5,loc_y-.25,floorthick+adjust+4,12,18.5,rotation,side)
cube([12,18.5,floorthick+(2*adjust)+4]);
}
// rj45 opening
if(type == "rj45_single" && rotation == 0) {
place(loc_x,loc_y-6,loc_z,16,17.5,rotation,side)
@@ -2629,61 +2657,185 @@ module mask(loc_x,loc_y,loc_z,rotation,side,class,type,wallthick,gap,floorthick,
cube([6.5,8,15]);
}
// ir opening
if(type == "ir_1") {
if(type == "ir_1" && rotation == 0) {
place(loc_x,loc_y,loc_z,6,6,rotation,side)
translate([2.5,wallthick+gap,7.5]) rotate([90,0,0]) cylinder(d=6, h=9);
translate([3.5,2,7.5]) rotate([90,0,0]) cylinder(d=6, h=9);
}
if(type == "ir_1" && rotation == 90) {
place(loc_x,loc_y,loc_z,6,6,rotation,side)
translate([2.5,2,7.5]) rotate([90,0,0]) cylinder(d=6, h=9);
}
if(type == "ir_1" && rotation == 180) {
place(loc_x,loc_y,loc_z,6,6,rotation,side)
translate([2.5,5,7.5]) rotate([90,0,0]) cylinder(d=6, h=9);
}
if(type == "ir_1" && rotation == 270) {
place(loc_x,loc_y,loc_z,6,6,rotation,side)
translate([3.375,5,7.5]) rotate([90,0,0]) cylinder(d=6, h=9);
}
// switch opening
if(type == "slide_4x9" && rotation == 0) {
place(loc_x+(wallthick+gap+adjust),loc_y,loc_z,4,9.1,rotation,side)
translate([0,0,.5]) cube([15.75,9.1,4]);
place(loc_x,loc_y,loc_z,4,9,rotation,side)
translate([0,-6,.25]) cube([9,8,4]);
}
if(type == "slide_4x9" && rotation == 90) {
place(loc_x,loc_y,loc_z,4,9,rotation,side)
translate([-5,-6,.25]) cube([9,8,4]);
}
if(type == "slide_4x9" && rotation == 180) {
place(loc_x,loc_y,loc_z,4,9,rotation,side)
translate([-5,-.5,.25]) cube([9,8,4]);
}
if(type == "slide_4x9" && rotation == 270) {
place(loc_x,loc_y,loc_z,4,9.1,rotation,side)
translate([0,0,.5]) cube([15.75,9.1,4]);
place(loc_x,loc_y,loc_z,4,9,rotation,side)
translate([0,-.75,.25]) cube([9,8,4]);
}
// rj45-usb2_double opening
if(type == "rj45-usb2_double" && rotation == 0) {
place(loc_x,loc_y-2*(wallthick+gap)-adjust,loc_z,19,28,rotation,side)
cube([19,28,31]);
place(loc_x,loc_y-6,loc_z,19,28,rotation,side)
cube([19,8,31]);
}
if(type == "rj45-usb2_double" && rotation == 90) {
place(loc_x-6,loc_y,loc_z,19,28,rotation,side)
cube([19,8,31]);
}
if(type == "rj45-usb2_double" && rotation == 180) {
place(loc_x,loc_y+6,loc_z,19,28,rotation,side)
cube([19,8,31]);
}
if(type == "rj45-usb2_double" && rotation == 270) {
place(loc_x+6,loc_y,loc_z,19,28,rotation,side)
cube([19,8,31]);
}
// rj45-usb3_double opening
if(type == "rj45-usb3_double" && rotation == 0) {
place(loc_x,loc_y-2*(wallthick+gap)-adjust,loc_z,19.5,28,rotation,side)
cube([19.5,28,31]);
place(loc_x-.25,loc_y-6,loc_z,19.5,28,rotation,side)
cube([19.5,8,31.25]);
}
if(type == "rj45-usb3_double" && rotation == 90) {
place(loc_x-6,loc_y-.25,loc_z,19.5,28,rotation,side)
cube([19.5,8,31.25]);
}
if(type == "rj45-usb3_double" && rotation == 180) {
place(loc_x+.25,loc_y+6,loc_z,19.5,28,rotation,side)
cube([19.5,8,31.25]);
}
if(type == "rj45-usb3_double" && rotation == 270) {
place(loc_x+6,loc_y-.25,loc_z,19.5,28,rotation,side)
cube([19.5,8,31.25]);
}
// out-in-spdif opening
if(type == "out-in-spdif" && rotation == 0) {
place(loc_x,loc_y-2*(wallthick+gap)-adjust,loc_z,13,21.65,rotation,side)
cube([13,21.65,35.5]);
place(loc_x-.1,loc_y-6,loc_z,13,21.65,rotation,side)
cube([13,8,35.5]);
}
if(type == "out-in-spdif" && rotation == 90) {
place(loc_x-6,loc_y-.1,loc_z,13,21.65,rotation,side)
cube([13,8,35.5]);
}
if(type == "out-in-spdif" && rotation == 180) {
place(loc_x-.2,loc_y+6,loc_z,13,21.65,rotation,side)
cube([13,8,35.5]);
}
if(type == "out-in-spdif" && rotation == 270) {
place(loc_x+6,loc_y-.1,loc_z,13,21.65,rotation,side)
cube([13,8,35.5]);
}
// dp-hdmi_a opening
if(type == "dp-hdmi_a" && rotation == 0) {
place(loc_x-.5,loc_y-2*(wallthick+gap)-adjust,loc_z,19,18,rotation,side)
cube([19,18,19]);
place(loc_x-.5,loc_y-6,loc_z,19,18,rotation,side)
cube([19,8,19.25]);
}
if(type == "dp-hdmi_a" && rotation == 90) {
place(loc_x-6,loc_y-.5,loc_z,19,18,rotation,side)
cube([19,8,19.25]);
}
if(type == "dp-hdmi_a" && rotation == 180) {
place(loc_x-.5,loc_y+6,loc_z,19,18,rotation,side)
cube([19,8,19.25]);
}
if(type == "dp-hdmi_a" && rotation == 270) {
place(loc_x+6,loc_y-.5,loc_z,19,18,rotation,side)
cube([19,8,19.25]);
}
// sata_encl_power opening
if(type == "sata_encl_power" && rotation == 0) {
place(loc_x,loc_y,loc_z,38.5,7.5,rotation,side)
translate([1,9.5+adjust,3]) rotate([90,0,0]) slot(7.5,38.5,wallthick+2*adjust);
translate([1,14,3]) rotate([90,0,0]) slot(7.5,38.5,10);
}
if(type == "sata_encl_power" && rotation == 90) {
place(loc_x,loc_y,loc_z,38.5,7.5,rotation,side)
translate([-1,14,3]) rotate([90,0,0]) slot(7.5,38.5,10);
}
if(type == "sata_encl_power" && rotation == 180) {
place(loc_x,loc_y,loc_z,38.5,7.5,rotation,side)
translate([-1,8,3]) rotate([90,0,0]) slot(7.5,38.5,10);
}
if(type == "sata_encl_power" && rotation == 270) {
place(loc_x,loc_y,loc_z,38.5,7.5,rotation,side)
translate([1,8,3]) rotate([90,0,0]) slot(7.5,38.5,10);
}
// audio jack opening
if(type == "jack_3.5" && rotation == 0) {
place(loc_x,loc_y,loc_z,7.5,7.5,rotation,side)
union() {
translate([3.25,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) {
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=5, h=8);
translate([.5,-.5,0]) cube([7.5,2.5,4.5]);
}
}
if(type == "jack_3.5" && rotation == 180) {
place(loc_x,loc_y+wallthick+gap,loc_z,7.5,7.5,rotation,side)
translate([4,0,2.25]) rotate([90,0,0]) cylinder(d=5, h=9);
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=5, h=8);
translate([.5,-5,0]) cube([7.5,2.5,4.5]);
}
}
if(type == "jack_3.5" && rotation == 270) {
place(loc_x,loc_y+wallthick+gap,loc_z,5,5,rotation,side)
translate([-.5,-6,2]) rotate([90,0,0]) cylinder(d=5, h=9);
place(loc_x,loc_y,loc_z,7.5,7.5,rotation,side)
union() {
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]);
}
}
// button opening
if(type == "momentary_6x6x4") {
place(loc_x,loc_y,loc_z,6,6,rotation,side)
translate([3,3,5]) rotate([0,0,0]) cylinder(d=5, h=50);
translate([3,3,4]) rotate([0,0,0]) cylinder(d=5, h=50);
}
if(type == "momentary_6x6x4_90" && rotation == 0) {
place(loc_x,loc_y,loc_z,6,6,rotation,side)
union() {
translate([3,-2.5,3]) rotate([90,0,0]) cylinder(d=5, h=8);
translate([-.5,-3.75,0]) cube([7,2.5,6.5]);
}
}
if(type == "momentary_6x6x4_90" && rotation == 90) {
place(loc_x,loc_y,loc_z,6,6,rotation,side)
union() {
translate([3,-2.5,3]) rotate([90,0,0]) cylinder(d=5, h=8);
translate([-.5,-3.75,0]) cube([7,2.5,6.5]);
}
}
if(type == "momentary_6x6x4_90" && rotation == 180) {
place(loc_x,loc_y,loc_z,6,6,rotation,side)
union() {
translate([3,-2.5,3]) rotate([90,0,0]) cylinder(d=5, h=8);
translate([-.5,-3.75,0]) cube([7,2.5,6.5]);
}
}
if(type == "momentary_6x6x4_90" && rotation == 270) {
place(loc_x,loc_y,loc_z,6,6,rotation,side)
translate([3,-3,3]) rotate([90,0,0]) cylinder(d=5, h=10);
union() {
translate([3,-2.5,3]) rotate([90,0,0]) cylinder(d=5, h=8);
translate([-.5,-3.75,0]) cube([7,2.5,6.5]);
}
}
}