0

Waveshield + Arduino Mega -> Distorted sound
Moderators: adafruit_support_bill, adafruit

Please be positive and constructive with your questions and comments.

Waveshield + Arduino Mega -> Distorted sound

by dy-wen on Wed Mar 16, 2011 11:43 am

Hi,

I run
- Ubuntu 10.04
- Arduino 21
use
- Arduino Mega 1280
- Waveshield 1.1

I have sound when I push buttons - but it is distorted:
http://www.lo-bat.be/wendy/waveshield/Waveshield_slightly_distorted_sound.mp3

Not your usual distorted but a rrrrr (rolling r's - http://en.wikipedia.org/wiki/Alveolar_trill) sound extra

Here are a few of my original sounds - the ones which are on the SD-card of the wavsehield
http://www.lo-bat.be/wendy/waveshield/SOUND1.wav
http://www.lo-bat.be/wendy/waveshield/SOUND10.wav
http://www.lo-bat.be/wendy/waveshield/SOUND11.wav
http://www.lo-bat.be/wendy/waveshield/SOUND12.wav
http://www.lo-bat.be/wendy/waveshield/SOUND13.wav
http://www.lo-bat.be/wendy/waveshield/SOUND14.wav

Here is an image of the waveshield - with the modifications indicated here:
http://forums.adafruit.com/viewtopic.php?f=31&t=10939&start=45 -> instructions given by fat16lib

Photograph of the Waveshield & Mega
http://www.lo-bat.be/wendy/waveshield/mega_and_waveshield.JPG
(the copper thingy in the corner connects my buttons to the ground - and there is no current flowing between the pins 50-53 and the ground...)

My code for playing the 20 sound files:
Code: Select all | TOGGLE FULL SIZE
#include <FatReader.h>
#include <SdReader.h>
#include <avr/pgmspace.h>
#include "WaveUtil.h"
#include "WaveHC.h"


SdReader card;    // This object holds the information for the card
FatVolume vol;    // This holds the information for the partition on the card
FatReader root;   // This holds the information for the filesystem on the card
FatReader f;      // This holds the information for the file we're play

WaveHC wave;      // This is the only wave (audio) object, since we will only play one at a time

#define DEBOUNCE 5  // button debouncer

// here is where we define the buttons that we'll use. button "1" is the first, button "6" is the 6th, etc
byte buttons[] = {22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41};
// This handy macro lets us determine how big the array up above is, by checking the size
#define NUMBUTTONS sizeof(buttons)
// we will track if a button is just pressed, just released, or 'pressed' (the current state
volatile byte pressed[NUMBUTTONS], justpressed[NUMBUTTONS], justreleased[NUMBUTTONS];

// this handy function will return the number of bytes currently free in RAM, great for debugging!   
int freeRam(void)
{
  extern int  __bss_end;
  extern int  *__brkval;
  int free_memory;
  if((int)__brkval == 0) {
    free_memory = ((int)&free_memory) - ((int)&__bss_end);
  }
  else {
    free_memory = ((int)&free_memory) - ((int)__brkval);
  }
  return free_memory;
}

void sdErrorCheck(void)
{
  if (!card.errorCode()) return;
  putstring("\n\rSD I/O error: ");
  Serial.print(card.errorCode(), HEX);
  putstring(", ");
  Serial.println(card.errorData(), HEX);
  while(1);
}

void setup() {
  byte i;
 
  // set up serial port
  Serial.begin(9600);
  putstring_nl("WaveHC with ");
  Serial.print(NUMBUTTONS, DEC);
  putstring_nl("buttons");
 
  putstring("Free RAM: ");       // This can help with debugging, running out of RAM is bad
  Serial.println(freeRam());      // if this is under 150 bytes it may spell trouble!
 
  // Set the output pins for the DAC control. This pins are defined in the library
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
 
  // pin13 LED
  pinMode(13, OUTPUT);
 
  // Make input & enable pull-up resistors on switch pins
  for (i=0; i< NUMBUTTONS; i++) {
    pinMode(buttons[i], INPUT);
    digitalWrite(buttons[i], HIGH);
  }
 
  //  if (!card.init(true)) { //play with 4 MHz spi if 8MHz isn't working for you
  if (!card.init()) {         //play with 8 MHz spi (default faster!) 
    putstring_nl("Card init. failed!");  // Something went wrong, lets print out why
    sdErrorCheck();
    while(1);                            // then 'halt' - do nothing!
  }
 
  // enable optimize read - some cards may timeout. Disable if you're having problems
  card.partialBlockRead(true);
 
// Now we will look for a FAT partition!
  uint8_t part;
  for (part = 0; part < 5; part++) {     // we have up to 5 slots to look in
    if (vol.init(card, part))
      break;                             // we found one, lets bail
  }
  if (part == 5) {                       // if we ended up not finding one  :(
    putstring_nl("No valid FAT partition!");
    sdErrorCheck();      // Something went wrong, lets print out why
    while(1);                            // then 'halt' - do nothing!
  }
 
  // Lets tell the user about what we found
  putstring("Using partition ");
  Serial.print(part, DEC);
  putstring(", type is FAT");
  Serial.println(vol.fatType(),DEC);     // FAT16 or FAT32?
 
  // Try to open the root directory
  if (!root.openRoot(vol)) {
    putstring_nl("Can't open root dir!"); // Something went wrong,
    while(1);                             // then 'halt' - do nothing!
  }
 
  // Whew! We got past the tough parts.
  putstring_nl("Ready!");
 
  TCCR2A = 0;
  TCCR2B = 1<<CS22 | 1<<CS21 | 1<<CS20;

  //Timer2 Overflow Interrupt Enable
  TIMSK2 |= 1<<TOIE2;


}

SIGNAL(TIMER2_OVF_vect) {
  check_switches();
}

void check_switches()
{
  static byte previousstate[NUMBUTTONS];
  static byte currentstate[NUMBUTTONS];
  byte index;

  for (index = 0; index < NUMBUTTONS; index++) {
    currentstate[index] = digitalRead(buttons[index]);   // read the button
   
    /*     
    Serial.print(index, DEC);
    Serial.print(": cstate=");
    Serial.print(currentstate[index], DEC);
    Serial.print(", pstate=");
    Serial.print(previousstate[index], DEC);
    Serial.print(", press=");
    */
   
    if (currentstate[index] == previousstate[index]) {
      if ((pressed[index] == LOW) && (currentstate[index] == LOW)) {
          // just pressed
          justpressed[index] = 1;
      }
      else if ((pressed[index] == HIGH) && (currentstate[index] == HIGH)) {
          // just released
          justreleased[index] = 1;
      }
      pressed[index] = !currentstate[index];  // remember, digital HIGH means NOT pressed
    }
    //Serial.println(pressed[index], DEC);
    previousstate[index] = currentstate[index];   // keep a running tally of the buttons
  }
}


void loop() {
  byte i;
 
  if (justpressed[0]) {
    justpressed[0] = 0;
    playfile("SOUND1.WAV");
  }
  else if (justpressed[1]) {
      justpressed[1] = 0;
      playfile("SOUND2.WAV");
  }
  else if (justpressed[2]) {
      justpressed[2] = 0;
      playfile("SOUND3.WAV");
  }
  else if (justpressed[3]) {
      justpressed[3] = 0;
      playfile("SOUND4.WAV");
  }
  else if (justpressed[4]) {
      justpressed[4] = 0;
      playfile("SOUND5.WAV");
  }
  else if (justpressed[5]) {
      justpressed[5] = 0;
      playfile("SOUND6.WAV");
  }
  else if (justpressed[6]) {
      justpressed[6] = 0;
      playfile("SOUND7.WAV");
  }
    else if (justpressed[7]) {
      justpressed[7] = 0;
      playfile("SOUND8.WAV");
  }
    else if (justpressed[8]) {
      justpressed[8] = 0;
      playfile("SOUND9.WAV");
  }
    else if (justpressed[9]) {
      justpressed[9] = 0;
      playfile("SOUND10.WAV");
  }
    else if (justpressed[10]) {
      justpressed[10] = 0;
      playfile("SOUND11.WAV");
  }
    else if (justpressed[11]) {
      justpressed[11] = 0;
      playfile("SOUND12.WAV");
  }
    else if (justpressed[12]) {
      justpressed[12] = 0;
      playfile("SOUND13.WAV");
  } 
    else if (justpressed[13]) {
      justpressed[13] = 0;
      playfile("SOUND14.WAV");
  }
    else if (justpressed[14]) {
      justpressed[14] = 0;
      playfile("SOUND15.WAV");
  } 
    else if (justpressed[15]) {
      justpressed[15] = 0;
      playfile("SOUND16.WAV");
  }
    else if (justpressed[16]) {
      justpressed[16] = 0;
      playfile("SOUND17.WAV");
  } 
    else if (justpressed[17]) {
      justpressed[17] = 0;
      playfile("SOUND18.WAV");
  } 
    else if (justpressed[18]) {
      justpressed[18] = 0;
      playfile("SOUND19.WAV");
  } 
    else if (justpressed[19]) {
      justpressed[19] = 0;
      playfile("SOUND20.WAV");
  } 
}



// Plays a full file from beginning to end with no pause.
void playcomplete(char *name) {
  // call our helper to find and play this name
  playfile(name);
  while (wave.isplaying) {
  // do nothing while its playing
  }
  // now its done playing
}

void playfile(char *name) {
  // see if the wave object is currently doing something
  if (wave.isplaying) {// already playing something, so stop it!
    wave.stop(); // stop it
  }
  // look in the root directory and open the file
  if (!f.open(root, name)) {
    putstring("Couldn't open file "); Serial.print(name); return;
  }
  // OK read the file and turn it into a wave object
  if (!wave.create(f)) {
    putstring_nl("Not a valid WAV"); return;
  }
 
  // ok time to play! start playback
  wave.play();
}


I have no idea why I have the distortion :-/
Any clues? Que pasa?

Bizarre: running the Daphc sketch (which plays all sounds it finds on the sd-card) gives me no distortion whatsoever.
:?:
dy-wen
 
Posts: 30
Joined: Wed Sep 16, 2009 11:31 am

Re: Waveshield + Arduino Mega -> Distorted sound

by adafruit on Wed Mar 16, 2011 1:10 pm

try reformatting the card and copying over all the files cleanly ?

adafruit
 
Posts: 12151
Joined: Thu Apr 06, 2006 4:21 pm
Location: nyc

Re: Waveshield + Arduino Mega -> Distorted sound

by dy-wen on Wed Mar 16, 2011 5:28 pm

Hey
I have just done that, format the sd card & put the sounds on again - the audio is still distorted.
What I find really strange is that when I run the running the Daphc sketch (which plays all sounds it finds on the sd-card) gives me no distortion whatsoever -> whilst I'm using the same sounds on the same sd-card, same waveshield, same Arduino Mega.

The biggest difference is that, in the sketch with distortion I use buttons to activate the sound, and the Daphc sketch has no buttons.

Set-up with buttons:
I connect the ground of the Arduino with a resistor of 10 Kohms, which then makes contact with pin 22, 23, 24...

I have used this set-up several times with a regular Arduino - never had any trouble..

bizzarrooo
dy-wen
 
Posts: 30
Joined: Wed Sep 16, 2009 11:31 am

Re: Waveshield + Arduino Mega -> Distorted sound

by adafruit_support_bill on Wed Mar 16, 2011 6:40 pm

Interesting.

Do you still hear it if you replace the "playfile" calls with "playcomplete"?

adafruit_support_bill
 
Posts: 74923
Joined: Sat Feb 07, 2009 10:11 am

Re: Waveshield + Arduino Mega -> Distorted sound

by dy-wen on Thu Mar 17, 2011 4:34 pm

Hey

When I replace playfile by playcomplete
basically it's the same crackled sound :-/

I did have to keep one "playfile"in this part of the code:

Code: Select all | TOGGLE FULL SIZE
// Plays a full file from beginning to end with no pause.
void playfile(char *name) {
  // call our helper to find and play this name
  playcomplete(name);
  while (wave.isplaying) {
  // do nothing while its playing
  }
  // now its done playing
}

void playcomplete(char *name) {
  // see if the wave object is currently doing something
  if (wave.isplaying) {// already playing something, so stop it!
    wave.stop(); // stop it
  }
  // look in the root directory and open the file
  if (!f.open(root, name)) {
    putstring("Couldn't open file "); Serial.print(name); return;
  }
  // OK read the file and turn it into a wave object
  if (!wave.create(f)) {
    putstring_nl("Not a valid WAV"); return;
  }
 
  // ok time to play! start playback
  wave.play();
}


>When I replaced all the playfiles by playcomplete, I got this error:


wavehc_play_10_files_Arduino_Mega_playcomplete.cpp: In function ‘void playcomplete(char*)’:
wavehc_play_10_files_Arduino_Mega_playcomplete:257: error: redefinition of ‘void playcomplete(char*)’
wavehc_play_10_files_Arduino_Mega_playcomplete:248: error: ‘void playcomplete(char*)’ previously defined here


Question: what happens when a sketch is controlled by buttons? Does it "listen" to an incoming signal? Can it get noise from that?
I'm trying to figure out what the essential difference is between the Daphc sketch and this one, that works with buttons on the waveshield. (no noise when playing versus noise when playing)
dy-wen
 
Posts: 30
Joined: Wed Sep 16, 2009 11:31 am

Re: Waveshield + Arduino Mega -> Distorted sound

by adafruit_support_bill on Thu Mar 17, 2011 5:10 pm

what happens when a sketch is controlled by buttons? Does it "listen" to an incoming signal? Can it get noise from that?

The Arduino itself, as a digital circuit, it a fairly noisy device from an audio perspective. The nature of the noise may vary somewhat depending on what the processor is doing at the time. In the case of the button sketch, it is reading the state of the digital input ports.

Try adding a delay to your loop so it doesn't check as often. See if that changes the sound at all.

adafruit_support_bill
 
Posts: 74923
Joined: Sat Feb 07, 2009 10:11 am

Re: Waveshield + Arduino Mega -> Distorted sound

by dy-wen on Thu Mar 17, 2011 6:42 pm

Hey Arduwino

Where would you put the delay in this code?

After
Code: Select all | TOGGLE FULL SIZE
else if (justpressed[1]) {
      justpressed[1] = 0;
      playfile("SOUND2.WAV");


?

I am a Frankenscript coder... (cut & paste) :-)

GMT + 1 here (midnight)...
dy-wen
 
Posts: 30
Joined: Wed Sep 16, 2009 11:31 am

Re: Waveshield + Arduino Mega -> Distorted sound

by adafruit_support_bill on Thu Mar 17, 2011 9:27 pm

Can't tell without more context. Can you post the whole code?

adafruit_support_bill
 
Posts: 74923
Joined: Sat Feb 07, 2009 10:11 am

Re: Waveshield + Arduino Mega -> Distorted sound

by dy-wen on Fri Mar 18, 2011 4:09 am

Good morning from Brussels!

The whole code is in the first post :-)
Today I'll re-check the hardware part - you never know..
Thanks!
dy-wen
 
