Close

Designing the Body

A project log for Walking Machine

Almost everyone has seen images/videos of Theo Jansen's walking machine, the "Strandbeesten". Here I want to look at a simplified version.

agpcooperagp.cooper 07/27/2026 at 09:580 Comments

Designing The Body

-

I have started designing the body. First thoughts is a bumper bar:

It serves several functions:

I think I will need to extent the motor plate forward and aft, to reinforce the bumper bar floor.

-

I have selected 2 mm thick PTFE M3 washers.

Bought the rods and pins.

Bought the Nema 14 round steppers.

A couple for the motor shaft (5 mm) to the drive shaft (3 mm).

-

I looked at buying M3 collars but after a long consideration, stayed with gluing the "fixed" rods/collar to the shafts.

-

While there are commercially  available stepper drivers, a long long time ago I built discrete drivers based on TTL logic:

transistors - Totem Pole Output Driver - Electrical Engineering Stack ExchangeI seem to remember that I added protection diodes between ground and the output, and the output to the power supply.

The input transistor was not used but looks like a good idea.

-

For the micro-processor I feel rather retro. As in the vein of "How to build your own working robot pet." by Frank DaCosta. A book I repurchased after more than 40 years. So I am looking at the Intel 8085.

-

When I look at the bumper bar, I could add a nose and it would look like a dog from above!

That is the bumper bar looks like a head and a set of ears, all it needs is a snout and a nose,

-

I started this project on the 28th of June so tomorrow is one month.

-

Its been a few days with some success and failures to report:

If you wondering, the big holes in the carriage torsion box,  are used to get access to the stepper motors.

Balancing the Rotating Mechanisms

I looked at a balancing the crank:

The double thickness counter balance matches weight and centre of mass so should work okay.

-

Here is my first pass counter balance design:

-

Recalculated the counter balance weight (as best I could):

Made the counter weight balance small as practical, but no allowance for reciprocating parts. 

Usually an allowance of 50% to 90% of the moment of these parts is made (for internal combustion engines).

-

Bugs in OpenSCAD

Bug in OpenSCAD are silent (but Syntax errors are noisy).

-

To implement Slot and Tabs, I wrote Function Slots(). Easy enough, create some slots, translate them to the edge in question and take the difference:

    // Add Slots for Bulkhead
    mirrorCopy([1,0,0])
    translate([cgap/2-5,0,0])
    rotate([0,0,90])
    slots(wgap,plateThick,3);

-

Worked fine until it does not!

Spent a day working through this, the answer was a vertical version of slots to avoid the rotation: 

-

Slotting

The slotting code work with odd and even matching slots or tabs:

// Make Slots for edge joins
module xslots(l,d,n) {
  let(m=n%2)
  let(w=l/(2*n+2*m-1))
  for(i=[1-n:2:n-1+0.001])
  translate([i*w,0,0])
  cube([w+0.01,d+0.02,3*d],center=true);
}

module yslots(l,d,n) {
  let(m=n%2)
  let(w=l/(2*n+2*m-1))
  for(j=[1-n:2:n-1+0.001])
  translate([0,j*w,0])
  cube([d+0.02,w+0.01,3*d],center=true);
}

-

For example, adding slots and tabs using  tab = 3 and slots  = 4, to bulkheads:

  // Add Bulkheads
  color("Red") mirrorCopy([1,0,0]) { 
    translate([cgap/2-5,0,0])
    rotate([0,90,0])
    difference() { 
      cube([wgap,mgap,plateThick],center=true);

      // Add Tabs on Sides
      mirrorCopy([1,0,0]) 
      translate([wgap/2-plateThick/2,0,0])
      yslots(mgap,plateThick,4); // 4 slots and 3 Tabs

      // Add Tabs on Top and Bottom
      mirrorCopy([0,1,0]) 
      translate([0,mgap/2-plateThick/2,0])
      xslots(wgap,plateThick,4); // 4 slots 3 and Tabs
    }
  }

 -

First the bulkheads with edges oversized:

-

First set of slots cutout:

-

Second set of cutouts:

-

Other cutouts:

-

So the trick here was to use n=3 for tabs and n=4 for slots, keeping d=depth and l=length the same.

Note: (1,2) and (3,4) and (5,6) etc, are matching sets. 

Now some matching slots in the Top:

  color("Magenta") translate([0,mgap/2-plateThick/2,0])
  rotate([90,0,0])
  difference() {
    cube([cgap,wgap,plateThick],center=true);

    // Add Tabs to Vertical Support
    mirrorCopy([0,1,0])
    translate([0,wgap/2-plateThick/2,0])
    xslots(cgap,plateThick,4);

    // Add Slots for Bulkhead
    mirrorCopy([1,0,0])
    translate([cgap/2-5,0,0])
    rotate([0,0,90])
    xslots(wgap,plateThick,3);

    // Add Top Cutout
    scale([(cgap/2-3.5-3*plateThick)/(wgap/2-3*plateThick),1,1])
    cylinder(h=3*plateThick,r=wgap/2-3*plateThick,center=true);
  }

-

And finally, assembled and checked for fit:

-

The Elliptical Wing Function

The method for mathematical shapes is two step, first the function:

// Bumpers
function ellipticalWing(a,b,c) =
  [for(e=[0:3:360])
    if (e<180) [a*cos(e),b*sin(e)] else [a*cos(e),c*sin(e)]
  ];

then the polygon/extrusion:

   // Make an Elliptical Wing (Bumper)
    linear_extrude(height=plateThick,center=false)
    polygon(ellipticalWing(wgap/2+4*sgap,50,10));

 -

The Bumper (an elliptical wing):

AlanX

Discussions