Go Down

Topic: Small piano with ArduinoUNO (Read 873 times) previous topic - next topic

DoctorW

Hello, i'm developing a small piano with my ArduinoUNO, and i have a problem. When i upload the code to the board, and i press the switches, the output tone is always the same. I have downloaded pitches.h library.
The code i'm using is this:
Code: [Select]
#include <pitches.h>
int sw1=2; //Switch for C
int sw2=3; //Switch for D
int sw3=4; //Switch for E
int sw4=5; //Switch for F
int sw5=6; //Switch for G
int spk=8; //Output for speaker
int val1=0;
int val2=0;
int val3=0;
int val4=0;
int val5=0;

void setup(){
 pinMode(sw1,INPUT);
 pinMode(sw2,INPUT);
 pinMode(sw3,INPUT);
 pinMode(sw4,INPUT);
 pinMode(sw5,INPUT);
}

void loop(){
 val1=digitalRead(sw1);
 val2=digitalRead(sw2);
 val3=digitalRead(sw3);
 val4=digitalRead(sw4);
 val5=digitalRead(sw5);
 if(val1==HIGH){
   tone(spk, NOTE_C3);
 }else{
   if(val1==LOW){
     noTone(spk);
   }
 }
 if(val2==HIGH){
   tone(spk, NOTE_D3);
 }else{
   if(val2==LOW){
     noTone(spk);
   }
 }
 if(val3==HIGH){
   tone(spk,NOTE_E3);
 }else{
   if(val3==LOW){
     noTone(spk);
   }
 }
 if(val4==HIGH){
   tone(spk,NOTE_F3);
 }else{
   if(val4==LOW){
     noTone(spk);
   }
 }
}


I have also tried to set the frequency value without using the library
Code: [Select]
int A=440;

What can i do? I attach a link with a small video with the problem: https://mega.co.nz/#!M1MjRZoQ!alIJX2HuKyp3BsgFHwQTKjbcUmYhW0ZDfXC_fTsslyk

Thanks :)

CrossRoads

Are using and IDE 1.0.1 or later?
Change these to
pinMode(sw1,INPUT_PULLUP);

and wire your switches to connect the pin to Gnd when the switch is closed.

Change your logic to match:
Code: [Select]

  if(val1==LOW){
    tone(spk, NOTE_C3);
  }
  else{
    if(val1==HIGH){
      noTone(spk);
    }
  }


This will ensure that the HIGH/LOW level is always valid, and not "floating" as the pins are read.
You don't do anything with switch 5 yet, I assume more will be added later.

I am kind of surprised any thing plays. As soon as you reach an if condition without a key pressed you stop the tone. You may want to re-think your logic there.
Perhaps only call noTone(skp) when a key had been pressed and is then detected as not pressed; that way, key2 does not stop the tone from key1.
Designing & building electrical circuits for over 25 years.  Screw Shield for Mega/Due/Uno,  Bobuino with ATMega1284P, & other '328P & '1284P creations & offerings at  my website.

DoctorW

I use 1.0.1 IDE.
I have tried all you said me, but i have the same problem. If i write your code for 2 switches (for instance) i have the same problem and it sounds wrong. If i write the code for only one switch there's no problem with.
I have changed the conections and the other switches will be conected and programmed when the code works properly.

Thanks.

CrossRoads

Post the code for 2, lets see what you have.
Designing & building electrical circuits for over 25 years.  Screw Shield for Mega/Due/Uno,  Bobuino with ATMega1284P, & other '328P & '1284P creations & offerings at  my website.

DoctorW

Code: [Select]
#include <pitches.h>
int sw1=2; //Pulsador para Do
int sw2=3; //Pulsador para Re
int sw3=4; //Pulsador para Mi
int sw4=5; //Pulsador para Fa
int sw5=6; //Pulsador para Sol
int spk=8; //Salida para el piezo
int val1=0;
int val2=0;
int val3=0;
int val4=0;
int val5=0;
int val6=0;

void setup(){
  pinMode(sw1,INPUT_PULLUP);
  pinMode(sw2,INPUT_PULLUP);
  pinMode(sw3,INPUT_PULLUP);
  pinMode(sw4,INPUT_PULLUP);
  pinMode(sw5,INPUT_PULLUP);
}

void loop(){
  val1=digitalRead(sw1);
  val2=digitalRead(sw2);
  val3=digitalRead(sw3);
  val4=digitalRead(sw4);
  val5=digitalRead(sw5);
  if(val1==LOW){
    tone(spk, NOTE_C3);
  }else{
    noTone(spk);
  }
}

CrossRoads

try this
Code: [Select]

// assumes only 1 pressed at a time - if not, the higher note will sound
keyPressed  = 0;
  if(vl1==LOW){
    keyPressed = 1;
    tone(spk, NOTE_C3);
  }
  if(val2==LOW){
    keyPressed = 1;
    tone(spk, NOTE_D3);
  }
  if(val3==LOW){
    keyPressed = 1;
    tone(spk, NOTE_E3);
  }
  if(val4==LOW){
    keyPressed = 1;
    tone(spk, NOTE_F3);
  }
  if(val5==LOW){
    keyPressed = 1;
    tone(spk, NOTE_G3); // add the notes want
  }
if (keyPressed == 0){ // no keys are pressed
noTone(spk);
}
Designing & building electrical circuits for over 25 years.  Screw Shield for Mega/Due/Uno,  Bobuino with ATMega1284P, & other '328P & '1284P creations & offerings at  my website.

DoctorW

Now it works properly!! Thanks for all :)
When I finish the proyect, i will upload te tutorial.

And thanks for all!!

CrossRoads

Designing & building electrical circuits for over 25 years.  Screw Shield for Mega/Due/Uno,  Bobuino with ATMega1284P, & other '328P & '1284P creations & offerings at  my website.

Go Up