Back to It
Past time to get back to the linkage. I’m glad I’m not on a deadline—other than the big one—and I don’t know when that is. Anyway, let’s add a link or two. Result: WOOT!
The current state of the linkage in the test picture looks like this:

The near-vertical red line near the top is the most recently added Component, a bell crank. I’m working from a diagram borrowed from the Internet, on which I’ve drawn a grid. I think I should annotate that diagram and share it with you, so that you can see what’s happening, and about to happen, more readily, in case you are interested. Here you go, showing our current state, with Bell Crank, and the new Arc Rod that we’ll do below:

Here’s the code that produces the above diagram:
def w_linkage(linkage):
global wheel
bell_pos = vector(6.5, 1.8)
linkage.add(
FixedPoint(vector(1.75, 3.5)),
wheel := Wheel(),
crank1 := Crank(radius=1, lead_degrees=0),
ConRod(length=8,piston_angle = 0)
)
linkage.parent = wheel
linkage.add(
crank_2 := Crank(radius = 0.5, lead_degrees = -90),
ArcRod(length=4.5, target_position=bell_pos,
target_radius= 1.5, target_angle = 0)
)
linkage.add(
bell1 := BellCrank(center=bell_pos,
input_radius=1.5,
output_radius=0.5,
angle=0),
)
Note that the final bell crank has an output at angle zero, namely right on the line between its pivot at the top and driven end at the bottom of the red line. In the Walschaerts diagram, the same bell crank is shown as a sort of backward L shape. We’re about to put in part of the blue, nearly horizontal line from that diagram.
The “insight” that makes me believe it is possible to define the W linkage with my current scheme is that the segment from the driving part of the bell crank must connect to the short red link, angling down from the green structure to the far left of my diagram, not yet shown on the working picture. At any given setting of the controls, that green structure doesn’t move, so the connection from bell crank driven bit should be an ArcRod. If I’m right about that, that’s what we’ll do next, a short blue line from the driving point of the bell crank to an arc of radius about 1, around the end of the green line.
I’ll estimate the coordinates from my gridded diagram.
First, I need to see how ArcRod works. It has been literally days since I used it.
class ArcRod(Component):
def __init__(self, *, length, target_position, target_radius, target_angle):
self._length = length
self._target_position = target_position
self._target_radius = target_radius
radius_vector = vector(target_radius, 0)
self._target_offset = radius_vector.rotate_xy(target_angle*math.pi/180)
Ah, easy enough, I think. The ArcRod parent should be the BellCrank that we just did:
For my first attempt:
target_position = vector(5.6, 1.75)
linkage.add(
bell1 := BellCrank(center=bell_pos,
input_radius=1.5,
output_radius=0.5,
angle=0),
ArcRod(length=1,
target_position=target_position,
target_radius=1,
target_angle=180),
)
With luck, this is good except for the target angle. That’s used to control which side of the arc the ArcRod selects, and it is fiddly. Too fiddly, really but I don’t have a better idea yet.
Let’s see how this attempt disappoints us. Woot! It does not disappoint at all:

The stubby blue rod connecting to the new smaller circle at the left is doing exactly what I wanted. Let’s have a video:
I think that’s actually working. I’ll pause here and make a version of the drawing that I’m working on, and include that either in a new version of this article, or the next one.
I’m going to stop here for that, and more importantly perhaps, because I’ve just had a bit of success and there is no better time to stop.
See you next time!