problem with declaring servos

The error that I’m getting says:
In function ‘void loop()’;
error ‘leftservo’ was not declared in this scope

I’m ready to tear my hair out because I know the fix to this is so easy and I’m just not seeing it.

#include <Servo.h>
Servo myservo;
Servo leftServo;
Servo rightServo;
int pos = 0;
int pos1 = 0;
int pos2 = 0;
int pingPin = 7;
const int ledPin = 13;
int rightDist;
int leftDist;

void setup()
{
Serial.begin(9600);
pinMode (ledPin, OUTPUT);
myservo.attach(9);
}

void loop()
{
pos1+10;
pos-10;
leftservo.write(pos1);
rightservo.write(pos2);
long duration, inches, cm;

// The PING))) is triggered by a HIGH pulse of 2 or more microseconds.
// We give a short LOW pulse beforehand to ensure a clean HIGH pulse.
pinMode(pingPin, OUTPUT);
digitalWrite(pingPin, LOW);
delayMicroseconds(2);
digitalWrite(pingPin, HIGH);
delayMicroseconds(5);
digitalWrite(pingPin, LOW);

// The same pin is used to read the signal from the PING))): a HIGH
// pulse whose duration is the time (in microseconds) from the sending
// of the ping to the reception of its echo off of an object.
pinMode(pingPin, INPUT);
duration = pulseIn(pingPin, HIGH);

// convert the time into a distance
inches = microsecondsToInches(duration);
cm = microsecondsToCentimeters(duration);

Serial.print(inches);
Serial.print("in, ");
Serial.print(cm);
Serial.print(“cm”);
Serial.println();
if (inches >= 3) {
digitalWrite (ledPin, LOW);
pos=0;
myservo.write(pos);
}
else {
digitalWrite (ledPin, HIGH);

//start of right scan
pos = 180;
myservo.write(pos);
delay (1200); // wait for servo
pinMode(pingPin, OUTPUT); //|||
digitalWrite(pingPin, LOW); //|||
delayMicroseconds(2); //giving short burst telling Ping to Send distance
digitalWrite(pingPin, HIGH);//|||
delayMicroseconds(5); //|||
digitalWrite(pingPin, LOW); //|||
pinMode(pingPin, INPUT); // make Ping an input
duration = pulseIn(pingPin, HIGH);
inches = microsecondsToInches(duration); //converting time into distance
cm = microsecondsToCentimeters(duration);//converting time into distance
inches = rightDist;
Serial.print("right distance = ");//|||
Serial.print(inches);//sends serial data to computer
Serial.println(); //|||
// end of right scan

//beginning of left scan
pos = -180;
myservo.write(pos);
delay(1200);
pinMode(pingPin, OUTPUT); //|||
digitalWrite(pingPin, LOW); //|||
delayMicroseconds(2); //giving short burst telling Ping to Send distance
digitalWrite(pingPin, HIGH);//|||
delayMicroseconds(5); //|||
digitalWrite(pingPin, LOW); //|||
pinMode(pingPin, INPUT); // make Ping an input
duration = pulseIn(pingPin, HIGH);
inches = microsecondsToInches(duration); //converting time into distance
cm = microsecondsToCentimeters(duration);//converting time into distance
inches = leftDist;
Serial.print("right distance = ");//|||
Serial.print(inches);//sends serial data to computer
Serial.println(); //|||
//end of left scan

//beginning of mathematics to determine which directions was
//furthest distance from robot
leftServo.read(pos1);//gets degree of left servo
rightServo.read(pos2);//gets degree of right servo
pos1-360;
pos+360;
leftServo.write(pos1);//back up robot’s left wheel
rightServo.write(pos2);//back up robot’s right wheel
if leftDist < rightDist {
serial.print(“right side is longer”);
pos1+180;
leftServo.write(pos1);
delay(250);//wait for servo
}
else {
serial.print(“left side is longer”);
pos2-180;
rightServo.write(pos2);
delay(250);//wait for servo
}
}

delay(100);

}

