From: Jan "Yenya" Kasprzak Date: Mon, 28 Oct 2013 21:18:09 +0000 (+0100) Subject: Merge branch 'master' of ssh://calypso.fi.muni.cz/home/kas/html/git/bike-lights X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?p=bike-lights.git;a=commitdiff_plain;h=74c8418108d14042c710aedcc0b9d0f0331c142f;hp=6d9e2053eb39ebbe70df69c1faf3384ac2aa99fa Merge branch 'master' of ssh://calypso.fi.muni.cz/home/kas/html/git/bike-lights --- diff --git a/firmware/ambient.c b/firmware/ambient.c index b1b726c..37aaa77 100644 --- a/firmware/ambient.c +++ b/firmware/ambient.c @@ -34,8 +34,8 @@ static ambient_zone_t ambient_zones[N_AMBIENT_ZONES] = { #else { 0x0000, 0x0250 }, // dark { 0x0230, 0x02e0 }, // evening - { 0x02c0, 0x0304 }, // dawn - { 0x02fc, 0xffff }, // day + { 0x02c0, 0x0302 }, // dawn + { 0x02fa, 0xffff }, // day #endif }; diff --git a/parts/rearlight.scad b/parts/rearlight.scad new file mode 100644 index 0000000..938c381 --- /dev/null +++ b/parts/rearlight.scad @@ -0,0 +1,364 @@ +// 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 diff --git a/parts/statuslights.scad b/parts/statuslights.scad new file mode 100644 index 0000000..e46673b --- /dev/null +++ b/parts/statuslights.scad @@ -0,0 +1,157 @@ +debug = 1; +tube_diam = 25; +tube_angle = 35; +view_angle = 15; + +wall = 2; +led_w = 3; +screw_hole = 3.5; +screw_head = 5; +screw_base = 3; +epsilon=0.01; + +module outer_shape() { + difference() { + hull() { + translate([-26, 0, 5]) + rotate([0, -70, 0]) + scale([2, 1, 1]) + cylinder(r=6, h=1); + + scale([1, 1, 1/2]) + sphere(r=tube_diam/2, center=true); + } + + translate([0, 0, -100+epsilon]) + cube(200, center=true); + + translate([-25, 0, 0]) + rotate([0, -35, 0]) + translate([-100, 0, 0]) + cube(200, center=true); + } +} + +module inner_shape() { + difference() { + hull() { + translate([-26-epsilon, 0, 5]) + rotate([0, -70, 0]) + scale([2.5, 1, 1]) + cylinder(r=4, h=1); + + scale([1, 1, 1/2]) + sphere(r=tube_diam/2 - 4, center=true); + } + + translate([0, 0, 2+-100+epsilon]) + cube(200, center=true); + + translate([-22, 0, 0]) + rotate([0, -35, 0]) + translate([-100, 0, 0]) + cube(200, center=true); + } +} + +module screw_hole(d1, d2, z_base) { + union() { + // body + translate([0, 0, -epsilon]) + cylinder(r=d1/2, h=z_base + 2*epsilon); + // head + translate([0, 0, z_base]) + cylinder(r=d2/2, h=20); + } +} + +module front_hole() { + difference() { + inner_shape(); + translate([-35, 0, 0]) + rotate([0, view_angle + tube_angle, 0]) + translate([100, 0, 0]) cube([200, 200, 200], center=true); + } +} + +module inner_hole() { + intersection() { + inner_shape(); + + translate([-32, 0, 0]) + rotate([0, view_angle + tube_angle, 0]) + translate([100, 0, 0]) cube([200, 200, 200], center=true); + + translate([-27, 0, 0]) + rotate([0, 20, 0]) + translate([100, 0, 0]) cube([200, 200, 200], center=true); + + translate([-108, 0, 0]) cube([200, 200, 200], center=true); + } +} + +module cable_hole() { + translate([-10, 0, -epsilon]) + difference() { + cylinder(r=6.5, h=3); + translate([12-epsilon, 0, 0]) cube(20, center=true); + } +} + +module tube() { + // presmykacova trubka + color("grey") { + rotate([0, -tube_angle, 0]) + translate([0, 0, -50]) + cylinder(r=tube_diam/2, h=50); + } +} + +module led(h, w, h1, w1) { + union() { + translate([0, 0, h-w/2]) + sphere(r=w/2, $fn=64); + cylinder(r=w/2, h=h-w/2, $fn=64); + translate([0, 0, -h1]) + cylinder(r=w1/2, h=h1+epsilon, $fn=64); + } +} + +module illum_led() { + translate([-24, 0, 3]) + rotate([0, 180+tube_angle, 0]) + led(h=5,w=3.5,h1=2,w1=4); +}; + +module status_led() { + translate([-21, 0, 8.5]) + rotate([0, 270+view_angle+tube_angle, 0]) + led(h=5,w=3.5,h1=2,w1=4); +} + +module main() { + difference() { + outer_shape(); + screw_hole(d1=4, d2=8, z_base=4); + front_hole(); + inner_hole(); + cable_hole($fn=8); + status_led(); + illum_led(); + }; +}; + +if (debug == 1) { + rotate([0, -tube_angle, 0]) { + difference() { + main($fn=16); + translate([0, -100, 0]) cube([200, 200, 200], center=true); + }; + color("red") status_led(); + color("deepskyblue") illum_led(); + }; + color("gray") tube(); +} else { + main($fn=32); +} +