Lab 05

Description

I used Arduino with force sensor. I edited the sample melody (twinkle twinkle little star) sketch code to make the piezo buzzer play the meolody and use the force sensor to control the melody’s tempo. With different value detected by the force sensor, the tempo of the melody will change. Also, to make the input and output coincide I attache both the piezo buzzer and force sensor to the android toy. Lastly, I ¬†uploaded the code and took pictures of the result.

Components

  • 1 Arduino
  • 1 Piezo
  • 1 Breadboard
  • 1 force sensor
  • 1 Andoird toy

Code

/*
Connections For this application;
Use Freeduino-RichBoard made by www.EmbeddedMarket.com

1. Connect Digital Pin 9 to Buz pin in Section 9 on Freeduino Board

2. Connect USB Cable

*/

/* 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 = 7;
// Do we want debugging on serial out? 1 for yes, 0 for no
//int DEBUG = 1;
int potPin = 2;
int val = 0;

int length = 15; // the number of notes

//twinkle twinkle little star
char notes[] = "ccggaag ffeeddc ggffeed ggffeed ccggaag ffeeddc "; // a space represents a rest
int beats[] = { 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 4 };
int tempo = 200;

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);
 Serial.begin(9600); // Set serial out if we want debugging
 Serial.println("ready"); 
}

void loop() {
 val = analogRead(potPin); //read value from the sensor
 if (tempo>500){
 tempo = 100;
 } else{
 tempo = tempo+val;
 }

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); 
 }
}

//read a string from the serial and store it in an array
//you must supply the array variable
void readSerialString (char *strArray) {
 int i = 0;
 if(!Serial.available()) {
 return;
 }
 while (Serial.available()) {
 strArray[i] = Serial.read();
 i++;
 }
}

hw5