Pages: [1]   Go Down
Author Topic: servo is jerky  (Read 342 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi! I coded a little thing for a servo engine just for testing. But i recognize that the servo is always jerky with my code. If i use it with another code (partially from a example) it runs smooth. Maybe someone can see my fault? I added the "Serial.println(b);" & "Serial.println(a);" line to see if the for loop is running correct and yes in both codes it runs the same way.

jerky code:
Code:
#include <Servo.h>

Servo myservo; // create Servo Object "servo"

int pos = 0;
int pos_old = pos;
int i;
char buffer[4]; //max. Zahl "9999"


void setup()
{
  myservo.attach(9); // attaches servo to pin 9
  Serial.begin(9600); // Baudrate 9600
}

void loop()
{
  Serial.print("Servo Position 0-179: ");
  while(pos == pos_old)
  {
    if (Serial.available() > 0)
    {
      Serial.flush();
      delay(5);
      i=0;
      while(i<5)
      { 
        buffer[i] = Serial.read();
        i++;
      }
      Serial.flush();
      pos = atoi(buffer);
      Serial.print("Bewege um: ");
      Serial.println(pos);
    }
  }
  for(int a = pos_old; pos >a; a+=1)
  {
    myservo.write(a);
    delay(15);
    Serial.println(a);
  }
  for(int b = pos_old; pos <b; b-=1)
  {
    myservo.write(b);
    delay(15);
    Serial.println(b);
  }
  Serial.println("Postion erreicht");
  pos_old = pos;
}

good code:
Code:
#include <Servo.h>

Servo myservo;  // create servo object to control a servo
                // a maximum of eight servo objects can be created
 
int pos = 0;    // variable to store the servo position
 
void setup()
{
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
  Serial.begin(9600);
}
 
 
void loop()
{
  for(pos = 0; pos < 180; pos += 1)  // goes from 0 degrees to 180 degrees
  {                                  // in steps of 1 degree
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);
    Serial.println(pos);    // waits 15ms for the servo to reach the position
  }
  for(pos = 180; pos>=1; pos-=1)     // goes from 180 degrees to 0 degrees
  {                               
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);
    Serial.println(pos);    // waits 15ms for the servo to reach the position
  }
}

Thanks for help!
Logged

Offline Offline
Faraday Member
**
Karma: 60
Posts: 3242
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Is the hardware the same in both cases?
Logged

Retired from Arduino.
PMs are set to ignore all.

Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Yes exactly the same hardware. I only change the software.
Logged

Offline Offline
Faraday Member
**
Karma: 60
Posts: 3242
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Perhaps try the code with the problem, but with various lines //'d out (so that it still compiles of course  smiley-cool ) and see if the problem goes away.
Logged

Retired from Arduino.
PMs are set to ignore all.

Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I changed the code like you said and figured out that my readout/conversion of the position number from serial might be the problem. The code below works! Any ideas? As you can see i print the integer variable to the serial port and i can see a correct integer number.. so i dont understand whats the problem smiley-sad

Code:
#include <Servo.h>

Servo myservo; // create Servo Object "servo"

int pos = 0;
int pos_old = pos;
int i;
char buffer[4]; //max. Zahl "9999"


void setup()
{
  myservo.attach(9); // attaches servo to pin 9
  Serial.begin(9600); // Baudrate 9600
}

void loop()
{
  Serial.print("Servo Position 0-179: ");
  while(pos == pos_old)
  {
    //if (Serial.available() > 0)
    //{
      //Serial.flush();
      //delay(5);
      //i=0;
      //while(i<5)
      //{  
        //buffer[i] = Serial.read();
        //i++;
      //}
      //Serial.flush();
      //pos = atoi(buffer);
      //Serial.print("Bewege um: ");
      //Serial.println(pos);
    //}
    pos = random(0,179);
  }
  for(int a = pos_old; pos >a; a+=1)
  {
    myservo.write(a);
    delay(15);
    Serial.println(a);
  }
  for(int b = pos_old; pos <b; b-=1)
  {
    myservo.write(b);
    delay(15);
    Serial.println(b);
  }
  Serial.println("Postion erreicht");
  pos_old = pos;
}
« Last Edit: February 23, 2013, 06:24:09 am by freaky-m0 » Logged

Pages: [1]   Go Up
Jump to: