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(){
Serial.begin(9600);
pinMode(motorPin, OUTPUT);
pinMode(switchPin, INPUT);
}
void loop(){
if(digitalRead(switchPin) == LOW){
runMotor = !runMotor;
}
if(runMotor){
Serial.println("motor HIGH");
digitalWrite(motorPin, HIGH);
}
else{
Serial.println("motor LOW");
digitalWrite(motorPin, LOW);
}
//delay(100);
}