long microsecondsToInches(long microseconds)
{
// According to Parallax’s datasheet for the PING))), there are
// 73.746 microseconds per inch (i.e. sound travels at 1130 feet per
// second). This gives the distance travelled by the ping, outbound
// and return, so we divide by 2 to get the distance of the obstacle.
// See: http://www.parallax.com/dl/docs/prod/acc/28015-PING-v1.3.pdf
return microseconds / 74/ 2;
}

long microsecondsToCentimeters(long microseconds)
{
// The speed of sound is 340 m/s or 29 microseconds per centimeter.
// The ping travels out and back, so to find the distance of the
// object we take half of the distance travelled.
return microseconds / 29 / 2;
}

The compiler is telling you that you have not declared an object called leftservo.

The error is because arduino code is case sensitive and your servo is declared as: Servo leftServo; But used as: leftservo.write(pos1);

Make sure the everywhere your variables are referenced that you have spelled them identically.

You have declared three servo objects but only attached one of them in setup. Also, the Arduino servo library only supports two servo objects (this one can support more : http://www.arduino.cc/playground/Code/MegaServo)

It may help you if you start out with a simpler test sketch that just moves the servos and when you have that going you can add all the ping code.

Good luck!

thanks so much! :)

ok, but now I’m presented with another problem, how do i single out each servo, the tutoial you showed me uses them all together. :slight_smile:

What are you building?

how do i single out each servo, the tutoial you showed me uses them all together

myservo.write (pos); ... leftServo.write (pos1); ... rightServo.write (pos2);

I’m building a robot that rolls until it gets to a wall and then stops when its X distance away. It then scans the Ping in both directions which is sitting on a servo. The Arduino figures out the the direction it should go in, backs up, turns and keeps going. It seems I can’t get this thing working without getting an error! I did successfully single out each servo in a simpler program. I also got the MegaServo library to work. The servo is responding super fast when i got it working before though. :slight_smile:

The error is on the line that’s highlighted

In function ‘void loop()’:
error: no matching function for call to
'MegaServo::read(int&)*/Users/jacobRozansky/Downloads/arduino-0016/hardware/libraries/MegaServo/MegaServo.h:94: note:
candidates are: int MegaServo::read()

#include <MegaServo.h>
#define NBR_SERVOS 3
#define FIRST_SERVO_PIN 8
MegaServo myservo;
MegaServo leftServo;
MegaServo rightServo;
int pos = 0;
int pos1 = 0;
int pos2 = 0;
int pingPin = 7;
const int ledPin = 13;
int rightDist;
int leftDist;

void setup()
{
Serial.begin(9600);
pinMode (ledPin, OUTPUT);
myservo.attach(9);
leftServo.attach(8);
rightServo.attach(10);
}