Posts: 30
Joined: Wed Sep 16, 2009 11:31 am

Re: Waveshield + Arduino Mega -> Distorted sound

by adafruit_support_bill on Fri Mar 18, 2011 5:46 am

You can put the delay at the very beginning of the loop function. If you use a delay of 200 milliseconds (as below) it will check the buttons 5 times per second instead of several thousand times per second.

Code: Select all | TOGGLE FULL SIZE
void loop() {
  byte i;
 
  delay(200);

  if (justpressed[0]) {
    justpressed[0] = 0;
    playfile("SOUND1.WAV");
  }

adafruit_support_bill
 
Posts: 74923
Joined: Sat Feb 07, 2009 10:11 am

Re: Waveshield + Arduino Mega -> Distorted sound

by dy-wen on Fri Mar 18, 2011 6:14 am

Still the same :-/

It suffices to put the delay only once?
Just after this:

Code: Select all | TOGGLE FULL SIZE
void loop() {
  byte i;
 
  delay(200);


--> because that is the point it listens -> then once a button is pressed it goes back to this?
Just trying to understand :-)
dy-wen
 
Posts: 30
Joined: Wed Sep 16, 2009 11:31 am

Re: Waveshield + Arduino Mega -> Distorted sound

by adafruit_support_bill on Fri Mar 18, 2011 6:34 am

Sorry, I was assuming that you called check_switches from the loop, but it looks like you are calling it based on a timer interrupt:
SIGNAL(TIMER2_OVF_vect) {
check_switches();
}


You could either slow down the timer, or move your check_switches() call to the loop as below:

void loop() {
byte i;

delay(200);
check_switches();

adafruit_support_bill
 
Posts: 74923
Joined: Sat Feb 07, 2009 10:11 am

Re: Waveshield + Arduino Mega -> Distorted sound

by dy-wen on Fri Mar 18, 2011 7:06 am

Hey

I understand what your saying - but I have trouble writing it (I understand and can read code - but I have trouble writing)
I'm trying to move the declarative part of check_switches to the loop - but failing

(what to do with: void check_switches() -> I'm presuming you cannot put this as such in the void loop -> but how to declare it then?)

(it's all a question of literacy)
dy-wen
 
Posts: 30
Joined: Wed Sep 16, 2009 11:31 am

Re: Waveshield + Arduino Mega -> Distorted sound

by adafruit_support_bill on Fri Mar 18, 2011 7:18 am

You can leave the function definition where it is. What you want to do is move the call.

Delete (or comment out) this bit of code:
Code: Select all | TOGGLE FULL SIZE
SIGNAL(TIMER2_OVF_vect) {
  check_switches();
}


And add the delay and check_switches calls to the beginning of the loop as shown here:
Code: Select all | TOGGLE FULL SIZE
void loop() {
byte i;

delay(200);
check_switches();

adafruit_support_bill
 
Posts: 74923
Joined: Sat Feb 07, 2009 10:11 am

Re: Waveshield + Arduino Mega -> Distorted sound

by dy-wen on Fri Mar 18, 2011 7:25 am

No more sound..

ai ai caramba!
dy-wen
 
Posts: 30
Joined: Wed Sep 16, 2009 11:31 am

Please be positive and constructive with your questions and comments.