From 66595c77679c2a12ea72d864eecfc6aa3c525d23 Mon Sep 17 00:00:00 2001 From: Julien Calixte Date: Sat, 11 Jul 2026 02:31:44 +0200 Subject: [PATCH] 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. --- hardware/case/.gitignore | 2 + hardware/case/README.md | 168 +++++++++++++++++ hardware/case/concept.html | 255 +++++++++++++++++++++++++ hardware/case/renders/assembled.png | Bin 0 -> 30041 bytes hardware/case/renders/baseplate.png | Bin 0 -> 23308 bytes hardware/case/renders/body.png | Bin 0 -> 32568 bytes hardware/case/renders/bracket.png | Bin 0 -> 15847 bytes hardware/case/renders/front34.png | Bin 0 -> 19599 bytes hardware/case/renders/nameplate.png | Bin 0 -> 21852 bytes hardware/case/renders/print.png | Bin 0 -> 28917 bytes hardware/case/typoena-case.scad | 277 ++++++++++++++++++++++++++++ hardware/justfile | 25 +++ 12 files changed, 727 insertions(+) create mode 100644 hardware/case/.gitignore create mode 100644 hardware/case/README.md create mode 100644 hardware/case/concept.html create mode 100644 hardware/case/renders/assembled.png create mode 100644 hardware/case/renders/baseplate.png create mode 100644 hardware/case/renders/body.png create mode 100644 hardware/case/renders/bracket.png create mode 100644 hardware/case/renders/front34.png create mode 100644 hardware/case/renders/nameplate.png create mode 100644 hardware/case/renders/print.png create mode 100644 hardware/case/typoena-case.scad create mode 100644 hardware/justfile diff --git a/hardware/case/.gitignore b/hardware/case/.gitignore new file mode 100644 index 0000000..587b2a0 --- /dev/null +++ b/hardware/case/.gitignore @@ -0,0 +1,2 @@ +# generated mesh exports — regenerate with `just stl` +*.stl diff --git a/hardware/case/README.md b/hardware/case/README.md new file mode 100644 index 0000000..4273e39 --- /dev/null +++ b/hardware/case/README.md @@ -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 ~4–5 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.2–0.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.** 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). + +## 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 3–4 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 — + + +## 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. diff --git a/hardware/case/concept.html b/hardware/case/concept.html new file mode 100644 index 0000000..bd3411d --- /dev/null +++ b/hardware/case/concept.html @@ -0,0 +1,255 @@ +Typoena — Enclosure Concept + + +
+
+ +
+
+
Typoena
+
Enclosure concept · typewriter body
+
+
Panel
GDEY0579T93
Board
ESP32-S3
+
Units
mm
Scale
to-fit
+
Rev
v0 · concept
Date
2026-07-11
+
+ +
+

The screen is the sheet of paper. A shallow sage wedge with a reclined deck; the e-paper strip sits where a typewriter's page would be, a decorative platen roller and two knobs ride the back edge, and the keyboard you bring rests in front. Every dimension below is from the real datasheets — this is the shape to react to before I cut the parametric model.

+
+ body + platen / deck / feet + e-paper + dimensions +
+
+ +
+
+

Side profile — the silhouette

+

The money view: shallow deck reclined ~18°, platen & knob at the back, ports on the tail, your keyboard ghosted in front.

+ +
+
+
+

Front elevation — width

+

Letterbox screen across the deck; knobs poke past the sides.

+ +
+
+

Top plan — deck layout

+

Screen forward, platen band aft, ports along the back edge.

+ +
+
+
+ +
+

01 Cheap-ish body

You picked the higher-material form, but it stays a shell: ~2.4 mm walls, open bottom, a screwed baseplate. Hollow inside, no infill spent on a solid block.

+

02 Color does the work

Print the body in matte sage, platen & knobs in cream or black. Two-tone via a filament change reads unmistakably "typewriter" for free.

+

03 Decorative cues

Platen roller + two knobs are cosmetic (your call) — printed separately, no wiring, no GPIO. Round feet finish the machined look.

+

04 Fragile glass

The 1 mm panel drops into a rebate behind a bezel lip that overlaps ~6 mm; the FPC folds back to the DESPI-C579 breakout in the cavity.

+

05 The one tunable

Deck angle is the ergonomics dial. 18° is typewriter-shallow; 28–35° reads better seated. Say the word and I'll steepen it.

+

06 Optional lid

Your docs say "hinged lid" — a cover latching over the deck echoes a portable typewriter's case and guards the glass in a bag. Toggled off by default.

