]> www.fi.muni.cz Git - bike-lights.git/blob - parts/rearlight.scad
rearlight.scad: new holder, not yet connected to the main object
[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 = 2;
9 fraen_diam = 30.75;
10 fraen_h = 29.8;
11 pin_diam = 4;
12 pin_offset = 10.35*1.4142;
13 pin_len = 9.2;
14 front_add = 4;
15
16 side_barrier_x_offset = 13;
17 side_barrier_pin_z_offset = 4.2;
18 side_barrier_thickness = 2;
19
20 heatsink_thickness = 2.5;
21
22 clip_h1 = 27; // front height (on the heatsink side)
23 clip_h2 = 20; // rear height (on the lens side)
24 clip_l  = 28;
25 clip_wall = wall_thickness;
26 clip_space = 3.5;
27 clip_bolt1_z = 6;
28 clip_bolt1_x = 20;
29 clip_bolt2_z = 22;
30 clip_bolt2_x = 23;
31 clip_angle = 24;
32 clip_top_xoff = clip_l*tan(clip_angle);
33
34 clip_y_off = 37;
35 clip_x_off = 0;
36
37 // z-axis is up
38 module bolt_mount(d, h, w1, w2, fn) {
39         difference() {
40                 translate([0, 0, -epsilon])
41                         cylinder(r1=w2/2, r2=w1/2, h=h+epsilon);
42                 translate([0, 0, -2*epsilon])
43                 cylinder(r=d/2, h=h+3*epsilon, $fn=fn);
44         };
45 };
46
47 module seat_clip() {
48         difference() {
49                 union() {
50                         // right part
51                         hull() {
52                                 translate([0, clip_space/2, 0])
53                                         cube([clip_h1, clip_wall, epsilon]);
54                                 translate([clip_top_xoff, clip_space/2, clip_l])
55                                         cube([clip_h2, clip_wall, epsilon]);
56                         };
57
58                         // left part
59                         hull() {
60                                 translate([0, -clip_space/2-clip_wall, 0])
61                                         cube([clip_h1, clip_wall, epsilon]);
62                                 translate([0+clip_top_xoff, -clip_space/2-clip_wall, clip_l])
63                                         cube([clip_h2, clip_wall, epsilon]);
64                         };
65
66                         // top part
67                         hull() {
68                                 translate([-clip_wall, -clip_space/2-clip_wall, 0])
69                                         cube([clip_wall+epsilon, 2*clip_wall+clip_space, epsilon]);
70                                 translate([-clip_wall+clip_top_xoff, -clip_space/2-clip_wall, clip_l])
71                                         cube([clip_wall+epsilon, 2*clip_wall+clip_space, epsilon]);
72                         };
73
74                         // bolt mounts
75                         translate([clip_bolt1_x, clip_space/2 + clip_wall, clip_bolt1_z])
76                         rotate([-90, 0, 0])
77                         bolt_mount(6.5, 2, 7, 12, 32);
78
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_bolt2_x, clip_space/2 + clip_wall, clip_bolt2_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                 // bolt holes
92                 translate([clip_bolt1_x, infty/2, clip_bolt1_z])
93                         rotate([90, 0, 0])
94                         cylinder(r=2, h=infty, $fn = 6);
95                 translate([clip_bolt2_x, infty/2, clip_bolt2_z])
96                         rotate([90, 0, 0])
97                         cylinder(r=2, h=infty, $fn = 6);
98         }
99
100 }
101
102 // upper part of the lens holder
103 module round_part() {
104         difference() {
105                 cylinder(r = fraen_diam/2 + pin_diam/2 + wall_thickness,
106                         h = front_add + pin_len);
107
108                 hull() {
109                         translate([0, 0, -epsilon])
110                                 cylinder(r = fraen_diam/2,
111                                         h = pin_len + front_add + 2*epsilon);
112                         for (angle = [0, 90, 180, 270]) {
113                                 rotate([0, 0, angle+45])
114                                         translate([pin_offset, 0, -epsilon])
115                                                 cylinder(r=pin_diam/2,
116                                                         h=epsilon, $fn=32);
117                         };
118                 }
119
120                 // front cone
121                 translate([0, 0, pin_len + 0.5*wall_thickness - epsilon])
122                         cylinder(r1 = fraen_diam/2,
123                                 r2 = (fraen_diam+pin_diam + wall_thickness)/2,
124                                 h = front_add - 0.5*wall_thickness+ 2*epsilon);
125                 // pin holes
126                 for (angle = [0, 90, 180, 270]) {
127                         rotate([0, 0, angle+45])
128                                 translate([pin_offset, 0, epsilon])
129                                         cylinder(r=pin_diam/2,
130                                                 h=pin_len+epsilon, $fn=32);
131                 };
132         };
133
134         // side barriers
135         for (angle = [0, 90, 180]) // omit the bottom one
136                 rotate([0, 0, angle])
137                         intersection() {
138                                 cylinder(r=fraen_diam/2+epsilon, h=infty);
139                                 translate([-infty/2, side_barrier_x_offset,
140                                         wall_thickness + pin_len - side_barrier_pin_z_offset - side_barrier_thickness ])
141                                         cube([infty, infty, side_barrier_thickness]);
142                 };
143 };
144
145 module square_cone() {
146         difference() {
147                 hull() {
148                         translate([0, 0, fraen_h - pin_len])
149                                 cylinder(r = fraen_diam/2 + pin_diam/2 + wall_thickness,
150                                         h = epsilon);
151                         for (angle = [0, 90, 180, 270])
152                                 rotate([0, 0, angle])
153                                         translate([9.1, 9.1, 0])
154                                                 cylinder(r=wall_thickness+3.75/2, h = epsilon);
155                 }
156                 hull() {
157                         translate([0, 0, fraen_h - pin_len + epsilon])
158                                 cylinder(r = fraen_diam/2,
159                                         h = epsilon);
160                         for (angle = [0, 90, 180, 270]) {
161                                 rotate([0, 0, angle]) 
162                                         translate([9.1, 9.1, -epsilon])
163                                                 cylinder(r=3.75/2, h = epsilon);
164                                 rotate([0, 0, angle+45])
165                                         translate([pin_offset, 0, fraen_h - pin_len + epsilon])
166                                                 cylinder(r=pin_diam/2,
167                                                         h=epsilon, $fn=32);
168                         }
169                 }
170         }
171 }
172
173 rear_spring_w = 4;
174
175 module rear_spring() {
176         translate([0, 0, wall_thickness/2])
177                 cube([18+2*wall_thickness+3.5, rear_spring_w, wall_thickness], center=true);
178         difference() {
179                 rotate([90, 0, 0])
180                         translate([0, 0, -rear_spring_w/2])
181                         cylinder(r=6-heatsink_thickness, h = rear_spring_w);
182                 translate([0, 0, -infty/2+epsilon])
183                         cube(infty, center=true);
184         };
185 };
186
187 module heatsink_holder() {
188         for (angle = [0, 180]) {
189                 rotate([0, 0, angle])
190                         translate([9.1+wall_thickness, 0, 6/2])
191                         cube([3.5/2+wall_thickness, 2*9.1-3.5-0.5, 6], center=true);
192         }
193 }
194
195 module lens_holder() {
196         difference() {
197                 union() {
198                         translate([0, 0, fraen_h - pin_len])
199                                 round_part();
200                         square_cone();
201                 };
202                 
203                 // 0.5mm hole in the bottom
204                 // translate([side_barrier_x_offset-epsilon, -0.25, -epsilon])
205                 translate([0, -0.25, (fraen_h - pin_len)/2])
206                         cube([infty, 0.5, infty]);
207
208                 // cable hole, 2*3mm
209                 translate([9.1, 0, 6+3])
210                         rotate([0, 0, 60])
211                                 cube([infty, 2, 3]);
212
213                 // side LED hole, 3mm
214                 translate([0, 0, fraen_h - pin_len])
215                         rotate([90, 0, 0])
216                                 cylinder(r=3.5/2, h=infty, $fn=6);
217         };
218                 
219         rear_spring();
220         heatsink_holder();
221 };
222
223 union() {
224         lens_holder($fn = 128);
225         translate([clip_x_off, clip_y_off, 0])
226                 seat_clip();
227 /*
228 hull() {
229         translate([0, 9.1+3.5/2+epsilon, wall_thickness/2])
230                 cube([9.1, epsilon, wall_thickness], center=true);
231         translate([20-clip_wall/2, 40-clip_space/2-clip_wall+epsilon, wall_thickness/2])
232                 cube([9.1, epsilon/2, wall_thickness], center=true);
233 };
234
235 hull() {
236         translate([0, 9.1+3.5/2+epsilon, wall_thickness/2])
237                 cube([2*.259+3.5, epsilon, wall_thickness], center=true);
238         translate([20-clip_wall/2, 40-clip_space/2-clip_wall+epsilon, wall_thickness/2])
239                 cube([clip_h1+clip_wall, epsilon/2, wall_thickness], center=true);
240 };
241
242 translate([7.5, 13.3, 0])
243         cube([wall_thickness, 23, fraen_h - pin_len - wall_thickness]);
244
245         }
246         //translate([-infty/2, -infty/2, 8])
247         //      cube(infty);
248 */
249 };
250
251
252         // vnitrni prumer kruhu by mel byt 30.75mm
253         // vnejsi prumer aspon 35 mm
254         // pin od stredu 10.35mm na x a y
255         // prumer pinu 4 mm
256         // pin ma od cela do zabrany 4.2mm, celkove by mel mit 9.2mm
257
258         // piny by mely pokracovat jeste tak 4mm pod nulu,
259         // a pak uz muze jit konv.obal do ctverce
260         // vnitrni rozmery ctverce 21.5x21.5, zakulacene rohy prumer 3.5
261         // vrch chladice (s LEDkou) -18.5
262         // konec nozicek -24.5