154 lines
5.7 KiB
OpenSCAD
154 lines
5.7 KiB
OpenSCAD
|
|
// Impeller Parameters
|
||
|
|
diameter = 100; // Overall base diameter
|
||
|
|
hub_diameter = 30; // Diameter of the central hub
|
||
|
|
hub_height = 10; // Height of the central hub
|
||
|
|
base_thickness = 3; // Thickness of the base
|
||
|
|
shaft_diameter = 10; // Diameter of the central shaft hole
|
||
|
|
blade_count = 6; // Number of blades
|
||
|
|
blade_length = 35; // Length of blades from hub
|
||
|
|
blade_thickness = 3; // Thickness of blades
|
||
|
|
blade_height_at_hub = 5; // Blade height at the hub
|
||
|
|
blade_height_at_diameter = 20; // Blade height at full diameter
|
||
|
|
|
||
|
|
module impeller_base() {
|
||
|
|
// Base with hub
|
||
|
|
difference() {
|
||
|
|
union() {
|
||
|
|
// Solid base disk
|
||
|
|
cylinder(h = base_thickness, d = diameter, center = false);
|
||
|
|
|
||
|
|
// Central hub
|
||
|
|
translate([0, 0, base_thickness])
|
||
|
|
cylinder(h = hub_height, d = hub_diameter, center = false);
|
||
|
|
}
|
||
|
|
|
||
|
|
// Countersink for shaft entry
|
||
|
|
translate([0, 0, -0.1])
|
||
|
|
cylinder(h = 1, d1 = shaft_diameter, d2 = shaft_diameter + 2, center = false);
|
||
|
|
|
||
|
|
// Through hole for shaft
|
||
|
|
translate([0, 0, base_thickness - 0.1])
|
||
|
|
cylinder(h = hub_height + 0.2, d = shaft_diameter, center = false);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
module impeller_blade() {
|
||
|
|
// Blade with base always touching the impeller base
|
||
|
|
polyhedron(
|
||
|
|
points = [
|
||
|
|
// Bottom points at hub
|
||
|
|
[hub_diameter/2, -blade_thickness/2, base_thickness],
|
||
|
|
[hub_diameter/2, blade_thickness/2, base_thickness],
|
||
|
|
|
||
|
|
// Bottom points at full diameter
|
||
|
|
[diameter/2, -blade_thickness/2, base_thickness],
|
||
|
|
[diameter/2, blade_thickness/2, base_thickness],
|
||
|
|
|
||
|
|
// Top points at hub
|
||
|
|
[hub_diameter/2, -blade_thickness/2, base_thickness + blade_height_at_hub],
|
||
|
|
[hub_diameter/2, blade_thickness/2, base_thickness + blade_height_at_hub],
|
||
|
|
|
||
|
|
// Top points at full diameter
|
||
|
|
[diameter/2, -blade_thickness/2, base_thickness + blade_height_at_diameter],
|
||
|
|
[diameter/2, blade_thickness/2, base_thickness + blade_height_at_diameter]
|
||
|
|
],
|
||
|
|
faces = [
|
||
|
|
[0, 2, 3, 1], // Bottom face
|
||
|
|
[0, 1, 5, 4], // Inner side bottom
|
||
|
|
[2, 6, 7, 3], // Outer side bottom
|
||
|
|
[4, 5, 7, 6], // Top face
|
||
|
|
[0, 4, 6, 2], // Side face 1
|
||
|
|
[1, 3, 7, 5] // Side face 2
|
||
|
|
]
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
module impeller_blade() {
|
||
|
|
polyhedron(
|
||
|
|
points = [
|
||
|
|
// Bottom points at hub - SHIFTED OUTWARD
|
||
|
|
[hub_diameter/2 + base_thickness * tan(30), -blade_thickness/2, base_thickness],
|
||
|
|
[hub_diameter/2 + base_thickness * tan(30), blade_thickness/2, base_thickness],
|
||
|
|
|
||
|
|
// Bottom points at full diameter - SHIFTED OUTWARD
|
||
|
|
[diameter/2 + base_thickness * tan(30), -blade_thickness/2, base_thickness],
|
||
|
|
[diameter/2 + base_thickness * tan(30), blade_thickness/2, base_thickness],
|
||
|
|
|
||
|
|
// Top points at hub - INCREASED RADIAL ANGLE
|
||
|
|
[hub_diameter/2 + blade_height_at_hub * tan(30), -blade_thickness/2, base_thickness + blade_height_at_hub],
|
||
|
|
[hub_diameter/2 + blade_height_at_hub * tan(30), blade_thickness/2, base_thickness + blade_height_at_hub],
|
||
|
|
|
||
|
|
// Top points at full diameter - INCREASED RADIAL ANGLE
|
||
|
|
[diameter/2 + blade_height_at_diameter * tan(30), -blade_thickness/2, base_thickness + blade_height_at_diameter],
|
||
|
|
[diameter/2 + blade_height_at_diameter * tan(30), blade_thickness/2, base_thickness + blade_height_at_diameter]
|
||
|
|
],
|
||
|
|
faces = [
|
||
|
|
[0, 2, 3, 1], // Bottom face
|
||
|
|
[0, 1, 5, 4], // Inner side bottom
|
||
|
|
[2, 6, 7, 3], // Outer side bottom
|
||
|
|
[4, 5, 7, 6], // Top face
|
||
|
|
[0, 4, 6, 2], // Side face 1
|
||
|
|
[1, 3, 7, 5] // Side face 2
|
||
|
|
]
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
module impeller_blades() {
|
||
|
|
// Add blades
|
||
|
|
for (i = [0:360/blade_count:359]) {
|
||
|
|
rotate([0, 0, i]) {
|
||
|
|
impeller_blade();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
module impeller_column() {
|
||
|
|
// Column Parameters
|
||
|
|
column_height = blade_height_at_diameter + base_thickness; // Height matches blade height
|
||
|
|
num_ports = blade_count; // Number of ports matching blade count
|
||
|
|
wall_thickness = 5; // Thickness of the column wall
|
||
|
|
outer_diameter = diameter; // Diameter of the impeller base
|
||
|
|
|
||
|
|
// Calculate port width based on equal arc length
|
||
|
|
port_width = (PI * outer_diameter) / (num_ports * 2);
|
||
|
|
|
||
|
|
// Calculate inner diameter based on wall thickness
|
||
|
|
inner_diameter = outer_diameter - (2 * wall_thickness);
|
||
|
|
|
||
|
|
// Rotate by half the port width
|
||
|
|
rotate([0, 0, 180/(num_ports * 2)])
|
||
|
|
difference() {
|
||
|
|
union() {
|
||
|
|
// Main cylindrical body
|
||
|
|
cylinder(h = column_height, d = outer_diameter, $fn = 100);
|
||
|
|
|
||
|
|
// Close the bottom with wall_thickness height
|
||
|
|
cylinder(h = wall_thickness, d = outer_diameter, $fn = 100);
|
||
|
|
}
|
||
|
|
|
||
|
|
// Hollow out the center (open on top end)
|
||
|
|
translate([0, 0, wall_thickness])
|
||
|
|
cylinder(h = column_height + 1, d = inner_diameter, $fn = 100);
|
||
|
|
|
||
|
|
// Create evenly spaced rectangular ports
|
||
|
|
for (i = [0 : num_ports - 1]) {
|
||
|
|
rotate([0, 0, i * (360 / num_ports)])
|
||
|
|
translate([outer_diameter/2 - wall_thickness * 2, -port_width/2, 0])
|
||
|
|
cube([wall_thickness * 2 + 1, port_width, column_height + 10]);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
module complete_impeller() {
|
||
|
|
// Combine base and blades
|
||
|
|
impeller_base();
|
||
|
|
impeller_blades();
|
||
|
|
//impeller_column();
|
||
|
|
}
|
||
|
|
|
||
|
|
// Render the complete impeller
|
||
|
|
complete_impeller();
|