forked from nophead/NopSCADlib
-
Notifications
You must be signed in to change notification settings - Fork 0
/
scs_bearing_block.scad
157 lines (138 loc) · 6.46 KB
/
scs_bearing_block.scad
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
//
// NopSCADlib Copyright Chris Palmer 2020
// nop.head@gmail.com
// hydraraptor.blogspot.com
//
// This file is part of NopSCADlib.
//
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
// GNU General Public License as published by the Free Software Foundation, either version 3 of
// the License, or (at your option) any later version.
//
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along with NopSCADlib.
// If not, see <https://www.gnu.org/licenses/>.
//
//
//! SCSnUU and SCSnLUU bearing blocks
//
include <../utils/core/core.scad>
use <screw.scad>
use <nut.scad>
use <washer.scad>
use <linear_bearing.scad>
function scs_size(type) = [type[4],type[6],type[5]]; //! Size of scs bracket bounding block
function scs_hole_offset(type) = type[2]; //! Offset of bearing hole from base of block
function scs_block_center_height(type) = type[6]; //! Height of the center of the block
function scs_block_side_height(type) = type[7]; //! Height of the side of the block, this determines the minimum screw length
function scs_screw(type) = type[11]; //! Screw type
function scs_screw_separation_x(type) = type[8]; //! Screw separation in X direction
function scs_screw_separation_z(type) = type[9]; //! Screw separation in Z direction
function scs_bearing(type) = type[14]; //! Linear bearing used
sks_bearing_block_color = grey90;
module scs_bearing_block(type) { //! Draw the specified SCS bearing block
vitamin(str("scs_bearing_block(", type[0], "): ", type[0], " bearing block"));
T = type[1];
h = scs_hole_offset(type);
E = type[3];
W = scs_size(type)[0];
assert(W == 2 * E, str("W or E wrong for scs_bearing_block", type[0]));
L = scs_size(type)[2];
F = scs_block_center_height(type);
G = scs_block_side_height(type);
B = scs_screw_separation_x(type);
C = scs_screw_separation_z(type);
K = type[10];
S1 = scs_screw(type);
S2 = type[12];
L1 = type[13];
module right_trapezoid(base, top, height, h = 0, center = true) {//! A right angled trapezoid with the 90° corner at the origin. 3D when ```h``` is nonzero, otherwise 2D
extrude_if(h, center = center)
polygon(points = [ [0,0], [base, 0], [top, height], [0, height] ]);
}
boltHoleRadius = screw_clearance_radius(S1);
footHeight = min(0.75, (G - bearing_dia(scs_bearing(type)) - 1.5) / 2); // estimate, not specified on drawings
color(sks_bearing_block_color) {
linear_extrude(L, center = true) {
bearingRadius = bearing_dia(scs_bearing(type)) / 2;
// center section with bearing hole
difference() {
union() {
translate([-(B - 2 * boltHoleRadius) / 2, -h + footHeight])
square([B - 2 * boltHoleRadius, G - footHeight]);
for(m = [0, 1])
mirror([m, 0, 0])
translate([0 , G - h])
right_trapezoid(bearingRadius, bearingRadius -F + G, F - G);
}
circle(r = bearingRadius);
}
// add the sides
for(m = [0, 1])
mirror([m, 0, 0]) {
trapezoidX = boltHoleRadius - 0.5; // estimate, not specified on drawings
sideX = 2 * (K - boltHoleRadius - trapezoidX);
chamfer = 0.5;
assert(sideX > chamfer, "trapezoidX too large in scs_bearing_block");
translate([B / 2 + boltHoleRadius, -h]) {
square([sideX - chamfer, G]);
translate([sideX, 0])
rotate(90)
right_trapezoid(G - chamfer, G, chamfer);
translate([sideX, 0]) {
right_trapezoid(trapezoidX - footHeight, trapezoidX, footHeight);
translate([trapezoidX, footHeight])
rotate(90)
right_trapezoid(T - footHeight, L1 - footHeight, trapezoidX);
}
}
translate([B / 2 - boltHoleRadius, -h])
mirror([1, 0, 0])
right_trapezoid(boltHoleRadius, boltHoleRadius + footHeight, footHeight);
}
}
// side blocks with bolt holes
for(x = [-B / 2, B / 2])
translate([x, G / 2 - h, 0])
rotate([90, 0, 0])
linear_extrude(G, center = true)
difference() {
square([boltHoleRadius * 2, L], center = true);
for (y = [-C / 2, C / 2])
translate([0, y])
circle(r = boltHoleRadius);
}
}
not_on_bom() no_explode()
linear_bearing(scs_bearing(type));
}
module scs_bearing_block_hole_positions(type) { //! Place children at hole positions
screw_separation_x = scs_screw_separation_x(type);
screw_separation_z = scs_screw_separation_z(type);
G = scs_block_side_height(type);
h = scs_hole_offset(type);
for(x = [-screw_separation_x, screw_separation_x], z = [-screw_separation_z, screw_separation_z])
translate([x / 2, G - h, z / 2])
rotate([-90, 0, 0])
children();
}
module scs_bearing_block_assembly(type, part_thickness, screw_type, nut_type) { //! Assembly with screws and nuts in place
scs_bearing_block(type);
screw_type = is_undef(screw_type) ? scs_screw(type) : screw_type;
nut_type = is_undef(nut_type) ? screw_nut(screw_type) : nut_type;
washer_type = nut_washer(nut_type);
washer_thickness = washer_type ? washer_thickness(washer_type) : 0;
G = scs_block_side_height(type);
nut_offset = G + part_thickness + nut_thickness(nut_type) + washer_thickness;
screw_length = screw_longer_than(nut_offset);
scs_bearing_block_hole_positions(type) {
screw(screw_type, screw_length);
translate_z(-nut_offset)
nut(nut_type)
if (washer_type)
washer(washer_type);
}
}