void loop()
{
pos1+10;
pos-10;
leftServo.write(pos1);
rightServo.write(pos2);
long duration, inches, cm;

// The PING))) is triggered by a HIGH pulse of 2 or more microseconds.
// We give a short LOW pulse beforehand to ensure a clean HIGH pulse.
pinMode(pingPin, OUTPUT);
digitalWrite(pingPin, LOW);
delayMicroseconds(2);
digitalWrite(pingPin, HIGH);
delayMicroseconds(5);
digitalWrite(pingPin, LOW);

// The same pin is used to read the signal from the PING))): a HIGH
// pulse whose duration is the time (in microseconds) from the sending
// of the ping to the reception of its echo off of an object.
pinMode(pingPin, INPUT);
duration = pulseIn(pingPin, HIGH);

// convert the time into a distance
inches = microsecondsToInches(duration);
cm = microsecondsToCentimeters(duration);

Serial.print(inches);
Serial.print("in, ");
Serial.print(cm);
Serial.print(“cm”);
Serial.println();
if (inches >= 3) {
digitalWrite (ledPin, LOW);
pos=0;
myservo.write(pos);
}
else {
digitalWrite (ledPin, HIGH);

//start of right scan
pos = 180;
myservo.write(pos);
delay (1200); // wait for servo
pinMode(pingPin, OUTPUT); //|||
digitalWrite(pingPin, LOW); //|||
delayMicroseconds(2); //giving short burst telling Ping to Send distance
digitalWrite(pingPin, HIGH);//|||
delayMicroseconds(5); //|||
digitalWrite(pingPin, LOW); //|||
pinMode(pingPin, INPUT); // make Ping an input
duration = pulseIn(pingPin, HIGH);
inches = microsecondsToInches(duration); //converting time into distance
cm = microsecondsToCentimeters(duration);//converting time into distance
inches = rightDist;
Serial.print("right distance = ");//|||
Serial.print(inches);//sends serial data to computer
Serial.println(); //|||
// end of right scan

//beginning of left scan
pos = -180;
myservo.write(pos);
delay(1200);
pinMode(pingPin, OUTPUT); //|||
digitalWrite(pingPin, LOW); //|||
delayMicroseconds(2); //giving short burst telling Ping to Send distance
digitalWrite(pingPin, HIGH);//|||
delayMicroseconds(5); //|||
digitalWrite(pingPin, LOW); //|||
pinMode(pingPin, INPUT); // make Ping an input
duration = pulseIn(pingPin, HIGH);
inches = microsecondsToInches(duration); //converting time into distance
cm = microsecondsToCentimeters(duration);//converting time into distance
inches = leftDist;
Serial.print("right distance = ");//|||
Serial.print(inches);//sends serial data to computer
Serial.println(); //|||
//end of left scan

//beginning of mathematics to determine which directions was
//furthest distance from robot
leftServo.read(pos1);//gets degree of left servo
rightServo.read(pos2);//gets degree of right servo
pos1-360;
pos+360;
leftServo.write(pos1);//back up robot’s left wheel
rightServo.write(pos2);//back up robot’s right wheel
if leftDist < rightDist {
serial.print(“right side is longer”);
pos1+180;
leftServo.write(pos1);
delay(250);//wait for servo
}
else {
serial.print(“left side is longer”);
pos2-180;
rightServo.write(pos2);
delay(250);//wait for servo
}
}

delay(100);

}

long microsecondsToInches(long microseconds)
{
// According to Parallax’s datasheet for the PING))), there are
// 73.746 microseconds per inch (i.e. sound travels at 1130 feet per
// second). This gives the distance travelled by the ping, outbound
// and return, so we divide by 2 to get the distance of the obstacle.
// See: http://www.parallax.com/dl/docs/prod/acc/28015-PING-v1.3.pdf
return microseconds / 74/ 2;
}

long microsecondsToCentimeters(long microseconds)
{
// The speed of sound is 340 m/s or 29 microseconds per centimeter.
// The ping travels out and back, so to find the distance of the
// object we take half of the distance travelled.
return microseconds / 29 / 2;
}

leftServo.read(pos1);//gets degree of left servo

Should be
pos1 = leftServo.read();//gets degree of left servo

Though I’m not sure why you need to read back a value that you wrote.

These lines:

pos1+10;
 pos-10;
...
...
pos1-360;
pos+360;

Do nothing useful (they’ll compile, but they don’t do what you think) - did you mean

pos1+= 10;
 pos-=10;

?

This

pinMode(pingPin, OUTPUT);
 digitalWrite(pingPin, LOW);
 delayMicroseconds(2);
 digitalWrite(pingPin, HIGH);
 delayMicroseconds(5);
 digitalWrite(pingPin, LOW);
 pinMode(pingPin, INPUT);    // make Ping an input
 duration = pulseIn(pingPin, HIGH);
 inches = microsecondsToInches(duration); //converting time into distance
  cm = microsecondsToCentimeters(duration);//converting time into distance

is repeated three times - it would be better in a function.
It will make your code easier to understand, debug and maintain.

   pos = -180;
   myservo.write(pos);

Is unlikely to work at all, or as you might expect. Servo angles are 0…180.

if leftDist < rightDist

Will probably give you grief - needs parentheses, and “leftDist” and “rightDist” are both uninitialised.

ahhhhhhhhhhhhhhhhhhhhhhhhhh!!! whats wrong now!

#include <MegaServo.h>
#define NBR_SERVOS 3
#define FIRST_SERVO_PIN 8
MegaServo myservo;
MegaServo leftServo;
MegaServo rightServo;
int pos = 0;
int pos1 = 0;
int pos2 = 0;
int pingPin = 7;
const int ledPin = 13;
int rightDist;
int leftDist;

