Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions docs/Notes.md
Original file line number Diff line number Diff line change
Expand Up @@ -151,22 +151,22 @@ Performance
- simple models for preview, e.g. simplify the table based curves


README Notes
============
Videos
======

- extended for keyboard to -X, -Y, same angles and curves, except curves in keyboard area
- which keyboard to use, how to mount it
- which display to use, how to mount it
- how to adjust the model (dimensions, "custom", link to DEC diagrams)
https://www.youtube.com/watch?v=nb2bxaj79rc
https://www.youtube.com/watch?v=ksL232PHivI
https://www.youtube.com/watch?v=3gNN4nL5F-k


TODOs
=====

- rename outside to !mask in body models
- terminal top and bottom are an interference between the two body planes, you can see it if you color body_xy red
- screen bezel interferes with body vertical front, move screen bezel back by DELTA
- screen bezel and cassette mask interfere with keyboard surface, move screen bezel/cassette mask back by DELTA?
- move some of the _dimensions that are not shared between files into the .scad file that uses them
- comment out dimensions that are not yet used at all
- Section AK-AK Sheet 10: Display top has 5 stiffening ribs
- add stiffening ribs to other places as well
- rotate the model for easy viewing (needs also adjusting make preview)
2 changes: 1 addition & 1 deletion model/Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
TARGETS=shell.stl vt52.stl
TARGETS=cassette_cover.stl shell.stl vt52.stl
PREVIEWS=$(TARGETS:.stl=.png)

all: $(TARGETS)
Expand Down
7 changes: 3 additions & 4 deletions model/body.scad
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,9 @@ module body_yz_half(outside) {
body_yz_half_plane(outside, XZ_CURVE_Y000[3], YZ_CURVE_X150),
body_yz_half_plane(outside, XZ_CURVE_Y000[4], YZ_CURVE_X200),
body_yz_half_plane(outside, XZ_CURVE_Y000[5], YZ_CURVE_X250),
body_yz_half_plane(outside, XZ_CURVE_Y000[6], YZ_CURVE_X300),
body_yz_half_plane(outside, XZ_CURVE_Y000[7], YZ_CURVE_X350),
body_yz_half_plane(outside, XZ_CURVE_Y000[8], YZ_CURVE_X400),
// TODO decide depth of the model
// body_yz_half_plane(outside, XZ_CURVE_Y000[6], YZ_CURVE_X300),
// body_yz_half_plane(outside, XZ_CURVE_Y000[7], YZ_CURVE_X350),
// body_yz_half_plane(outside, XZ_CURVE_Y000[8], YZ_CURVE_X400),
];

// The keyboard area is extended into -X by extend_fwd_bot_x, so we need to space the keyboard area
Expand Down
16 changes: 8 additions & 8 deletions model/body_dimensions.scad
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ BODY_WALL = 4; // custom
// Calculate missing coordinates
kbd_fwd_x = adj_ang_to_opp(KBD_FWD_Y, KBD_FWD_A);

//echo("kbd_fwd_x", kbd_fwd_x);
//echo("KBD_FWD_Y", KBD_FWD_Y);
// echo("kbd_fwd_x", kbd_fwd_x); // 7.79423
// echo("KBD_FWD_Y", KBD_FWD_Y); // 13.5

/* Top back point of the keyboard
kbd_back_x and kbd_back_y are only defined by KBD_FWD_A and KBD_TOP_A
Expand All @@ -49,8 +49,8 @@ x = (kbd_fwd_x * tan(KBD_TOP_A) - KBD_FWD_Y - SCR_TOP_X * cotan(SCR_FWD_A) + SCR
kbd_back_x = (kbd_fwd_x * tan(KBD_TOP_A) - KBD_FWD_Y - SCR_TOP_X * cotan(SCR_FWD_A) + SCR_TOP_Y) / (tan(KBD_TOP_A) - cotan(SCR_FWD_A));
kbd_back_y = kbd_back_x * tan(KBD_TOP_A) - kbd_fwd_x * tan(KBD_TOP_A) + KBD_FWD_Y;

//echo("kbd_back_x", kbd_back_x);
//echo("kbd_back_y", kbd_back_y);
// echo("kbd_back_x", kbd_back_x); // 130.303
// echo("kbd_back_y", kbd_back_y); // 41.7833

// Extend the model to -Y and shorten the front edge to fit a larger keyboard; custom
EXTEND_Y = 6;
Expand All @@ -72,7 +72,7 @@ extend_fwd_bot_x = extend_fwd_top_x - kbd_fwd_x + ang_adj_to_opp(KBD_FWD_A, KBD_
YZ_TOP_CORNER_R = 20; // Sheet 6, Section AA-AA

// X values for which we have YZ_CURVE_X* tables
YZ_X = [0, 50, 100, 150, 200, 250, 300, 350, 400];
YZ_X = [0, 50, 100, 150, 200, 250/*, 300, 350, 400*/];

