diff --git a/models/cups.scad b/models/cups.scad new file mode 100644 index 0000000..381017f --- /dev/null +++ b/models/cups.scad @@ -0,0 +1,44 @@ +/* + * Copyright (c) Camden Dixie O'Brien + * SPDX-License-Identifier: AGPL-3.0-only + */ + +module hemisphere (radius) +{ + difference() { + sphere(radius); + translate([0, -radius, -radius]) cube([radius, 2 * radius, 2 * radius]); + } +} + +module cup (cup_radius, cup_thickness, cup_offset, spoke_length, spoke_radius) +{ + translate([0, cup_radius + spoke_length, 0]) scale([1, -1, 1]) + difference() { + union() { + translate([spoke_radius + cup_offset, 0, 0]) hemisphere(cup_radius); + rotate([-90, 0, 0]) + cylinder(cup_radius + spoke_length, r = spoke_radius); + } + translate([spoke_radius + cup_offset, 0, 0]) sphere(cup_radius - cup_thickness); + }; +} + +module cups (n_cups, hub_height, hub_outer_radius, hub_inner_radius, + cup_radius, cup_thickness, cup_offset, spoke_length, + spoke_radius) +{ + difference() { + union() { + cylinder(hub_height, r = hub_outer_radius, center = true); + for (i = [0 : n_cups - 1]) { + rotate([0, 0, i * 360 / n_cups]) + cup(cup_radius, cup_thickness, cup_offset, spoke_length, + spoke_radius); + } + } + cylinder(hub_height + 1, r = hub_inner_radius, center = true); + } +} + +cups(5, 20, 18, 6, 40, 3, 6, 60, 8); diff --git a/models/vane.scad b/models/vane.scad new file mode 100644 index 0000000..ed63a1a --- /dev/null +++ b/models/vane.scad @@ -0,0 +1,43 @@ +/* + * Copyright (c) Camden Dixie O'Brien + * SPDX-License-Identifier: AGPL-3.0-only + */ + +module shaft (length, radius, taper_length) +{ + translate([-length / 2, 0, 0]) rotate([0, 90, 0]) { + non_tapered_length = length - taper_length; + cylinder(non_tapered_length, r = radius); + translate([0, 0, non_tapered_length]) + cylinder(taper_length, radius, 0); + } +} + +module panel (length, height, thickness, wedge_length) +{ + rotate([90, 0, 0]) + translate([0, 0, -thickness / 2]) + scale([-1, 1, 1]) + linear_extrude(thickness) + polygon([[0, 0], [wedge_length, height], [length, height], [length, 0]]); +} + +module vane (length, shaft_radius, shaft_taper_length, panel_height, + panel_thickness, panel_wedge_length, hub_height, hub_outer_radius, + hub_inner_radius) +{ + union () { + difference () { + union () { + shaft (length, shaft_radius, shaft_taper_length); + cylinder(hub_height, r = hub_outer_radius, center = true); + } + cylinder(hub_height + 1, r = hub_inner_radius, center = true); + } + panel_length = length / 2 - hub_outer_radius; + translate ([-hub_outer_radius, 0, 0]) + panel (panel_length, panel_height, panel_thickness, panel_wedge_length); + } +} + +vane (260, 6, 24, 80, 3, 40, 14, 12, 6);