My understanding of this assignment was to create an object that moved in a way that evoked human movement. For my the the primary interesting aspect of human movement is that it is usually far more complex that a machine that would be designed to cover an equivalent task. Mathematically this would be that the human body has many more degrees of freedom than would be necessary for any single activity. With my machine, my primary goal was to recreate this smooth level of motion by having multiple axes of rotation. I chose to use hand waving, as I could make the point of having multiple axes of rotation without needing to work on it for weeks. By looking at my own hand wave I noticed that there were two primary axes of rotation, at the wrist and elbow. The axes are offset by only a few degrees, but if only one axes is used the motion looks far less human. Therefore, I cut out a basic arm shape in a piece of wood, attached to a servo at either end. The ends of the “arm” were not parallel, the angle being about what I measured on myself when waving. One end was fixed to a base, and the other to a cutout of a hand. The hand was also angled a bit so that it was not vertical to the base, not at the odd angle the arm was at. I then added some simple code so that the arm and hand would turn in sync in opposite directions to create the basic motion, where the hand always faces the same point at every moment in a wave. The final thing I could have done to make the motion look particularly human would have been to cover the arm in “skin” so that the rotation of the wrist appeared continuous over the length of the arm, as it does in a human arm for the same reason. However, I realized that the motion I had was not too far off, and the quality of work I would be able to do for this would be atrocious.
I though I had a video of the arm in motion, but instead I took a series of rapid photos, so I will include one of these in this post and add a video if I take one later.
This is the simple code I mentioned. various values could be modified to produce different waves, but this set actually produced remarkably smooth results.
#include <Servo.h> Servo hand; Servo arm; int handPos=90; int armPos=130; boolean forward; const int handRate=1; const int armRate=1; const int handMax=140; const int handMin=80; void setup() { Serial.begin(9600); hand.attach(5); arm.attach(3); arm.write(armPos); hand.write(handPos); delay(100); } void loop() { if(forward){ handPos+=handRate; armPos-=armRate; } else{ handPos-=handRate; armPos+=armRate; } hand.write(handPos); arm.write(armPos); delay(25); if(forward && handPos>=handMax){ forward=false; } if(!forward && handPos<=handMin){ forward=true; } }