From 74145f88d2803222f412b324216281ff5871d490 Mon Sep 17 00:00:00 2001 From: Leni Aniva Date: Mon, 12 May 2025 12:24:33 -0700 Subject: [PATCH] Add bolts on rotor --- nhf/touhou/yasaka_kanako/onbashira.py | 63 ++++++++++++++++++++++++--- 1 file changed, 56 insertions(+), 7 deletions(-) diff --git a/nhf/touhou/yasaka_kanako/onbashira.py b/nhf/touhou/yasaka_kanako/onbashira.py index 5750abb..6a82d0c 100644 --- a/nhf/touhou/yasaka_kanako/onbashira.py +++ b/nhf/touhou/yasaka_kanako/onbashira.py @@ -25,13 +25,17 @@ class Onbashira(Model): # Size of ball bearings bearing_ball_diam: float = 25.4 * 1/2 bearing_ball_gap: float = .5 - bearing_height: float = 40.0 + # Thickness of bearing disks bearing_thickness: float = 20.0 bearing_track_radius: float = 120.0 # Gap between the inner and outer bearing disks bearing_gap: float = 10.0 bearing_disk_thickness: float = 25.4 / 8 + rotor_bind_bolt_diam: float = 10.0 + rotor_bind_radius: float = 50.0 + stator_bind_radius: float = 150.0 + material_side: Material = Material.WOOD_BIRCH material_bearing: Material = Material.PLASTIC_PLA material_bearing_ball: Material = Material.ACRYLIC_TRANSPARENT @@ -41,8 +45,9 @@ class Onbashira(Model): assert self.n_side >= 3 # Bulk must be large enough for the barrel + bearing to rotate assert self.bulk_radius - self.side_thickness - self.bearing_thickness - self.bearing_diam > self.rotation_radius + self.barrel_diam / 2 - assert self.bearing_height > self.bearing_diam assert self.bearing_gap < 0.95 * self.bearing_ball_diam + assert self.rotor_bind_bolt_diam < self.rotor_bind_radius < self.bearing_track_radius + assert self.bearing_track_radius < self.stator_bind_radius @property def angle_side(self) -> float: @@ -62,6 +67,9 @@ class Onbashira(Model): @property def bearing_disk_gap(self) -> float: + """ + Gap between two bearing disks to touch the bearing balls + """ diag = self.bearing_ball_diam dx = self.bearing_gap return math.sqrt(diag ** 2 - dx ** 2) @@ -72,6 +80,12 @@ class Onbashira(Model): Cq.Sketch() .regularPolygon(self.side_width, self.n_side) .circle(self.bearing_track_radius + self.bearing_gap/2, mode="s") + .reset() + .regularPolygon( + self.stator_bind_radius, self.n_side, + mode="c", tag="bolt") + .vertices(tag="bolt") + .circle(self.rotor_bind_bolt_diam/2, mode="s") ) def bearing_stator(self) -> Cq.Workplane: return ( @@ -81,12 +95,22 @@ class Onbashira(Model): ) @target(name="bearing-rotor", kind=TargetKind.DXF) def profile_bearing_rotor(self) -> Cq.Sketch: + bolt_angle = 180 / self.n_side return ( Cq.Sketch() .circle(self.bearing_track_radius - self.bearing_gap/2) - .regularPolygon(self.rotation_radius, self.n_side) - .vertices() + .reset() + .regularPolygon( + self.rotation_radius, self.n_side, + mode="c", tag="corners") + .vertices(tag="corners") .circle(self.barrel_diam/2, mode="s") + .reset() + .regularPolygon( + self.rotor_bind_radius, self.n_side, + mode="c", tag="bolt", angle=bolt_angle) + .vertices(tag="bolt") + .circle(self.rotor_bind_bolt_diam/2, mode="s") ) def bearing_rotor(self) -> Cq.Workplane: return ( @@ -96,7 +120,25 @@ class Onbashira(Model): ) @target(name="bearing-gasket", kind=TargetKind.DXF) def profile_bearing_gasket(self) -> Cq.Sketch: - pass + dr = self.bearing_ball_diam + eps = 0.05 + return ( + Cq.Sketch() + .circle(self.bearing_track_radius + dr) + .circle(self.bearing_track_radius - dr, mode="s") + .reset() + .regularPolygon( + self.bearing_track_radius, self.n_bearing_balls, + mode="c", tag="corners") + .vertices(tag="corners") + .circle(self.bearing_ball_diam/2 * (1+eps), mode="s") + ) + def bearing_gasket(self) -> Cq.Workplane: + return ( + Cq.Workplane() + .placeSketch(self.profile_bearing_gasket()) + .extrude(self.bearing_disk_thickness) + ) @target(name="pipe", kind=TargetKind.DXF) @@ -138,7 +180,7 @@ class Onbashira(Model): return Cq.Solid.makeSphere(radius=self.bearing_ball_diam/2, angleDegrees1=-90) def assembly_rotor(self) -> Cq.Assembly: - z_lower = -self.bearing_disk_gap - self.bearing_disk_thickness + z_lower = -self.bearing_disk_gap/2 - self.bearing_disk_thickness a = ( Cq.Assembly() .addS( @@ -169,6 +211,13 @@ class Onbashira(Model): role=Role.ROTOR, loc=Cq.Location(0, 0, z_lower) ) + .addS( + self.bearing_gasket(), + name="gasket", + material=self.material_bearing, + role=Role.ROTOR, + loc=Cq.Location(0, 0, -self.bearing_disk_thickness/2) + ) ) for i in range(self.n_bearing_balls): ball = self.bearing_ball() @@ -186,7 +235,7 @@ class Onbashira(Model): a = Cq.Assembly() side = self.side_panel() r = self.bulk_radius - a = a.add(self.assembly_bearing(), name="bearing") + a = a.add(self.assembly_rotor(), name="rotor") for i in range(self.n_side): a = a.addS( side,