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
|
// sphere diameter
d = 30;
cutoff = 3;
c = 3;
base = 10;
screw_len = 0.8 * (d - 2*cutoff);
screw_dia = 25.4/4;
mount_screw_dia = 4;
mount_screw_head_dia = 10;
e = 0.01;
$fn = 500;
module screw() {
cylinder(r=screw_dia/2, h=screw_len);
}
module grip()
for (i = [0:19])
rotate(i*360/20)
translate([d/2-3, 0, -5/2])
cube([3,2,5]);
module ball()
difference() {
sphere(d/2);
translate([0, 0, d/2 - cutoff - screw_len + e]) screw();
for (i = [-1,1])
translate([0, 0, i * (d - cutoff)]) cube(d, center=true);
// horizontal grip
grip();
// vertical grip at the upper half sphere (but not at the top)
difference() {
rotate([90, -5, 0]) grip();
cylinder(r1=0, r2=sqrt(pow(d/2, 2) - pow(d/2-cutoff, 2)), h=d/2-cutoff);
translate([0, 0, -d+4]) cylinder(r=d/2, h=d);
}
}
module shell() {
difference() {
// sphere with cylinder to bottom
mirror([0, 0, 1])
assign(r2=d/2+c)
union() {
sphere(r=r2);
cylinder(r=r2, h=r2 + base);
}
// hollow out the sphere
sphere(d/2);
// add intro region
translate([0, 0, d])
cube([d-2*cutoff, d*2, 2*d], center=true);
// path for 1/4" screw; lets you rotate the sphere after
// pushing it in (and allows later removal of it)
hull() {
cylinder(r=screw_dia/2, h=d);
rotate([90, 0, 90])
cylinder(r=screw_dia/2, h=d);
}
// mounting screw hole
assign(rs=mount_screw_dia)
assign(rh=mount_screw_head_dia)
union() {
cylinder(r=rs/2, h=3*(d+base), center=true);
translate([0, 0, -d/2-rh]) cylinder(r1=0, r2=rh/2, h=rh);
translate([0, 0, -d/2 ]) cylinder(r=rh/2, h=d);
}
}
}
union() {
shell();
translate([0,0,20]) rotate([90, 0, 90]) ball();
}
|