X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?p=bike-lights.git;a=blobdiff_plain;f=parts%2Frearlight.scad;h=05a79cb31cca19163c5507e42e9ebbcc8b97b229;hp=938c381e2b1620c99fd9676c0902fee1ea7851b3;hb=HEAD;hpb=74c8418108d14042c710aedcc0b9d0f0331c142f diff --git a/parts/rearlight.scad b/parts/rearlight.scad index 938c381..05a79cb 100644 --- a/parts/rearlight.scad +++ b/parts/rearlight.scad @@ -5,93 +5,40 @@ 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); -}; +wall_thickness = 1.5; +fraen_diam = 30.90; +fraen_h = 29.3; +pin_diam = 4; +pin_offset = 10.35*1.4142; +pin_len = 9.2; +front_add = 4; -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); - }; -} +rear_pin_dist = 9.1; +rear_pin_diam = 3.25; -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(); - } -} +side_barrier_x_offset = 13; +side_barrier_pin_z_offset = 4.2; +side_barrier_thickness = 2; +heatsink_thickness = 2; + +clip_h1 = 27; // front height (on the heatsink side) +clip_h2 = 20; // rear height (on the lens side) +clip_l = 28; +clip_wall = wall_thickness; +clip_space = 3.5; +clip_bolt1_z = 6; +clip_bolt1_x = 19.5; +clip_bolt2_z = 22; +clip_bolt2_x = 21; +clip_angle = 18; +clip_top_xoff = clip_l*tan(clip_angle); + +clip_y_off = 34; +clip_x_off = 2; +clip_x_rot = -3; + +// z-axis is up module bolt_mount(d, h, w1, w2, fn) { difference() { translate([0, 0, -epsilon]) @@ -101,158 +48,90 @@ module bolt_mount(d, h, w1, w2, 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); + union() { + // right part + hull() { + translate([0, clip_space/2, 0]) + cube([clip_h1, clip_wall, epsilon]); + translate([clip_top_xoff, clip_space/2, clip_l]) + cube([clip_h2, clip_wall, epsilon]); + }; - translate([clip_space, clip_bolt2_x, 0]) - rotate([0, 90, 0]) - bolt_mount(6, 3, 7, 14, 128); + // left part + hull() { + translate([0, -clip_space/2-clip_wall, 0]) + cube([clip_h1, clip_wall, epsilon]); + translate([0+clip_top_xoff, -clip_space/2-clip_wall, clip_l]) + cube([clip_h2, clip_wall, epsilon]); + }; - clip_top(); -}; + // top part + hull() { + translate([-2*clip_wall, -clip_space/2-clip_wall, 0]) + cube([2*clip_wall+epsilon, 2*clip_wall+clip_space, epsilon]); + translate([-clip_wall+clip_top_xoff, -clip_space/2-clip_wall, clip_l]) + cube([clip_wall+epsilon, 2*clip_wall+clip_space, epsilon]); + }; -/* -seat_clip(); + // bolt mounts + translate([clip_bolt1_x, clip_space/2 + clip_wall, clip_bolt1_z]) + rotate([-90, 0, 0]) + bolt_mount(6.5, 2, 7, 12, 6); -difference() { - union() { - hull() { - translate([40, epsilon, 2]) - clip_top(); - clip_top(); - }; + translate([clip_bolt1_x, -clip_space/2 - clip_wall, clip_bolt1_z]) + rotate([90, 0, 0]) + bolt_mount(6.5, 2, 7, 12, 32); - translate([40, 0, 25]) + translate([clip_bolt2_x, clip_space/2 + clip_wall, clip_bolt2_z]) rotate([-90, 0, 0]) - cylinder(r=34/2, h=clip_l); + bolt_mount(6.5, 2, 7, 12, 6); - 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(); + translate([clip_bolt2_x, -clip_space/2 - clip_wall, clip_bolt2_z]) + rotate([90, 0, 0]) + bolt_mount(6.5, 2, 7, 12, 32); }; -}; -*/ - -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; + // bolt holes + translate([clip_bolt1_x, infty/2, clip_bolt1_z]) + rotate([90, 0, 0]) + cylinder(r=2, h=infty, $fn = 6); + translate([clip_bolt2_x, infty/2, clip_bolt2_z]) + rotate([90, 0, 0]) + cylinder(r=2, h=infty, $fn = 6); + } -side_barrier_x_offset = 13; -side_barrier_pin_z_offset = 4.2; -side_barrier_thickness = 2; +} +// upper part of the lens holder 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); + h = front_add + pin_len); + + hull() { + translate([0, 0, -epsilon]) + cylinder(r = fraen_diam/2, + h = pin_len + front_add + 2*epsilon); + for (angle = [0, 90, 180, 270]) { + rotate([0, 0, angle+45]) + translate([pin_offset, 0, -epsilon]) + cylinder(r=pin_diam/2, + h=epsilon); + }; + } + // front cone - translate([0, 0, pin_len + 1.5*wall_thickness - epsilon]) + translate([0, 0, pin_len + 0.5*wall_thickness - epsilon]) cylinder(r1 = fraen_diam/2, r2 = (fraen_diam+pin_diam + wall_thickness)/2, - h = front_add + 2*epsilon); + h = front_add - 0.5*wall_thickness+ 2*epsilon); // pin holes for (angle = [0, 90, 180, 270]) { rotate([0, 0, angle+45]) - translate([pin_offset, 0, wall_thickness-epsilon]) + translate([pin_offset, 0, epsilon]) cylinder(r=pin_diam/2, - h=pin_len+epsilon, $fn=32); + h=pin_len+epsilon); }; }; @@ -262,7 +141,7 @@ module round_part() { 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 ]) + pin_len - side_barrier_pin_z_offset - side_barrier_thickness ]) cube([infty, infty, side_barrier_thickness]); }; }; @@ -270,87 +149,151 @@ module round_part() { module square_cone() { difference() { hull() { - translate([0, 0, fraen_h - pin_len - wall_thickness]) + translate([0, 0, fraen_h - pin_len]) 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); + translate([rear_pin_dist, rear_pin_dist, 0]) + cylinder(r=wall_thickness+3.75/2, h = epsilon); } hull() { - translate([0, 0, fraen_h - pin_len - wall_thickness+epsilon]) + translate([0, 0, fraen_h - pin_len + 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); + for (angle = [0, 90, 180, 270]) { + rotate([0, 0, angle]) + translate([rear_pin_dist, rear_pin_dist, -epsilon]) + cylinder(r=3.75/2, h = epsilon); + rotate([0, 0, angle+45]) + translate([pin_offset, 0, fraen_h - pin_len + epsilon]) + cylinder(r=pin_diam/2, + h=epsilon); + } } } } -rear_spring_w = 4; +rear_spring_w = 2*rear_pin_dist-rear_pin_diam-2; +rear_spring_h = 1.5; +rear_spring_center_w = 4; +led_zoff = 6; 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); - }; -}; + cube([rear_spring_center_w, rear_spring_w, wall_thickness], + center=true); + translate([0, rear_spring_w/2-wall_thickness/2, + (led_zoff-heatsink_thickness)/2]) + cube([rear_spring_center_w, + wall_thickness, led_zoff-heatsink_thickness], + center=true); + translate([0, -rear_spring_w/2+wall_thickness/2, + (led_zoff-heatsink_thickness)/2]) + cube([rear_spring_center_w, + wall_thickness, led_zoff-heatsink_thickness], + center=true); + + for (angle=[0, 180]) { + rotate([0, 0, angle]) + translate([5.5, 0, rear_spring_h/2]) + rotate([0, 0, 45]) { + cube([wall_thickness, 14, rear_spring_h], + 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); + translate([rear_pin_dist+wall_thickness, 0, (led_zoff+wall_thickness)/2]) + cube([rear_pin_diam/2+wall_thickness, 2*rear_pin_dist-rear_pin_diam-2, led_zoff+wall_thickness], center=true); } } module lens_holder() { difference() { union() { - translate([0, 0, fraen_h - pin_len - wall_thickness]) + translate([0, 0, fraen_h - pin_len]) 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]) + translate([0, -0.25, (fraen_h - pin_len)/2]) cube([infty, 0.5, infty]); // cable hole, 2*3mm - translate([9, 0, 6+3]) + translate([rear_pin_dist, 0, 6+3]) rotate([0, 0, 60]) cube([infty, 2, 3]); + + // side LED hole, 3mm + translate([0, 0, fraen_h - pin_len]) + rotate([90, 0, 0]) + cylinder(r=rear_pin_diam/2, h=infty, $fn=6); }; rear_spring(); heatsink_holder(); }; -lens_holder($fn = 128); - -translate([20, 40, 0]) - rotate([90, 0, -90]) - seat_clip(, $fn=128); +module full_joint() { + difference() { + hull() { + intersection() { + rotate([-90, 0, 0]) + scale([0.25, 1, 1]) + cylinder(r = fraen_h-pin_len, h = rear_pin_dist + wall_thickness+rear_pin_diam/2); + translate([-infty/2, rear_pin_dist + wall_thickness + rear_pin_diam/2 - epsilon, 0]) + cube(infty); + }; + translate([clip_x_off, clip_y_off, 0]) + intersection() { + seat_clip_rotated(); + translate([(fraen_h-pin_len)*tan(clip_angle)-clip_wall, -clip_space/2-0.1*clip_wall+epsilon, 0]) + rotate([90+clip_x_rot, 0, 0]) + scale([0.45, 1, 1]) + cylinder(r = fraen_h-pin_len, h = epsilon); + }; + }; + hull() { + translate([0, 0, fraen_h - pin_len + epsilon]) + cylinder(r = fraen_diam/2 + pin_diam/2 + wall_thickness/2, + h = epsilon); + for (angle = [0, 90, 180, 270]) + rotate([0, 0, angle]) + translate([rear_pin_dist, rear_pin_dist, -epsilon]) + cylinder(r=wall_thickness/2+3.75/2, h = epsilon); + }; + } +}; -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); +module seat_clip_rotated() { + difference() { + translate([clip_space/2+clip_wall, 0, 0]) + rotate([clip_x_rot, 0, 0]) + translate([-clip_space/2-clip_wall, 0, sin(clip_x_rot)*(clip_space/2+clip_wall+epsilon)]) + seat_clip(); + translate([-infty/2, -infty/2, -infty]) + cube(infty); + }; +}; + +module main() { + lens_holder(); + translate([clip_x_off, clip_y_off, 0]) + seat_clip_rotated(); + // xy_joint(); + // yz_joint(); + full_joint(); }; -translate([7.5, 13.3, 0]) - cube([wall_thickness, 23, fraen_h - pin_len - wall_thickness]); +// scale([1, -1, 1]) main($fn=128); +main($fn = 128); // vnitrni prumer kruhu by mel byt 30.75mm // vnejsi prumer aspon 35 mm // pin od stredu 10.35mm na x a y