void setup()
{
Serial.begin(9600);
pinMode (ledPin, OUTPUT);
myservo.attach(9);
leftServo.attach(8);
rightServo.attach(10);
}

void loop()
{
pos1+=10;
pos-=10;
leftServo.write(pos1);
rightServo.write(pos2);
long duration, inches, cm;
delay(1200);
// The PING))) is triggered by a HIGH pulse of 2 or more microseconds.
// We give a short LOW pulse beforehand to ensure a clean HIGH pulse.

launchPing();//what else do i need here?

// The same pin is used to read the signal from the PING))): a HIGH
// pulse whose duration is the time (in microseconds) from the sending
// of the ping to the reception of its echo off of an object.

// convert the time into a distance
inches = microsecondsToInches(duration);
cm = microsecondsToCentimeters(duration);

Serial.print(inches);
Serial.print("in, ");
Serial.print(cm);
Serial.print(“cm”);
Serial.println();
if (inches >= 3) {
digitalWrite (ledPin, LOW);
pos=0;
myservo.write(pos);
}
else {
digitalWrite (ledPin, HIGH);

//start of right scan
pos = 180;
myservo.write(pos);
launchPing();
delay(1200);
launchPing();
duration = pulseIn(pingPin, HIGH);
inches = microsecondsToInches(duration); //converting time into distance
cm = microsecondsToCentimeters(duration);//converting time into distance
inches = rightDist;
Serial.print("right distance = ");//|||
Serial.print(inches);//sends serial data to computer
Serial.println(); //|||
// end of right scan

//beginning of left scan
pos = -180;
myservo.write(pos);
delay(1200);
launchPing();
inches = microsecondsToInches(duration); //converting time into distance
cm = microsecondsToCentimeters(duration);//converting time into distance
inches = leftDist;
Serial.print("right distance = ");//|||
Serial.print(inches);//sends serial data to computer
Serial.println(); //|||
//end of left scan

//beginning of mathematics to determine which directions was
//furthest distance from robot
pos1=leftServo.read();//gets degree of left servo
pos2=rightServo.read();//gets degree of right servo
pos1-360;
pos+360;
leftServo.write(pos1);//back up robot’s left wheel
rightServo.write(pos2);//back up robot’s right wheel
if (leftDist < rightDist) {
serial.print(“right side is longer”);
pos1=180;
leftServo.write(pos1);
delay(250);//wait for servo
}
else {
serial.print(“left side is longer”);
pos2=0;
rightServo.write(pos2);
delay(250);//wait for servo
}
}

delay(100);

}

long microsecondsToInches(long microseconds)
{
// According to Parallax’s datasheet for the PING))), there are
// 73.746 microseconds per inch (i.e. sound travels at 1130 feet per
// second). This gives the distance travelled by the ping, outbound
// and return, so we divide by 2 to get the distance of the obstacle.
// See: http://www.parallax.com/dl/docs/prod/acc/28015-PING-v1.3.pdf
return microseconds / 74/ 2;
}

long microsecondsToCentimeters(long microseconds)
{
// The speed of sound is 340 m/s or 29 microseconds per centimeter.
// The ping travels out and back, so to find the distance of the
// object we take half of the distance travelled.
return microseconds / 29 / 2;
}
int launchPing()
{

pinMode(pingPin, OUTPUT); //|||
digitalWrite(pingPin, LOW); //|||
delayMicroseconds(2); //giving short burst telling Ping to Send distance
digitalWrite(pingPin, HIGH);//|||
delayMicroseconds(5); //|||
digitalWrite(pingPin, LOW); //|||
pinMode(pingPin, INPUT); // make Ping an input
duration = pulseIn(pingPin, HIGH);
return;
}

Where you have serial.print you need Serial.print (Arduino code is case sensitive)

Your launchPing function does not declare the variable duration and it does not return a value. You can fix it by removing these lines: duration = pulseIn(pingPin, HIGH); return;

and adding this: return pulseIn(pingPin, HIGH);

where you want the duration in loop , your code can do this : duration = launchPing();

As I mentioned in my earlier post, I think you should start out with a simpler sketch that just does the ping and add the servo code when you have that working.

thanks, its finally working :)