Danube Blue Waltz

Posted by lizzy

Anonymous's picture

Description:

The motor's ability to spin and rotate things made me  think of phenakistoscopes. For this lab, I used this waltzing disc made by Eadweard J. Muybridge. I also used the code from last week to play the Blue Danube Waltz. The output of this lab is an animated image and song.

I glued the image to cardboard and attached the disc  to the dc motor. When the pot's sensor value increases, the song speeds up and the disc spins faster. When the pot's sensor value decreases, the song slows down and the spinning decreases.

In order to start spinning when sensorVal was low (e.g 2-200), I had to I realized that I had to lightly spin the disc. I think it was because the motor value was too low (motorpin, 65) to handle the  the size, shape, and weight of the disc.   It didn't have any problems spinning when the sensorVal was high (100 + ).

To see the animation, I faced the disc towards a mirror. Looking through the slits, one is able to see an animated image in the mirror.

Components

Breadboard

Arduino Microcontroller

Resistors

1 Pot

1 Piezo Speaker

Mirror

For disc:

This image, glued to cardboard

 

Code

 

/*
 * I modfied this code to have music. When the motor speeds up, both the disc's spin and the song, Blue *Danube Waltz speeds up.
 * one pot fades one motor
 * modified version of AnalogInput
 * by DojoDave <http://www.0j0.org>
 * http://www.arduino.cc/en/Tutorial/AnalogInput
 * Modified again by dave
 * Middle C = C4
 *
 * note     frequency     period     PW (timeHigh)
 * c3 (C)       139 hz                  3597
 * d3 (D)       147 hz                  3401
 * e3 (E)       165 hz                  3030
 * f3 (F)       174 hz                  2907
 * g3 (G)       196 hz                  2551
 * a3 (A)       220 hz                  2273
 * b3 (B)    245 hz                  2041
 * c4            261 Hz             3830     1915     
 * d4             294 Hz             3400     1700
 * dSharp       311 Hz                  1607
 * e4             329 Hz             3038     1519     
 * f4             349 Hz             2864     1432     
 * fsharp       370 hz                   1351
 * g4             392 Hz             2550     1275     
 * a4             440 Hz             2272     1136     
 * b4             493 Hz             2028    1014    
 * c5 (Cfive)    523 Hz            1912     956
 * d5           587                     852
 * e5           659                     759
 * f5           698                     716
 * g5           784                     638
 *
 * (cleft) 2005 D. Cuartielles for K3
 */

int potPin = 0;   // select the input pin for the potentiometer
int motorPin = 9; // select the pin for the Motor
int sensorVal = 0;      // variable to store the value coming from the sensor
int speakerOut = 7;               
byte names[] = {'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C'};  
int tones[] = {1915, 1700, 1519, 1432, 1275, 1136, 1014, 956};
byte melody[] = "2c1p2c1p2e1p2g1p2g3p2g1p2g2p2e1p2e2p";

// count length: 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
//                                10                  20                  30

int count = 0;
int count2 = 0;
int count3 = 0;
int MAX_COUNT = 116; // the longer the song, the longer this should be. if short, song will cut off.

