summaryrefslogtreecommitdiff
path: root/gimbal.scad
blob: 4e1857a6210e0ec0d1500161842ed98a40976509 (plain)
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
// 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);
	}
    }
}

module shell_splitter()
    assign(w1 = d + 2*c + e)
    assign(w2 = mount_screw_head_dia + 2*c)
    assign(h  = base + c)
    translate([-w1/2, -w2/2, -h - d/2]) {
	cube([w1, w2, 2/3*h+e]);
	
	rotate([90, 0, 90])
	translate([w2/2, 2/3*h, 0])
	cylinder(h=w1, r=w2/2);
    }

module shell_upper()
    difference() {
	shell();
	translate([0, 0, -e]) shell_splitter();
    }

module shell_lower()
  intersection() {
	shell();
	shell_splitter();
    }

translate([0, 0, -3*base]) shell_lower();
shell_upper();
translate([0,0,20]) rotate([90, 0, 90]) ball();
contact: Jan Huwald // Impressum