Assignment 10, Automaton, Josh Lopez-Binder

While playing around with legos I found that an odd sort of wave could be produced from a chain of links.  This chain has the property that each link is limited in rotation by its neighbor links due to little pegs.  I thought it would be neat to make a little machine that replicates this wave.  After considerable time messing around with various linkages and cranks, I found  that a combination of a crank and a four bar linkage + crank moved the first link in a way that would create the wave I desired. Naively, I thought that I could use this to run a much longer chain without modifications.

I copied the lego configuration into a CAD model and built a housing for the motor with the gearbox, the arduino, and a battery.  I lazer cut all of this out of 1/8 inch acrylic. My major mistake was assuming that the gearbox would produce a enough torque to easily drive the mechanism.  Of course this was a ridiculous assumption (and a lazy one), and the mechanism hardly works as a result.  It is much too fast and the motor seems to die after a few rotations.  I think I need to find a better motor/gearbox or use a stepper.

Recently, I realized that what I was trying to make was a soliton, a solitary wave that moves through a medium like a particle.  I also realized that my method of driving one link while the opposite end remains pinned is much too complex.  This method does not allow for a large number of links (this would require a larger linkage), which is what I had hoped for.  The more elegant method would be to pin both ends of the chain, at a distance that required a few of the links to splay out into the wave, and simple rotate each end alternately to pass the wave back and forth.  Oy!





int motorPin = 9;
int switchPin = 2;
boolean runMotor = false;
int clickTime = 10;
void setup(){
  pinMode(motorPin, OUTPUT);
  pinMode(switchPin, INPUT);
void loop(){
  if(digitalRead(switchPin) == LOW){
   runMotor = !runMotor;
    Serial.println("motor HIGH");
    digitalWrite(motorPin, HIGH);
    Serial.println("motor LOW");
    digitalWrite(motorPin, LOW);

Post a comment