1//////////////////////////////////////////////////////////////////////
2// LibFile: ball_bearings.scad
3// Models for standard ball bearing cartridges.
4// Includes:
5// include <BOSL2/std.scad>
6// include <BOSL2/ball_bearings.scad>
7// FileGroup: Parts
8// FileSummary: Models for standard ball bearing cartridges.
9//////////////////////////////////////////////////////////////////////
10
11
12
13// Section: Ball Bearing Models
14
15// Module: ball_bearing()
16// Description:
17// Creates a model of a ball bearing assembly.
18// Arguments:
19// trade_size = String name of a standard ball bearing trade size. ie: "608", "6902ZZ", or "R8"
20// id = Inner diameter of ball bearing assembly.
21// od = Outer diameter of ball bearing assembly.
22// width = Width of ball bearing assembly.
23// anchor = Translate so anchor point is at origin (0,0,0). See [anchor](attachments.scad#subsection-anchor). Default: `CENTER`
24// spin = Rotate this many degrees around the Z axis after anchor. See [spin](attachments.scad#subsection-spin). Default: `0`
25// orient = Vector to rotate top towards, after spin. See [orient](attachments.scad#subsection-orient). Default: `UP`
26// Example:
27// ball_bearing("608");
28// Example:
29// ball_bearing("608ZZ");
30// Example:
31// ball_bearing("R8");
32// Example:
33// ball_bearing(id=12,od=32,width=10,shield=false);
34module ball_bearing(trade_size, id, od, width, shield=true, anchor=CTR, spin=0, orient=UP) {
35 info = is_undef(trade_size)? [id, od, width, shield] :
36 ball_bearing_info(trade_size);
37 check = assert(all_defined(info), "Bad Input");
38 id = info[0];
39 od = info[1];
40 width = info[2];
41 shield = info[3];
42 mid_d = (id+od)/2;
43 wall = (od-id)/2/3;
44 color("silver")
45 attachable(anchor,spin,orient, d=od, l=width) {
46 if (shield) {
47 tube(id=id, wall=wall, h=width);
48 tube(od=od, wall=wall, h=width);
49 tube(id=id+0.1, od=od-0.1, h=(wall*2+width)/2);
50 } else {
51 ball_cnt = floor(PI*mid_d*0.95 / (wall*2));
52 difference() {
53 union() {
54 tube(id=id, wall=wall, h=width);
55 tube(od=od, wall=wall, h=width);
56 }
57 torus(r_maj=mid_d/2, r_min=wall);
58 }
59 for (i=[0:1:ball_cnt-1]) {
60 zrot(i*360/ball_cnt) right(mid_d/2) sphere(d=wall*2);
61 }
62 }
63 children();
64 }
65}
66
67
68
69// Section: Ball Bearing Info
70
71
72// Function: ball_bearing_info()
73// Description:
74// Get dimensional info for a standard metric ball bearing cartridge.
75// Returns `[SHAFT_DIAM, OUTER_DIAM, WIDTH, SHIELDED]` for the cylindrical cartridge.
76// Arguments:
77// size = Inner diameter of lmXuu bearing, in mm.
78function ball_bearing_info(trade_size) =
79 assert(is_string(trade_size))
80 let(
81 IN = 25.4,
82 data = [
83 // trade_size, ID, OD, width, shielded
84 [ "R2", 1/8*IN, 3/8*IN, 5/32*IN, false],
85 [ "R3", 3/16*IN, 1/2*IN, 5/32*IN, false],
86 [ "R4", 1/4*IN, 5/8*IN, 0.196*IN, false],
87 [ "R6", 3/8*IN, 7/8*IN, 7/32*IN, false],
88 [ "R8", 1/2*IN, 9/8*IN, 1/4*IN, false],
89 [ "R10", 5/8*IN, 11/8*IN, 9/32*IN, false],
90 [ "R12", 3/4*IN, 13/8*IN, 5/16*IN, false],
91 [ "R14", 7/8*IN, 15/8*IN, 3/8*IN, false],
92 [ "R16", 8/8*IN, 16/8*IN, 3/8*IN, false],
93 [ "R18", 9/8*IN, 17/8*IN, 3/8*IN, false],
94 [ "R20", 10/8*IN, 18/8*IN, 3/8*IN, false],
95 [ "R22", 11/8*IN, 20/8*IN, 7/16*IN, false],
96 [ "R24", 12/8*IN, 21/8*IN, 7/16*IN, false],
97
98 [ "R2ZZ", 1/8*IN, 3/8*IN, 5/32*IN, true ],
99 [ "R3ZZ", 3/16*IN, 1/2*IN, 5/32*IN, true ],
100 [ "R4ZZ", 1/4*IN, 5/8*IN, 0.196*IN, true ],
101 [ "R6ZZ", 3/8*IN, 7/8*IN, 7/32*IN, true ],
102 [ "R8ZZ", 1/2*IN, 9/8*IN, 1/4*IN, true ],
103 [ "R10ZZ", 5/8*IN, 11/8*IN, 9/32*IN, true ],
104 [ "R12ZZ", 3/4*IN, 13/8*IN, 5/16*IN, true ],
105 [ "R14ZZ", 7/8*IN, 15/8*IN, 3/8*IN, true ],
106 [ "R16ZZ", 8/8*IN, 16/8*IN, 3/8*IN, true ],
107 [ "R18ZZ", 9/8*IN, 17/8*IN, 3/8*IN, true ],
108 [ "R20ZZ", 10/8*IN, 18/8*IN, 3/8*IN, true ],
109 [ "R22ZZ", 11/8*IN, 20/8*IN, 7/16*IN, true ],
110 [ "R24ZZ", 12/8*IN, 21/8*IN, 7/16*IN, true ],
111
112 [ "608", 8, 22, 7, false],
113 [ "629", 9, 26, 8, false],
114 [ "635", 5, 19, 6, false],
115 [ "6000", 10, 26, 8, false],
116 [ "6001", 12, 28, 8, false],
117 [ "6002", 15, 32, 9, false],
118 [ "6003", 17, 35, 10, false],
119 [ "6007", 35, 62, 14, false],
120 [ "6200", 10, 30, 9, false],
121 [ "6201", 12, 32, 10, false],
122 [ "6202", 15, 35, 11, false],
123 [ "6203", 17, 40, 12, false],
124 [ "6204", 20, 47, 14, false],
125 [ "6205", 25, 52, 15, false],
126 [ "6206", 30, 62, 16, false],
127 [ "6207", 35, 72, 17, false],
128 [ "6208", 40, 80, 18, false],
129 [ "6209", 45, 85, 19, false],
130 [ "6210", 50, 90, 20, false],
131 [ "6211", 55, 100, 21, false],
132 [ "6212", 60, 110, 22, false],
133 [ "6301", 12, 37, 12, false],
134 [ "6302", 15, 42, 13, false],
135 [ "6303", 17, 47, 14, false],
136 [ "6304", 20, 52, 15, false],
137 [ "6305", 25, 62, 17, false],
138 [ "6306", 30, 72, 19, false],
139 [ "6307", 35, 80, 21, false],
140 [ "6308", 40, 90, 23, false],
141 [ "6309", 45, 100, 25, false],
142 [ "6310", 50, 110, 27, false],
143 [ "6311", 55, 120, 29, false],
144 [ "6312", 60, 130, 31, false],
145 [ "6403", 17, 62, 17, false],
146 [ "6800", 10, 19, 5, false],
147 [ "6801", 12, 21, 5, false],
148 [ "6802", 15, 24, 5, false],
149 [ "6803", 17, 26, 5, false],
150 [ "6804", 20, 32, 7, false],
151 [ "6805", 25, 37, 7, false],
152 [ "6806", 30, 42, 7, false],
153 [ "6900", 10, 22, 6, false],
154 [ "6901", 12, 24, 6, false],
155 [ "6902", 15, 28, 7, false],
156 [ "6903", 17, 30, 7, false],
157 [ "6904", 20, 37, 9, false],
158 [ "6905", 25, 42, 9, false],
159 [ "6906", 30, 47, 9, false],
160 [ "6907", 35, 55, 10, false],
161 [ "6908", 40, 62, 12, false],
162 [ "16002", 15, 22, 8, false],
163 [ "16004", 20, 42, 8, false],
164 [ "16005", 25, 47, 8, false],
165 [ "16100", 10, 28, 8, false],
166 [ "16101", 12, 30, 8, false],
167
168 [ "608ZZ", 8, 22, 7, true ],
169 [ "629ZZ", 9, 26, 8, true ],
170 [ "635ZZ", 5, 19, 6, true ],
171 [ "6000ZZ", 10, 26, 8, true ],
172 [ "6001ZZ", 12, 28, 8, true ],
173 [ "6002ZZ", 15, 32, 9, true ],
174 [ "6003ZZ", 17, 35, 10, true ],
175 [ "6007ZZ", 35, 62, 14, true ],
176 [ "6200ZZ", 10, 30, 9, true ],
177 [ "6201ZZ", 12, 32, 10, true ],
178 [ "6202ZZ", 15, 35, 11, true ],
179 [ "6203ZZ", 17, 40, 12, true ],
180 [ "6204ZZ", 20, 47, 14, true ],
181 [ "6205ZZ", 25, 52, 15, true ],
182 [ "6206ZZ", 30, 62, 16, true ],
183 [ "6207ZZ", 35, 72, 17, true ],
184 [ "6208ZZ", 40, 80, 18, true ],
185 [ "6209ZZ", 45, 85, 19, true ],
186 [ "6210ZZ", 50, 90, 20, true ],
187 [ "6211ZZ", 55, 100, 21, true ],
188 [ "6212ZZ", 60, 110, 22, true ],
189 [ "6301ZZ", 12, 37, 12, true ],
190 [ "6302ZZ", 15, 42, 13, true ],
191 [ "6303ZZ", 17, 47, 14, true ],
192 [ "6304ZZ", 20, 52, 15, true ],
193 [ "6305ZZ", 25, 62, 17, true ],
194 [ "6306ZZ", 30, 72, 19, true ],
195 [ "6307ZZ", 35, 80, 21, true ],
196 [ "6308ZZ", 40, 90, 23, true ],
197 [ "6309ZZ", 45, 100, 25, true ],
198 [ "6310ZZ", 50, 110, 27, true ],
199 [ "6311ZZ", 55, 120, 29, true ],
200 [ "6312ZZ", 60, 130, 31, true ],
201 [ "6403ZZ", 17, 62, 17, true ],
202 [ "6800ZZ", 10, 19, 5, true ],
203 [ "6801ZZ", 12, 21, 5, true ],
204 [ "6802ZZ", 15, 24, 5, true ],
205 [ "6803ZZ", 17, 26, 5, true ],
206 [ "6804ZZ", 20, 32, 7, true ],
207 [ "6805ZZ", 25, 37, 7, true ],
208 [ "6806ZZ", 30, 42, 7, true ],
209 [ "6900ZZ", 10, 22, 6, true ],
210 [ "6901ZZ", 12, 24, 6, true ],
211 [ "6902ZZ", 15, 28, 7, true ],
212 [ "6903ZZ", 17, 30, 7, true ],
213 [ "6904ZZ", 20, 37, 9, true ],
214 [ "6905ZZ", 25, 42, 9, true ],
215 [ "6906ZZ", 30, 47, 9, true ],
216 [ "6907ZZ", 35, 55, 10, true ],
217 [ "6908ZZ", 40, 62, 12, true ],
218 [ "16002ZZ", 15, 22, 8, true ],
219 [ "16004ZZ", 20, 42, 8, true ],
220 [ "16005ZZ", 25, 47, 8, true ],
221 [ "16100ZZ", 10, 28, 8, true ],
222 [ "16101ZZ", 12, 30, 8, true ],
223 ],
224 found = search([trade_size], data, 1)[0]
225 )
226 assert(found!=[], str("Unsupported ball bearing trade size: ", trade_size))
227 select(data[found], 1, -1);
228
229
230
231// vim: expandtab tabstop=4 shiftwidth=4 softtabstop=4 nowrap