diff --git a/case/README.md b/case/README.md index aa2f61f..a7e2353 100644 --- a/case/README.md +++ b/case/README.md @@ -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/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/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 works if the case stays out of the sun. ## 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 looser): - 4 in the bezel's display bosses - 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 × M3×6 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 (also with the TPU feet) +- 6 × M3×8 to hold the base on, from below (also with the TPU feet) ## Assembly diff --git a/case/stl/base.stl b/case/stl/base.stl index 3aafab0..0ad08f6 100644 Binary files a/case/stl/base.stl and b/case/stl/base.stl differ diff --git a/case/stl/body.stl b/case/stl/body.stl index dbb53db..065b14b 100644 Binary files a/case/stl/body.stl and b/case/stl/body.stl differ diff --git a/case/stl/feet.stl b/case/stl/feet.stl index 8cba180..374fc64 100644 Binary files a/case/stl/feet.stl and b/case/stl/feet.stl differ diff --git a/case/vfd-case.scad b/case/vfd-case.scad index 6e383ea..edc2b28 100644 --- a/case/vfd-case.scad +++ b/case/vfd-case.scad @@ -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();