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
|
beam_inter_distance=1500;
board_height=18;
beam_intra_distance=200;
beam_height=2500;
beam_radius=47.5/2;
beam_top_r1=35/2;
beam_top_r2=29/2; beam_top_h2=15; // TODO: measure h2/h3, values are guessed
beam_top_r3=26/2; beam_top_h3=20;
beam_top_h4=5;
module triangulate(d) {
children();
translate([d, 0, 0])
rotate(120)
children();
rotate(60)
translate([d, 0, 0])
rotate(180)
children();
}
module beam(include_struts=false) {
triangulate(beam_intra_distance)
union() {
cylinder(r=beam_radius, h=beam_height);
translate([0, 0, beam_height]) {
cylinder(r1=beam_top_r1, r2=beam_top_r2, h=beam_top_h2);
translate([0, 0, beam_top_h2])
cylinder(r1=beam_top_r2, r2=beam_top_r2, h=beam_top_h3);
translate([0, 0, beam_top_h2 + beam_top_h3])
cylinder(r1=beam_top_r2, r2=beam_top_r3, h=beam_top_h4);
}
if (include_struts)
for (i = [0:(2 * beam_intra_distance):(beam_height - 2*beam_intra_distance)])
translate([0, 0, i]) {
rotate([45, 0, 90])
cylinder(r=beam_radius/3, h=beam_intra_distance * sqrt(2));
translate([0, 0, 2*beam_intra_distance])
rotate([135, 0, 90])
cylinder(r=beam_radius/3, h=beam_intra_distance * sqrt(2));
}
}
}
module board() {
hull()
for (i = [0,1])
translate([i * (beam_inter_distance - 2 * beam_intra_distance), 0, 0])
rotate(i*120)
triangulate(beam_intra_distance)
cylinder(r=2*beam_radius, h=board_height);
}
module board_bottom() {
color("lime")
render()
difference() {
board();
translate([0, 0, -beam_height +board_height]) beam(false);
}
}
module board_top() {
color("green")
render()
difference() {
board();
translate([beam_inter_distance - 3 * beam_intra_distance, 0, -beam_height]) beam(false);
}
}
module printer() {
triangulate(beam_inter_distance) {
beam(include_struts=true);
translate([0, 0, beam_height - board_height])
board_bottom();
translate([2 * beam_intra_distance, 0, beam_height])
board_top();
}
}
printer();
|