Files
esphome-samsung-vfd/case/README.md
T
mangavalkandClaude Opus 5.5 4a533af37a Case: mount the display the right way up
The glass is 4.4 mm off-centre on the display PCB. Turning the display
180 degrees so the text reads correctly moved the glass partly behind the
window edge. New disp_rotated option (default on) moves the bezel bosses
to match. Only the bezel changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 13:03:53 +01:00

95 lines
3.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Desk case
A 3D-printable desk case for the Samsung 20L203 VFD and a WEMOS D1 R1
(UNO-sized ESP8266 board). The display is tilted back 15° and bolted to the
front with M3 screws. The DC jack and the USB port are reachable through the
back wall.
<p>
<img src="preview.png" alt="Case preview" width="49%">
<img src="section.png" alt="Cross-section: display on the bezel, board on the base" width="49%">
</p>
Outer size: about 208 × 112 × 86 mm (W × D × H). The parts need a print bed of
at least 210 × 115 mm.
## Parts
| File | Print orientation | Notes |
|------|-------------------|-------|
| [stl/body.stl](stl/body.stl) | upside down, top on the bed (as exported) | Sides, top and back wall. No supports needed. |
| [stl/bezel.stl](stl/bezel.stl) | face down (as exported) | Front panel with the window and the display bosses. |
| [stl/base.stl](stl/base.stl) | flat (as exported) | Floor with the board standoffs and the screw holes. |
PETG is a good choice: the display warms the inside by a few degrees. PLA
works if the case stays out of the sun.
## Hardware
- 10 × M3 heat-set inserts (about 4.6 mm OD, 5.7 mm long; the holes are 4.0 mm
and 6 mm deep):
- 4 in the bezel's display bosses
- 2 in the bezel's feet
- 2 in the body's rear corners
- 4 on the base's board standoffs
- 4 × M3×8 to bolt the display to the bezel
- 4 × M3×6 to hold the D1 board on its standoffs
- 4 × M3×8 to hold the base on, from below
## Assembly
1. Melt the inserts in.
2. Bolt the display to the bezel from behind, glass facing the window.
3. Screw the D1 board onto the base, with the DC jack and USB edge at the back.
4. Slide the bezel, with the display on it, into the body from below. Its edges
run in the grooves in the side walls until it stops against the top.
5. Connect the display cable. The MAX3232 sits inline in the cable; tie it to
the anchor on the base.
6. Put the body on the base and screw it together from below. The base holds
the bezel in place.
## Measure before printing
The dimensions come from the 20L203**DA12** datasheet. Your board is a DA5, so
check these against yours and change the values at the top of
[vfd-case.scad](vfd-case.scad) if needed:
- `disp_hole_inset`, `disp_w`, `disp_h`: the display's mounting holes, 182 ×
56 mm apart.
- `glass_x0`, `glass_y0`, `glass_w`, `glass_h`, `glass_depth`: the glass
position and the distance from its front face to the PCB.
- `usb_pos`: where the micro-USB port is along the D1's back edge (38 mm from
the jack side is a guess based on the UNO layout). Also check `jack_pos`.
- `disp_rotated`: the glass is off-centre on the display's PCB, so the bezel
depends on which way up the display is mounted. `true` (the default) is the
orientation the display reads correctly in: turned 180° from the
datasheet's front view, with the jumper header on the left seen from the
front.
If only the display is off, it's enough to reprint the bezel.
## Changing the design
Open [vfd-case.scad](vfd-case.scad) in OpenSCAD. Every dimension is a variable
at the top, including the tilt, wall thickness and clearances. Export a part
with:
```
openscad -D 'part="body"' --export-format binstl -o stl/body.stl vfd-case.scad
openscad -D 'part="bezel"' --export-format binstl -o stl/bezel.stl vfd-case.scad
openscad -D 'part="base"' --export-format binstl -o stl/base.stl vfd-case.scad
```
`part="assembly"` shows everything with dummy display and board models, and
`part="section"` shows a cut-away. The `check_*` parts are collision checks;
each one must render as an empty object:
- `check_body_bezel`, `check_body_display`, `check_bezel_display`
- `check_body_base`, `check_bezel_base`, `check_display_base`
- `check_board`
- `check_insertion`: sweeps the bezel and display along their slide-in path
through the body.
Faces that only touch can show up as a zero-volume result, which is fine.