Compare commits
2 Commits
704fd743a0
...
0c3b5b50b1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0c3b5b50b1 | ||
|
|
ff0ff0b5ae |
@@ -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.
|
||||
|
||||

|
||||

|
||||
|
||||
### 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.2–0.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"`):
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
### 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.
|
||||
|
||||

|
||||

|
||||
|
||||
### Assembly order
|
||||
|
||||
@@ -119,7 +130,7 @@ from below — far easier than fishing screws inside a shell.
|
||||
- **`Hb` (back height) → deck angle.** 18–22° is typewriter-shallow; raise `Hb`
|
||||
toward ~28–35° 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 `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
|
||||
|
||||
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
BIN
hardware/case/renders/section.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
@@ -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]);
|
||||
}
|
||||
}
|
||||
|
||||