unable to control a servo with Arduino

Hi,

I have received my Arduino Mega1280 clone this week and started playing with it. Yesterday I tried to control a servo with a potmeter but just got the servo to make a high pitch noise and causing the laptop to crash after connecting the servo. (I had to restart the laptop to be able to upload sketches to the Arduino).

After adding some lines to be able to track the potsettings on screen I found out that the potmeter works fine.
Replacing the servo with a resistor and led showed that the intensity of the light changes with the potvalue so my output seems to work ok also.

I have used this sketch.

// Controlling a servo position using a potentiometer (variable resistor)
// by Michal Rinott http://people.interaction-ivrea.it/m.rinott;

#include <Servo.h>

Servo myservo; // create servo object to control a servo

int potpin = 0; // analog pin used to connect the potentiometer
int val; // variable to read the value from the analog pin

void setup()
{
myservo.attach(10); // attaches the servo on pin 9 to the servo object
Serial.begin(9600);
}

void loop()
{
val = analogRead(potpin); // reads the value of the potentiometer (value between 0 and 1023)
val = map(val, 0, 1023, 0, 179); // scale it to use it with the servo (value between 0 and 180)
myservo.write(val); // sets the servo position according to the scaled value
int sensorValue = analogRead(potpin);
Serial.println(sensorValue, DEC);
delay(15); // waits for the servo to get there
}

What could be causing the trouble? I think I should add the servo.h tab but where can I find it, and what is it?

Regards,

Leo

Your code looks ok, assuming you use a standard Hobby-rc Servo with 3 cables - power, ground and control attached to your Arduino pin. The laptop crash would indicate, that your Servo draws too much power from the USB-connector. Could you please provide more information about that servo?

Korman

I'd use a separate supply for the servo, the USB supply isn't suitable for motors.

Thanks for the quick replies!

I can't find the specs (box) from the servo but it's a high torque mini servo with MG.

I have a seperate supply (12V 3A DC) but I dare not use it because I don't know the polarity of the connector on the board. Is the pin in the middle +?

What should I do with the servo.h tab?

Can you link to the servo? About the Servo.h-tab, I'm not sure what you mean by it. Close it or ignore it. If the program compiles correctly, your library is included correctly.

Korman

I have a seperate supply (12V 3A DC) but I dare not use it because I don't know the polarity of the connector on the board. Is the pin in the middle +?

The separate supply is to power the servo, not the Arduino board. The polarity of the connector on the Arduino board is irrelevant.

You guys rule!

A have connected a 4 cell NiMH receiver pack to the servo and it’s working fine now.

Thanks,

Edit:
This is the code I used to control 2 servos.

// Controlling servo positions using potentiometers
// by Michal Rinott, edited by Leo Groeneveld

#include <Servo.h>

Servo myservo1; // create servo object to control servo1
Servo myservo2; // create servo object to control servo2

int potpin1 = 0; // analog pin used to connect the potentiometer
int val1; // variable to read the value from the analog pin
int potpin2 = 1; // analog pin used to connect the potentiometer
int val2; // variable to read the value from the analog pin

void setup()
{
myservo1.attach(9); // attaches servo1 on pin 9 to the servo object
myservo2.attach(10); // attaches servo2 on pin 10 to the servo object
}

void loop()
{
val1 = analogRead(potpin1); // reads the value of the potentiometer (value between 0 and 1023)
val1 = map(val1, 0, 1023, 0, 179); // scale it to use it with the servo (value between 0 and 180)
myservo1.write(val1); // sets the servo position according to the scaled value
int sensorValue1 = analogRead(potpin1);
val2 = analogRead(potpin2); // reads the value of the potentiometer (value between 0 and 1023)
val2 = map(val2, 0, 1023, 0, 179); // scale it to use it with the servo (value between 0 and 180)
myservo2.write(val2); // sets the servo position according to the scaled value
int sensorValue2 = analogRead(potpin2);
delay(15); // waits for the servo to get there
}

Why are these statements “int sensorValue2 = analogRead(potpin2);” in the sketch? I don’t understand what they are doing.