Beat Match Rocking

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

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.

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]*
* }*

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.

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.