kcl-samples → cycloidal-gear

cycloidal-gear

cycloidal-gear

KCL

// Cycloidal Gear
// A cycloidal gear is a gear with a continuous, curved tooth profile. They are used in watchmaking and high precision robotics actuation

// Set Units
@settings(defaultLengthUnit = in)


fn cycloidalGear(gearPitch, gearHeight, holeDiameter, helixAngle) {
  // Create a function to draw the gear profile as a sketch. Rotate each profile about the gear's axis by an helix angle proportional to the total gear height
  fn gearSketch(gHeight) {
    helixAngleP = helixAngle * gHeight / gearHeight
    gearProfile = startSketchOn(offsetPlane("XY", offset = gHeight))
      |> startProfileAt([
           gearPitch * 1.55 * cos(toRadians(helixAngleP)) + gearPitch * sin(toRadians(-helixAngleP)),
           gearPitch * 1.55 * sin(toRadians(helixAngleP)) + gearPitch * cos(toRadians(-helixAngleP))
         ], %)
      |> arc({
           angleStart = 90 + helixAngleP,
           angleEnd = -90 + helixAngleP,
           radius = gearPitch
         }, %)
      |> tangentialArc({
           radius = gearPitch * 1.67,
           offset = 60
         }, %)
      |> tangentialArc({ radius = gearPitch, offset = -180 }, %)
      |> tangentialArc({
           radius = gearPitch * 1.67,
           offset = 60
         }, %)
      |> tangentialArc({ radius = gearPitch, offset = -180 }, %)
      |> tangentialArcTo([profileStartX(%), profileStartY(%)], %)
      |> close(%)
      |> hole(circle({
           center = [0, 0],
           radius = holeDiameter / 2
         }, %), %)
    return gearProfile
  }

  // Draw sketches of the gear profile along the gear height and loft them together
  gearLoft = loft([
    gearSketch(0),
    gearSketch(gearHeight / 2),
    gearSketch(gearHeight)
  ])

  return gearLoft
}

cycloidalGear(.3, 1.5, 0.297, -80)