// Values from Sheet 29, Data List #1 for X values in YZ_X
XZ_CURVE_Y000 = [
Expand All @@ -82,9 +82,9 @@ XZ_CURVE_Y000 = [
262.07143, // X = 150
262.78571, // X = 200
263.26191, // X = 250
263.50000, // X = 300
263.50000, // X = 350
263.29190, // X = 400
// 263.50000, // X = 300
// 263.50000, // X = 350
// 263.29190, // X = 400
];

// Sheet 5
Expand Down
123 changes: 123 additions & 0 deletions model/cassette_cover.scad
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
// use
include <common.scad>
include <cassette_dimensions.scad>
include <BOSL2/std.scad>

// TODO locating features on cover
// TODO mounting tabs on cover

module cc_cover_handle() {
move([
-CC_VISIBLE_DEPTH + DELTA,
scr_fwd_height - CC_HANDLE_POS,
CC_HANDLE_MARGIN_Z
])
cuboid(
[CC_HANDLE_DEPTH, CC_HANDLE_HEIGHT, cc_mask_width - 2 * CC_HANDLE_MARGIN_Z],
rounding = CC_HANDLE_R,
edges = [LEFT + TOP, LEFT + BOTTOM],
anchor = RIGHT + BOTTOM + FRONT
);
}

//cc_cover_handle();

// Cover plane, same height as forward screen plane + margin except at the bottom
function cc_cover_plane(dist) =
// Generate plane for given distance from the screen plane
// Bottom corner rounding is applied later
let(
extra_bot = sign(dist) * ang_adj_to_opp(KBD_TOP_A + SCR_FWD_A, abs(dist)),

shape = [
[0 - CC_COVER_MARGIN, 0 - extra_bot], // bottom left
[0 - CC_COVER_MARGIN, scr_fwd_height + CC_COVER_MARGIN], // top left
[cc_mask_width + CC_COVER_MARGIN, scr_fwd_height + CC_COVER_MARGIN], // top right
[cc_mask_width + CC_COVER_MARGIN, 0 - extra_bot] // bottom right
],

radii = [0, CC_TL_R, CC_TR_R, 0]
)
round_corners(shape, radius = radii, $fn=fn_where_needed);

module cc_bottom_corner_mask() {
// Rounding for bottom corners
// Needs to be applied after skin(), because it causes different
// count of vertices between front and back side of the cover

// Bottom corner mask depth, needs to clear CC_B_R at an angle
mask_depth = CC_B_R * 2;

// Duplicate for the near corner
zflip_copy(z = cc_mask_width / 2)
// Top corner of the mask should be perpendicular to the cover, not to the keyboard surface
difference() {
// Rotate the mask to match cassette_mask angle, centered on the back face corner which is [0, 0, 0]
zrot(KBD_TOP_A + SCR_FWD_A)
yrot(-90) // orient relative to the model
rounding_edge_mask(
l = mask_depth,
r = CC_B_R,
excess = CC_COVER_MARGIN + DELTA
);

ymove(CC_B_R)
cuboid(
mask_depth,
anchor = FRONT
);
}
}

// cc_bottom_corner_mask();

module cc_cover_object() {
// Position the forward face
fwd_face = apply(
// Transformations are applied last to first
IDENT
* xmove(-CC_VISIBLE_DEPTH) // cover depth
* yrot(-90), // orient relative to the model
path3d(cc_cover_plane(CC_VISIBLE_DEPTH))
);
// stroke(fwd_face, closed=true);

// Position the back face
back_face = apply(
// Transformations are applied last to first
IDENT
* yrot(-90), // orient relative to the model
path3d(cc_cover_plane(0))
);
// stroke(back_face, closed=true);

// Cover without the bottom corners
faces = [fwd_face, back_face];
skin(faces, slices = 10);
}

module cc_cover() {
// Angle and move the cover together with the corner mask
move([kbd_back_x, kbd_back_y, CC_MASK_LEFT_Z]) // move to position relative to the model
zrot(-SCR_FWD_A) // angle relative to the model
difference() {
union() {
cc_cover_object();
cc_cover_handle();
}

cc_bottom_corner_mask();
}
}

// %polygon(cc_cover_plane(CC_VISIBLE_DEPTH));
// polygon(cc_cover_plane(0));

// use <body.scad>
// xrot(90) {
// %body(true);
// cc_cover();
// }

xrot(90)
cc_cover();
97 changes: 97 additions & 0 deletions model/cassette_dimensions.scad
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
// include
include <common.scad>
include <body_dimensions.scad>
include <screen_dimensions.scad>
include <BOSL2/std.scad>

// "Cassette cover", dark cover on the right side of the screen

// Notes:
//
// The bottom edge of the original cover probably rests on the keyboard plane, in the model
// we instead fully support it from the back on all sides, since it's easier.

// Cover height discussion:
//
// Bottom back edge of the cover is at Y = kbd_back_y = 41.78.
// Cover height is CC_HEIGHT = 230.5, angled at SCR_FWD_A = 12.
// Cover height in Y is CC_HEIGHT * cos(SCR_FWD_A) = 225,46.
// Top edge of the cover is then at Y = kbd_back_y + 225,46 = 267.24.
// Top edge of the screen is defined as SCR_FWD_TOP_Y = 264, which is 3.2 mm lower.
// The bottom edge of the cover is angled (Page 6, Item #2), that explains about 0.8 mm in Y direction.
// That makes the cover about 2.4 mm larger than the screen viewport,
// suggesting the margins (CC_COVER_MARGIN) are about 1.2 mm.
//
// The photos seem to show the cover slightly taller than the screen viewport.
// Even photos taken from above, where parallax is not an issue.
// The space at the bottom of the louvres (Section AF-AF) is 4 mm,
// and the cover looks like it hides about one quarter of that.
//
// Decision: Cover mask has the exact vertical location of the screen viewport.
// Cover itself is 1 mm larger than the mask in every direction except bottom (CC_COVER_MARGIN).
// Cover corners are same as screen corners, do NOT add 1 mm to their radius.
// Cover is supported by the mask on all sides, with four tabs holding it in.

// Cover bottom discussion:
//
// Based on YouTube videos, the cover very slightly overlaps the hole and it rises perhaps
// 1 mm over the screen surface. It is not completely embedded in the body.
// Based on the videos and on higher res pictures, there is something strange going on with
// borders of the body hole at the bottom, where it touches the kbd/scr fillet.
// There is a discontinuity.
//
// The rounded corners at the bottom are R5 and match the R5 hole in the body.
// The kbd/scr fillet is R14, which means the corners interfere with top of the fillet.
// This is solved by masking of the part of the fillet that interferes with the back side
// of the corners, which is the "something strange" in the pictures.
//
// Specifically, what interferes is the back side of the outside corners of the bottom notches.
// The fillet is already moving away from the screen plane here. Also, the outside corners are
// definitely 90 degrees to the rest of the cover in all directions.
//
// Decision:
// The notches at the bottom of the cover are creating an overlap over screen plane,
// 1 mm wide on all sides except bottom. Cover bottom sits on keyboard top plane.
// In order to solve the interference between R5 and R14 shapes, top of the R14 fillet
// will be masked off to be in screen plane, allowing space for outside bottom corners
// of the cover.

// Page 6, Sheet 1, Cassette Cover

// These are unused (see discussion above), instead we derive them from body dimensions
// CC_HEIGHT = 230.5;
// CC_WIDTH_Z = 166;

// Depth of the cover above screen plane
CC_VISIBLE_DEPTH = 1; // estimated

// Difference between cover size and mask size; custom
CC_COVER_MARGIN = 1;

// Handle

// Space left and right of the handle; estimated from photos
CC_HANDLE_MARGIN_Z = 1;

// Top of the cover to bottom of the handle
CC_HANDLE_POS = 205;

// Visible handle depth; partly from drawings and partly estimated
CC_HANDLE_DEPTH = 12; // custom; original is (20 - estimated 4)

CC_HANDLE_HEIGHT = 2; // estimated

// Handle corner rounding; custom
CC_HANDLE_R = 1;

// Page 13, Sheet 2, Shell VT50, View E-E

// Let's use the screen constants to make sure they are kept in sync
CC_TR_R = SCR_FWD_TL_R;
CC_TL_R = SCR_FWD_TR_R;
CC_B_R = SCR_FWD_BR_R;

// This does not match CC_WIDTH_Z, the difference is 6.5 mm, that's why we don't use CC_WIDTH_Z
CC_MASK_LEFT_Z = 63;
CC_MASK_RIGHT_Z = 222.5;
cc_mask_width = CC_MASK_RIGHT_Z - CC_MASK_LEFT_Z;
Loading