/* configurable turbine wheel copyright 2013 sebastien lorquet f4grx <f4grx@f4grx.net> cc-by-sa-nc overlap problem to be avoided: http://rocklinux.net/pipermail/openscad/2012-March/002765.html todo: parabolic profiled blades */ module turbine( thickness = 3, shaft_diameter = 3, hub_diameter = 6, blade_count = 13, blade_length = 10, blade_thickness = 0.2, attack_angle = 50, blade_width_hub = 3, blade_width_final = 5, housing_thickness = 0.5, printer_compatible_bevel=0 ) { mode=0; hub_radius = hub_diameter/2; shaft_radius = shaft_diameter/2; total_radius = blade_length+hub_radius; module hub(r, thickness) { cylinder(r=r, h=thickness, center=true); } //progressive width blade //blade hub Z-, blade end Z+, blade profile centered on origin module blade_progr(len, start, thickness, width_base, width_final) { rotate([0,90,0]) linear_extrude(height=thickness,center=true) polygon( points=[ [0,width_base/2], [start,width_base/2], [start+len,width_final/2], [start+len,-width_final/2], [start,-width_base/2], [0,-width_base/2], ], paths=[[0,1,2,3,4,5]] ); } module blade_basic(len, start, thickness, width_base, width_final) { rotate([0,90,0]) translate([0,0,start]) cube([len,width_final,thickness]); } module turbine_body() { union() { //connect hub, blades, housing //hub, a bit too thick (will be cut by intersection) hub(hub_radius, thickness+1); intersection() { //ensure blades fit in a cylinder //blades for(b=[0:blade_count-1]) { rotate((360*b)/blade_count,[0,0,1]) //radial position rotate(attack_angle,[0,1,0]) //initial attack angle rotate(90,[1,0,0]) translate([0,0,-shaft_radius]) //avoid overlap blade_progr( len=blade_length, start=hub_radius-shaft_radius, thickness=blade_thickness, width_base=blade_width_hub, width_final=blade_width_final ); } } //exterior tube, a bit too thick (will be cut by intersection) //also a bit too wide to avoid slow 0-width intersection if(housing_thickness>0) { difference() { cylinder(r=(total_radius+housing_thickness)*1.1,h=thickness+1, center=true); cylinder(r=total_radius,h=thickness+2, center=true); } } } //union of all added parts } module turbine_outline() { difference() { cylinder(r=total_radius+housing_thickness, h=thickness, center=true); //cut a hollow cone to make the blades thinner at center, while keeping the other side if(true) { //printer_compatible_bevel>0) { union() { translate([0,0,thickness/2-printer_compatible_bevel]) cylinder(h=printer_compatible_bevel, r1=hub_radius, r2=total_radius,center=false); translate([0,0,thickness/2-0.01]) cylinder(h=printer_compatible_bevel, r=total_radius,center=false); } } //cylinder(center=true, r=hub_radius, h=thickness+1); } //diff hub(hub_radius, thickness); } //go difference() { //cut shaft hole if(mode==0) { intersection() { //make sure everything fits in a cylinder turbine_body(); turbine_outline(); }//intersection to ensure thickness and diameter } else if(mode==1) { turbine_outline(); //just the outline } else { turbine_body(); //just the body } cylinder(r=shaft_radius, h=thickness+2, center=true); //cut shaft hole } //difference for shaft hole and conicity } //turbine $fn=64; module test_rotor() { translate([-16,-16,2]) turbine( thickness = 4, shaft_diameter = 3, //important hub_diameter = 3+(0.34*9*2), //9 cercles blade_count = 11, blade_length = 10, blade_thickness = 0.34*2/sqrt(2), attack_angle = 45, housing_thickness = 0.34*2, blade_width_hub = 6, blade_width_final = 6, printer_compatible_bevel=1.5 ); } //stator module test_stator() { translate([16,-16,2]) turbine( thickness = 4, shaft_diameter = 8, //important hub_diameter = 9+(0.34*2*2), //2 cercles blade_count = 11, blade_length = 10, blade_thickness = 0.34*2/sqrt(2), attack_angle = -45, housing_thickness = 0.34*3, blade_width_hub = 6, blade_width_final = 6, printer_compatible_bevel=1.5 ); } //bearing module test_bearing() { translate([16,16,2]) turbine( thickness = 4, shaft_diameter = 8, //important hub_diameter = 9+(0.34*2*3), //2 cercles blade_count = 6, blade_length = 10, blade_thickness = 0.34*3, attack_angle = 0, housing_thickness = 0.34*3, blade_width_hub = 6, blade_width_final = 6, printer_compatible_bevel=0 ); } scale(1) { test_rotor(); test_stator(); test_bearing(); }