]> www.fi.muni.cz Git - bike-lights.git/blob - parts/rearlight.scad
2fd1868d71226ec432fa8bf2ea1fa1a0062afce8
[bike-lights.git] / parts / rearlight.scad
1 // Holder for Fraen FHS-HEB1-LB01-x lens for Luxeon LEDs.
2 // I use it for my rear lights.
3
4 epsilon = 0.01;
5 infty = 100;
6 debug = 0;
7
8 heatsink_thickness = 2.5;
9 heatsink_width = 18-3.4;
10 heatsink_length = 58;
11
12 module bolt_mount(d, h, w1, w2, fn) {
13         difference() {
14                 translate([0, 0, -epsilon])
15                         cylinder(r1=w2/2, r2=w1/2, h=h+epsilon);
16                 translate([0, 0, -2*epsilon])
17                 cylinder(r=d/2, h=h+3*epsilon, $fn=fn);
18         };
19 };
20
21 clip_h1 = 25; // inner height
22 clip_h2 = 18; // inner height
23 clip_l  = 35;
24 clip_wall = 2;
25 clip_space = 4;
26 clip_bolt1_x = 10;
27 clip_bolt2_x = 25;
28
29 module clip_top_circle() {
30         rotate([-90, 0, 0])
31         difference() {
32                 translate([-clip_space/2, 0, 0])
33                         cylinder(r=clip_wall, h = epsilon, $fn=32);
34                 translate([-infty/2, clip_wall/2-epsilon, -epsilon])
35                         cube(infty);
36                 translate([clip_wall+epsilon, -infty/2, -epsilon])
37                         cube(infty);
38         };
39 };
40
41 module seat_clip() {
42         difference() {
43                 polyhedron(points = [
44                         [-clip_wall-clip_space/2, 0, clip_h1/2+clip_wall],
45                         [-clip_wall-clip_space/2, clip_l, clip_h2/2+clip_wall],
46                         [-clip_wall-clip_space/2, clip_l, -clip_h2/2],
47                         [-clip_wall-clip_space/2, 0, -clip_h1/2],
48                         [ clip_wall+clip_space/2,  0, clip_h1/2+clip_wall],
49                         [ clip_wall+clip_space/2, clip_l, clip_h2/2+clip_wall],
50                         [ clip_wall+clip_space/2, clip_l, -clip_h2/2],
51                         [ clip_wall+clip_space/2, 0, -clip_h1/2],
52                 ], triangles = [
53                         [0, 2, 1], [3, 2, 0], [4, 5, 6], [6, 7, 4],
54                         [0, 1, 5], [5, 4, 0], [2, 3, 7], [7, 6, 2],
55                         [1, 2, 6], [6, 5, 1], [0, 7, 3], [7, 0, 4],
56                 ]);
57                 polyhedron(points = [
58                         [-clip_space/2, -epsilon, clip_h1/2],
59                         [-clip_space/2, clip_l+epsilon, clip_h2/2],
60                         [-clip_space/2, clip_l+epsilon, -clip_h2/2-epsilon],
61                         [-clip_space/2, -epsilon, -clip_h1/2-epsilon],
62                         [ clip_space/2, -epsilon, clip_h1/2],
63                         [ clip_space/2, clip_l+epsilon, clip_h2/2],
64                         [ clip_space/2, clip_l+epsilon, -clip_h2/2-epsilon],
65                         [ clip_space/2, -epsilon, -clip_h1/2-epsilon],
66                 ], triangles = [
67                         [0, 2, 1], [3, 2, 0], [4, 5, 6], [6, 7, 4],
68                         [0, 1, 5], [5, 4, 0], [2, 3, 7], [7, 6, 2],
69                         [1, 2, 6], [6, 5, 1], [0, 7, 3], [7, 0, 4],
70                 ]);
71                 // bolt holes
72                 translate([0, clip_bolt1_x, 0])
73                         rotate([0, 90, 0])
74                         translate([0, 0, -clip_wall-clip_space/2-epsilon])
75                         cylinder(r=2, h=2*clip_wall+clip_space+2*epsilon,
76                                 $fn = 6);
77                 translate([0, clip_bolt2_x, 0])
78                         rotate([0, 90, 0])
79                         translate([0, 0, -clip_wall-clip_space/2-epsilon])
80                         cylinder(r=2, h=2*clip_wall+clip_space+2*epsilon,
81                                 $fn=6);
82         };
83
84         translate([-clip_space, clip_bolt1_x, 0])
85         rotate([0, -90, 0])
86         bolt_mount(6, 3, 7, 14, 6);
87
88         translate([-clip_space, clip_bolt2_x, 0])
89         rotate([0, -90, 0])
90         bolt_mount(6, 3, 7, 14, 6);
91
92         translate([clip_space, clip_bolt1_x, 0])
93         rotate([0, 90, 0])
94         bolt_mount(6, 3, 7, 14, 128);
95
96         translate([clip_space, clip_bolt2_x, 0])
97         rotate([0, 90, 0])
98         bolt_mount(6, 3, 7, 14, 128);
99 };
100
101 /*
102 seat_clip();
103
104 difference() {
105         union() {
106                 hull() {
107                         translate([40, epsilon, 2])
108                                 clip_top();
109                         clip_top();
110                 };
111
112                 translate([40, 0, 25])
113                         rotate([-90, 0, 0])
114                                 cylinder(r=34/2, h=clip_l);
115
116                 hull() {
117                         translate([clip_space/2+epsilon, 0, 0])
118                                 cube([clip_wall-epsilon, clip_wall, clip_h1/2+2*clip_wall-epsilon]);
119                         translate([40, 0, 14+epsilon])
120                                 cube([clip_wall-epsilon, clip_wall, 34/2]);
121                 };
122         };
123         translate([40, 6, 25])
124                 rotate([-90, 0, 0]) {
125                         cylinder(r=31/2, h=clip_l);
126                         fraen_lens();
127                         heatsink();
128                 };
129 };
130 */
131
132 wall_thickness = 1.5;
133 fraen_diam = 30.75;
134 fraen_h = 29.8;
135 pin_diam = 4;
136 pin_offset = 10.35*1.4142;
137 pin_len = 9.2;
138 front_add = 4;
139
140 side_barrier_x_offset = 13;
141 side_barrier_pin_z_offset = 4.2;
142 side_barrier_thickness = 2;
143
144 module round_part() {
145         difference() {
146                 cylinder(r = fraen_diam/2 + pin_diam/2 + wall_thickness,
147                         h = front_add + pin_len);
148
149                 hull() {
150                         translate([0, 0, -epsilon])
151                                 cylinder(r = fraen_diam/2,
152                                         h = pin_len + front_add + 2*epsilon);
153                         for (angle = [0, 90, 180, 270]) {
154                                 rotate([0, 0, angle+45])
155                                         translate([pin_offset, 0, -epsilon])
156                                                 cylinder(r=pin_diam/2,
157                                                         h=epsilon, $fn=32);
158                         };
159                 }
160
161                 // front cone
162                 translate([0, 0, pin_len + 0.5*wall_thickness - epsilon])
163                         cylinder(r1 = fraen_diam/2,
164                                 r2 = (fraen_diam+pin_diam + wall_thickness)/2,
165                                 h = front_add + 2*epsilon);
166                 // pin holes
167                 for (angle = [0, 90, 180, 270]) {
168                         rotate([0, 0, angle+45])
169                                 translate([pin_offset, 0, epsilon])
170                                         cylinder(r=pin_diam/2,
171                                                 h=pin_len+epsilon, $fn=32);
172                 };
173         };
174
175         // side barriers
176         for (angle = [0, 90, 180]) // omit the bottom one
177                 rotate([0, 0, angle])
178                         intersection() {
179                                 cylinder(r=fraen_diam/2+epsilon, h=infty);
180                                 translate([-infty/2, side_barrier_x_offset,
181                                         wall_thickness + pin_len - side_barrier_pin_z_offset - side_barrier_thickness ])
182                                         cube([infty, infty, side_barrier_thickness]);
183                 };
184 };
185
186 module square_cone() {
187         difference() {
188                 hull() {
189                         translate([0, 0, fraen_h - pin_len])
190                                 cylinder(r = fraen_diam/2 + pin_diam/2 + wall_thickness,
191                                         h = epsilon);
192                         for (angle = [0, 90, 180, 270])
193                                 rotate([0, 0, angle])
194                                         translate([9.1, 9.1, 0])
195                                                 cylinder(r=wall_thickness+3.75/2, h = epsilon);
196                 }
197                 hull() {
198                         translate([0, 0, fraen_h - pin_len + epsilon])
199                                 cylinder(r = fraen_diam/2,
200                                         h = epsilon);
201                         for (angle = [0, 90, 180, 270]) {
202                                 rotate([0, 0, angle]) 
203                                         translate([9.1, 9.1, -epsilon])
204                                                 cylinder(r=3.75/2, h = epsilon);
205                                 rotate([0, 0, angle+45])
206                                         translate([pin_offset, 0, fraen_h - pin_len + epsilon])
207                                                 cylinder(r=pin_diam/2,
208                                                         h=epsilon, $fn=32);
209                         }
210                 }
211         }
212 }
213
214 rear_spring_w = 4;
215
216 module rear_spring() {
217         translate([0, 0, wall_thickness/2])
218                 cube([18+2*wall_thickness+3.5, rear_spring_w, wall_thickness], center=true);
219         difference() {
220                 rotate([90, 0, 0])
221                         translate([0, 0, -rear_spring_w/2])
222                         cylinder(r=6-heatsink_thickness, h = rear_spring_w);
223                 translate([0, 0, -infty/2+epsilon])
224                         cube(infty, center=true);
225         };
226 };
227
228 module heatsink_holder() {
229         for (angle = [0, 180]) {
230                 rotate([0, 0, angle])
231                         translate([9.1+wall_thickness, 0, 6/2])
232                         cube([3.5/2+wall_thickness, 2*9.1-3.5-0.5, 6], center=true);
233         }
234 }
235
236 module lens_holder() {
237         difference() {
238                 union() {
239                         translate([0, 0, fraen_h - pin_len])
240                                 round_part();
241                         square_cone();
242                 };
243                 
244                 // 0.5mm hole in the bottom
245                 // translate([side_barrier_x_offset-epsilon, -0.25, -epsilon])
246                 translate([0, -0.25, (fraen_h - pin_len)/2])
247                         cube([infty, 0.5, infty]);
248
249                 // cable hole, 2*3mm
250                 translate([9.1, 0, 6+3])
251                         rotate([0, 0, 60])
252                                 cube([infty, 2, 3]);
253
254                 // side LED hole, 3mm
255                 translate([0, 0, fraen_h - pin_len])
256                         rotate([90, 0, 0])
257                                 cylinder(r=3.5/2, h=infty, $fn=6);
258         };
259                 
260         rear_spring();
261         heatsink_holder();
262 };
263
264 difference() {
265         union() {
266         lens_holder($fn = 128);
267
268 translate([20, 40, 0])
269         rotate([90, 0, -90])
270                 seat_clip(, $fn=128);
271
272 hull() {
273         translate([0, 9.1+3.5/2+epsilon, wall_thickness/2])
274                 cube([9.1, epsilon, wall_thickness], center=true);
275         translate([20-clip_wall/2, 40-clip_space/2-clip_wall+epsilon, wall_thickness/2])
276                 cube([9.1, epsilon/2, wall_thickness], center=true);
277 };
278
279 hull() {
280         translate([0, 9.1+3.5/2+epsilon, wall_thickness/2])
281                 cube([2*.259+3.5, epsilon, wall_thickness], center=true);
282         translate([20-clip_wall/2, 40-clip_space/2-clip_wall+epsilon, wall_thickness/2])
283                 cube([clip_h1+clip_wall, epsilon/2, wall_thickness], center=true);
284 };
285
286 translate([7.5, 13.3, 0])
287         cube([wall_thickness, 23, fraen_h - pin_len - wall_thickness]);
288
289         }
290 /*
291         translate([-infty/2, -infty/2, 8])
292                 cube(infty);
293 */
294 };
295
296
297         // vnitrni prumer kruhu by mel byt 30.75mm
298         // vnejsi prumer aspon 35 mm
299         // pin od stredu 10.35mm na x a y
300         // prumer pinu 4 mm
301         // pin ma od cela do zabrany 4.2mm, celkove by mel mit 9.2mm
302
303         // piny by mely pokracovat jeste tak 4mm pod nulu,
304         // a pak uz muze jit konv.obal do ctverce
305         // vnitrni rozmery ctverce 21.5x21.5, zakulacene rohy prumer 3.5
306         // vrch chladice (s LEDkou) -18.5
307         // konec nozicek -24.5