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>
95 lines
3.8 KiB
Markdown
95 lines
3.8 KiB
Markdown
# 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.
|