// Holder for Fraen FHS-HEB1-LB01-x lens for Luxeon LEDs. // I use it for my rear lights. epsilon = 0.01; infty = 100; debug = 0; heatsink_thickness = 2.5; heatsink_width = 18-3.4; heatsink_length = 58; module fraen_lens_pin() { cylinder(r=4/2, h=23, $fn=32); translate([epsilon, 0, -5]) cylinder(r=3.4/2, h=5+epsilon); }; module fraen_lens() { cylinder(r1=6, r2=30.9/2, h=23); assign(off=10.35) { translate([off, off, 0]) fraen_lens_pin(); translate([off, -off, 0]) fraen_lens_pin(); translate([-off, off, 0]) fraen_lens_pin(); translate([-off, -off, 0]) fraen_lens_pin(); }; }; module heatsink() { translate([-heatsink_length+ 5 +heatsink_width/2, -heatsink_width/2, 0]) cube([heatsink_length, heatsink_width, heatsink_thickness]); } module seat_holder() { translate([-41, 8, 29]) cube([3, 30, 60], center=true); }; module stem_ellipse(h, w, x, y) { translate([x, y, 0]) difference() { translate([0, 0, 6]) scale([1, w/2, h-6]) rotate([0, 90, 0]) cylinder(r=1, h=epsilon); translate([0, 0, -100]) cube([200, 200, 200], center=true); }; } module main() { difference() { union() { hull() { cylinder(r=34/2, h=33); stem_ellipse(h = 15, w = 10, x = -21, y=-5); }; hull() { stem_ellipse(h = 15, w = 10, x = -21-epsilon, y=-5); stem_ellipse(h = 15, w = 10, x = -33, y=-5); }; hull() { stem_ellipse(h = 15, w = 10, x = -33-epsilon, y=-5); stem_ellipse(h = 25, w = 15, x = -40+epsilon, y=-2.5); }; translate([-41, 5, 52/2]) cube([7, 30, 52], center=true); // bolt hole ring translate([-44+epsilon, 10, 40]) rotate([0, -90, 0]) difference() { cylinder(r1=9, r2=6, h=3); translate([0, 0, -epsilon]) cylinder(r=5, h=3+2*epsilon, $fn=6); } // screw hole ring translate([-38-epsilon, 10, 40]) rotate([0, 90, 0]) difference() { cylinder(r1=9, r2=6, h=3); translate([0, 0, -epsilon]) cylinder(r=5, h=3+2*epsilon); } }; translate([-47, 10, 40]) rotate([0, 90, 0]) cylinder(r=2.5, h=12); translate([0, 0, 6-heatsink_thickness]) cylinder(r=31/2, h=32); translate([0, 0, 6]) fraen_lens(); heatsink(); seat_holder(); } if (debug == 1) { translate([0, 0, 6]) color("gray") fraen_lens(); color("lightblue") heatsink(); color("lightgreen") seat_holder(); } } module bolt_mount(d, h, w1, w2, fn) { difference() { translate([0, 0, -epsilon]) cylinder(r1=w2/2, r2=w1/2, h=h+epsilon); translate([0, 0, -2*epsilon]) cylinder(r=d/2, h=h+3*epsilon, $fn=fn); }; }; clip_h1 = 25; // inner height clip_h2 = 18; // inner height clip_l = 35; clip_wall = 2; clip_space = 4; clip_bolt1_x = 10; clip_bolt2_x = 25; module clip_top_circle() { rotate([-90, 0, 0]) difference() { translate([-clip_space/2, 0, 0]) cylinder(r=clip_wall, h = epsilon, $fn=32); translate([-infty/2, clip_wall/2-epsilon, -epsilon]) cube(infty); translate([clip_wall+epsilon, -infty/2, -epsilon]) cube(infty); }; }; module clip_top() { hull() { translate([0, 0, clip_h1/2+clip_wall]) clip_top_circle(); translate([0, clip_l-epsilon, clip_h2/2+clip_wall]) clip_top_circle(); }; }; module seat_clip() { difference() { polyhedron(points = [ [-clip_wall-clip_space/2, 0, clip_h1/2+clip_wall], [-clip_wall-clip_space/2, clip_l, clip_h2/2+clip_wall], [-clip_wall-clip_space/2, clip_l, -clip_h2/2], [-clip_wall-clip_space/2, 0, -clip_h1/2], [ clip_wall+clip_space/2, 0, clip_h1/2+clip_wall], [ clip_wall+clip_space/2, clip_l, clip_h2/2+clip_wall], [ clip_wall+clip_space/2, clip_l, -clip_h2/2], [ clip_wall+clip_space/2, 0, -clip_h1/2], ], triangles = [ [0, 2, 1], [3, 2, 0], [4, 5, 6], [6, 7, 4], [0, 1, 5], [5, 4, 0], [2, 3, 7], [7, 6, 2], [1, 2, 6], [6, 5, 1], [0, 7, 3], [7, 0, 4], ]); polyhedron(points = [ [-clip_space/2, -epsilon, clip_h1/2], [-clip_space/2, clip_l+epsilon, clip_h2/2], [-clip_space/2, clip_l+epsilon, -clip_h2/2-epsilon], [-clip_space/2, -epsilon, -clip_h1/2-epsilon], [ clip_space/2, -epsilon, clip_h1/2], [ clip_space/2, clip_l+epsilon, clip_h2/2], [ clip_space/2, clip_l+epsilon, -clip_h2/2-epsilon], [ clip_space/2, -epsilon, -clip_h1/2-epsilon], ], triangles = [ [0, 2, 1], [3, 2, 0], [4, 5, 6], [6, 7, 4], [0, 1, 5], [5, 4, 0], [2, 3, 7], [7, 6, 2], [1, 2, 6], [6, 5, 1], [0, 7, 3], [7, 0, 4], ]); // bolt holes translate([0, clip_bolt1_x, 0]) rotate([0, 90, 0]) translate([0, 0, -clip_wall-clip_space/2-epsilon]) cylinder(r=2, h=2*clip_wall+clip_space+2*epsilon, $fn = 6); translate([0, clip_bolt2_x, 0]) rotate([0, 90, 0]) translate([0, 0, -clip_wall-clip_space/2-epsilon]) cylinder(r=2, h=2*clip_wall+clip_space+2*epsilon, $fn=6); }; translate([-clip_space, clip_bolt1_x, 0]) rotate([0, -90, 0]) bolt_mount(6, 3, 7, 14, 6); translate([-clip_space, clip_bolt2_x, 0]) rotate([0, -90, 0]) bolt_mount(6, 3, 7, 14, 6); translate([clip_space, clip_bolt1_x, 0]) rotate([0, 90, 0]) bolt_mount(6, 3, 7, 14, 128); translate([clip_space, clip_bolt2_x, 0]) rotate([0, 90, 0]) bolt_mount(6, 3, 7, 14, 128); clip_top(); }; /* seat_clip(); difference() { union() { hull() { translate([40, epsilon, 2]) clip_top(); clip_top(); }; translate([40, 0, 25]) rotate([-90, 0, 0]) cylinder(r=34/2, h=clip_l); hull() { translate([clip_space/2+epsilon, 0, 0]) cube([clip_wall-epsilon, clip_wall, clip_h1/2+2*clip_wall-epsilon]); translate([40, 0, 14+epsilon]) cube([clip_wall-epsilon, clip_wall, 34/2]); }; }; translate([40, 6, 25]) rotate([-90, 0, 0]) { cylinder(r=31/2, h=clip_l); fraen_lens(); heatsink(); }; }; */ wall_thickness = 1.5; fraen_diam = 30.75; fraen_h = 29.8; pin_diam = 4; pin_offset = 10.35*1.4142; pin_len = 9.2; front_add = 4; side_barrier_x_offset = 13; side_barrier_pin_z_offset = 4.2; side_barrier_thickness = 2; module round_part() { difference() { cylinder(r = fraen_diam/2 + pin_diam/2 + wall_thickness, h = front_add + pin_len + wall_thickness); translate([0, 0, -epsilon]) cylinder(r = fraen_diam/2, h = pin_len + wall_thickness + front_add + 2*epsilon); // front cone translate([0, 0, pin_len + 1.5*wall_thickness - epsilon]) cylinder(r1 = fraen_diam/2, r2 = (fraen_diam+pin_diam + wall_thickness)/2, h = front_add + 2*epsilon); // pin holes for (angle = [0, 90, 180, 270]) { rotate([0, 0, angle+45]) translate([pin_offset, 0, wall_thickness-epsilon]) cylinder(r=pin_diam/2, h=pin_len+epsilon, $fn=32); }; }; // side barriers for (angle = [0, 90, 180]) // omit the bottom one rotate([0, 0, angle]) intersection() { cylinder(r=fraen_diam/2+epsilon, h=infty); translate([-infty/2, side_barrier_x_offset, wall_thickness + pin_len - side_barrier_pin_z_offset - side_barrier_thickness ]) cube([infty, infty, side_barrier_thickness]); }; }; module square_cone() { difference() { hull() { translate([0, 0, fraen_h - pin_len - wall_thickness]) cylinder(r = fraen_diam/2 + pin_diam/2 + wall_thickness, h = epsilon); for (angle = [0, 90, 180, 270]) rotate([0, 0, angle]) translate([9, 9, 0]) cylinder(r=wall_thickness+3.5/2, h = epsilon); } hull() { translate([0, 0, fraen_h - pin_len - wall_thickness+epsilon]) cylinder(r = fraen_diam/2, h = epsilon); for (angle = [0, 90, 180, 270]) rotate([0, 0, angle]) translate([9, 9, -epsilon]) cylinder(r=3.5/2, h = epsilon); } } } rear_spring_w = 4; module rear_spring() { translate([0, 0, wall_thickness/2]) cube([18+2*wall_thickness+3.5, rear_spring_w, wall_thickness], center=true); difference() { rotate([90, 0, 0]) translate([0, 0, -rear_spring_w/2]) cylinder(r=6-heatsink_thickness, h = rear_spring_w); translate([0, 0, -infty/2+epsilon]) cube(infty, center=true); }; }; module heatsink_holder() { for (angle = [0, 180]) { rotate([0, 0, angle]) translate([9+wall_thickness, 0, 6/2]) cube([3.5/2+wall_thickness, 2*9-3.5-0.5, 6], center=true); } } module lens_holder() { difference() { union() { translate([0, 0, fraen_h - pin_len - wall_thickness]) round_part(); square_cone(); }; // 0.5mm hole in the bottom // translate([side_barrier_x_offset-epsilon, -0.25, -epsilon]) translate([0, -0.25, (fraen_h - pin_len - wall_thickness)/2]) cube([infty, 0.5, infty]); // cable hole, 2*3mm translate([9, 0, 6+3]) rotate([0, 0, 60]) cube([infty, 2, 3]); }; rear_spring(); heatsink_holder(); }; lens_holder($fn = 128); translate([20, 40, 0]) rotate([90, 0, -90]) seat_clip(, $fn=128); hull() { translate([0, 9+3.5/2+epsilon, wall_thickness/2]) cube([2*9+3.5, epsilon, wall_thickness], center=true); translate([20-clip_wall/2, 40-clip_space/2-clip_wall+epsilon, wall_thickness/2]) cube([clip_h1+clip_wall, epsilon/2, wall_thickness], center=true); }; translate([7.5, 13.3, 0]) cube([wall_thickness, 23, fraen_h - pin_len - wall_thickness]); // vnitrni prumer kruhu by mel byt 30.75mm // vnejsi prumer aspon 35 mm // pin od stredu 10.35mm na x a y // prumer pinu 4 mm // pin ma od cela do zabrany 4.2mm, celkove by mel mit 9.2mm // piny by mely pokracovat jeste tak 4mm pod nulu, // a pak uz muze jit konv.obal do ctverce // vnitrni rozmery ctverce 21.5x21.5, zakulacene rohy prumer 3.5 // vrch chladice (s LEDkou) -18.5 // konec nozicek -24.5