]> www.fi.muni.cz Git - bike-lights.git/blob - parts/rearlight.scad
mudflap for dual rearlights
[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 wall_thickness = 1.5;
9 fraen_diam = 30.90;
10 fraen_h = 29.3;
11 pin_diam = 4;
12 pin_offset = 10.35*1.4142;
13 pin_len = 9.2;
14 front_add = 4;
15
16 rear_pin_dist = 9.1;
17 rear_pin_diam = 3.25;
18
19 side_barrier_x_offset = 13;
20 side_barrier_pin_z_offset = 4.2;
21 side_barrier_thickness = 2;
22
23 heatsink_thickness = 2;
24
25 clip_h1 = 27; // front height (on the heatsink side)
26 clip_h2 = 20; // rear height (on the lens side)
27 clip_l  = 28;
28 clip_wall = wall_thickness;
29 clip_space = 3.5;
30 clip_bolt1_z = 6;
31 clip_bolt1_x = 19.5;
32 clip_bolt2_z = 22;
33 clip_bolt2_x = 21;
34 clip_angle = 18;
35 clip_top_xoff = clip_l*tan(clip_angle);
36
37 clip_y_off = 34;
38 clip_x_off = 2;
39 clip_x_rot = -3;
40
41 // z-axis is up
42 module bolt_mount(d, h, w1, w2, fn) {
43         difference() {
44                 translate([0, 0, -epsilon])
45                         cylinder(r1=w2/2, r2=w1/2, h=h+epsilon);
46                 translate([0, 0, -2*epsilon])
47                 cylinder(r=d/2, h=h+3*epsilon, $fn=fn);
48         };
49 };
50
51 module seat_clip() {
52         difference() {
53                 union() {
54                         // right part
55                         hull() {
56                                 translate([0, clip_space/2, 0])
57                                         cube([clip_h1, clip_wall, epsilon]);
58                                 translate([clip_top_xoff, clip_space/2, clip_l])
59                                         cube([clip_h2, clip_wall, epsilon]);
60                         };
61
62                         // left part
63                         hull() {
64                                 translate([0, -clip_space/2-clip_wall, 0])
65                                         cube([clip_h1, clip_wall, epsilon]);
66                                 translate([0+clip_top_xoff, -clip_space/2-clip_wall, clip_l])
67                                         cube([clip_h2, clip_wall, epsilon]);
68                         };
69
70                         // top part
71                         hull() {
72                                 translate([-2*clip_wall, -clip_space/2-clip_wall, 0])
73                                         cube([2*clip_wall+epsilon, 2*clip_wall+clip_space, epsilon]);
74                                 translate([-clip_wall+clip_top_xoff, -clip_space/2-clip_wall, clip_l])
75                                         cube([clip_wall+epsilon, 2*clip_wall+clip_space, epsilon]);
76                         };
77
78                         // bolt mounts
79                         translate([clip_bolt1_x, clip_space/2 + clip_wall, clip_bolt1_z])
80                         rotate([-90, 0, 0])
81                         bolt_mount(6.5, 2, 7, 12, 6);
82
83                         translate([clip_bolt1_x, -clip_space/2 - clip_wall, clip_bolt1_z])
84                         rotate([90, 0, 0])
85                         bolt_mount(6.5, 2, 7, 12, 32);
86
87                         translate([clip_bolt2_x, clip_space/2 + clip_wall, clip_bolt2_z])
88                         rotate([-90, 0, 0])
89                         bolt_mount(6.5, 2, 7, 12, 6);
90
91                         translate([clip_bolt2_x, -clip_space/2 - clip_wall, clip_bolt2_z])
92                         rotate([90, 0, 0])
93                         bolt_mount(6.5, 2, 7, 12, 32);
94                 };
95                 // bolt holes
96                 translate([clip_bolt1_x, infty/2, clip_bolt1_z])
97                         rotate([90, 0, 0])
98                         cylinder(r=2, h=infty, $fn = 6);
99                 translate([clip_bolt2_x, infty/2, clip_bolt2_z])
100                         rotate([90, 0, 0])
101                         cylinder(r=2, h=infty, $fn = 6);
102         }
103
104 }
105
106 // upper part of the lens holder
107 module round_part() {
108         difference() {
109                 cylinder(r = fraen_diam/2 + pin_diam/2 + wall_thickness,
110                         h = front_add + pin_len);
111
112                 hull() {
113                         translate([0, 0, -epsilon])
114                                 cylinder(r = fraen_diam/2,
115                                         h = pin_len + front_add + 2*epsilon);
116                         for (angle = [0, 90, 180, 270]) {
117                                 rotate([0, 0, angle+45])
118                                         translate([pin_offset, 0, -epsilon])
119                                                 cylinder(r=pin_diam/2,
120                                                         h=epsilon);
121                         };
122                 }
123
124                 // front cone
125                 translate([0, 0, pin_len + 0.5*wall_thickness - epsilon])
126                         cylinder(r1 = fraen_diam/2,
127                                 r2 = (fraen_diam+pin_diam + wall_thickness)/2,
128                                 h = front_add - 0.5*wall_thickness+ 2*epsilon);
129                 // pin holes
130                 for (angle = [0, 90, 180, 270]) {
131                         rotate([0, 0, angle+45])
132                                 translate([pin_offset, 0, epsilon])
133                                         cylinder(r=pin_diam/2,
134                                                 h=pin_len+epsilon);
135                 };
136         };
137
138         // side barriers
139         for (angle = [0, 90, 180]) // omit the bottom one
140                 rotate([0, 0, angle])
141                         intersection() {
142                                 cylinder(r=fraen_diam/2+epsilon, h=infty);
143                                 translate([-infty/2, side_barrier_x_offset,
144                                         pin_len - side_barrier_pin_z_offset - side_barrier_thickness ])
145                                         cube([infty, infty, side_barrier_thickness]);
146                 };
147 };
148
149 module square_cone() {
150         difference() {
151                 hull() {
152                         translate([0, 0, fraen_h - pin_len])
153                                 cylinder(r = fraen_diam/2 + pin_diam/2 + wall_thickness,
154                                         h = epsilon);
155                         for (angle = [0, 90, 180, 270])
156                                 rotate([0, 0, angle])
157                                         translate([rear_pin_dist, rear_pin_dist, 0])
158                                                 cylinder(r=wall_thickness+3.75/2, h = epsilon);
159                 }
160                 hull() {
161                         translate([0, 0, fraen_h - pin_len + epsilon])
162                                 cylinder(r = fraen_diam/2,
163                                         h = epsilon);
164                         for (angle = [0, 90, 180, 270]) {
165                                 rotate([0, 0, angle]) 
166                                         translate([rear_pin_dist, rear_pin_dist, -epsilon])
167                                                 cylinder(r=3.75/2, h = epsilon);
168                                 rotate([0, 0, angle+45])
169                                         translate([pin_offset, 0, fraen_h - pin_len + epsilon])
170                                                 cylinder(r=pin_diam/2,
171                                                         h=epsilon);
172                         }
173                 }
174         }
175 }
176
177 rear_spring_w = 2*rear_pin_dist-rear_pin_diam-2;
178 rear_spring_h = 1.5;
179 rear_spring_center_w = 4;
180 led_zoff = 6;
181
182 module rear_spring() {
183         translate([0, 0, wall_thickness/2])
184                 cube([rear_spring_center_w, rear_spring_w, wall_thickness],
185                         center=true);
186         translate([0, rear_spring_w/2-wall_thickness/2,
187                 (led_zoff-heatsink_thickness)/2])
188                 cube([rear_spring_center_w,
189                         wall_thickness, led_zoff-heatsink_thickness],
190                         center=true);
191         translate([0, -rear_spring_w/2+wall_thickness/2,
192                 (led_zoff-heatsink_thickness)/2])
193                 cube([rear_spring_center_w,
194                         wall_thickness, led_zoff-heatsink_thickness],
195                         center=true);
196
197         for (angle=[0, 180]) {
198                 rotate([0, 0, angle])
199                 translate([5.5, 0, rear_spring_h/2])
200                         rotate([0, 0, 45]) {
201                                 cube([wall_thickness, 14, rear_spring_h],
202                                         center=true);
203                 }
204         }
205 }
206
207 module heatsink_holder() {
208         for (angle = [0, 180]) {
209                 rotate([0, 0, angle])
210                         translate([rear_pin_dist+wall_thickness, 0, (led_zoff+wall_thickness)/2])
211                         cube([rear_pin_diam/2+wall_thickness, 2*rear_pin_dist-rear_pin_diam-2, led_zoff+wall_thickness], center=true);
212         }
213 }
214
215 module lens_holder() {
216         difference() {
217                 union() {
218                         translate([0, 0, fraen_h - pin_len])
219                                 round_part();
220                         square_cone();
221                 };
222                 
223                 // 0.5mm hole in the bottom
224                 // translate([side_barrier_x_offset-epsilon, -0.25, -epsilon])
225                 translate([0, -0.25, (fraen_h - pin_len)/2])
226                         cube([infty, 0.5, infty]);
227
228                 // cable hole, 2*3mm
229                 translate([rear_pin_dist, 0, 6+3])
230                         rotate([0, 0, 60])
231                                 cube([infty, 2, 3]);
232
233                 // side LED hole, 3mm
234                 translate([0, 0, fraen_h - pin_len])
235                         rotate([90, 0, 0])
236                                 cylinder(r=rear_pin_diam/2, h=infty, $fn=6);
237         };
238                 
239         rear_spring();
240         heatsink_holder();
241 };
242
243 module full_joint() {
244         difference() {
245                 hull() {
246                                 intersection() {
247                                         rotate([-90, 0, 0])
248                                         scale([0.25, 1, 1])
249                                                 cylinder(r = fraen_h-pin_len, h = rear_pin_dist + wall_thickness+rear_pin_diam/2);
250                                         translate([-infty/2, rear_pin_dist + wall_thickness + rear_pin_diam/2 - epsilon, 0])
251                                                 cube(infty);
252                                 };
253                         translate([clip_x_off, clip_y_off, 0])
254                                 intersection() {
255                                         seat_clip_rotated();
256                                         translate([(fraen_h-pin_len)*tan(clip_angle)-clip_wall, -clip_space/2-0.1*clip_wall+epsilon, 0])
257                                                 rotate([90+clip_x_rot, 0, 0])
258                                                 scale([0.45, 1, 1])
259                                                         cylinder(r = fraen_h-pin_len, h = epsilon);
260                                 };
261                 };
262                 hull() {
263                         translate([0, 0, fraen_h - pin_len + epsilon])
264                                 cylinder(r = fraen_diam/2 + pin_diam/2 + wall_thickness/2,
265                                         h = epsilon);
266                         for (angle = [0, 90, 180, 270])
267                                 rotate([0, 0, angle])
268                                         translate([rear_pin_dist, rear_pin_dist, -epsilon])
269                                                 cylinder(r=wall_thickness/2+3.75/2, h = epsilon);
270                 };
271         }
272 };
273
274 module seat_clip_rotated() {
275         difference() {
276                 translate([clip_space/2+clip_wall, 0, 0])
277                 rotate([clip_x_rot, 0, 0])
278                 translate([-clip_space/2-clip_wall, 0, sin(clip_x_rot)*(clip_space/2+clip_wall+epsilon)])
279                         seat_clip();
280                 translate([-infty/2, -infty/2, -infty])
281                         cube(infty);
282         };
283 };
284                         
285 module main() {
286         lens_holder();
287         translate([clip_x_off, clip_y_off, 0])
288                 seat_clip_rotated();
289         // xy_joint();
290         // yz_joint();
291         full_joint();
292 };
293
294
295 // scale([1, -1, 1]) main($fn=128);
296 main($fn = 128);
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