summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJanne Grunau <j@jannau.net>2023-09-17 23:20:54 +0200
committerMarc Zyngier <maz@kernel.org>2023-09-17 22:41:34 +0100
commit0ead14a80eb1b0d959a83c94f8a27a26fe97d981 (patch)
tree700b9aef8c0a3c64bbc278f09397ef0fc9aa6701
parent5045cd20e2bca12bbe3bb0f11d719f0bf63490e5 (diff)
downloadcs-hw-0ead14a80eb1b0d959a83c94f8a27a26fe97d981.tar.gz
Add a simple OpenSCAD based tray style case
This could be extended to a full case but since the stacked height may vary that requires some thought. For dual cs setups both the top and bottom cs board could use their own tray if the pico is stacked between the boards. Signed-off-by: Janne Grunau <j@jannau.net> Signed-off-by: Marc Zyngier <maz@kernel.org>
-rw-r--r--README.txt6
-rw-r--r--case_v3.2.scad108
2 files changed, 114 insertions, 0 deletions
diff --git a/README.txt b/README.txt
index 79c1d1d..8b45653 100644
--- a/README.txt
+++ b/README.txt
@@ -102,3 +102,9 @@ For the SW that runs on the RPi Pico and how to use the damn thing,
head to
https://git.kernel.org/pub/scm/linux/kernel/git/maz/cs-sw.git
+
+* Case:
+
+case_v3.2.scad contains an OpenSCAD design for a tray case.
+The model file is available on
+https://www.printables.com/model/585592-central-scrutinizer-case
diff --git a/case_v3.2.scad b/case_v3.2.scad
new file mode 100644
index 0000000..365f5d1
--- /dev/null
+++ b/case_v3.2.scad
@@ -0,0 +1,108 @@
+/* SPDX-License-Identifier: MIT */
+// Copyright (c) 2023 Janne Grunau
+
+// tray style case for Central Scrutinizer v3.2
+
+$fn=60;
+
+// layer resolution for bottom chamfer
+lh = 0.1;
+// height of the case base
+base_h = 1.2;
+
+// height of the case without base
+height = 6;
+// wall thickness
+wt = 1.8;
+
+// Cutouts for USB-C/micro USB connectors
+gap_c = 14 + wt;
+// make the case symmetric
+gap_m = gap_c; //12 + wt;
+
+// M2 tapping bore, assume this approximation works well enough for
+// self-"tapping" with regular M2 machine screws.
+m2_bore = 1.85; // tapping diameter would be 1.6
+
+// board size
+size = [53, 33];
+// size of the mounting hole pattern
+h_pos = [38.1, 27.9];
+
+
+module mirror_copy(v = [0, 1, 0]) {
+ union() {
+ children();
+ mirror(v) children();
+ }
+}
+
+module connector_cutout(width, off=0) {
+ mirror_copy() translate([off, off, 0]) union() {
+ difference() {
+ translate([-wt/2 - 0.1, (width - wt)/4 - off]) square([wt + 0.2, (width - wt) / 2 + 2 * off], center=true);
+ translate([-wt/2, (width) / 2 - wt]) square([wt / 2, wt / 2]);
+ }
+ translate([-wt/2, (width)/2-wt]) circle(d=wt);
+ translate([-wt/2, width/2]) difference() {
+ translate([-wt/4 - 0.1, -wt/4]) square([wt / 2 + 0.2, wt / 2], center=true);
+ circle(d=wt);
+ }
+ }
+}
+
+module standoff(st_h) {
+ difference() {
+ union() {
+ cylinder(d=5, h=st_h);
+ translate([0, (size.y - h_pos.y - wt) / 2, st_h / 2]) cube([5, (size.y - h_pos.y) - wt, st_h], center=true);
+ }
+ cylinder(d=m2_bore, h=st_h + 0.1);
+ translate([0, 0, st_h - 0.5]) cylinder(d1=m2_bore, d2=m2_bore + 0.5, h=0.51);
+ }
+}
+
+union() {
+ // main case without bottom
+ difference() {
+ hull() {
+ for (x_pos = [-size.x, size.x], y_pos = [-size.y, size.y]) {
+ translate([x_pos / 2, y_pos / 2, 0]) cylinder(r=wt, h=height);
+ }
+
+ }
+ translate([0, 0, height / 2 + 0.049]) {
+ translate([0, 0, 0]) cube([size.x, size.y, height+0.1], center=true);
+ translate([-size.x/2, 0, 0]) cube([2 * wt + .1, gap_c, height+0.1], center=true);
+ translate([ size.x/2, 0, 0]) cube([2 * wt + .1, gap_m, height+0.1], center=true);
+ }
+ }
+ // add rounded corners to usb-c / micro usb cutouts
+ mirror_copy() translate([-(size.x + wt) / 2, gap_c / 2, 0]) cylinder(d=wt, h=height);
+ mirror_copy() translate([ (size.x + wt) / 2, gap_m / 2, 0]) cylinder(d=wt, h=height);
+
+ // add 4 standoffs to mount the Central Scrutinizer board to
+ for (xoff = [-h_pos.x, h_pos.x], yoff = [-h_pos.y, h_pos.y])
+ {
+ translate([xoff/2, yoff/2, 0])
+ rotate([0, 0, (yoff < 0.0) ? 180 : 0]) standoff(4);
+ }
+
+ // add case bottom with chamfer and partial cutouts for the usb connectors
+ mirror([0, 0, 1]) difference() {
+ // base plate with chamfers
+ union() for (z_off = [0:lh:base_h]) {
+ translate([0, 0, z_off]) linear_extrude(height = lh) hull() {
+ lsize = [size.x - z_off, size.y - z_off];
+ for (x_pos = [-lsize.x, lsize.x], y_pos = [-lsize.y, lsize.y]) {
+ translate([x_pos / 2, y_pos / 2]) circle(r=wt);
+ }
+ }
+ }
+ // chamfered cutouts for usb connectors
+ union() for (z_off = [0:lh:base_h]) {
+ translate([-size.x/2, 0, z_off]) linear_extrude(height = lh) connector_cutout(gap_c, z_off/2);
+ translate([ size.x/2, 0, z_off]) linear_extrude(height = lh) mirror([1,0,0]) connector_cutout(gap_m, z_off/2);
+ }
+ }
+}