Friday, October 28, 2011

Music (CIRC-06)

PURPOSE:

To get the Arduino play the nursery rhyme “Twinkle Twinkle Little Star” with the help of a Piezo Element.

EQUIPMENT:

·         1 x Arduino Holder
·         1 x Breadboard
·         1 x Arduino Uno
·         1 x Breadboard Sheet (CIRC-06)
·         1 x Piezo Element
·         4 x Wire (any colors)

PROGRAM DETAILS:

In the previous circuit labs, we have learned to control light, motion and election. In this lab, sound was the target. Sound is an analog phenomena, will our Arduino Uno be able to handle it? The answer is a piezo element which will help the digital Arduino to do so. A piezo element is a device that makes a clicking sound each time it is pulsed with current. The pulsing can vary and because of this, the frequency and the music notes it plays varies as well.

A new method called the delayMicroseconds(us) was introduced in this circuit lab. This method is similar to delay method from the previous labs, as it suspends the program for a few milliseconds. The delay time is measured in milliseconds, (one microsecond is equal to 1/1000th of a millisecond or 1 microsecond = 1 millionth of a second).  The length of the delay time determines which music note(s) to play. This method gives the program some time to send the voltage to the speaker, and not turning on and off right away. Another method that was introduced was the playNote(char,int) method which plays the tone corresponding to the note name. Also, there was some calculations and mathematical operations involved in this codes as shown below:
timeHigh = period / 2 = 1 / (2 * toneFrequency)
For further information on Melody and to advance your learning, click this link!

At first, we attached the piezo element to the breadboard, keeping in mind where the positive and negative side goes. Then we took out four different colored wires and the first wire was connected to I7 and the negative row (the farthest row to the right). The second wire was connected to J9 and Pin 9, fourth wire to negative row and to the ground and, the last wire was connected to 5 volts and the positive row (2nd row starting from the right).

Click here for the link of the image.
TIME TO COMPLETE:

It took us 7 minutes to build and 5 minutes to program it.

RESULTS:

This was an amazing and unique circuit lab. It’s amazing because we can finally make our Arduino make sound and play pleasant music notes. It’s unique because this is the first lab that doesn’t involve LEDs. Given the size and shape of the piezo element it is easy to miss the right holes on the breadboard but we didn’t make this mistake because we were aware about it from before. We changed the serial port and uploaded our program correctly. Thus, our program ran successfully and we enjoyed doing this simple circuit lab.

PHOTOS OF PROJECT:

Final CIRC-06 Arduino Circuit 
TIPS:

Request your class-mates to be quiet because you might have hard time hearing the music notes the Arduino. That’s why, you need to be in a quiet place, you need to sit near your Arduino and you have to try to listen to it carefully.

FURTHER WORK:

For further work, I would like to change the timing and speed for each note. To do this I have to only change one line which is:

int tempo = 300; -à int tempo = (new #) // Changing it to a larger # will slow down the melody, or changing it to a smaller # will speed it up.

Moreover, I am a little worried about the notes being a little out of tune and I would like to fix it in the future. To do this, I have to tune the value of individual notes in the tones [] array up or down until they sound right.

PROGRAM MODIFICATIONS:

My program was very similar to the core program in the Sparkfun Inventor’s Guide. The only differences are that I took out the comments and I added the composition of my own melody in it. I took out the comments because I already knew what each variable, method and loop are used for in the program so I didn’t need the comments. I composed the Happy Birthday melody and added it with the main program. Thus, our program first played the “Twinkle Twinkle Little Star” and then it played “Happy Birthday”!

PROGRAM (with comments):

/* Melody
 * (cleft) 2005 D. Cuartielles for K3
 *
 * This example uses a piezo speaker to play melodies.  It sends
 * a square wave of the appropriate frequency to the piezo, generating
 * the corresponding tone.
 *
 * The calculation of the tones is made following the mathematical
 * operation:
 *
 *       timeHigh = period / 2 = 1 / (2 * toneFrequency)
 *
 * where the different tones are described as in the table:
 *
 * note        frequency      period timeHigh
 * c            261 Hz         3830   1915   
 * d            294 Hz         3400   1700   
 * e            329 Hz         3038   1519   
 * f            349 Hz         2864   1432   
 * g            392 Hz         2550   1275   
 * a            440 Hz         2272   1136   
 * b            493 Hz         2028   1014   
 * C            523 Hz         1912   956
 *
 * http://www.arduino.cc/en/Tutorial/Melody
 */
 
int speakerPin = 9;

int length = 15; // the number of notes
char notes[] = "ccggaagffeeddc "; // a space represents a rest
int beats[] = { 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 4 };
int tempo = 300;

void playTone(int tone, int duration) {
  for (long i = 0; i < duration * 1000L; i += tone * 2) {
    digitalWrite(speakerPin, HIGH);
    delayMicroseconds(tone);
    digitalWrite(speakerPin, LOW);
    delayMicroseconds(tone);
  }
}

void playNote(char note, int duration) {
  char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
  int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 };
 
  // play the tone corresponding to the note name
  for (int i = 0; i < 8; i++) {
    if (names[i] == note) {
      playTone(tones[i], duration);
    }
  }
}

void setup() {
  pinMode(speakerPin, OUTPUT);
}

void loop() {
  for (int i = 0; i < length; i++) {
    if (notes[i] == ' ') {
      delay(beats[i] * tempo); // rest
    } else {
      playNote(notes[i], beats[i] * tempo);
    }
   
    // pause between notes
    delay(tempo / 2);
  }
}

REFERENCE:



1 comment:

  1. Can you explain how does for(int i=0; i < 8; i ++) works?

    ReplyDelete