Stephanie and Minnar – Jellyfish
Our project is a mechanical jellyfish whose tentacles scrunch as it bobs up and down. The top is a wire armature with fabric wrapped around it, and the tentacles are acetate plastic strips that have been hand cut and laser cut. Clear fishing line connects the tentacles and suspends the jellyfish from a stepper motor that controls its vertical movement. Some fishing line runs from the top of the jellyfish up to two ball bearings, the stepper motor, and a counterweight. The rest connects the tentacles together and is anchored to the bottom of the wooden frame structure. Pulling the string upwards pulls our tentacles upward, causing them to scrunch.
We were inspired by this youtube video and by the movements of real jellyfish. http://www.youtube.com/watch?v=JAULjWIwJBg
We wanted to create a puppet that would elegantly mimic the gestures of a jellyfish with only one motor. First we fabricated a small, non-motorized prototype to experiment with how to best execute the gesture of the tentacles, then worked on how to bring it to life with Arduino. Using a servo motor would have been easy, but we were turned off by the loud squeaky sounds that they make. We experimented with muscle wire as a means to pull our jellyfish up, but it was difficult because muscle wire only shrinks 3-5% of its length. Instead we chose to use a stepper motor, and went through several before we found one that was powerful enough to raise and lower the jellyfish. Adding the on/off switch was also a challenge because we were unfamiliar with the circuitry of the stepper motor. Luckily, we got a lot of great advice from Ali Momeni and Robb.
We went through several sketches before arriving at our final design.
Code:
#include
// Map our pins to constants to make things easier to keep track of
int pushButton = 7;
const int pwmA = 3;
const int pwmB = 11;
const int brakeA = 9;
const int brakeB = 8;
const int dirA = 12;
const int dirB = 13;
boolean forward = true;
// The amount of steps for a full revolution of your motor.
// 360 / stepAngle
const int STEPS = 500;
int currentStep = 0;
// Initialize the Stepper class
Stepper myStepper(STEPS, dirA, dirB);
void setup() {
// Set the RPM of the motor
myStepper.setSpeed(8);
// Turn on pulse width modulation
pinMode(pushButton, INPUT);
pinMode(pwmA, OUTPUT);
digitalWrite(pwmA, HIGH);
pinMode(pwmB, OUTPUT);
digitalWrite(pwmB, HIGH);
// Turn off the brakes
pinMode(brakeA, OUTPUT);
digitalWrite(brakeA, LOW);
pinMode(brakeB, OUTPUT);
digitalWrite(brakeB, LOW);
Serial.begin(9600);
}
void loop() {
if (digitalRead(pushButton)==1){
Serial.println ("steppin'!");
if(forward){
myStepper.step(1);
currentStep +=1;
} else {
myStepper.step(-1);
currentStep +=1;
}
if (currentStep == STEPS){
forward = not forward;
currentStep = 0;
}
}
}
Note: Fritzing does not have support for the Arduino motor shield we used.