1 // Holder for Fraen FHS-HEB1-LB01-x lens for Luxeon LEDs.
2 // I use it for my rear lights.
12 pin_offset = 10.35*1.4142;
19 side_barrier_x_offset = 13;
20 side_barrier_pin_z_offset = 4.2;
21 side_barrier_thickness = 2;
23 heatsink_thickness = 2;
25 clip_h1 = 27; // front height (on the heatsink side)
26 clip_h2 = 20; // rear height (on the lens side)
28 clip_wall = wall_thickness;
35 clip_top_xoff = clip_l*tan(clip_angle);
41 module bolt_mount(d, h, w1, w2, fn) {
43 translate([0, 0, -epsilon])
44 cylinder(r1=w2/2, r2=w1/2, h=h+epsilon);
45 translate([0, 0, -2*epsilon])
46 cylinder(r=d/2, h=h+3*epsilon, $fn=fn);
55 translate([0, clip_space/2, 0])
56 cube([clip_h1, clip_wall, epsilon]);
57 translate([clip_top_xoff, clip_space/2, clip_l])
58 cube([clip_h2, clip_wall, epsilon]);
63 translate([0, -clip_space/2-clip_wall, 0])
64 cube([clip_h1, clip_wall, epsilon]);
65 translate([0+clip_top_xoff, -clip_space/2-clip_wall, clip_l])
66 cube([clip_h2, clip_wall, epsilon]);
71 translate([-clip_wall, -clip_space/2-clip_wall, 0])
72 cube([clip_wall+epsilon, 2*clip_wall+clip_space, epsilon]);
73 translate([-clip_wall+clip_top_xoff, -clip_space/2-clip_wall, clip_l])
74 cube([clip_wall+epsilon, 2*clip_wall+clip_space, epsilon]);
78 translate([clip_bolt1_x, clip_space/2 + clip_wall, clip_bolt1_z])
80 bolt_mount(6.5, 2, 7, 12, 32);
82 translate([clip_bolt1_x, -clip_space/2 - clip_wall, clip_bolt1_z])
84 bolt_mount(6.5, 2, 7, 12, 6);
86 translate([clip_bolt2_x, clip_space/2 + clip_wall, clip_bolt2_z])
88 bolt_mount(6.5, 2, 7, 12, 32);
90 translate([clip_bolt2_x, -clip_space/2 - clip_wall, clip_bolt2_z])
92 bolt_mount(6.5, 2, 7, 12, 6);
95 translate([clip_bolt1_x, infty/2, clip_bolt1_z])
97 cylinder(r=2, h=infty, $fn = 6);
98 translate([clip_bolt2_x, infty/2, clip_bolt2_z])
100 cylinder(r=2, h=infty, $fn = 6);
105 // upper part of the lens holder
106 module round_part() {
108 cylinder(r = fraen_diam/2 + pin_diam/2 + wall_thickness,
109 h = front_add + pin_len);
112 translate([0, 0, -epsilon])
113 cylinder(r = fraen_diam/2,
114 h = pin_len + front_add + 2*epsilon);
115 for (angle = [0, 90, 180, 270]) {
116 rotate([0, 0, angle+45])
117 translate([pin_offset, 0, -epsilon])
118 cylinder(r=pin_diam/2,
124 translate([0, 0, pin_len + 0.5*wall_thickness - epsilon])
125 cylinder(r1 = fraen_diam/2,
126 r2 = (fraen_diam+pin_diam + wall_thickness)/2,
127 h = front_add - 0.5*wall_thickness+ 2*epsilon);
129 for (angle = [0, 90, 180, 270]) {
130 rotate([0, 0, angle+45])
131 translate([pin_offset, 0, epsilon])
132 cylinder(r=pin_diam/2,
138 for (angle = [0, 90, 180]) // omit the bottom one
139 rotate([0, 0, angle])
141 cylinder(r=fraen_diam/2+epsilon, h=infty);
142 translate([-infty/2, side_barrier_x_offset,
143 wall_thickness + pin_len - side_barrier_pin_z_offset - side_barrier_thickness ])
144 cube([infty, infty, side_barrier_thickness]);
148 module square_cone() {
151 translate([0, 0, fraen_h - pin_len])
152 cylinder(r = fraen_diam/2 + pin_diam/2 + wall_thickness,
154 for (angle = [0, 90, 180, 270])
155 rotate([0, 0, angle])
156 translate([rear_pin_dist, rear_pin_dist, 0])
157 cylinder(r=wall_thickness+3.75/2, h = epsilon);
160 translate([0, 0, fraen_h - pin_len + epsilon])
161 cylinder(r = fraen_diam/2,
163 for (angle = [0, 90, 180, 270]) {
164 rotate([0, 0, angle])
165 translate([rear_pin_dist, rear_pin_dist, -epsilon])
166 cylinder(r=3.75/2, h = epsilon);
167 rotate([0, 0, angle+45])
168 translate([pin_offset, 0, fraen_h - pin_len + epsilon])
169 cylinder(r=pin_diam/2,
176 rear_spring_w = 2*rear_pin_dist-rear_pin_diam-0.5;
178 rear_spring_center_w = 4;
181 module rear_spring() {
182 translate([0, 0, wall_thickness/2])
183 cube([rear_spring_center_w, rear_spring_w, wall_thickness],
185 translate([0, rear_spring_w/2-wall_thickness/2,
186 (led_zoff-heatsink_thickness)/2])
187 cube([rear_spring_center_w,
188 wall_thickness, led_zoff-heatsink_thickness],
190 translate([0, -rear_spring_w/2+wall_thickness/2,
191 (led_zoff-heatsink_thickness)/2])
192 cube([rear_spring_center_w,
193 wall_thickness, led_zoff-heatsink_thickness],
196 for (angle=[0, 180]) {
197 rotate([0, 0, angle])
198 translate([5.5, 0, rear_spring_h/2])
200 cube([wall_thickness, 14, rear_spring_h],
206 module heatsink_holder() {
207 for (angle = [0, 180]) {
208 rotate([0, 0, angle])
209 translate([rear_pin_dist+wall_thickness, 0, led_zoff/2])
210 cube([rear_pin_diam/2+wall_thickness, 2*rear_pin_dist-rear_pin_diam-0.5, led_zoff], center=true);
214 module lens_holder() {
217 translate([0, 0, fraen_h - pin_len])
222 // 0.5mm hole in the bottom
223 // translate([side_barrier_x_offset-epsilon, -0.25, -epsilon])
224 translate([0, -0.25, (fraen_h - pin_len)/2])
225 cube([infty, 0.5, infty]);
228 translate([rear_pin_dist, 0, 6+3])
232 // side LED hole, 3mm
233 translate([0, 0, fraen_h - pin_len])
235 cylinder(r=rear_pin_diam/2, h=infty, $fn=6);
246 translate([-infty-0.5*rear_pin_dist,
247 rear_pin_dist+rear_pin_diam/2+0.35*wall_thickness,
249 cube([infty, infty, clip_wall]);
252 translate([clip_x_off, clip_y_off, 0])
255 translate([-infty+clip_wall+0.20*clip_h1, -infty-clip_space, 0])
256 cube([infty, infty, clip_wall]);
262 translate([0.5*rear_pin_dist,
263 rear_pin_dist+rear_pin_diam/2+0.35*wall_thickness,
265 cube([infty, infty, clip_wall]);
268 translate([clip_x_off, clip_y_off, 0])
271 translate([0.8*clip_h1-clip_wall, -infty-clip_space, 0])
272 cube([infty, infty, clip_wall]);
280 translate([clip_x_off, clip_y_off, 0])
283 translate([-1.5*clip_wall+(fraen_h-pin_len)*tan(clip_angle), -clip_space/2-clip_wall+epsilon, 0])
284 cube([clip_wall, epsilon, fraen_h - pin_len]);
286 translate([clip_x_off - 1.5*clip_wall+(fraen_h-pin_len)*tan(clip_angle), 0, 0])
288 cube([clip_wall, epsilon, (fraen_h - pin_len)]);
291 translate([0, 0, fraen_h - pin_len + epsilon])
292 cylinder(r = fraen_diam/2 + pin_diam/2 + wall_thickness/2,
294 for (angle = [0, 90, 180, 270])
295 rotate([0, 0, angle])
296 translate([rear_pin_dist, rear_pin_dist, -epsilon])
297 cylinder(r=wall_thickness/2+3.75/2, h = epsilon);
302 module full_joint() {
308 cylinder(r = fraen_h-pin_len, h = rear_pin_dist + wall_thickness+rear_pin_diam/2);
309 translate([-infty/2, rear_pin_dist + wall_thickness + rear_pin_diam/2 - epsilon, 0])
312 translate([clip_x_off, clip_y_off, 0])
315 translate([(fraen_h-pin_len)*tan(clip_angle)-clip_wall, -clip_space/2-clip_wall+epsilon, 0])
318 cylinder(r = fraen_h-pin_len, h = epsilon);
322 translate([0, 0, fraen_h - pin_len + epsilon])
323 cylinder(r = fraen_diam/2 + pin_diam/2 + wall_thickness/2,
325 for (angle = [0, 90, 180, 270])
326 rotate([0, 0, angle])
327 translate([rear_pin_dist, rear_pin_dist, -epsilon])
328 cylinder(r=wall_thickness/2+3.75/2, h = epsilon);
335 translate([clip_x_off, clip_y_off, 0])
343 scale([1, -1, 1]) main($fn=128);
345 // vnitrni prumer kruhu by mel byt 30.75mm
346 // vnejsi prumer aspon 35 mm
347 // pin od stredu 10.35mm na x a y
349 // pin ma od cela do zabrany 4.2mm, celkove by mel mit 9.2mm
351 // piny by mely pokracovat jeste tak 4mm pod nulu,
352 // a pak uz muze jit konv.obal do ctverce
353 // vnitrni rozmery ctverce 21.5x21.5, zakulacene rohy prumer 3.5
354 // vrch chladice (s LEDkou) -18.5
355 // konec nozicek -24.5