Compare commits

..

2 Commits

Author SHA1 Message Date
Julien Calixte
0c3b5b50b1 docs(case): refresh renders and document the FPC bay + section
Regenerate all previews for the current model, embed the nameplate and
section views, and correct the screen/FPC captions (ribbon exits the
left, breakout on the left, wiring to the ESP32).
2026-07-11 03:01:26 +02:00
Julien Calixte
ff0ff0b5ae 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.
2026-07-11 03:01:19 +02:00
10 changed files with 67 additions and 20 deletions

View File

@@ -61,7 +61,7 @@ The deck angle is the one knob worth tuning first — see below.
The whole design avoids glue on the fragile 1 mm glass and keeps every part
serviceable.
![The bare body shell — screen recess cut through the deck, FPC slot on the up-slope edge](renders/body.png)
![The bare body shell — screen recess cut through the deck, FPC slot on the left short edge](renders/body.png)
### Screen (bezel lip + foam + screwed bracket)
@@ -81,8 +81,9 @@ serviceable.
- The through-**aperture** is a hair larger than the active area and stays
*inside* the glass-minus-lip envelope, so the lip covers only dead border.
- The recess opens straight into the cavity, and an **FPC slot** on the
up-slope edge lets the ribbon fold back to the DESPI-C579 breakout.
- The recess opens into the cavity, and an **FPC bay** — an open notch in the
**left bezel** (the user's left as they face the screen) — lets the flex exit
and fold down to the DESPI-C579 breakout below.
- Foam does three jobs: cushions the glass, takes up print tolerance
(±0.20.5 mm), and removes any need for adhesive. Cut it from a plain EVA/
PORON sheet — no sticky backing.
@@ -90,6 +91,13 @@ serviceable.
cantilever clips. It works, but clips point-load the glass edge; the
foam+bracket route is gentler and I'd default to it.
The lip alone can't hold the glass — it only stops it falling *out* the front.
The glass is **trapped at both edges** between the front lip and the rear
foam+bracket; the bracket is what stops it dropping *into* the cavity
(`show="section"`):
![Midline section: glass clamped between the front lip and the rear foam + bracket; the FPC bay is the notch in the left bezel, standoffs on the cavity floor](renders/section.png)
![The screwed bracket — four corner holes, window clears the active area](renders/bracket.png)
### Boards (the baseplate is the chassis)
@@ -100,11 +108,14 @@ from below — far easier than fishing screws inside a shell.
- ESP32 + DESPI-C579 sit on printed **standoffs** (M2.5 self-tap). Positions in
`esp_holes` / `brk_holes` are placeholders — set them to your board's holes.
No mounting holes on your board rev? Switch to slide-in edge rails.
- The **DESPI-C579 breakout** sits in the cavity on the **left**, right under the
FPC exit; short SPI jumpers (MOSI/SCLK/CS/DC/RST/BUSY + 3V3/GND) run across to
the ESP32. Keep that left channel clear.
- The baseplate screws **up into 4 corner posts** in the shell.
- A **cable relief** notch at the back lets the keyboard's USB-C cable exit and
route around to the front.
![The baseplate — standoff bosses for the ESP32 + breakout; mount the boards at the bench, then close from below](renders/baseplate.png)
![The baseplate — four standoffs for the ESP32 (centre) and two for the DESPI-C579 breakout (left, under the FPC exit); mount at the bench, then close from below](renders/baseplate.png)
### Assembly order
@@ -119,7 +130,7 @@ from below — far easier than fishing screws inside a shell.
- **`Hb` (back height) → deck angle.** 1822° is typewriter-shallow; raise `Hb`
toward ~2835° if the screen reads too edge-on when you're sitting close.
- **`<< MEASURE >>` items:** `esp_holes`, `brk_holes`, `port_x`, `port_z`,
`screen_off` (the real panel's active area is offset toward the FPC edge).
`active_off_x/y` (the panel's active area sits off-centre from the glass).
## Print notes
@@ -138,6 +149,8 @@ from below — far easier than fishing screws inside a shell.
## Nameplate font
![The recessed TYPOENA engrave on the deck, in Monaspace Krypton](renders/nameplate.png)
The `TYPOENA` engrave on the deck (recessed, faces the user) is set via the
`name_font` parameter. Current pick: **Monaspace Krypton** (GitHub's mechanical
mono). OpenSCAD only renders fonts installed on the system:
@@ -159,8 +172,8 @@ name —
## Open questions / TODO
- [ ] Confirm the GDEY0579T93 active-area **offset** and which edge the **FPC**
exits; adjust `screen_off` / the FPC slot.
- [ ] Confirm the GDEY0579T93 active-area **offset** (FPC confirmed on the left
edge); adjust `active_off_x/y`.
- [ ] Real ESP32-S3-DevKitC-1 mounting-hole + port coordinates.
- [ ] Optional **hinged lid** over the deck (portable-typewriter-case echo,
protects the glass in a bag) — `docs/hardware.md` calls for one; not yet

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

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]);
}
}