please help

Post here about your Arduino projects, get help - for Adafruit customers!

Moderators: adafruit_support_bill, adafruit

Please be positive and constructive with your questions and comments.
User avatar
adafruit_support_bill
 
Posts: 88140
Joined: Sat Feb 07, 2009 10:11 am

Re: please help

Post by adafruit_support_bill »

The problem is most likely that your audio peaks are too short, so the servo does not have time to move. In the most recent code you posted, you use a loop to gradually move the servo. You can hold the peaks longer by using a gradual decay on v2 instead of setting it to zero on each pass. Something like this should help.

Code: Select all

  while (wave.isplaying)
  {
    volume = 0;
    v2 = v2 - 10;
    if (v2 < 0)
    {
      v2 = 0;
    }

djdc23
 
Posts: 37
Joined: Tue May 28, 2013 5:07 pm

Re: please help

Post by djdc23 »

ok thanks again. Do i still have to use the previous code? or end it there?

Thanks

djdc23
 
Posts: 37
Joined: Tue May 28, 2013 5:07 pm

Re: please help

Post by djdc23 »

anything i try to do doesnt seem to work i really do appreciate your time and effort.

I just need to get around the timer issue with the wave shield and timer 1 then i can run my program which is perfect and the audio as an animation sequence.

djdc23
 
Posts: 37
Joined: Tue May 28, 2013 5:07 pm

Re: please help

Post by djdc23 »

ok i think i have worked out a way to move the servo to audio. if i include int angle; then in the field at the bottom where it says "while (wave.isplaying)" i need to tell the servo motor to move at an angle 0-90 and back. But I'm not sure how to do it.

Any suggestions please?

User avatar
adafruit_support_bill
 
Posts: 88140
Joined: Sat Feb 07, 2009 10:11 am

Re: please help

Post by adafruit_support_bill »

Please change only one thing at a time. It is impossible to debug a problem if you change too many things at once.

Did you make the changed I suggested to PlayComplete? Post the code you are using.

djdc23
 
Posts: 37
Joined: Tue May 28, 2013 5:07 pm

Re: please help

Post by djdc23 »

Thanks for the reply the only reason I was changing so many things as i know what seemed to work as ive now mounted the mouth on a board attached to a servo motor and I have a sketch which works perfect it just confilcts with the wave shield.

heres my code for the 1st sketch

Code: Select all

//////////////////////////////////////////////////////////////////// libraries
#include <FatReader.h>
#include <SdReader.h>
#include <avr/pgmspace.h>
#include <WaveHC.h>
#include <WaveUtil.h>
///////////////////////////////////////////////////////// constant pins, values

#define swPin 14


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

// 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);
}

///////////////////////////////////////////////////////////////////////////////////////////

int inputPin = 8;               // choose the input pin (for PIR sensor)
int servoPin = 16;              // choose the input pin (for Servo)
int pirState = LOW;             // we start, assuming no motion detected
int val = 0;                    // variable for reading the pin status for motion sensor
int minPulse     =  600;  // minimum servo position
int maxPulse     =  2200; // maximum servo position
int BANNED     =  1800;  // servo turn rate increment (larger value, faster rate)
int refreshTime  =  20;   // time (ms) between pulses (50Hz)
int mouthchange = 6;  //checks to see if mouth position needs to be changed





/** The Arduino will calculate these values for you **/
int centerServo;         // center servo position
int pulseWidth;          // servo pulse width
long lastPulse   = 0;    // recorded time (ms) of the last pulse

/////////////////////////////////////////////////////////////////////////// setup

void setup() {

  pinMode(inputPin, INPUT);     // declare sensor as input for PIR

  // set up servo pin
  pinMode(servoPin, OUTPUT);  // Set servo pin 18 (analog 4) as an output pin
  centerServo = maxPulse - ((maxPulse - minPulse)/2);
  pulseWidth = centerServo;   // Give the servo a starting point (or it floats)

  // set up serial port
  Serial.begin(9600);


  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);

  //  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!");

}

//////////////////////////////////////////////////////////// loop
void loop() {

  val = digitalRead(inputPin);  // read input value

  if (val == HIGH)          // check if the input is LOW
  {
    if (pirState == LOW)
    {
      Serial.println("Motion Detected!");
      playcomplete("PUPPET~1.WAV");
      playcomplete("PUPPET~1.WAV");

      pirState = HIGH;

    }
  }

  else
  {
    if (pirState == HIGH)
    {

      Serial.println("Motion ended!");

      pirState = LOW;

    }
  }
}


