feat(case): add parametric 3D-printed enclosure concept

Typewriter-body OpenSCAD model for the GDEY0579T93 panel and
ESP32-S3-DevKitC-1: glueless screen retention (bezel lip + foam gasket
+ screwed bracket), baseplate-as-chassis board mounting, and a recessed
deck nameplate. Ships render previews, a dimensioned concept drawing,
and just recipes to open/render/export.
This commit is contained in:
Julien Calixte
2026-07-11 02:31:44 +02:00
parent 13d49930cc
commit 66595c7767
12 changed files with 727 additions and 0 deletions

168
hardware/case/README.md Normal file
View File

@@ -0,0 +1,168 @@
# Enclosure — typewriter body (concept)
Part of [**Typoena**](../../README.md) — the distraction-free DIY writing
machine. This page covers the enclosure only; the project root README covers
the whole appliance (hardware, software stack, roadmap).
A 3D-printable case for Typoena. The e-paper strip sits on a reclined **deck**
where a typewriter's sheet of paper would be; the keyboard you bring rests in
front. There is **no platen part** (it complicates the print) — the rounded
back-top edge is a subtle roll that nods to one for free.
> **Status: v0 concept, not yet printed.** Outer form and the screen-retention
> / board-mounting strategy are worked out and render cleanly. Board hole
> positions and port offsets are placeholders marked `<< MEASURE >>` in the
> `.scad` — confirm them against the real board before printing a final.
![The deck: bezel lip framing the e-paper aperture, screen ghosted in](renders/assembled.png)
![Assembled body, three-quarter — reclined deck and the back wall with its port cutouts](renders/front34.png)
## Files
| File | What |
| --- | --- |
| [`typoena-case.scad`](typoena-case.scad) | The parametric model. All dimensions live at the top. |
| [`concept.html`](concept.html) | Dimensioned side/front/top drawing (open in a browser). |
| `renders/` | PNG previews (regenerated by the commands below). |
## Render / preview
Needs [OpenSCAD](https://openscad.org). Open `typoena-case.scad` in the GUI and
flip the `show` variable, or from the CLI:
```sh
cd hardware/case
# assembled, coloured, screen ghosted in
openscad -o renders/assembled.png --imgsize=1100,825 --colorscheme=Tomorrow \
--camera=0,0,0,62,0,22,0 --viewall --autocenter \
-D 'show="assembled"' typoena-case.scad
# export a printable part to STL (body | bracket | baseplate)
openscad -o body.stl -D 'show="body"' typoena-case.scad
```
`show` accepts `assembled` · `body` · `bracket` · `baseplate` · `print_plate`.
## Dimensions
From the datasheets, baked into the model:
- **Panel — GDEY0579T93:** glass outline **150.92 × 56.94 × 1.0 mm**, active
area **139.00 × 47.74 mm**, pitch 0.1755 mm. Strip aspect ~2.9:1.
- **Board — ESP32-S3-DevKitC-1:** ~**70 × 28 mm**, USB-C ×2 + reset/boot on one
short edge (that edge faces the back wall).
- **Body (default):** 176 W × 104 D, 24 mm front → 58 mm back, deck reclined
**~21°**. Walls 2.4 mm, deck 2.6 mm, corner radius 8 mm.
The deck angle is the one knob worth tuning first — see below.
## How the hardware goes in — glueless
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)
### Screen (bezel lip + foam + screwed bracket)
```
front face the sandwich, front → back:
┌───────────────┐ 1. deck BEZEL LIP (overlaps ~45 mm of the
│ ┌─────────┐ │ glass's inactive border only, never the
│ │ active │ │ ← lip active area — lip_t = 1.4 mm of material)
│ └─────────┘ │ 2. GLASS drops into the recess from behind;
└───────────────┘ the recess walls locate it in X/Y
3. FOAM gasket (non-adhesive closed-cell,
[lip][glass][foam][bracket] foam_t ≈ 1 mm) spreads the clamp load
↑ screwed to 4 bosses so you never point-crack the glass
4. printed BRACKET, screwed to 4 bosses,
presses the stack forward
```
- 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.
- 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.
- Alternative if you want no screws: replace the bracket with printed
cantilever clips. It works, but clips point-load the glass edge; the
foam+bracket route is gentler and I'd default to it.
![The screwed bracket — four corner holes, window clears the active area](renders/bracket.png)
### Boards (the baseplate is the chassis)
Mount everything to the **baseplate** on the bench, then drop it in and close
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 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)
### Assembly order
1. Lay glass into the deck recess (from inside), add the foam gasket, screw the
bracket down onto the 4 bosses.
2. Screw ESP32 + breakout to the baseplate standoffs.
3. Connect the FPC (screen → breakout) through the slot.
4. Screw the baseplate up into the corner posts.
## Tune first
- **`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).
## Print notes
![The three printed parts laid out — body, bracket, baseplate](renders/print.png)
- **Material:** PLA/PETG. Print the body in matte **indigo** (`#130f40`), the
bracket/base in cream or brass — two-tone reads unmistakably "typewriter" for
the price of a filament swap.
- **Make the engrave read:** on a body this dark the recessed `TYPOENA` is
near-invisible until you give it contrast — a swipe of paint pen in the recess,
or a 34 layer filament swap across the nameplate band mid-print.
- **Shell, not solid:** 2.4 mm walls + open bottom keep material low despite the
chunky body form.
- **Orientation:** body deck-up (or on its back) needs little/no support; the
bezel lip is a small overhang. Bracket and baseplate print flat.
## 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:
```sh
# current: Monaspace Krypton (installs the whole family)
brew install --cask font-monaspace
# alternative tried: Cutive Mono (typewriter slab-serif)
curl -sL -o ~/Library/Fonts/CutiveMono-Regular.ttf \
https://github.com/google/fonts/raw/main/ofl/cutivemono/CutiveMono-Regular.ttf
fc-cache -f # so the OpenSCAD CLI picks either up
```
To audition other faces: Google Fonts, filtered to monospace and previewing the
name —
<https://fonts.google.com/?preview.text=TYPOENA%0ATypoena%0Atypoena&categoryFilters=Appearance:%2FMonospace%2FMonospace>
## Open questions / TODO
- [ ] Confirm the GDEY0579T93 active-area **offset** and which edge the **FPC**
exits; adjust `screen_off` / the FPC slot.
- [ ] 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
modelled.
- [ ] Decide feet: printed (modelled) vs. stick-on rubber bumpers.