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