Danube Blue Waltz
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;
}
}