0

Wave Shield and Servo won't work together
Moderators: adafruit_support_bill, adafruit

Please be positive and constructive with your questions and comments.

Wave Shield and Servo won't work together

by ndillane on Mon Nov 02, 2009 6:26 pm

I have been playing around with adafruits wave shield and have it working and playing wav files no problem. However I am trying to drive a servo at the same time but when I include servo.h in my sketch I get this compile error


/var/folders/rW/rWvoTHZWF+iF1HuGiixILU+++TI/-Tmp-/build5300156778023286889.tmp/S
ervo/Servo.cpp.o: In function `__vector_11':

/Applications/Arduino.app/Contents/Resources/Java/hardware/libraries/Servo/Servo
.cpp:104: multiple definition of `__vector_11'

/var/folders/rW/rWvoTHZWF+iF1HuGiixILU+++TI/-Tmp-/build5300156778023286889.tmp/A
F_Wave/wave.cpp.o:/Applications/Arduino.app/Contents/Resources/Java/hardware/lib
raries/AF_Wave/wave.cpp:33: first defined here


MY CODE IS BELOW
#include <AF_Wave.h>
#include <avr/pgmspace.h>
#include <Servo.h> //If I comment this out error goes away
#include "util.h"
#include "wave.h"

AF_Wave card;
File f;
Wavefile wave; // only one!

#define redled 9
int relayPin = 6; // Relay connected to digital pin 6
uint16_t samplerate;

void setup() {
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.println("Wave test!");
// initialize the digital pin as an output:
pinMode(relayPin, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(redled, OUTPUT);

if (!card.init_card()) {
putstring_nl("Card init. failed!"); return;
}
if (!card.open_partition()) {
putstring_nl("No partition!"); return;
}
if (!card.open_filesys()) {
putstring_nl("Couldn't open filesys"); return;
}

if (!card.open_rootdir()) {
putstring_nl("Couldn't open dir"); return;
}

putstring_nl("Files found:");
ls();
}

void ls() {
char name[13];
int ret;

card.reset_dir();
putstring_nl("Files found:");
while (1) {
ret = card.get_next_name_in_dir(name);
if (!ret) {
card.reset_dir();
return;
}
Serial.println(name);
}
}

uint8_t tracknum = 0;

void loop() {
uint8_t i, r;
char c, name[15];


card.reset_dir();
// scroll through the files in the directory
for (i=0; i<tracknum+1; i++) {
r = card.get_next_name_in_dir(name);
if (!r) {
// ran out of tracks! start over
tracknum = 0;
return;
}
}
putstring("\n\rPlaying "); Serial.print(name);
// reset the directory so we can find the file
card.reset_dir();
playcomplete(name);
tracknum++;
}

void playcomplete(char *name) {
uint16_t potval;
uint32_t newsamplerate;

playfile(name);
samplerate = wave.dwSamplesPerSec;
while (wave.isplaying) {
// you can do stuff here!

// my relay code start
// digitalWrite(relayPin, HIGH); // set the LED on
// delay(500); // wait for a second
// digitalWrite(relayPin, LOW); // set the LED off
// delay(500); // wait for a second
// my relay code end

delay(500);
}
card.close_file(f);
}

void playfile(char *name) {
f = card.open_file(name);
if (!f) {
putstring_nl(" Couldn't open file"); return;
}
if (!wave.create(f)) {
putstring_nl(" Not a valid WAV"); return;
}
// ok time to play!
wave.play();
}


I am a bit of a newbie I'm afraid but will welcome advice

thank you for your time
Noel
ndillane
 
Posts: 2
Joined: Mon Nov 02, 2009 6:24 pm

Re: Wave Shield and Servo won't work together

by adafruit on Mon Nov 02, 2009 6:50 pm

sounds like theres a timer conflict. youll want to use a software servo library, there is at least one out ther

also

see the Code button? use it

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

Re: Wave Shield and Servo won't work together

by ndillane on Fri Nov 06, 2009 6:44 pm

I don't really understand your response - What do you mean use a servo software library ? Am n't I already doing that by using #include <Servo.h>

I can drive the servo no problem using the examples that come with the IDE

tks again
Noel
ndillane
 
Posts: 2
Joined: Mon Nov 02, 2009 6:24 pm

Re: Wave Shield and Servo won't work together

by adafruit on Fri Nov 06, 2009 6:48 pm

the servo library is trying to use timer 1 which the waveshield needs. you will have to find a servo library that does not use timer 1. we dont know where that is, perhaps someone else does or you can spend time searching online. someone has likely written one.

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

Re: Wave Shield and Servo won't work together

by tarikbrie on Fri Mar 05, 2010 1:08 pm

This Servo library should solve the problem:

http://www.arduino.cc/playground/ComponentLib/Servo
tarikbrie
 
Posts: 1
Joined: Fri Mar 05, 2010 1:00 pm

Re: Wave Shield and Servo won't work together

by kasm on Sun May 05, 2013 3:53 pm

Has anyone found a servo software library that is for Arduino 1.0 + or what changes need to be made to this library?
Thanks!

kasm
 
Posts: 6
Joined: Mon Mar 25, 2013 11:30 am

Re: Wave Shield and Servo won't work together

by bratan on Fri Dec 09, 2016 2:36 pm

I know this is really old topic, but you can easily get SoftwareServer library working again by changing one line in SoftwareServo.h:
Replace:
Code: Select all | TOGGLE FULL SIZE
#include <WProgram.h>

with
Code: Select all | TOGGLE FULL SIZE
#include <Arduino.h>


I can confirm that it works with Wave Sheild! :)

bratan
 
Posts: 49
Joined: Sun Mar 25, 2012 2:08 pm

Re: Wave Shield and Servo won't work together

by adafruit_support_bill on Fri Dec 09, 2016 2:38 pm

Good to know. Thanks for posting your findings.

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

Re: Wave Shield and Servo won't work together

by bratan on Fri Dec 09, 2016 9:54 pm

One more thing. While SoftwareServo library works, after playing with it, I can't say that I like it at all. It requires you to manually refresh servos at least ones every 50ms, which can be a pain, and produces some weird results...
I figured out a way to "hack" original Servo library by changing some definitions to use Timer2 instead of Timer1.
Catch is I'm using ATmega1284p chip, so it might be different for 328p, but I think you can just replace _userTimer1 to _useTimer2 under "everything else" part at the end of the file.
Here's section I modified (commented out old values)
Code: Select all | TOGGLE FULL SIZE
#elif defined(__AVR_ATmega128__) || defined(__AVR_ATmega1281__) || defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega2561__)
#define _useTimer3
#define _useTimer2
//#define _useTimer1
//typedef enum { _timer3, _timer1, _Nbr_16timers } timer16_Sequence_t;
typedef enum { _timer3, _timer2, _Nbr_16timers } timer16_Sequence_t;


Oh and if you are having trouble finding Servo library (it's not in MyDocuments/Arduino/libraries), it's installed in your Arduino installation folder in libraries/Servo/src/avr

bratan
 
Posts: 49
Joined: Sun Mar 25, 2012 2:08 pm

Re: Wave Shield and Servo won't work together

by bratan on Fri Dec 09, 2016 10:56 pm


bratan
 
Posts: 49
Joined: Sun Mar 25, 2012 2:08 pm

Re: Wave Shield and Servo won't work together

by adafruit_support_bill on Sat Dec 10, 2016 7:17 am

Thanks. There used to be a ServoTimer2 library, but it wasn't maintained &hasn't worked since IDE 1.0.

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

Please be positive and constructive with your questions and comments.