File: turbine.scad - Tab length: 1 2 4 8 - Lines: on off - No wrap: on off

/*
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();
}