# No. 271 (Brown 1868): "On vibrating the lever to which the two pawls are attached, a nearly continuous rectilinear motion is given to the ratchet-bar."
#
# Model (cm, gravity on): the hand-lever, pivoted on a post at 6 cm, is the one driven joint, rocked 0.5 rad each way 0.5 times a second. Two pawls hang from it on
# pins 2 cm above and below its pivot, so as it rocks one pin goes back while the other goes forward, each through 1.92 cm. Each pawl lies by its own weight and a light
# spring on the ratchet-bar's teeth (pitch 0.3, vertical faces toward the lever) and pushes the bar to the left on its stroke, slipping back over the teeth on the other:
# the bar goes on at every stroke of the lever, either way. The bar works against a drag on its slide. Generator: opencode-runs/batch12/gen271.py.
number: 271
slug: two-pawl-lever-ratchet-bar
name: A lever with two pawls driving a ratchet-bar
brown: "On vibrating the lever to which the two pawls are attached, a nearly continuous rectilinear motion is given to the ratchet-bar."
units: cm
sim:
  timestep: 0.0002
  integrator: implicitfast
  iterations: 100
  solver: CG
  multiccd: true
  duration_s: 8.5
  floor: false
bodies:
  - id: lever
    shape: part
    pos: [0, 0, 6.0]
    density: 2700
    color: "#b8ad97"
    pieces:
      - {kind: poly, points: [[-0.5, 3.4], [0.5, 3.4], [0.6, 8.6], [-0.6, 8.6]], y: [0.05, 0.35], collide: 0}   # the lever's plate, carrying the pins
      - {kind: poly, points: [[-0.35, 6.2], [7.47, 10.79], [7.47, 11.39], [-0.35, 6.8]], y: [0.05, 0.35], collide: 0}   # its handle
      - {kind: disc, center: [0, 6.0], radius: 2.5, y: [1.5, 2.1], collide: 0, density: 7800, color: "#8f8a80"}   # a hand-wheel on the lever's arbor, behind the post
  - id: bar
    shape: part
    pos: [0, 0, 0]
    density: 2700
    color: "#d9c9a3"
    pieces:
      - {kind: poly, points: [[-20.0, 0], [13.0, 0], [13.0, 1.0], [-20.0, 1.0]], y: [-0.6, 0.6], collide: 0}   # the ratchet-bar
      - {kind: poly, points: [[-19.0, 1.0], [-18.7, 1.2], [-18.7, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-18.7, 1.0], [-18.4, 1.2], [-18.4, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-18.4, 1.0], [-18.1, 1.2], [-18.1, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-18.1, 1.0], [-17.8, 1.2], [-17.8, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-17.8, 1.0], [-17.5, 1.2], [-17.5, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-17.5, 1.0], [-17.2, 1.2], [-17.2, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-17.2, 1.0], [-16.9, 1.2], [-16.9, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-16.9, 1.0], [-16.6, 1.2], [-16.6, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-16.6, 1.0], [-16.3, 1.2], [-16.3, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-16.3, 1.0], [-16.0, 1.2], [-16.0, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-16.0, 1.0], [-15.7, 1.2], [-15.7, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-15.7, 1.0], [-15.4, 1.2], [-15.4, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-15.4, 1.0], [-15.1, 1.2], [-15.1, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-15.1, 1.0], [-14.8, 1.2], [-14.8, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-14.8, 1.0], [-14.5, 1.2], [-14.5, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-14.5, 1.0], [-14.2, 1.2], [-14.2, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-14.2, 1.0], [-13.9, 1.2], [-13.9, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-13.9, 1.0], [-13.6, 1.2], [-13.6, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-13.6, 1.0], [-13.3, 1.2], [-13.3, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-13.3, 1.0], [-13.0, 1.2], [-13.0, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-13.0, 1.0], [-12.7, 1.2], [-12.7, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-12.7, 1.0], [-12.4, 1.2], [-12.4, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-12.4, 1.0], [-12.1, 1.2], [-12.1, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-12.1, 1.0], [-11.8, 1.2], [-11.8, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-11.8, 1.0], [-11.5, 1.2], [-11.5, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-11.5, 1.0], [-11.2, 1.2], [-11.2, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-11.2, 1.0], [-10.9, 1.2], [-10.9, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-10.9, 1.0], [-10.6, 1.2], [-10.6, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-10.6, 1.0], [-10.3, 1.2], [-10.3, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-10.3, 1.0], [-10.0, 1.2], [-10.0, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-10.0, 1.0], [-9.7, 1.2], [-9.7, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-9.7, 1.0], [-9.4, 1.2], [-9.4, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-9.4, 1.0], [-9.1, 1.2], [-9.1, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-9.1, 1.0], [-8.8, 1.2], [-8.8, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-8.8, 1.0], [-8.5, 1.2], [-8.5, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-8.5, 1.0], [-8.2, 1.2], [-8.2, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-8.2, 1.0], [-7.9, 1.2], [-7.9, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-7.9, 1.0], [-7.6, 1.2], [-7.6, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-7.6, 1.0], [-7.3, 1.2], [-7.3, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-7.3, 1.0], [-7.0, 1.2], [-7.0, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-7.0, 1.0], [-6.7, 1.2], [-6.7, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-6.7, 1.0], [-6.4, 1.2], [-6.4, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-6.4, 1.0], [-6.1, 1.2], [-6.1, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-6.1, 1.0], [-5.8, 1.2], [-5.8, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-5.8, 1.0], [-5.5, 1.2], [-5.5, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-5.5, 1.0], [-5.2, 1.2], [-5.2, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-5.2, 1.0], [-4.9, 1.2], [-4.9, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-4.9, 1.0], [-4.6, 1.2], [-4.6, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-4.6, 1.0], [-4.3, 1.2], [-4.3, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-4.3, 1.0], [-4.0, 1.2], [-4.0, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-4.0, 1.0], [-3.7, 1.2], [-3.7, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-3.7, 1.0], [-3.4, 1.2], [-3.4, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-3.4, 1.0], [-3.1, 1.2], [-3.1, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-3.1, 1.0], [-2.8, 1.2], [-2.8, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-2.8, 1.0], [-2.5, 1.2], [-2.5, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-2.5, 1.0], [-2.2, 1.2], [-2.2, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-2.2, 1.0], [-1.9, 1.2], [-1.9, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-1.9, 1.0], [-1.6, 1.2], [-1.6, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-1.6, 1.0], [-1.3, 1.2], [-1.3, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-1.3, 1.0], [-1.0, 1.2], [-1.0, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-1.0, 1.0], [-0.7, 1.2], [-0.7, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-0.7, 1.0], [-0.4, 1.2], [-0.4, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-0.4, 1.0], [-0.1, 1.2], [-0.1, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[-0.1, 1.0], [0.2, 1.2], [0.2, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[0.2, 1.0], [0.5, 1.2], [0.5, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[0.5, 1.0], [0.8, 1.2], [0.8, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[0.8, 1.0], [1.1, 1.2], [1.1, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[1.1, 1.0], [1.4, 1.2], [1.4, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[1.4, 1.0], [1.7, 1.2], [1.7, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[1.7, 1.0], [2.0, 1.2], [2.0, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[2.0, 1.0], [2.3, 1.2], [2.3, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[2.3, 1.0], [2.6, 1.2], [2.6, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[2.6, 1.0], [2.9, 1.2], [2.9, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[2.9, 1.0], [3.2, 1.2], [3.2, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[3.2, 1.0], [3.5, 1.2], [3.5, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[3.5, 1.0], [3.8, 1.2], [3.8, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[3.8, 1.0], [4.1, 1.2], [4.1, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[4.1, 1.0], [4.4, 1.2], [4.4, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[4.4, 1.0], [4.7, 1.2], [4.7, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[4.7, 1.0], [5.0, 1.2], [5.0, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[5.0, 1.0], [5.3, 1.2], [5.3, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[5.3, 1.0], [5.6, 1.2], [5.6, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[5.6, 1.0], [5.9, 1.2], [5.9, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[5.9, 1.0], [6.2, 1.2], [6.2, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[6.2, 1.0], [6.5, 1.2], [6.5, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[6.5, 1.0], [6.8, 1.2], [6.8, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[6.8, 1.0], [7.1, 1.2], [7.1, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[7.1, 1.0], [7.4, 1.2], [7.4, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[7.4, 1.0], [7.7, 1.2], [7.7, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[7.7, 1.0], [8.0, 1.2], [8.0, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[8.0, 1.0], [8.3, 1.2], [8.3, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[8.3, 1.0], [8.6, 1.2], [8.6, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[8.6, 1.0], [8.9, 1.2], [8.9, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[8.9, 1.0], [9.2, 1.2], [9.2, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[9.2, 1.0], [9.5, 1.2], [9.5, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[9.5, 1.0], [9.8, 1.2], [9.8, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[9.8, 1.0], [10.1, 1.2], [10.1, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[10.1, 1.0], [10.4, 1.2], [10.4, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[10.4, 1.0], [10.7, 1.2], [10.7, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[10.7, 1.0], [11.0, 1.2], [11.0, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[11.0, 1.0], [11.3, 1.2], [11.3, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[11.3, 1.0], [11.6, 1.2], [11.6, 1.0]], y: [-0.6, 0.6], collide: 2}
      - {kind: poly, points: [[11.6, 1.0], [11.9, 1.2], [11.9, 1.0]], y: [-0.6, 0.6], collide: 2}
  - id: pawl_a
    shape: part
    pos: [0, 0, 8.0]
    mount: lever
    density: 7800
    friction: 0.3
    color: "#e4d9bf"
    pieces:
      - {kind: poly, points: [[0.087, 7.8424], [-11.913, 1.2124], [-12.087, 1.5276], [-0.087, 8.1576]], y: [-0.25, 0.05], collide: 0}   # the pawl
      - {kind: disc, center: [-12.0, 1.37], radius: 0.15, y: [-0.3, 0.3], collide: 1}   # its tip
      - {kind: rod, from: [0, -0.3, 8.0], to: [0, 0.7, 8.0], radius: 0.22, collide: 0, color: "#6f675a"}   # its pin in the lever
  - id: pawl_b
    shape: part
    pos: [0, 0, 4.0]
    mount: lever
    density: 7800
    friction: 0.3
    color: "#e0d2b0"
    pieces:
      - {kind: poly, points: [[0.0723, 3.8351], [-5.9277, 1.2051], [-6.0723, 1.5349], [-0.0723, 4.1649]], y: [0.35, 0.65], collide: 0}   # the pawl
      - {kind: disc, center: [-6.0, 1.37], radius: 0.15, y: [-0.3, 0.3], collide: 1}   # its tip
      - {kind: rod, from: [0, -0.3, 4.0], to: [0, 0.7, 4.0], radius: 0.22, collide: 0, color: "#6f675a"}   # its pin in the lever
  - id: frame
    shape: part
    pos: [0, 0, 0]
    fixed: true
    color: "#cfc6b4"
    pieces:
      - {kind: poly, points: [[-30, -2.4], [8, -2.4], [8, -1.6], [-30, -1.6]], y: [-3, 3], collide: 0, color: "#b9b09c"}   # the bed
      - {kind: poly, points: [[-25, -1.6], [5, -1.6], [5, -0.05], [-25, -0.05]], y: [-1.0, 1.0], collide: 0, color: "#a39a86"}   # the bar's way
      - {kind: poly, points: [[1.6, -1.6], [3.0, -1.6], [3.0, 6.6], [1.6, 6.6]], y: [0.4, 1.4], collide: 0}   # the lever's post
      - {kind: rod, from: [0, 0.35, 6.0], to: [0, 2.1, 6.0], radius: 0.3, collide: 0, color: "#8f8a80"}   # its pivot
      - {kind: poly, points: [[1.0, 5.6], [3.0, 5.6], [3.0, 6.4], [1.0, 6.4]], y: [0.4, 1.4], collide: 0}
joints:
  - {id: j_l, type: hinge, body: lever, axis: [0, 1, 0], damping: 0.05}   # the one driven joint; + : the top pin to the right
  - {id: j_b, type: slide, body: bar, axis: [1, 0, 0], damping: 20}   # the ratchet-bar; - : to the left
  - {id: j_a, type: hinge, body: pawl_a, axis: [0, 1, 0], stiffness: 0.02, springref: -0.3, range: [-1.3, 1.3], damping: 0.0005}   # the upper pawl; - : tip down
  - {id: j_bb, type: hinge, body: pawl_b, axis: [0, 1, 0], stiffness: 0.02, springref: -0.3, range: [-1.3, 1.3], damping: 0.0005}   # the lower pawl
contact: {solref: [0.001, 1], solimp: [0.95, 0.99, 0.0005], margin: 0}
driver: {joint: j_l, kind: velocity, rpm: 1, kv: 3.0, max_torque: 30, swing: {amplitude: 0.5, hz: 0.5}}
checks:
  - {type: advance, joint: j_b, beat: j_l, expect: -0.0177, tol: 0.1149, settle_s: 0.5, window_s: 7.5}   # the bar goes on at every stroke, either way: a pin's stroke (1.918 cm) less up to a tooth's pickup
  - {type: monotonic, joint: j_b, direction: -1, max_back: 0.0015, settle_s: 0.5, window_s: 7.5}   # and never goes back as much as half a tooth
camera: {target: [-6.0, 0, 1.0], position: [-6.0, -60.0, 8.0], fov: 34.0}
display:
  output: j_b
  labels: {j_l: "The lever (driver)", j_b: "The ratchet-bar", j_a: "Upper pawl", j_bb: "Lower pawl"}
  proof: {label: "Two pawls", sub: "one pushes while the other slips back"}