void setup() {
  pinMode(speakerOut, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  sensorVal = analogRead(potPin);    // read the value from the sensor, between 0 - 1024
 
  Serial.println(sensorVal);
 
 
  if (sensorVal > 0 && sensorVal <= 200 ){ //these conditions read sensor. if sensor is high, then sound is fast, else, sound is slow. Sound is normal here.
   analogWrite(motorPin, 65); // if sensor val is more than 0 and less than 200, turn motor on.
   for (count = 0; count < MAX_COUNT; count++) {
    for (count3 = 0; count3 <= (melody[count*2] - 48) * 50; count3++) { //50 is what makes sound fast or slow
      for (count2=0;count2<8;count2++) {
        if (names[count2] == melody[count*2 + 1]) {       
          digitalWrite(speakerOut,HIGH);
          delayMicroseconds(tones[count2]);
          digitalWrite(speakerOut, LOW);
          delayMicroseconds(tones[count2]);
        }
        if (melody[count*2 + 1] == 'p') {
          // make a pause of a certain size
          digitalWrite(speakerOut, 0);
          delayMicroseconds(500);
        }
      }
      }
   }
  }
 
  else if (sensorVal > 200 && sensorVal <= 400 ){ // Sounds speed up when pot is turned.
   analogWrite(motorPin, 90);
   for (count = 0; count < MAX_COUNT; count++) {
    for (count3 = 0; count3 <= (melody[count*2] - 48) * 30; count3++) {
      for (count2=0;count2<8;count2++) {
        if (names[count2] == melody[count*2 + 1]) {       
          digitalWrite(speakerOut,HIGH);
          delayMicroseconds(tones[count2]);
          digitalWrite(speakerOut, LOW);
          delayMicroseconds(tones[count2]);
        }
        if (melody[count*2 + 1] == 'p') {
          // make a pause of a certain size
          digitalWrite(speakerOut, 0);
          delayMicroseconds(500);
        }
      }
      }
   }
  }
 
  else if (sensorVal > 400 && sensorVal <= 600 ){ // Sounds speed up when pot is turned
   analogWrite(motorPin, 100);
   for (count = 0; count < MAX_COUNT; count++) {
    for (count3 = 0; count3 <= (melody[count*2] - 48) * 20; count3++) {
      for (count2=0;count2<8;count2++) {
        if (names[count2] == melody[count*2 + 1]) {       
          digitalWrite(speakerOut,HIGH);
          delayMicroseconds(tones[count2]);
          digitalWrite(speakerOut, LOW);
          delayMicroseconds(tones[count2]);
        }
        if (melody[count*2 + 1] == 'p') {
          // make a pause of a certain size
          digitalWrite(speakerOut, 0);
          delayMicroseconds(500);
        }
      }
      }
   }
  }
 
  else if (sensorVal > 600 && sensorVal <= 800 ){ // Sounds speed up when pot is turned
   analogWrite(motorPin, 105);
   for (count = 0; count < MAX_COUNT; count++) {
    for (count3 = 0; count3 <= (melody[count*2] - 48) * 10; count3++) {
      for (count2=0;count2<8;count2++) {
        if (names[count2] == melody[count*2 + 1]) {       
          digitalWrite(speakerOut,HIGH);
          delayMicroseconds(tones[count2]);
          digitalWrite(speakerOut, LOW);
          delayMicroseconds(tones[count2]);
        }
        if (melody[count*2 + 1] == 'p') {
          // make a pause of a certain size
          digitalWrite(speakerOut, 0);
          delayMicroseconds(500);
        }
      }
      }
   }
  }
 
  else if (sensorVal > 800){ // Sounds speed up when pot is turned
  analogWrite(motorPin, 200);
   for (count = 0; count < MAX_COUNT; count++) {
    for (count3 = 0; count3 <= (melody[count*2] - 48) * 5; count3++) {
      for (count2=0;count2<8;count2++) {
        if (names[count2] == melody[count*2 + 1]) {       
          digitalWrite(speakerOut,HIGH);
          delayMicroseconds(tones[count2]);
          digitalWrite(speakerOut, LOW);
          delayMicroseconds(tones[count2]);
        }
        if (melody[count*2 + 1] == 'p') {
          // make a pause of a certain size
          digitalWrite(speakerOut, 0);
          delayMicroseconds(500);
        }
      }
      }
   }
  }
  else if (sensorVal == 0){ // sound and motor turn off when pot val is 0 (off)
      digitalWrite(speakerOut, 0);
      analogWrite(motorPin, 0);
      return;
      }
 
}

setup.jpg
mirror.jpg
disc.jpg
board_0.jpg
0
Your rating: None
Tags: