Go Down

Topic: Beat Match Rocking (Read 2143 times) previous topic - next topic

kalear20

Hello Everyone,

I am very new to Arduino but I am an artist and started working with it a month ago for a very specific project I had in mind. I want to use an accelerometer (xl 335) to record the bpm
(beats per minute) of a rocking chair that will then be output to a piezo speaker to adjust the tempo of a simple song. Thus the faster a participant rocks the faster in tempo the song will play. So far the biggest problem is with the code, I need some equation in the code to input the bpm of only the x axis rather than the normal accelerometer numerical values. If anyone has any suggestions at all it would be greatly appreciated, I am so anxious to finish the piece! Any specifics on the code for bpm input in the serial port would be great because then I could just use those in an "if" statement to adjust the piezo output.

Thanks for any help!

kalear20

Grumpy_Mike

You need to see when the axis changes sign and time between that.
If you post what you have (use the # icon) then there is a chance someone could show you where to put this code.

kalear20

This is the code my professor and I have been working with, although I don't believe this is really what we need. The accelerometer is giving input values between 320 and 350 we are only using the x-axis and I just need a time equation for the time lapse between when the rocker hits 320 and 350. Is there a time based code, that could deliver the beats per minute to the serial port and eventually to the piezo speaker. Thanks again, kalear20

This code was created using multiple other codes all combined and we have loaded it and we got nothing.

/* 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
*/
 
int speakerPin = 9;
int xpin = 0;          // x-axis of the accelerometer 2
//int ypin = 1;          // y-axis 2
//int zpin = 2;          // z-axis (only on 3-axis models) 2
int prevX = 0;
int currX = 0;
int prevAccel = 0;
int currAccel = 0;
int pause =  100;            //delay time 2

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 = 100;

void setup(){
 pinMode(speakerPin, OUTPUT);
 prevX = analogRead(xpin);
 prevAccel = (currX - prevX)/pause;
}

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 == note) {
     playTone(tones, duration);
   }
 }
}



void loop(){
 //Acceleration formula: a = (V2 - V1)/T;
 //Acceleration:  a = (currX - prevX)/pause;
 currX = analogRead(xpin);
 currAccel = (currX - prevX)/pause;
 if (currAccel > prevAccel);{
                               //output text/serial trigger
 digitalWrite(speakerPin, HIGH);   // set the SPEAKER on
 }
  prevX = currX;
  prevAccel = currAccel;
 for (int i = 0; i < length; i++) {
   if (notes == ' ') {
     delay(beats * tempo); // rest
   } else {
     playNote(notes, beats * tempo);
   }
   
     delay(tempo / 2); // pause between notes
 }
 digitalWrite(speakerPin, LOW);   // set the SPEAKER off
 delay(pause);   //pause 100 ms.. [10 checks per second]

 }


Grumpy_Mike

Ok two things when asking for help.
1) I asked you nicely to use the # icon when posting code. I will ask you again for the last time. Go back, click on modify, select the code part and click on the # icon. Then save the changes. This stops the code getting corrupted, at the moment it goes into italics half way down so we can't copy and paste it and try things with it.

2) When posting code it is good to say what it actually does and what you expect it to do.

3) (No one expects the Spanish inquisition) Use Serial.println() statements to look at variables at various points in your code.

PaulS

Code: [Select]
if (currAccel > prevAccel);{
                                //output text/serial trigger
  digitalWrite(speakerPin, HIGH);   // set the SPEAKER on
  }

That semicolon at the end of the if statement is not doing you any favors.
Shouldn't there be an else to go with this, to turn the speaker pin off?

You said that you wanted the temp to based on acceleration, yet there is no code that relates tempo to the acceleration.

Go Up