longdesc

Posted by | September 29, 2008 | Communications Lab, ITP, Physical Computing | No Comments

Alright, so this is a joint commlab/physcomp post. I’m supposed to document one of my projects for commlab, so it all worked out.

Here’s the video.



I started toying around with the servo, but I really wanted to play with the piezo. I wanted to create a different sound based on the user’s input. I had a force sensor, so I jury rigged some code up to do interesting stuff. At first there was a problem when I tried to upgrade the arduino program and found that it was broken. Oh well. Back down to version 0011.


So, what i was trying to do is let a user make a 3-note song. But this sound stuff is harder than it seems. I kept having trouble getting the delay right for to seperate the notes, so really what you’re hearing in the video is 3 notes being played very fast, but it sounds like one sound. Still, it’s generally what I was aiming for. I need to figure out the delays more. But not now. Later.


And here’s the code:

int speakerOut = 9;  // Set up speaker on a PWM pin (digital 9, 10 or 11)
int analogValue = 0;  // the value returned from the analog sensor
int analogPin = 0;    // the analog pin that the sensor's on

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

int notes[] = { 261, 261, 261 };
int times[] = { 1, 1, 1 };
int i=0;
int j=0;
int state=0;
unsigned long time=0;

void loop() {
  if(j>3){j=0;}
  if(j==0)
  { 
    Serial.println("Hi! Enter first note."); 
    getNote(j);
    Serial.println(notes[j]);
    Serial.println(times[j]);
    Serial.println("Ok! Processing the note.");
    delay(2000);
    
    Serial.print("enddelay");
  }else if(j==1)
  {
    getNote(j);
    Serial.println("Hi! Enter second note."); 
    Serial.println(notes[j]);
    Serial.println(times[j]);
    Serial.println("Ok! Processing the note.");
    delay(2000);
  }else if(j==2)
  {
    getNote(j);
    Serial.println("Hi! Enter 3rd note."); 
    Serial.println(notes[j]);
    Serial.println(times[j]);
    Serial.println("Ok! Processing the note.");
    delay(2000);
  }else if(j==3)
  {
    Serial.println("Who's awesome? You're awesome!");
    Serial.println("Ok, listen to your tune and whenever 
           you're ready to stop, just press the button.");
    playIt();
    Serial.println("Back!");
    delay(2000);
  }
  j++;
}

//gets the user input note and how long it took them to input it
void getNote(int i)
{
  time=millis();
  int analogValueOld=0;
  while(1)
  {
    
    analogValue = analogRead(analogPin);
    if(analogValue > 4)
    {
      while(analogValue > 4)
      {
        analogValue = analogRead(analogPin);
        if(analogValueOld < analogValue) {analogValueOld=analogValue;}
      }
    
      notes[i]=map(analogValueOld,0,870,3830,1912);
      times[i]=abs(millis()-time);
      return;
    }
  }
}

//play the tune till user stops it
void playIt()
{
  while(1)
  {
    //Serial.println(analogValue);
    analogValue = analogRead(analogPin);
    while(analogValue < 50)
    {
      if(analogValue >=50)
      {
        digitalWrite(speakerOut,LOW);
        return; // in theory, this should return out of the function 
                  //but it's acting like a break
      }
      for(int i=0;i<3;i++)
      {
        for(int j=times[i]*1000;j>0;j-=(notes[i]/2))
        {
           digitalWrite(speakerOut,HIGH);
           delayMicroseconds(notes[i]/ 2);
           digitalWrite(speakerOut,LOW);
           delayMicroseconds(notes[i]/ 2);
        }
        delayMicroseconds(times[1]*times[2]*times[3]*150);
      }
      analogValue = analogRead(analogPin);
    }
    return; // so that's why i had to use two return statements
  }
}
  

Leave a Reply

Your email address will not be published.