Case: two more body screws near the front

The base only screwed to the body at the back. New bosses in the side walls sit just behind the display, clear of the bezel's slide-in path; the base rim gets a gap around them and the feet part now has 6 feet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
mangavalkandClaude Opus 5.5 committed 2026-11-01 21:24:44 +01:00
1 parent 18cf03f388
commit 592837c6de
5 files changed
+38 -22

No files matched your search

+4 -4
View File
@@ -20,23 +20,23 @@ at least 210 × 115 mm.
| [stl/body.stl](stl/body.stl) | upside down, top on the bed (as exported) | Sides, top and back wall. No supports needed. | | [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/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. | | [stl/base.stl](stl/base.stl) | flat (as exported) | Floor with the board standoffs and the screw holes. |
| [stl/feet.stl](stl/feet.stl) | flat side down (as exported) | 4 feet, print in **TPU**. Each clamps under one of the base screws, with a spigot that locates in the screw's counterbore. | | [stl/feet.stl](stl/feet.stl) | flat side down (as exported) | 6 feet, print in **TPU**. Each clamps under one of the base screws, with a spigot that locates in the screw's counterbore. |
PETG is a good choice: the display warms the inside by a few degrees. PLA PETG is a good choice: the display warms the inside by a few degrees. PLA
works if the case stays out of the sun. works if the case stays out of the sun.
## Hardware ## Hardware
- 12 × M3 heat-set inserts, CNC Kitchen M3 × 5.7 (about 4.6 mm OD; the holes - 14 × M3 heat-set inserts, CNC Kitchen M3 × 5.7 (about 4.6 mm OD; the holes
are 4.2 mm and 6 mm deep, set by `insert_d` if your printer runs tighter or are 4.2 mm and 6 mm deep, set by `insert_d` if your printer runs tighter or
looser): looser):
- 4 in the bezel's display bosses - 4 in the bezel's display bosses
- 2 in the bezel's feet - 2 in the bezel's feet
- 2 in the body's rear corners - 2 in the body's rear corners and 2 in its side walls, behind the display
- 4 on the base's board standoffs - 4 on the base's board standoffs
- 4 × M3×6 to bolt the display to the bezel - 4 × M3×6 to bolt the display to the bezel
- 4 × M3×6 to hold the D1 board on its standoffs - 4 × M3×6 to hold the D1 board on its standoffs
- 4 × M3×8 to hold the base on, from below (also with the TPU feet) - 6 × M3×8 to hold the base on, from below (also with the TPU feet)
## Assembly ## Assembly
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+34 -18
View File
@@ -7,11 +7,11 @@
// //
// Assembly: // Assembly:
// 1. Melt M3 heat-set inserts into: 4 display bosses + 2 feet on the bezel, // 1. Melt M3 heat-set inserts into: 4 display bosses + 2 feet on the bezel,
// 2 rear corner bosses in the body, 4 board standoffs on the base. // 2 rear corner + 2 front side bosses in the body, 4 board standoffs on the base.
// 2. Bolt the display to the bezel from behind (4x M3x6). // 2. Bolt the display to the bezel from behind (4x M3x6).
// 3. Screw the D1 board onto the base (4x M3x6). // 3. Screw the D1 board onto the base (4x M3x6).
// 4. Slide the bezel (with display) up into the body's side grooves from below. // 4. Slide the bezel (with display) up into the body's side grooves from below.
// 5. Wire up, put the body on the base and screw it together from below (4x M3x8). // 5. Wire up, put the body on the base and screw it together from below (6x M3x8).
// //
// Render one part: openscad -D 'part="body"' -o body.stl vfd-case.scad // Render one part: openscad -D 'part="body"' -o body.stl vfd-case.scad
// Parts: "assembly" (preview with dummy display + board), "body", "bezel", "base", // Parts: "assembly" (preview with dummy display + board), "body", "bezel", "base",
@@ -107,9 +107,17 @@ foot_n = n_bezel_in + 6; // insert axis in the beze
foot_y = foot_n / cos(tilt); foot_y = foot_n / cos(tilt);
foot_xs = [inner_w * 0.25, inner_w * 0.75]; foot_xs = [inner_w * 0.25, inner_w * 0.75];
rear_boss = 9; // rear corner boss block size rear_boss = 9; // rear corner boss block size
boss_h = 10; // body boss height before the chamfer
rear_screws = [[rear_boss / 2, depth - wall - rear_boss / 2], rear_screws = [[rear_boss / 2, depth - wall - rear_boss / 2],
[inner_w - rear_boss / 2, depth - wall - rear_boss / 2]]; [inner_w - rear_boss / 2, depth - wall - rear_boss / 2]];
base_screws = concat([for (x = foot_xs) [x, foot_y]], rear_screws); // front side bosses: far enough back that the display's back stays clear while
// the bezel slides in along the panel
n_disp_back = n_pcb + pcb_t + disp_back;
front_boss_y = ceil((n_disp_back + 2 + (boss_h + rear_boss) * sin(tilt)) / cos(tilt));
front_screws = [[rear_boss / 2, front_boss_y + rear_boss / 2],
[inner_w - rear_boss / 2, front_boss_y + rear_boss / 2]];
body_screws = concat(front_screws, rear_screws);
base_screws = concat([for (x = foot_xs) [x, foot_y]], body_screws);
echo(str("Outer size: ", outer_w, " x ", depth, " x ", height + base_t, " mm (W x D x H)")); echo(str("Outer size: ", outer_w, " x ", depth, " x ", height + base_t, " mm (W x D x H)"));
@@ -151,19 +159,23 @@ module body() {
for (i = [0 : 3]) translate([inner_w / 2, depth - wall - 14 - i * 8, height - wall / 2]) for (i = [0 : 3]) translate([inner_w / 2, depth - wall - 14 - i * 8, height - wall / 2])
linear_extrude(wall + 2, center = true) rrect(inner_w - 50, 3, 1.4); linear_extrude(wall + 2, center = true) rrect(inner_w - 50, 3, 1.4);
} }
// rear corner bosses for the base screws, chamfered up into the walls // bosses for the base screws, chamfered up into the walls
for (p = rear_screws) { for (p = rear_screws) body_boss(p, true);
x0 = p[0] < inner_w / 2 ? 0 : inner_w - rear_boss; for (p = front_screws) body_boss(p, false);
xw = p[0] < inner_w / 2 ? 0 : inner_w - 0.01; }
difference() {
hull() { // rear: in the corner, chamfered into the side and back walls; front: side wall only
translate([x0, depth - wall - rear_boss, 0]) cube([rear_boss, rear_boss, 10]); module body_boss(p, rear) {
translate([xw, depth - wall - 0.01, 0]) cube([0.01, 0.01, 10 + rear_boss]); x0 = p[0] < inner_w / 2 ? 0 : inner_w - rear_boss;
translate([x0, depth - wall - 0.01, 0]) cube([rear_boss, 0.01, 10 + rear_boss]); xw = p[0] < inner_w / 2 ? 0 : inner_w - 0.01;
translate([xw, depth - wall - rear_boss, 0]) cube([0.01, rear_boss, 10 + rear_boss]); y0 = p[1] - rear_boss / 2;
} difference() {
translate([p[0], p[1], -1]) cylinder(d = insert_d, h = insert_depth + 1); hull() {
translate([x0, y0, 0]) cube([rear_boss, rear_boss, boss_h]);
translate([xw, y0, 0]) cube([0.01, rear_boss, boss_h + rear_boss]);
if (rear) translate([x0, y0 + rear_boss - 0.01, 0]) cube([rear_boss, 0.01, boss_h + rear_boss]);
} }
translate([p[0], p[1], -1]) cylinder(d = insert_d, h = insert_depth + 1);
} }
} }
@@ -210,8 +222,12 @@ module base() {
translate([-wall, 0, -base_t]) cube([outer_w, depth, base_t]); translate([-wall, 0, -base_t]) cube([outer_w, depth, base_t]);
// locating rim inside the side and back walls (stops short of the bezel and bosses) // locating rim inside the side and back walls (stops short of the bezel and bosses)
rim_y0 = 20; rim_y0 = 20;
for (x = [clr, inner_w - clr - 1.6]) difference() {
translate([x, rim_y0, -0.01]) cube([1.6, depth - wall - rear_boss - clr - rim_y0, 2]); for (x = [clr, inner_w - clr - 1.6])
translate([x, rim_y0, -0.01]) cube([1.6, depth - wall - rear_boss - clr - rim_y0, 2]);
for (p = front_screws) translate([p[0], p[1], 1])
cube([rear_boss + 2 * clr, rear_boss + 2 * clr, 4], center = true);
}
translate([rear_boss + clr, depth - wall - clr - 1.6, -0.01]) translate([rear_boss + clr, depth - wall - clr - 1.6, -0.01])
cube([inner_w - 2 * (rear_boss + clr), 1.6, 2]); cube([inner_w - 2 * (rear_boss + clr), 1.6, 2]);
// board standoffs // board standoffs
@@ -314,7 +330,7 @@ if (part == "assembly") {
} else if (part == "bezel") { } else if (part == "bezel") {
translate([0, 0, -lip]) multmatrix(M) bezel(); // front face on the bed translate([0, 0, -lip]) multmatrix(M) bezel(); // front face on the bed
} else if (part == "feet") { } else if (part == "feet") {
for (i = [0 : len(base_screws) - 1]) // 4 feet, flat side down for (i = [0 : len(base_screws) - 1]) // 6 feet, flat side down
translate([i * (foot_d + 5), 0, foot_h]) foot(); translate([i * (foot_d + 5), 0, foot_h]) foot();
} else if (part == "base") { } else if (part == "base") {
translate([0, 0, base_t]) base(); translate([0, 0, base_t]) base();