sirens/designs/openscad/stator_iris_top.scad

293 lines
8.4 KiB
OpenSCAD
Raw Normal View History

/* [Siren General Parameters] */
siren_diameter = 121; // Base diameter - 121 for rotor to fit original siren
siren_height = 60; // Height of the rotor - 60 for rotor to fit original siren
number_of_ports = 6; // Number of ports
tolerance = 2; // Tolerance between stator and rotor
pressure_zone = 0.5; // Percentage of diameter
round_radius = 4; // Rounding of top/bottom
$fn = $preview ? 32 : 128; // Number of fragments
/* [Stator Parameters] */
stator_wall_thickness = 8; // Stator wall thickness
number_of_mounting_holes = 4; // Number of mounting holes
screw_diameter = 3.2; // Diameter of screws - M3 clearance hole (3.2mm diameter)
screw_bore_diameter = 6.5;
screw_insert_diameter = 4.5;
screw_bore_depth = 2.5;
screw_length = 10 - (stator_wall_thickness - screw_bore_depth);
stator_screw_offset = siren_diameter/2 - stator_wall_thickness/2; //distance to screws
/* [Rotor Parameters] */
rotor_wall_thickness = 3; // Rotor wall thickness
hub_height = 3;
hub_diameter = 12;
blade_angle = 8;
port_height = siren_height - (rotor_wall_thickness * 2) - (tolerance * 2); // Height of the port
/* [Motor Parameters] */
motor_shaft_diameter = 8; // Diameter of the motor body
motor_frame_diameter = 60;
motor_diameter = 28; // Diameter of the motor body
motor_height = 24;
magnet_diameter = 7;
motor_screw_x_offset = 9.5;
motor_screw_y_offset = 8;
motor_screw_offset = 8;
motor_frame_screw_offset = motor_frame_diameter/2 - stator_wall_thickness/2; //distance to screws
/* [Base Parameters] */
leg_screw_offset = motor_frame_diameter / 2 + 5;
leg_height = motor_height + 10;
/* [Iris Parameters] */
iris_blade_arc_angle = 135;
number_of_iris_blades = 8;
// helper functions
module ports(diameter, height, ports, r_offset = 0) {
radius = diameter / 2;
angle = (180 / ports) - (r_offset * 6);
rotate([0, 0, 180 / ports])
for (i = [0:360/ports:360]) {
rotate([0, 0, i + (r_offset * 6 / 2)])
linear_extrude(height)
polygon(concat(
[[0, 0]], // Center point
[for (j = [0 : $fn])
[radius * cos(angle * j / $fn),
radius * sin(angle * j / $fn)]]
));
}
}
module column(outer_diameter, inner_diameter, height, z_offset = 0) {
difference(){
// Outer cylinder
cylinder(d = outer_diameter, h = height);
// Subtract inner cylinder
translate([0, 0, z_offset])
cylinder(d = inner_diameter, h = height - z_offset);
}
}
module rounded_column(outer_diameter, inner_diameter, height, z_offset = 0){
difference() {
// Rounded top
intersection() {
// Unrounded full cylinder
cylinder(d = outer_diameter, h = height);
// Add Minkowski rounded version
minkowski() {
cylinder(h = height - round_radius, d = outer_diameter - round_radius * 2);
sphere(r = round_radius);
}
}
// Subtract inner cylinder
translate([0, 0, z_offset])
cylinder(d = inner_diameter, h = height);
}
}
module counter_bored_holes(screw_offset){
// Subtract mounting holes for stator
for (i = [0:360/number_of_mounting_holes:360]) {
// Subtract screw hole
rotate([0, 0, i])
translate([screw_offset, 0, -1]) // Adjusted position
cylinder(d = screw_diameter, h = stator_wall_thickness + 2);
// Subtract counterbore
rotate([0, 0, i])
translate([screw_offset, 0, stator_wall_thickness - screw_bore_depth]) // Adjusted position
cylinder(d = screw_bore_diameter, h = stator_wall_thickness);
}
}
module mounting_holes(screw_offset){
for (i = [0:360/number_of_mounting_holes:360]) {
rotate([0, 0, i])
translate([screw_offset, 0, 0])
cylinder(d = screw_insert_diameter, h = screw_length);
}
}
// Linear Interpolation
function lerp(a, b, t) = a * (1 - t) + b * t;
// Arc between points function
function arc_between_points(p1, p2, height, steps=20) =
[for(t = [0:1/steps:1])
let(
x = lerp(p1.x, p2.x, t),
y = lerp(p1.y, p2.y, t),
// Parabolic arc height calculation
arc_height = height * (1 - pow(2*t-1, 2))
)
[x, y + arc_height]
];
function bezier_curve(t, p0, p1, p2, p3, p4) =
pow(1-t, 4) * p0 +
4 * pow(1-t, 3) * t * p1 +
6 * pow(1-t, 2) * pow(t, 2) * p2 +
4 * (1-t) * pow(t, 3) * p3 +
pow(t, 4) * p4;
function curved_polygon(points, steps, x_shift, y_shift) =
let(
left_curve = [for (t = [0 : 1/steps : 1])
bezier_curve(t, points[0], points[1], points[2], points[3], points[4])
],
right_curve = [for (pt = left_curve)
[pt[0] + x_shift, pt[1] + y_shift]
]
)
concat(left_curve, [for (i = [len(right_curve)-1 : -1 : 0]) right_curve[i]]);
module stator_top() {
difference(){
rounded_column(
siren_diameter,
siren_diameter * pressure_zone,
stator_wall_thickness
);
counter_bored_holes(stator_screw_offset);
}
}
module iris_top() {
outer_diameter = stator_screw_offset * 2 - 5;
inner_diameter = siren_diameter * pressure_zone + 5;
blade_height = 0.5;
center = (inner_diameter / 2) + ((outer_diameter - inner_diameter) / 4);
difference(){
column(
outer_diameter,
inner_diameter,
3
);
translate([0, 0, 2])
linear_extrude(){
for (i = [0:360/8:360]) {
rotate([0, 0, i])
translate([center, 0, 0])
rotate([0, 0, 90])
square([5, 25], center = true);
}
}
}
column(outer_diameter + 0.5, outer_diameter - 0.5, 5);
}
module iris_bottom() {
outer_diameter = stator_screw_offset * 2 - 5;
inner_diameter = siren_diameter * pressure_zone + 5;
//blade_height = 0.5;
center = (inner_diameter / 2) + ((outer_diameter - inner_diameter) / 4);
difference(){
column(
siren_diameter,
siren_diameter * pressure_zone,
3
);
translate([0, 0, 2])
linear_extrude(){
for (i = [0:360/8:360]) {
rotate([0, 0, i])
translate([center, 0, 0])
circle(2.5);
}
}
counter_bored_holes(stator_screw_offset);
translate([0, 0, 1])
column(outer_diameter + 1, outer_diameter - 1, 10);
}
}
module iris_blade() {
outer_diameter = stator_screw_offset * 2 - 10;
inner_diameter = siren_diameter * pressure_zone + 10;
blade_height = 0.5;
center = (inner_diameter / 2) + ((outer_diameter - inner_diameter) / 4);
linear_extrude(blade_height){
difference(){
for (i = [0:iris_blade_arc_angle/$fn:iris_blade_arc_angle]) {
rotate([0, 0, i])
translate([center, 0, 0])
circle((outer_diameter - inner_diameter) / 4);
}
translate([center, 0, 0])
circle(2.5);
rotate([0, 0, iris_blade_arc_angle])
translate([center, 0, 0])
circle(2.5);
}
}
}
//color("blue")
iris_bottom();
translate([0, 0, 2])
color("red")
iris_blade();
translate([0, 0, 10])
iris_top();
/*
iris_blade_arc_angle = 135;
number_of_iris_blades = 8;
outer_diameter = stator_screw_offset * 2 - tolerance;
inner_diameter = siren_diameter * pressure_zone + tolerance;
center = (inner_diameter / 2) + ((outer_diameter - inner_diameter) / 4);
rotate([0, 0, 0])
color("blue")
square([5, 200]);
//iris_top();
rotate([0, 0, -45])
for(i = [0:360/8:360/8 * 0]){
//this point is the radial translation of the rh pin based on angle of the blade
pin_angle = -70;
echo(center * cos(pin_angle), center * sin(pin_angle));
//echo((center * cos(pin_angle)) + pin_angle);
//rotate([0, 0, -10])
rotate([0, 0, i])
translate([(center + 0) * cos(pin_angle), (center + 0) * sin(pin_angle), i/50])
rotate([0, 0, -35])
//rotate([0, 0, -0 + (pin_angle / ((iris_blade_arc_angle / -(pin_angle)) + 1))])
translate([-center, 0, 0])
color("red")
iris_blade();
}
translate([0, 0, -10])
circle(d = center * 2);
*/