+
+ +
+ Typoena · writing appliance + Screen 150.9 × 56.9 × 1.0 · active 139.0 × 47.7 · pitch 0.1755 + Orthographic · third-angle · not for manufacture +
+ +
+
+ + diff --git a/hardware/case/renders/assembled.png b/hardware/case/renders/assembled.png new file mode 100644 index 0000000000000000000000000000000000000000..6e06e8b9daf927480aac60ae506b6bf56b5a4990 GIT binary patch literal 30041 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 literal 0 HcmV?d00001 diff --git a/hardware/case/renders/baseplate.png b/hardware/case/renders/baseplate.png new file mode 100644 index 0000000000000000000000000000000000000000..88b62819c7112872a48dcdfe76270c7f360cb721 GIT binary patch literal 23308 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

3gP~w;RN4GYU>4*1DI~hrQV(T2L|>W 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 literal 0 HcmV?d00001 diff --git a/hardware/case/renders/body.png b/hardware/case/renders/body.png new file mode 100644 index 0000000000000000000000000000000000000000..90d44f538e3e88153305257f4ebb725d58cb9454 GIT binary patch literal 32568 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 VbaKCth7hqsSJUu#p1Q-0{|D|Yw`u?Y literal 0 HcmV?d00001 diff --git a/hardware/case/renders/bracket.png b/hardware/case/renders/bracket.png new file mode 100644 index 0000000000000000000000000000000000000000..5a33c53755da94cf8cfa51b3767d6741783e8dbf GIT binary patch literal 15847 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 bhonSg(uRMhQ%BlP<<(t{pP5${m%Bcdh literal 0 HcmV?d00001 diff --git a/hardware/case/renders/print.png b/hardware/case/renders/print.png new file mode 100644 index 0000000000000000000000000000000000000000..1e108548933f040d9346f42c0dd9d900dd5d3182 GIT binary patch literal 28917 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 literal 0 HcmV?d00001 diff --git a/hardware/case/typoena-case.scad b/hardware/case/typoena-case.scad new file mode 100644 index 0000000..d81fb3c --- /dev/null +++ b/hardware/case/typoena-case.scad @@ -0,0 +1,277 @@ +// ============================================================================ +// Typoena — 3D-printed enclosure · "typewriter body" · rev v0 (concept) +// ---------------------------------------------------------------------------- +// A shallow sage wedge. 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. +// No platen part (keeps the print simple) — the rounded back-top edge is a +// subtle roll that nods to one for free. +// +// Everything here is PARAMETRIC. Numbers that come from a datasheet are noted; +// numbers marked << MEASURE >> are best-guesses you must confirm against the +// real board / breakout before printing a final. +// +// Units: millimetres. Render: see hardware/case/README.md +// +// Parts (set `show` below): +// "assembled" – everything in place, coloured (screen ghosted in) +// "body" – the shell only (print deck-up or on its back) +// "bracket" – the screen retaining frame (print flat) +// "baseplate" – the chassis / bottom cover (print flat) +// "print_plate" – all printed parts laid out side by side +// ============================================================================ + +show = "assembled"; +$fn = 48; + +// ---- body envelope -------------------------------------------------------- +W = 176; // width (X) — screen 150.9 + bezel + walls +D = 104; // depth (Y) — front (keyboard) .. back (ports) +Hf = 24; // height at the FRONT edge +Hb = 58; // height at the BACK edge (Hf> THE ergonomics dial. Raise Hb for a more vertical, easier-to-read screen; +// lower it for a flatter, more typewriter-like deck. 18-22 deg = shallow, +// 28-35 deg reads better when you're sitting close. + +// ---- e-paper panel : GDEY0579T93 (datasheet) ------------------------------ +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 retention (glueless) ------------------------------------------ +lip_over = 4.0; // how far the front bezel lip overlaps the glass border +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 + +// ---- deck nameplate (engraved, faces the user) ---------------------------- +name_text = "TYPOENA"; +name_size = 6.5; // cap height in mm +name_depth = 0.8; // engrave depth — raise for a bolder, deeper cut +name_font = "Monaspace Krypton"; // install once — see README (Nameplate font) + +A_ap_w = A_w + 2; // through-aperture (a hair bigger than active) +A_ap_h = A_h + 1; // still smaller than glass minus 2*lip +P_w = G_w + glass_gap; // glass pocket (locates the glass in X/Y) +P_h = G_h + glass_gap; + +// screen placed centred on the deck (measured up the slope) +deck_L = (D - 2*corner_r) / cos(theta); // deck length along the slope +screen_cy = deck_L/2; // centre it +boss_r = 3.4; // M2 self-tap boss for the bracket + +// ---- ports on the back wall (ESP32-S3-DevKitC-1 edge) -------------------- +port_z = 7; // height of the port centres off the desk << MEASURE >> +usbc_w = 9.6; usbc_h = 3.6; // USB-C opening (with clearance) +sd_w = 12; sd_h = 2.4; // microSD slot +// X positions of the three openings along the back << MEASURE to your board >> +port_x = [W/2 - 15, W/2, W/2 + 17]; // usb-c (kbd), usb-c (power), µSD + +// ---- baseplate / chassis -------------------------------------------------- +bp_t = 2.6; // baseplate thickness +bp_gap = 0.5; // clearance so it drops into the shell +foot_r = 7; // round feet (the little typewriter feet) +foot_h = 3.5; +post_r = 4.2; // corner screw posts inside the shell (M2.5 self-tap) +post_pilot = 1.15; + +// board mounting standoffs on the baseplate << MEASURE hole positions >> +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]]; + +// ---- colours (for the assembled render) ----------------------------------- +C_body = "#130f40"; // deep indigo (chosen) +C_plate = "#C9C3B2"; +C_bracket= "#2B2B2B"; +C_screen = "#F7F4EA"; + +// =========================================================================== +// helpers +// =========================================================================== +module rrect(w, d, r) { // 2D rounded rectangle, centred + hull() for (mx=[-1,1], my=[-1,1]) + translate([mx*(w/2-r), my*(d/2-r)]) circle(r=r); +} + +// place children onto the reclined deck plane. Origin at the FRONT-TOP edge +// (world y=0, z=Hf) — where the true hull top surface actually begins; anchor +// it at the pillar centre instead and everything lands ~3mm below the surface. +// local frame: X = width, Y = up the slope, Z = out of the deck (normal). +module on_deck() { + translate([W/2, 0, Hf]) rotate([theta, 0, 0]) children(); +} + +// =========================================================================== +// body +// =========================================================================== +module body_outer() { + hull() { + translate([corner_r, corner_r, 0]) cylinder(h=Hf, r=corner_r); + translate([W-corner_r, corner_r, 0]) cylinder(h=Hf, r=corner_r); + translate([corner_r, D-corner_r, 0]) cylinder(h=Hb, r=corner_r); + translate([W-corner_r, D-corner_r, 0]) cylinder(h=Hb, r=corner_r); + } +} + +module body_cavity() { + ri = corner_r - wall; + hull() { + translate([corner_r, corner_r, -3]) cylinder(h=Hf-top_wall+3, r=ri); + translate([W-corner_r, corner_r, -3]) cylinder(h=Hf-top_wall+3, r=ri); + translate([corner_r, D-corner_r, -3]) cylinder(h=Hb-top_wall+3, r=ri); + translate([W-corner_r, D-corner_r, -3]) cylinder(h=Hb-top_wall+3, r=ri); + } +} + +// 4 corner posts the baseplate screws up into +module corner_posts() { + for (px=[corner_r+3, W-corner_r-3], py=[corner_r+3, D-corner_r-3]) { + h = (py < D/2) ? Hf-top_wall : Hb-top_wall; + translate([px, py, 0]) difference() { + cylinder(h=h, r=post_r); + translate([0,0,-1]) cylinder(h=h+2, r=post_pilot); + } + } +} + +// 4 bosses just OUTSIDE the glass pocket for the retaining bracket +module bracket_bosses() { + on_deck() for (bx=[-(P_w/2+5), P_w/2+5], + by=[screen_cy-(P_h/2+5), screen_cy+(P_h/2+5)]) { + blen = lip_t + G_t + foam_t + bracket_t + 6; + translate([bx, by, -lip_t-blen]) difference() { + cylinder(h=blen, r=boss_r); + translate([0,0,-1]) cylinder(h=blen+2, r=1.0); // M2 self-tap + } + } +} + +// 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); + } +} + +module port_cuts() { + // USB-C x2 + microSD through the back wall (y = D) + for (i=[0:2]) { + pw = (i==2) ? sd_w : usbc_w; + ph = (i==2) ? sd_h : usbc_h; + translate([port_x[i], D-wall-1, port_z]) + rotate([-90,0,0]) linear_extrude(wall+2) + offset(r=0.8) square([pw-1.6, ph-1.6], center=true); + } +} + +// engraved nameplate on the DECK, in the band between the front edge and the +// screen — faces the user as they write. Sits flat on the reclined deck. +module nameplate() { + name_y = (screen_cy - P_h/2) / 2; // centre of the front deck band + on_deck() translate([screen_off, name_y, -name_depth]) + linear_extrude(name_depth + 0.6) + text(name_text, size=name_size, halign="center", valign="center", + font=name_font, spacing=1.1); +} + +module case_body() { + difference() { + union() { + difference() { body_outer(); body_cavity(); } + corner_posts(); + bracket_bosses(); + } + screen_cuts(); + port_cuts(); + nameplate(); // engrave (comment out for a blank face) + } +} + +// =========================================================================== +// screen retaining bracket (printed flat, screwed to the 4 bosses) +// =========================================================================== +module bracket() { + ow = P_w + 18; oh = P_h + 18; + difference() { + linear_extrude(bracket_t) + difference() { rrect(ow, oh, 4); rrect(A_ap_w+2, A_ap_h+2, 2); } + for (bx=[-(P_w/2+5), P_w/2+5], by=[-(P_h/2+5), P_h/2+5]) + translate([bx, by, -1]) cylinder(h=bracket_t+2, r=1.45); // M2 clear + } +} + +// =========================================================================== +// baseplate / chassis +// =========================================================================== +module baseplate() { + iw = W - 2*wall - bp_gap; + id = D - 2*wall - bp_gap; + difference() { + union() { + // plate (centred on the footprint) + translate([W/2, D/2, 0]) linear_extrude(bp_t) rrect(iw, id, corner_r-wall); + // round feet underneath + for (fx=[corner_r+6, W-corner_r-6], fy=[corner_r+6, D-corner_r-6]) + translate([fx, fy, -foot_h]) cylinder(h=foot_h+0.1, r=foot_r); + // board standoffs on top + for (h = concat(esp_holes, brk_holes)) + translate([h[0], h[1], bp_t]) cylinder(h=standoff_h, r=3); + } + // corner screw clearance (into the body posts) + for (px=[corner_r+3, W-corner_r-3], py=[corner_r+3, D-corner_r-3]) + translate([px, py, -foot_h-1]) cylinder(h=bp_t+foot_h+2, r=1.6); + // standoff pilot holes + for (h = concat(esp_holes, brk_holes)) + translate([h[0], h[1], bp_t-1]) cylinder(h=standoff_h+2, r=standoff_pilot); + // cable / connector relief at the back + translate([W/2, D-wall-3, -1]) cube([30, 8, bp_t+2], center=false); + } +} + +// =========================================================================== +// assemblies +// =========================================================================== +module ghost_screen() { + on_deck() translate([screen_off, screen_cy+screen_off, -lip_t-G_t/2]) + color(C_screen) cube([G_w, G_h, G_t], center=true); +} +module placed_bracket() { + on_deck() translate([screen_off, screen_cy+screen_off, + -lip_t-G_t-foam_t-bracket_t]) + color(C_bracket) bracket(); +} + +if (show == "assembled") { + color(C_body) case_body(); + ghost_screen(); + placed_bracket(); + translate([0,0,-0.01]) color(C_plate) baseplate(); +} else if (show == "body") { + color(C_body) case_body(); +} else if (show == "bracket") { + color(C_bracket) bracket(); +} else if (show == "baseplate") { + color(C_plate) baseplate(); +} else if (show == "print_plate") { + 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(); +} diff --git a/hardware/justfile b/hardware/justfile new file mode 100644 index 0000000..4c510ac --- /dev/null +++ b/hardware/justfile @@ -0,0 +1,25 @@ +# Typoena enclosure — 3D-printed case +# Run from the hardware/ directory (just sets cwd here automatically). + +scad := "case/typoena-case.scad" + +# list available recipes +default: + @just --list + +# open the case model in OpenSCAD +open: + open -a OpenSCAD {{scad}} + +# regenerate the preview PNGs in case/renders/ +render: + cd case && 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 + cd case && openscad -o renders/body.png --imgsize=1100,825 --colorscheme=Tomorrow \ + --camera=0,0,0,62,0,22,0 --viewall --autocenter -D 'show="body"' typoena-case.scad + +# export STLs for the three printable parts +stl: + cd case && openscad -o body.stl -D 'show="body"' typoena-case.scad + cd case && openscad -o bracket.stl -D 'show="bracket"' typoena-case.scad + cd case && openscad -o baseplate.stl -D 'show="baseplate"' typoena-case.scad