Controlling Servo Motor Problem

Hi all,

Im trying to control servo motor (MG996R) with Arduino mega.

In the code that given below, Im tring to turn my servo between angles 60-90-120 and this rotations are done correctly except one error.

Rotation of CCW is applied very well. But when i gave command to turn my servo CW, it goes to 0 position and then goes the given angle as shown in the video.

VIDEO

In this video i send 1,2,3 chars to serial respectively.

#include <Servo.h>
Servo servo;
char sensor;

int pos; // variable to store the servo position
int servo120(){
                    if(pos<120)
                    {
                        for(pos=pos;pos=120;pos++)
                        {
                            servo.write(pos);
                            if(pos==120)
                            {break;}
                        }
                    }
                    if(pos>=120)
                    {
                        for(pos=pos;pos=120;pos--)
                        {
                            servo.write(pos);
                            if(pos==120)
                            {break;}
                        }
                    }
                }

int servo60(){
                    if(pos<60)
                    {
                        for(pos=pos;pos=60;pos++)
                        {
                          Serial.println("test1");
                          servo.write(pos);
                          if(pos==60)
                            {break;}
                        }
                    }
                    if(pos>=60)
                    {
                        for(pos=pos;pos=60;pos--)
                        {
                            Serial.println("test2");
                            servo.write(pos);
                           if(pos==60)
                            {break;}
                        }
                    }
              }
int servo90(){
                    if(pos<90)
                    {
                        for(pos=pos;pos=90;pos++)
                        {
                          Serial.println("test3");
                          servo.write(pos);
                          if(pos==90)
                            {break;}
                        }
                    }
                    if(pos>=90)
                    {
                        for(pos=pos;pos=90;pos--)
                        {
                            Serial.println("test2");
                            servo.write(pos);
                           if(pos==90)
                            {break;}
                        }
                    }
              }
void setup() {
    // Seri haberleşmeyi başlatıyoruz (9600 bps hızında)
    Serial.begin(9600);
    pinMode(13, OUTPUT);
    servo.attach(9);
    sensor=0;
    }

void loop() {

    // Veri gelmiş mi?
    if (Serial.available() > 0) {
    // gelen veriyi oku
        sensor = Serial.read();

        Serial.println(sensor);

        if(sensor=='1')
            {digitalWrite(13, HIGH);servo60();delay(100);}
        else if(sensor=='2')
            {digitalWrite(13, LOW);servo90();delay(100);}
        else if(sensor=='3')
            {digitalWrite(13, LOW);servo120();delay(100);}
Serial.println("Deneme");
    }
  else { Serial.println("Gelmemis");}
  }

How can i solve this issue?

Thank u so much.

Please modify your post and use the code button </> (not the Quote button)

so your code looks like this

and is easy to copy to a text editor. See How to use the Forum

I can’t figure from your code which is CW and which is CCW.

There is no need to have separate functions for each of the movements. You could use a single function and send the required angle as a parameter. That way the program is shorter and there is less scope for silly mistakes.

Something like this

void servoMoveTo(int angle){
    if(pos < angle)
    {
        for(pos=pos; pos<=angle; pos++)
        {
            Serial.println("test3");
            servo.write(pos);
           delay(50);
        }
    }
    if(pos>=angle)
    {
        for(pos=pos; pos>=angle; pos--)
        {
            Serial.println("test2");
            servo.write(pos);
            delay(50);
        }
    }
}

Note that I have added some short delay()s to slow the servo. If you are not slowing the servo it is pointless having the FOR loop().

…R

I suggest you learn how for loops work first, before worrying about your servo

for(pos=pos;pos=120;pos++)

has two strangenesses in it that suggest a lack of basic understanding.