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

+34 -18
View File
@@ -7,11 +7,11 @@
//
// Assembly:
// 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).
// 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.
// 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
// 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_xs = [inner_w * 0.25, inner_w * 0.75];
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],
[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)"));
@@ -151,19 +159,23 @@ module body() {
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);
}
// rear corner bosses for the base screws, chamfered up into the walls
for (p = rear_screws) {
x0 = p[0] < inner_w / 2 ? 0 : inner_w - rear_boss;
xw = p[0] < inner_w / 2 ? 0 : inner_w - 0.01;
difference() {
hull() {
translate([x0, depth - wall - rear_boss, 0]) cube([rear_boss, rear_boss, 10]);
translate([xw, depth - wall - 0.01, 0]) cube([0.01, 0.01, 10 + rear_boss]);
translate([x0, depth - wall - 0.01, 0]) cube([rear_boss, 0.01, 10 + rear_boss]);
translate([xw, depth - wall - rear_boss, 0]) cube([0.01, rear_boss, 10 + rear_boss]);
}
translate([p[0], p[1], -1]) cylinder(d = insert_d, h = insert_depth + 1);
// bosses for the base screws, chamfered up into the walls
for (p = rear_screws) body_boss(p, true);
for (p = front_screws) body_boss(p, false);
}
// rear: in the corner, chamfered into the side and back walls; front: side wall only
module body_boss(p, rear) {
x0 = p[0] < inner_w / 2 ? 0 : inner_w - rear_boss;
xw = p[0] < inner_w / 2 ? 0 : inner_w - 0.01;
y0 = p[1] - rear_boss / 2;
difference() {
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]);
// locating rim inside the side and back walls (stops short of the bezel and bosses)
rim_y0 = 20;
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]);
difference() {
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])
cube([inner_w - 2 * (rear_boss + clr), 1.6, 2]);
// board standoffs
@@ -314,7 +330,7 @@ if (part == "assembly") {
} else if (part == "bezel") {
translate([0, 0, -lip]) multmatrix(M) bezel(); // front face on the bed
} 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();
} else if (part == "base") {
translate([0, 0, base_t]) base();