]> www.fi.muni.cz Git - bike-lights.git/commitdiff
Merge branch 'master' of ssh://calypso.fi.muni.cz/home/kas/html/git/bike-lights
authorJan "Yenya" Kasprzak <kas@fi.muni.cz>
Mon, 28 Oct 2013 21:18:09 +0000 (22:18 +0100)
committerJan "Yenya" Kasprzak <kas@fi.muni.cz>
Mon, 28 Oct 2013 21:18:09 +0000 (22:18 +0100)
firmware/ambient.c
parts/rearlight.scad [new file with mode: 0644]
parts/statuslights.scad [new file with mode: 0644]

index b1b726ce6c5c13f6259f4059e4ddfdab0146100c..37aaa772b6677d3134c63e23b8bdf7ca56441a04 100644 (file)
@@ -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 (file)
index 0000000..938c381
--- /dev/null
@@ -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 (file)
index 0000000..e46673b
--- /dev/null
@@ -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);
+}
+