feat(case): section view, foam gasket, and left-side FPC bay

The screen's flex leaves the LEFT short edge (user's left), so route it
there: an open ribbon bay in the left bezel, the DESPI-C579 breakout in
the cavity below it, and SPI wiring across to the ESP32. Add a modeled
foam gasket, a `show="section"` cutaway of the screen clamp, and
`active_off_x/y` for the panel's off-centre active area.
This commit is contained in:
Julien Calixte
2026-07-11 03:01:19 +02:00
parent 704fd743a0
commit ff0ff0b5ae

View File

@@ -18,9 +18,10 @@
// "bracket" the screen retaining frame (print flat)
// "baseplate" the chassis / bottom cover (print flat)
// "print_plate" all printed parts laid out side by side
// "section" midline cross-section: how the screen is trapped
// ============================================================================
show = "assembled";
show = "section";
$fn = 48;
// ---- body envelope --------------------------------------------------------
@@ -43,7 +44,13 @@ G_w = 150.92; G_h = 56.94; G_t = 1.0; // glass outline W x H x thickness
A_w = 139.00; A_h = 47.74; // active area (must stay uncovered)
// NOTE: the real panel's active area is offset toward the FPC edge — this model
// centres it. << MEASURE >> your panel's border and shift screen_off if needed.
screen_off = 0; // extra X/Y active-area offset
screen_off = 0; // (legacy) kept 0; see active_off_*
// This panel's flex (FPC) leaves the LEFT short edge — the user's left as they
// face the screen, i.e. the low-X side (world x < W/2). The aperture is centred
// on the ACTIVE area, which sits off-centre on the glass — measure yours and
// nudge these (+x = toward the right, away from the FPC edge). << MEASURE >>
active_off_x = 0;
active_off_y = 0;
// ---- screen retention (glueless) ------------------------------------------
lip_over = 4.0; // how far the front bezel lip overlaps the glass border
@@ -51,7 +58,7 @@ lip_t = 1.4; // deck material left in FRONT of the glass (the visible lip)
glass_gap = 0.5; // clearance around the glass in its pocket
foam_t = 1.0; // non-adhesive closed-cell foam gasket behind the glass
bracket_t = 2.6; // printed retaining frame thickness
fpc_w = 26; // width of the ribbon slot on the up-slope edge
fpc_w = 26; // ribbon-slot span along the LEFT short edge (the FPC side)
// ---- deck nameplate (engraved, faces the user) ----------------------------
name_text = "TYPOENA";
@@ -89,14 +96,17 @@ standoff_h = 6;
standoff_pilot = 1.15;
// ESP32-S3-DevKitC-1 is ~70 x 28 mm; these are PLACEHOLDER hole coords:
esp_holes = [[W/2-33, 30],[W/2+33, 30],[W/2-33, 54],[W/2+33, 54]];
// DESPI-C579 breakout sits behind the screen — PLACEHOLDER:
brk_holes = [[W/2-20, 78],[W/2+20, 78]];
// DESPI-C579 breakout sits in the cavity on the LEFT, under the FPC exit; SPI
// wires (MOSI/SCLK/CS/DC/RST/BUSY + 3V3/GND) run from here across to the ESP32.
// PLACEHOLDER hole coords << MEASURE >>:
brk_holes = [[22, 40],[22, 66]];
// ---- colours (for the assembled render) -----------------------------------
C_body = "#130f40"; // deep indigo (chosen)
C_body = "#3c6382";
C_plate = "#C9C3B2";
C_bracket= "#2B2B2B";
C_screen = "#F7F4EA";
C_foam = "#8a8f94";
// ===========================================================================
// helpers
@@ -161,13 +171,15 @@ module bracket_bosses() {
// deck cuts: through-aperture, glass pocket (leaves the front lip), FPC slot
module screen_cuts() {
on_deck() translate([screen_off, screen_cy + screen_off, 0]) {
// window
translate([0,0,-30]) cube([A_ap_w, A_ap_h, 66], center=true);
// glass pocket behind the lip
translate([0,0,-30-lip_t]) cube([P_w, P_h, 60], center=true);
// ribbon slot on the up-slope edge
translate([0, P_h/2, -30-lip_t]) cube([fpc_w, 12, 60], center=true);
on_deck() translate([0, screen_cy, 0]) {
// window — centred on the ACTIVE area (offset toward the FPC/left edge)
translate([active_off_x, active_off_y, -30])
cube([A_ap_w, A_ap_h, 66], center=true);
// glass pocket behind the lip — centred on the glass outline
translate([0, 0, -30-lip_t]) cube([P_w, P_h, 60], center=true);
// ribbon bay: an open notch in the LEFT short edge (breaches the bezel
// lip) so the FPC exits and folds down to the DESPI-C579 breakout below
translate([-P_w/2, 0, 0]) cube([14, fpc_w, 70], center=true);
}
}
@@ -258,6 +270,15 @@ module placed_bracket() {
-lip_t-G_t-foam_t-bracket_t])
color(C_bracket) bracket();
}
// foam gasket (non-adhesive) — a border frame between glass and bracket
module foam() {
linear_extrude(foam_t)
difference() { rrect(P_w+4, P_h+4, 3); rrect(A_ap_w, A_ap_h, 2); }
}
module placed_foam() {
on_deck() translate([screen_off, screen_cy+screen_off, -lip_t-G_t-foam_t])
color(C_foam) foam();
}
if (show == "assembled") {
color(C_body) case_body();
@@ -274,4 +295,17 @@ if (show == "assembled") {
color(C_body) case_body();
translate([W+30, 0, 0]) color(C_plate) baseplate();
translate([W+30, D+30, foot_h]) color(C_bracket) bracket();
} else if (show == "section") {
// slice away the +X half: the cut face shows the screen clamp, and the
// retained LEFT half shows the open FPC ribbon bay on the left edge
difference() {
union() {
color(C_body) case_body();
ghost_screen();
placed_foam();
placed_bracket();
translate([0,0,-0.01]) color(C_plate) baseplate();
}
translate([W/2, -30, -70]) cube([W, D+60, 220]);
}
}