// Plays a full file from beginning to end with no pause.

void playcomplete(char *name) {
  char i;
  uint8_t volume;
  int v2;

  playfile(name);

  while (wave.isplaying)
  {
    volume = 0;
    v2 = v2 - 10;
    if (v2 < 0)
    {
      v2 = 0;

      delay(1);
    } 

    if (v2 > 440)
    {  
      pulseWidth = 1800;
      mouthchange = 1;
    }
    else
    { 
      pulseWidth = 800;
      mouthchange = 1;
    } 
    digitalWrite(servoPin, HIGH);   // start the pulse
    delayMicroseconds(pulseWidth);  // pulse width
    digitalWrite(servoPin, LOW);    // stop the pulse
  }
}


void playfile(char *name)
{ 
  //////// stop any file already playing//////////////////////////
  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();
}
Thanks
(if you need me to post my servo sketch i can do?)

djdc23
 
Posts: 37
Joined: Tue May 28, 2013 5:07 pm

Re: please help

Post by djdc23 »

ps if it helps ive soldered a wire from resistor r7 on the wave shield to analogue 1. I believe this is where the pulse is taken from or not? Sorry dont have a clue just copied this tutorial

http://www.instructables.com/id/Talking ... /?ALLSTEPS

Thanks for your help so far hope this helps solve the problem! :)

User avatar
adafruit_support_bill
 
Posts: 88140
Joined: Sat Feb 07, 2009 10:11 am

Re: please help

Post by adafruit_support_bill »

heres my code for the 1st sketch
And what happens when you run that sketch?

djdc23
 
Posts: 37
Joined: Tue May 28, 2013 5:07 pm

Re: please help

Post by djdc23 »

Thanks for the reply it seems to open the mouth but keep pulling and not return back to postion

User avatar
adafruit_support_bill
 
Posts: 88140
Joined: Sat Feb 07, 2009 10:11 am

Re: please help

Post by adafruit_support_bill »

Ok then, choose a higher number for a faster decay on V2. You can adjust this number to tune the movement.

Code: Select all

v2 = v2 - 40;

djdc23
 
Posts: 37
Joined: Tue May 28, 2013 5:07 pm

Re: please help

Post by djdc23 »

would it not be better to work out a way of incorperating the wave shield in my sketch with the servo? as its the perfect movement i need.

it's the correct angle and returns to the correct position. I just need to know if if can add something in the while (wave.isplaying) section such as my previous sketch?

Thank you

djdc23
 
Posts: 37
Joined: Tue May 28, 2013 5:07 pm

Re: please help

Post by djdc23 »

adafruit_support_bill wrote:Ok then, choose a higher number for a faster decay on V2. You can adjust this number to tune the movement.

Code: Select all

v2 = v2 - 40;
Thanks for the reply but it seems to just pull the motor and keep straining but not return to position.

User avatar
adafruit_support_bill
 
Posts: 88140
Joined: Sat Feb 07, 2009 10:11 am

Re: please help

Post by adafruit_support_bill »

would it not be better to work out a way of incorperating the wave shield in my sketch with the servo? as its the perfect movement i need.
But the Servo library doesn't work with the WaveHC library due to the timer conflict. You can try the Software servo link i posted earlier. I have never used that library, so I don't know how well it works.

djdc23
 
Posts: 37
Joined: Tue May 28, 2013 5:07 pm

Re: please help

Post by djdc23 »

Thanks for the reply and I appreciate your help and patience.

Yes you are correct i would love to use either of these libraries software servo or timer2 but each one just comes up as "does not name a type" ?

User avatar
adafruit_support_bill
 
Posts: 88140
Joined: Sat Feb 07, 2009 10:11 am

Re: please help

Post by adafruit_support_bill »

but each one just comes up as "does not name a type" ?
You have to install the library in the location where the compiler expects to find it. See this guide for details on how to install a library.
http://learn.adafruit.com/adafruit-all- ... nstall-use

Locked
Please be positive and constructive with your questions and comments.

Return to “Arduino”