Summary

Theo Jansen’s Stranbeests are massive, legged, mechanical, beach-crawling creatures powered by only one actuator: the wind. The concept of the Pet Clock was initially to alter the Strandbeest mechanism so that it could operate at the size of a house pet and be fashioned out of paper-craft into a machine which could walk around under its own power. To add extra complication to the matter, it is designed to be actuated by only a single 9g servo motor oscillating back and forth.

To achieve the conversion between the oscillatory motion of the servo and the continuous rotation needed to drive the Strandbeest linkages,  a clock escapement was added. While these are typically used to convert the back-and-forth swings of a pendulum into the continuous spinning of the hands on a clock, the mechanism also works great as a rudimentary power control system, allowing the tiny hobby servo to serve as a regulator for the distribution of power by emulating a pendulum while the actual power was to be delivered from a separate falling weight.

Aside from providing an inherently studdering motion, the issue this created, however, is that the weight needed to overcome the friction in the joints was so large as to cause the paper-craft structure to buckle. As such, the final machine was repurposed as a slow-walking kinetic sculpture tribute to the mechanisms of Theo Jansen. In the future, a better way of realizing the vision of a “pet strandbeest” would be to abandon the self-imposed paper-craft constraint and to power the system directly from a larger motor, which, if it had to be oscillatory, could be made unidirectional by a ratchet rather than an escapement.

Video

Code

#include <Servo.h>

#define P_SERV 9

#define CENTER 71 //  [deg+, Center of Angular Sweep
#define AMP 15 //   [deg], Angular Width (Amplitude) of ONE Side of the Sweep
#define FREQ 2.0  //   [Hz], Number of Complete Sweep Cycles (out and back) per Second

Servo pendulum;

void setup(){
  pendulum.attach(P_SERV);
} // #setup

void loop(){
  static unsigned long start = millis();
  static float omega = 2.0f * M_PI * FREQ / 1000.0f; // Compute coefficient once and store

  pendulum.write( AMP * sinf( omega * (millis()-start)) + CENTER ); // Emulate pendulum behavior
  
  delay(10);
} // #loop

References

Theo Jansen’s “Holy Numbers”: https://upload.wikimedia.org/wikipedia/commons/thumb/2/23/Strandbeest_Leg_Proportions.svg/800px-Strandbeest_Leg_Proportions.svg.png